Всем, доброе время суток. Первое января, заняться нечем, вот и решил накатать статью на Гиктаймс. В связи с переездом в другую квартиру появилась такая опция как домофон. Всё бы ничего, но бегать и открывать дверь всем пришедшим очень напрягало, а так как телефоны, планшеты, компьютеры находятся всегда в шаговой доступности, только руку протяни, было решено подключить это благо к уже работающей системе автоматизации iobroker. Ниже опишу, что с этого получилось.

Собран на скорую руку из того что валялось под ногами было в наличии.В итоге выглядит всё это дело так.

image

Так как у меня уже есть замечательная система автоматизации iobroker было решено подключать к ней для возможности централизованного управления и конфигурации изменения поведения в едином интерфейсе. Настало время выбрать как будет общаться железо и общая система. Что только не приходило в голову в качестве протокола обмена от эмуляции 1wire до get запросов, в итоге победил протокол mqtt как самый удобный в моём видении ситуации, на нём и реализован обмен между железкой и iobroker.

На планшете это выглядит как вкладка с отображением текущей камеры и управлением

image

Часть первая железная. Состоит из arduino uno, ethernet shields, и небольшой схемы согласования с домофонной линией. Сама схема:

image

Тут всё просто, оптопарой отслеживается поступающий звонок и при поступлении просто прижимает нулевую ногу ардуино. Открывание двери реализовано на реле в нормальном состоянии всегда замкнуто, при поступлении команды от iobroker (нажали кнопку в интерфейсе, автоматом по условию в скрипте, поступила команда с телеграмм) разрывает линию на 7.5 секунд, при этом vizit воспринимает это как команду открыть и запускает гостя.

Дополнительно на оптопаре vo2 реализовано автоматическое переключение телевизора в режим AV для отображения с камеры домофона.

Часть вторая программная, которая тоже разделена по сути на двое. Первая — это скетч, который прошивается в ардуино и реализует обмен по протоколу mqtt с системой iobroker.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

int flag = 0;

#define ring1_pin 0  //звонок с домофона 1
#define open1_pin 2  //открыть домофон 1
#define open2_pin 3  //открыть домофон 2
#define mon1_pin 5  //сигнал на переключение тв

#define ID_CONNECT "DoorbellControll"

byte mac[]    = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 55, 170 };
byte ip[]     = { 192, 168, 55, 40 };

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char*)payload);

  if (strTopic == "myhome/DoorbellControll/open1") {
    if (strPayload == "false") {
      digitalWrite(2, HIGH);
    }
    else if (strPayload == "true") {
      digitalWrite(2, LOW);
    }
  }
  else if (strTopic == "myhome/DoorbellControll/open2") {
    if (strPayload == "false") digitalWrite(3, LOW);
    else if (strPayload == "true") digitalWrite(3, HIGH);
  }
  else if (strTopic == "myhome/DoorbellControll/mon1") {
    if (strPayload == "false") digitalWrite(5, LOW);
    else if (strPayload == "true") digitalWrite(5, HIGH);
  }
}


void reconnect() {
  while (!client.connected()) {
    if (client.connect(ID_CONNECT)) {
      client.subscribe("myhome/DoorbellControll/#");
    } else {
      delay(5000);
    }
  }
}

void setup() {

  pinMode(ring1_pin, INPUT);

  pinMode(open1_pin, OUTPUT);
  digitalWrite(open1_pin, HIGH);

  pinMode(open2_pin, OUTPUT);
  digitalWrite(open2_pin, LOW);

  pinMode(mon1_pin, OUTPUT);
  digitalWrite(mon1_pin, LOW);


  Ethernet.begin(mac, ip);
  if (client.connect("DoorbellControll")) {
    client.publish("myhome/DoorbellControll/open1", "false");
    client.publish("myhome/DoorbellControll/open2", "false");
    client.publish("myhome/DoorbellControll/mon1", "false");
    client.publish("myhome/DoorbellControll/ring1", "false");
    client.subscribe("myhome/DoorbellControll/#");
  }
}
void loop() {
  client.loop();
  //Отслеживаем звонок в домофон
  if (digitalRead(ring1_pin) == LOW && flag == 0) {
    client.publish("myhome/DoorbellControll/ring1", "true");
    flag = 1;//выставляем  переменную flag в единицу
  }
  else if (digitalRead(ring1_pin) == HIGH && flag == 1) {
    client.publish("myhome/DoorbellControll/ring1", "false");
    flag = 0; //обнуляем переменную flag
  }
  if (!client.connected()) {
    reconnect();
    client.subscribe("myhome/DoorbellControll/#");

  }
}

И вторая — скрипт на js для реализации взаимодействия с пользователем:

//************Создаём виртуальные объекты с которыми далее будем взаимодействовать********************
createState('doorbellcontroll.rings', 'false');
createState('doorbellcontroll.visopen', 'false');    //кнопка открыть в vis


on("mqtt.0.myhome.DoorbellControll.ring1", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('javascript.0.doorbellcontroll.rings', true);
    setTimeout(function() {
    }, 60000);
    }
});

//******** Открываем страничку с камерами и управлением, шлём оповещение в телеграм и проговариваем голосом ****************
on("javascript.0.doorbellcontroll.rings", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('sayit.0.tts.text', 'Звонок в домофон');       // Проговариваем оповещение о звонке
        sendTo('telegram.0', 'Звонок в домофон');               // Шлём в телеграм
        setState('mqtt.0.myhome.DoorbellControll.mon1', true);  // Включаем видеовход на телеке
        setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "Camers"}');   // Переходим на страницу "Камеры"
//*********** Ждём 30 секунд и переходим на главную ********************
    setTimeout(function () {
        setState('mqtt.0.myhome.DoorbellControll.mon1', false); // Выключаем  видеовход на телеке          
        setState("vis.0.control.command", '{"instance": "FFFFFFFF", "command": "changeView", "data": "StartView"}');    // Возвращаемся на страницу "Home"
        setState('javascript.0.doorbellcontroll.rings', false);
    }, 30000);
    }
});

//*******************Ожидает нажатия кнопки "Открыть" в Vis**************
on("javascript.0.doorbellcontroll.visopen", function (obj){
    if  (obj.newState.val == "true" || obj.newState.val === true) {
        setState('mqtt.0.myhome.DoorbellControll.open1', true);     // Открываем двери  
        toLog(' Подъездная дверь открыта. ', true, 'orange');     	//Выводим в лог
    
    setTimeout(function () {
        setState('mqtt.0.myhome.DoorbellControll.open1', false);    
        setState('javascript.0.doorbellcontroll.visopen', false);    // Возвращаем статус обратно
    }, 7500);    

    }       
});

В системе iobroker отображается как объекты с которыми можно взаимодействовать.

image

На этом повествование до чего доводит лень тяга упростить себе рутинные действия подошло к логическому завершению.
Поделиться с друзьями
-->

Комментарии (34)


  1. nikitos_2002
    04.01.2017 13:34

    Идея хорошая, у меня есть пару вопросов:
    1. Как соседи относятся в камере в подъезде, не открутили?
    2. Домофон, через который Вам звонят гости висит на улице или у вашей квартиры? Если на улице, как вы понимаете, открывать дверь или нет, насколько понял на планшет звук не идёт. Или у Вас камера с пометкой «подъезд» стоит на улице?


    1. AURodionov
      04.01.2017 13:55
      +1

      1. Камера стоит возле входной двери в квартиру. Как не странно, ещё не открутили и пока не пытались.
      2. Домофон находится на улице перед входом в подъезд, вопрос с установкой камеры решаю, не так всё просто.
      решение о том открыть нет не принимаю, пока работает только для своих, через телефоны


      1. electronus
        04.01.2017 17:17

        Никто не мешает установить камеру рядом с панелью. Я так в свое время сделал


        1. stifff
          04.01.2017 20:03

          А как это всё с точки зрения законодательства выглядит, на текущий момент?


          1. AURodionov
            04.01.2017 20:26

            Хороший вопрос, но я скорей разберусь с технической стороной вопроса.
            Вроде как надо собрать подписи с жильцов, что они не возражают установке камеры, далее согласовать установку в ук и техническими службами. Как-то так себе вижу.


          1. electronus
            04.01.2017 20:29

            Не знаю. Просто установка домофона лишила меня возможности принимать решение о допуске в жилище на основании камеры на входной двери квартиры. По-этому была установлена вторая камера внизу. Кроме того, сам факт установки домофона не решил вопрос безопасности, т.к. в результате анализа квартирных краж в подъезде — ничего не изменилось.
            Я выдрал eeprom из домофона, считал его на программаторе, есть софт, который по дампу показывает мастер-коды и прописанные ключи. Пошел в подъезд напротив, и открыл домофон используя полученный мастер-код от моего домофона. Выдрал оттуда eeprom и так-же вычитал его. Сравнил дампы, и понял, что в обоих домофонах прописаны ключи-вездеходы.
            Мне захотелось иметь возможность аудита используемых ключей, и я наваял на ардуино сниффер считывателя+RTC+флешкарта, подключив это собственно к не моему оборудованию. Когда ограбили квартиру соседа этажом ниже, оказалось что вошли «парни» используя вездеход.
            Насколько мои действия были законны? Это ли главный вопрос?
            Главный вывод я сделал — домофон «от компании» — по дефолту большая дыра, за которую ещё и платишь. Так что если ставить — то свой, менять мастера, не вносить/убивать вездеходы, ставить марку к которой нет решения «в лоб» открытия без метки…


            1. sumanai
              04.01.2017 21:10

              домофон «от компании» — по дефолту большая дыра, за которую ещё и платишь.

              Нет трубки- нет оплаты. Кому нужно- тот позвонит на сотовый. Хотя это удобно только для первых этажей, как у меня.
              Зато никаких левых звонков с просьбой открыть, которые, судя по моему опыту, чаще всего удовлетворяются. Так что никакие уникальные двери не защитят в случае, когда открывают сами жильцы.
              не вносить/убивать вездеходы

              Почтальоны/ЖЭК/ прочие службы. Всё это конечно решается, но больно много геморроя.


            1. Merkat0r
              05.01.2017 19:40

              настолько, что при желании вам легко пришьют то, что это вы домушникам помогли и еще вагон и тележечку.

              Про ключи — как и выше — да, бесполезно — всегда есть код, который добрые соседи расскажут по секрету всему свету.

              А, есть трубка или нет — пофиг, оно в общую платежку включено — все равно платить придется


              1. electronus
                05.01.2017 21:11

                Код как-раз был в секрете, и никто него не знал. Но то что он был одинаков для ближайших 10 подъездов — это проблема. Желание и действительность — разные вещи. Мой пассаж о рассуждениях о законности сводится к тому, что камеру ставить нужно в любом случае, не взирая на законность. А то получается: обычным гражданам — закон, а злоумышленникам — всё.


              1. sumanai
                08.01.2017 13:56

                А, есть трубка или нет — пофиг, оно в общую платежку включено — все равно платить придется

                У меня не так, я без трубки и ничего не плачу. Только раз в 3 месяца в последний год начала приходить слёзная бумажка, мол, без ваших денег весь подъезд загнётся. То, что основная проблема в этих самых жителях подъезда, они не знают.


  1. vdemon
    04.01.2017 14:11
    +1

    По поводу камер в подъезде — за два года установил примерно десяток айпишек — себе, родителям, знакомым.
    Соседи только за и пару раз уже обращались с просьбой посмотреть, что происходило в определенное время.
    И пока еще не было ни одного покушения на камеры.


    1. AURodionov
      04.01.2017 14:14

      Ко мне тоже обращались соседи по площадке на предмет глянуть видео, и тоже обеими руками за камеры, мало того приглядывают что-бы хулиганы не сломали или не утащили


    1. KiraVergil
      05.01.2017 10:37

      Хорошо вам. У нас даже за простенький видеоглазок в двери тамбура, самолично спаянный и кустарно установленный, можно огрести вполне себе нехило. А заказывать у фирм, занимающихся этим, довольно дорого


      1. AURodionov
        05.01.2017 10:40

        Ну не так хорошо как кажется, на своей площадке я камеры конечно поставил. А вот на входной группе в подъезд как уже писал есть проблемы. Вроде все за, но подписи собрать уже почти год не получается.


        1. KiraVergil
          05.01.2017 10:51

          У меня была идея приспособить веб-камеру и старый планшет для оборудования обыкновенного видеоглазка из тамбура, на лестничный пролёт, ибо дверца тамбура довольно хлипкая, но, посмотрев сколько документов на сие простенькое действо необходимо (фактически, по нашему законодательству, это установка средства скрытного видеонаблюдения) ужаснулся и решил, что себе дороже обойдется. У Вас, насколько я понял, даже установка на пролёте не препятствуется.


          1. electronus
            05.01.2017 21:17

            У Вас это где?


            1. KiraVergil
              09.01.2017 14:23

              Беларусь это.


  1. gsaw
    04.01.2017 14:27

    Не страшно, что двери программно открываются? Кстати таймер на отжатие кнопки открытия двери я бы перенес в ардуину. Конечно случай может быть редкий, но если что то заклинит в сети/mqtt-брокере в процессе и будет долго дверь открыта.


    1. AURodionov
      04.01.2017 14:39

      Нет не страшно. На ардуинке собран просто исполнитель, вся логика описывается на JS на стороне сервера. Никогда не знаешь чего захочется завтра, а лазать перешивать ардуинку по каждому чиху не хотелось.


  1. Alexandr0202
    04.01.2017 14:39

    Подскажите, пожалуйста, зачем дублируется

    client.subscribe("myhome/DoorbellControll/#");
    
    в случае reconnect.


    1. AURodionov
      04.01.2017 14:41

      Подписывается заново на топики, что-бы наверняка.


      1. Alexandr0202
        04.01.2017 15:13

        да, но в том месте, откуда вызывается функция reconnect() следом сразу следует та же самая инструкция… получается одна и та же команда выполняется 2 раза подряд.


  1. Vasia529
    04.01.2017 14:41

    Ардуинщик из вас так себе xD
    0 и 1 пины не рекомендуется использовать, чтобы не поиметь проблем с заливкой нового скетча потом


    1. AURodionov
      04.01.2017 14:44

      Я знаю что там uart, но мне было так удобно. В любом случае это прототип для обкатки, будет добавляться функции для чего придётся поработать паяльником заодно и прошью.


  1. Jmann
    04.01.2017 14:53

    Используете dip trace для схемотехники и PCB?


    1. AURodionov
      04.01.2017 14:59

      Да, просто был установлен на компе.


  1. TimyrKol
    04.01.2017 18:59
    -2

    А это как ебётся делается? Вы нажимаете на кнопку и открывается дверь?


    1. AURodionov
      04.01.2017 19:04

      В общем да. Передаётся true в топик /myhome/DoorbellControll/open1. На самом деле за несколько дней скрипт и интерфейс получил своё логическое развитие. На данный момент реализовано открытие домофона со странички управления на планшете, открытие при помощи клавиатуры в телеграмм, автоматическое открывание контролируемое со странички на планшете.


  1. catnikita255
    04.01.2017 19:50
    -1

    Отличная идея! Лень — воистину двигатель прогресса. Плюс в карму.

    UPD: упс, забыл, что на Хабре и на ГТ у меня разные аккаунты и тут я ничего не могу делать. Извините.


  1. Jmann
    04.01.2017 23:09

    База транзистора Q1 так и просится на землю через резистор кОм так на 22. Вход оптопары VO1 неплохо бы зашунтировать керамическим конденсатором на 100 нФ. И на схему питания схемы согласования с Arduino установить бы электролитический конденсатор + керамику.


    1. AURodionov
      05.01.2017 00:04

      Про подпорку базы Q1 согласен, но содрано как есть из серийного устройства и вполне работает. Керамика на оптике по факту имеется, висит прям на ногах с обратной стороны макетки.


  1. ClearAirTurbulence
    05.01.2017 01:21

    Вход оптопары VO1 неплохо бы зашунтировать керамическим конденсатором на 100 нФ.

    Это от помех, или еще для чего?
    прошу простить, ошибся веткой.


  1. skalentev
    07.01.2017 17:18

    Подскажите, какой софт используете на планшете?


    1. AURodionov
      07.01.2017 17:50

      На планшетах и телефонах использую визуализацию системы ioBroker. В нём есть модуль vis, в котором отрисован интерфейс.Так-же в ioBroker настроена реакция системы на звонок который отслеживается контроллером и передаётся с помощью протокола mqtt. Пример на JS в статье, так-же можно использовать другие способы описать логику, например blockly.