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); }
}
});! ````