Как я домофон Vizit к mqtt подключал

Всем, доброе время суток. Первое января, заняться нечем, вот и решил накатать статью на Гиктаймс. В связи с переездом в другую квартиру появилась такая опция как домофон. Всё бы ничего, но бегать и открывать дверь всем пришедшим очень напрягало, а так как телефоны, планшеты, компьютеры находятся всегда в шаговой доступности, только руку протяни, было решено подключить это благо к уже работающей системе автоматизации 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

На этом повествование до чего доводит лень тяга упростить себе рутинные действия подошло к логическому завершению.
Поделиться публикацией
Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

Зачем оно вам?
Реклама
Комментарии 38
  • 0
    Идея хорошая, у меня есть пару вопросов:
    1. Как соседи относятся в камере в подъезде, не открутили?
    2. Домофон, через который Вам звонят гости висит на улице или у вашей квартиры? Если на улице, как вы понимаете, открывать дверь или нет, насколько понял на планшет звук не идёт. Или у Вас камера с пометкой «подъезд» стоит на улице?
    • +1
      1. Камера стоит возле входной двери в квартиру. Как не странно, ещё не открутили и пока не пытались.
      2. Домофон находится на улице перед входом в подъезд, вопрос с установкой камеры решаю, не так всё просто.
      решение о том открыть нет не принимаю, пока работает только для своих, через телефоны
      • 0
        Никто не мешает установить камеру рядом с панелью. Я так в свое время сделал
        • 0
          А как это всё с точки зрения законодательства выглядит, на текущий момент?
          • 0
            Хороший вопрос, но я скорей разберусь с технической стороной вопроса.
            Вроде как надо собрать подписи с жильцов, что они не возражают установке камеры, далее согласовать установку в ук и техническими службами. Как-то так себе вижу.
            • 0
              Не знаю. Просто установка домофона лишила меня возможности принимать решение о допуске в жилище на основании камеры на входной двери квартиры. По-этому была установлена вторая камера внизу. Кроме того, сам факт установки домофона не решил вопрос безопасности, т.к. в результате анализа квартирных краж в подъезде — ничего не изменилось.
              Я выдрал eeprom из домофона, считал его на программаторе, есть софт, который по дампу показывает мастер-коды и прописанные ключи. Пошел в подъезд напротив, и открыл домофон используя полученный мастер-код от моего домофона. Выдрал оттуда eeprom и так-же вычитал его. Сравнил дампы, и понял, что в обоих домофонах прописаны ключи-вездеходы.
              Мне захотелось иметь возможность аудита используемых ключей, и я наваял на ардуино сниффер считывателя+RTC+флешкарта, подключив это собственно к не моему оборудованию. Когда ограбили квартиру соседа этажом ниже, оказалось что вошли «парни» используя вездеход.
              Насколько мои действия были законны? Это ли главный вопрос?
              Главный вывод я сделал — домофон «от компании» — по дефолту большая дыра, за которую ещё и платишь. Так что если ставить — то свой, менять мастера, не вносить/убивать вездеходы, ставить марку к которой нет решения «в лоб» открытия без метки…
              • 0
                домофон «от компании» — по дефолту большая дыра, за которую ещё и платишь.

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

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

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

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

                      У меня не так, я без трубки и ничего не плачу. Только раз в 3 месяца в последний год начала приходить слёзная бумажка, мол, без ваших денег весь подъезд загнётся. То, что основная проблема в этих самых жителях подъезда, они не знают.
          • +1
            По поводу камер в подъезде — за два года установил примерно десяток айпишек — себе, родителям, знакомым.
            Соседи только за и пару раз уже обращались с просьбой посмотреть, что происходило в определенное время.
            И пока еще не было ни одного покушения на камеры.
            • 0
              Ко мне тоже обращались соседи по площадке на предмет глянуть видео, и тоже обеими руками за камеры, мало того приглядывают что-бы хулиганы не сломали или не утащили
              • 0
                Хорошо вам. У нас даже за простенький видеоглазок в двери тамбура, самолично спаянный и кустарно установленный, можно огрести вполне себе нехило. А заказывать у фирм, занимающихся этим, довольно дорого
                • 0
                  Ну не так хорошо как кажется, на своей площадке я камеры конечно поставил. А вот на входной группе в подъезд как уже писал есть проблемы. Вроде все за, но подписи собрать уже почти год не получается.
                  • 0
                    У меня была идея приспособить веб-камеру и старый планшет для оборудования обыкновенного видеоглазка из тамбура, на лестничный пролёт, ибо дверца тамбура довольно хлипкая, но, посмотрев сколько документов на сие простенькое действо необходимо (фактически, по нашему законодательству, это установка средства скрытного видеонаблюдения) ужаснулся и решил, что себе дороже обойдется. У Вас, насколько я понял, даже установка на пролёте не препятствуется.
            • 0
              Не страшно, что двери программно открываются? Кстати таймер на отжатие кнопки открытия двери я бы перенес в ардуину. Конечно случай может быть редкий, но если что то заклинит в сети/mqtt-брокере в процессе и будет долго дверь открыта.
              • 0
                Нет не страшно. На ардуинке собран просто исполнитель, вся логика описывается на JS на стороне сервера. Никогда не знаешь чего захочется завтра, а лазать перешивать ардуинку по каждому чиху не хотелось.
              • 0
                Подскажите, пожалуйста, зачем дублируется
                client.subscribe("myhome/DoorbellControll/#");
                
                в случае reconnect.
                • 0
                  Подписывается заново на топики, что-бы наверняка.
                  • 0
                    да, но в том месте, откуда вызывается функция reconnect() следом сразу следует та же самая инструкция… получается одна и та же команда выполняется 2 раза подряд.
                • 0
                  Ардуинщик из вас так себе xD
                  0 и 1 пины не рекомендуется использовать, чтобы не поиметь проблем с заливкой нового скетча потом
                  • 0
                    Я знаю что там uart, но мне было так удобно. В любом случае это прототип для обкатки, будет добавляться функции для чего придётся поработать паяльником заодно и прошью.
                  • 0

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

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

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

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

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

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

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

                          • 0
                            Про подпорку базы Q1 согласен, но содрано как есть из серийного устройства и вполне работает. Керамика на оптике по факту имеется, висит прям на ногах с обратной стороны макетки.
                          • 0
                            Вход оптопары VO1 неплохо бы зашунтировать керамическим конденсатором на 100 нФ.

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

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

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

                                Давно уже придумали SIP домофоны для лентяев ...

                                • 0
                                  Вопрос, всего цена вопроса.
                                  Про sip я в курсе и даже переделывал какой-то грандстрим.
                                  Вменяемого шлюза vizit — sip до сих пор нет, про прослойки я тоже в курсе.
                                • 0

                                  Подскажите, а почему выбрали iobroker, а не openhab, например?

                                  • 0
                                    Я перепробовал приличное количество разных систем для автоматизации и визуализации.
                                    iobroker мне понравился тем, что в нём всё просто, легко установить, есть примеры для первичного старта,
                                    отличный гуи, сообщество которое развивается и реально помогает новичкам а не отправляет «гуглить». Именно openhab не понравился из-за сложной установки на момент когда я его пытался использовать. Я не хочу сказать,
                                    что другие системы плохие, просто они не нравятся мне.

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.