NEWS
Домофон_MQTT
- 
					
					
					
					
 Надоело бегать открывать домофон, решил прикрутить его к iobroker Статья на гикктаймс https://geektimes.ru/post/284302/ 
  Что умеет: - 
Работает по MQTT 
- 
При поступлении вызова оповещает голосом, открывает страничку с камерами в vis, 
 дёргает переключение на AV вход на телеке через управляющий вход на скарт разъёме, шлёт сообщение в телеграм - 
Со странички vis можно открыть нажав кнопочку "ОТКРЫТЬ" 
- 
Автоматическое открывание двери, управляется со странички vis 
- 
Есть второй канал "open2" ,у меня используется для управления Bolid С2000-2 
 Схема: 
  Так у меня в интерфейсе vis: 
  На страничке home пара переключателей: 
  Так отображается в объектах: 
  Скетч для ардуинки: ! ```` 
 ! #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/#");
 ! }
 }</pubsubclient.h></ethernet.h></spi.h>Скрипт для iobroker: >! ```` >! //************Создаём виртуальные объекты с кототорыми далее будем взаимодействовать******************** createState('doorbellcontroll.rings', 'false'); createState('doorbellcontroll.visopen', 'false'); //кнопка открыть в vis createState('doorbellcontroll.autoopen', '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); >! } }); >! //******************* Автоматическое открытие ****************************** on("javascript.0.doorbellcontroll.rings", function (obj) { var AutoOpen = (getState('javascript.0.doorbellcontroll.autoopen').val); if ((obj.newState.val == "true" || obj.newState.val === true) && AutoOpen === true ) { setState('mqtt.0.myhome.DoorbellControll.open1', true); // Открываем двери автоматически toLog(' Подъездная дверь открыта автоматически. ', true, 'orange'); //Выводим в лог sendTo('telegram.0', 'Подъездная дверь открыта автоматически'); // Шлём в телеграм setTimeout(function () { setState('mqtt.0.myhome.DoorbellControll.open1', false); }, 7500); >! } }); >! ````
- 
- 
					
					
					
					
 ! /* ! #include <spi.h> #include <ethernet.h> #include <pubsubclient.h> ! //int ring1; //int open1; //int open2; //int mon1; int flag = 0; ! #define ring1_pin 6 //звонок с домофона 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, LOW);} else if (strPayload == "true") {digitalWrite(2, HIGH);} } 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, LOW); ! 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() { //Отслеживаем звонок в домофон 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/#"); client.loop(); } }</pubsubclient.h></ethernet.h></spi.h>`! ```` 
 /*
 ! #include <spi.h>
 #include <ethernet.h>
 #include <pubsubclient.h>
 ! //int ring1;
 //int open1;
 //int open2;
 //int mon1;
 int flag = 0;
 ! #define ring1_pin 6 //звонок с домофона 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, LOW);}
 else if (strPayload == "true") {digitalWrite(2, HIGH);}
 }
 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, LOW);
 ! 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/#");} 
 }</pubsubclient.h></ethernet.h></spi.h>
- 
					
					
					
					
 Это мой крипт для домофона, правда бардак тут) ! ```` 
 ///////////////////Домофон/////////////////
 var flag_domofon = false;
 var sch;
 createState('flag_domofon', '0');
 createState('counter', 0);
 createState('javascript.0.Scenes.DomofonAutoOpenDate', ''); //21-02-2016-3 3-период (1,2,3,4)
 ! on({id: 'javascript.0.Scenes.DomofonAutoOpenDate', change: 'any'}, function (obj) {
 if (obj.newState.val){
 var SetTime = obj.newState.val.split("-"); // массив [день, месяц, год, период]
 var SetDay = SetTime[0];
 var SetMouth = SetTime[1].replace('0', '');
 var SetPeriod = parseInt(SetTime[3], 10);
 var SetHour;
 if (SetPeriod === 1){ //1: '9:00-13:00 (утро)',
 SetHour = 9; //2: '13:01-17:00 (день)',
 } //3: '17:01-21:00 (вечер)',
 if (SetPeriod === 2){ //4: '18:01-21:00 (вечер)'
 SetHour = 13;
 }
 if (SetPeriod === 3 || SetPeriod === 4){
 SetHour = 17;
 }
 var sched = '0 '+SetHour+' '+SetDay+' '+SetMouth+' *';
 log(sched);
 sch = schedule(sched , function () { //0 17 7 5 *"
 setState('javascript.0.Scenes.DomofonAutoOpen', 1);
 setTimeout(function() {clearSchedule(sch);}, 14400000); //4 часа
 });
 }
 });
 ! on('mqtt.0.myhome.Mother.DomofonRing', function (obj) {
 if (obj.newState.val === '1' || obj.newState.val === 1) {
 var TVon = getState('mqtt.0.myhome.RS232.LGTV_PWR').val;
 var TVsource = getState('mqtt.0.myhome.RS232.LGTV_Source').val;
 var AllGone = getState('javascript.0.Scenes.Allgone').val;
 var OpenDomofonNumber = parseFloat(getState('javascript.0.Scenes.DomofonAutoOpen').val);
 if (!flag_domofon){
 if ((AllGone === false || AllGone === 'false') && OpenDomofonNumber === 0){
 setState('sayit.1.tts.text', '/sayit.1/tts.userfiles/domofon.mp3');
 }
 sendTo('telegram.0', {
 text: 'Звонок домофона!\n\n\nОТКРЫТЬ ДВЕРЬ!',
 parse_mode: 'html',
 disable_web_page_preview: true
 });
 sendTo("pushover", {
 message: 'Звонок домофона',
 title: 'Домофон',
 url: 'https://192.168.1.190:8087/set/mqtt.0.myhome.Mother.DomofonOpen?value=1&prettyPrint',
 url_title: 'ОТКРЫТЬ ДВЕРЬ!',
 });
 if (OpenDomofonNumber === 88){
 setState('sayit.0.tts.text', 'Кто то пришел, я открою дверь!');
 setTimeout(function() { setState('mqtt.0.myhome.Mother.DomofonOpen', '1'); }, 5000);
 }
 if (OpenDomofonNumber >= 1 && OpenDomofonNumber < 88){
 if (sch){
 clearSchedule(sch);
 }
 setState('sayit.0.tts.text', 'Кто то пришел, я открою дверь!');
 setTimeout(function() { setState('mqtt.0.myhome.Mother.DomofonOpen', '1'); }, 5000);
 OpenDomofonNumber--;
 if (OpenDomofonNumber < 0){OpenDomofonNumber = 0;}
 setState('javascript.0.Scenes.DomofonAutoOpen', OpenDomofonNumber);
 }
 ! flag_domofon = true;if (TVon === '1' || TVon === 1) { setState('mqtt.0.myhome.RS232.LGTV_Source', 'av2'); setTimeout(function() { setState('mqtt.0.myhome.RS232.LGTV_Source', TVsource.toLowerCase()); }, 25100); } setTimeout(function() {flag_domofon = false;}, 30000); }} 
 });! ```` 
 
		
	 
		
	