Собран на скорую руку из того что
Так как у меня уже есть замечательная система автоматизации iobroker было решено подключать к ней для возможности централизованного управления и конфигурации
На планшете это выглядит как вкладка с отображением текущей камеры и управлением
Часть первая железная. Состоит из arduino uno, ethernet shields, и небольшой схемы согласования с домофонной линией. Сама схема:
Тут всё просто, оптопарой отслеживается поступающий звонок и при поступлении просто прижимает нулевую ногу ардуино. Открывание двери реализовано на реле в нормальном состоянии всегда замкнуто, при поступлении команды от 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 отображается как объекты с которыми можно взаимодействовать.
На этом повествование до чего доводит
Комментарии (34)
vdemon
04.01.2017 14:11+1По поводу камер в подъезде — за два года установил примерно десяток айпишек — себе, родителям, знакомым.
Соседи только за и пару раз уже обращались с просьбой посмотреть, что происходило в определенное время.
И пока еще не было ни одного покушения на камеры.AURodionov
04.01.2017 14:14Ко мне тоже обращались соседи по площадке на предмет глянуть видео, и тоже обеими руками за камеры, мало того приглядывают что-бы хулиганы не сломали или не утащили
KiraVergil
05.01.2017 10:37Хорошо вам. У нас даже за простенький видеоглазок в двери тамбура, самолично спаянный и кустарно установленный, можно огрести вполне себе нехило. А заказывать у фирм, занимающихся этим, довольно дорого
AURodionov
05.01.2017 10:40Ну не так хорошо как кажется, на своей площадке я камеры конечно поставил. А вот на входной группе в подъезд как уже писал есть проблемы. Вроде все за, но подписи собрать уже почти год не получается.
KiraVergil
05.01.2017 10:51У меня была идея приспособить веб-камеру и старый планшет для оборудования обыкновенного видеоглазка из тамбура, на лестничный пролёт, ибо дверца тамбура довольно хлипкая, но, посмотрев сколько документов на сие простенькое действо необходимо (фактически, по нашему законодательству, это установка средства скрытного видеонаблюдения) ужаснулся и решил, что себе дороже обойдется. У Вас, насколько я понял, даже установка на пролёте не препятствуется.
gsaw
04.01.2017 14:27Не страшно, что двери программно открываются? Кстати таймер на отжатие кнопки открытия двери я бы перенес в ардуину. Конечно случай может быть редкий, но если что то заклинит в сети/mqtt-брокере в процессе и будет долго дверь открыта.
AURodionov
04.01.2017 14:39Нет не страшно. На ардуинке собран просто исполнитель, вся логика описывается на JS на стороне сервера. Никогда не знаешь чего захочется завтра, а лазать перешивать ардуинку по каждому чиху не хотелось.
Alexandr0202
04.01.2017 14:39Подскажите, пожалуйста, зачем дублируется
в случае reconnect.client.subscribe("myhome/DoorbellControll/#");
AURodionov
04.01.2017 14:41Подписывается заново на топики, что-бы наверняка.
Alexandr0202
04.01.2017 15:13да, но в том месте, откуда вызывается функция reconnect() следом сразу следует та же самая инструкция… получается одна и та же команда выполняется 2 раза подряд.
Vasia529
04.01.2017 14:41Ардуинщик из вас так себе xD
0 и 1 пины не рекомендуется использовать, чтобы не поиметь проблем с заливкой нового скетча потомAURodionov
04.01.2017 14:44Я знаю что там uart, но мне было так удобно. В любом случае это прототип для обкатки, будет добавляться функции для чего придётся поработать паяльником заодно и прошью.
TimyrKol
04.01.2017 18:59-2А это как
ебётсяделается? Вы нажимаете на кнопку и открывается дверь?AURodionov
04.01.2017 19:04В общем да. Передаётся true в топик /myhome/DoorbellControll/open1. На самом деле за несколько дней скрипт и интерфейс получил своё логическое развитие. На данный момент реализовано открытие домофона со странички управления на планшете, открытие при помощи клавиатуры в телеграмм, автоматическое открывание контролируемое со странички на планшете.
catnikita255
04.01.2017 19:50-1Отличная идея! Лень — воистину двигатель прогресса. Плюс в карму.
UPD: упс, забыл, что на Хабре и на ГТ у меня разные аккаунты и тут я ничего не могу делать. Извините.
Jmann
04.01.2017 23:09База транзистора Q1 так и просится на землю через резистор кОм так на 22. Вход оптопары VO1 неплохо бы зашунтировать керамическим конденсатором на 100 нФ. И на схему питания схемы согласования с Arduino установить бы электролитический конденсатор + керамику.
AURodionov
05.01.2017 00:04Про подпорку базы Q1 согласен, но содрано как есть из серийного устройства и вполне работает. Керамика на оптике по факту имеется, висит прям на ногах с обратной стороны макетки.
ClearAirTurbulence
05.01.2017 01:21Вход оптопары VO1 неплохо бы зашунтировать керамическим конденсатором на 100 нФ.
Это от помех, или еще для чего?
прошу простить, ошибся веткой.
skalentev
07.01.2017 17:18Подскажите, какой софт используете на планшете?
AURodionov
07.01.2017 17:50На планшетах и телефонах использую визуализацию системы ioBroker. В нём есть модуль vis, в котором отрисован интерфейс.Так-же в ioBroker настроена реакция системы на звонок который отслеживается контроллером и передаётся с помощью протокола mqtt. Пример на JS в статье, так-же можно использовать другие способы описать логику, например blockly.
nikitos_2002
Идея хорошая, у меня есть пару вопросов:
1. Как соседи относятся в камере в подъезде, не открутили?
2. Домофон, через который Вам звонят гости висит на улице или у вашей квартиры? Если на улице, как вы понимаете, открывать дверь или нет, насколько понял на планшет звук не идёт. Или у Вас камера с пометкой «подъезд» стоит на улице?
AURodionov
1. Камера стоит возле входной двери в квартиру. Как не странно, ещё не открутили и пока не пытались.
2. Домофон находится на улице перед входом в подъезд, вопрос с установкой камеры решаю, не так всё просто.
решение о том открыть нет не принимаю, пока работает только для своих, через телефоны
electronus
Никто не мешает установить камеру рядом с панелью. Я так в свое время сделал
stifff
А как это всё с точки зрения законодательства выглядит, на текущий момент?
AURodionov
Хороший вопрос, но я скорей разберусь с технической стороной вопроса.
Вроде как надо собрать подписи с жильцов, что они не возражают установке камеры, далее согласовать установку в ук и техническими службами. Как-то так себе вижу.
electronus
Не знаю. Просто установка домофона лишила меня возможности принимать решение о допуске в жилище на основании камеры на входной двери квартиры. По-этому была установлена вторая камера внизу. Кроме того, сам факт установки домофона не решил вопрос безопасности, т.к. в результате анализа квартирных краж в подъезде — ничего не изменилось.
Я выдрал eeprom из домофона, считал его на программаторе, есть софт, который по дампу показывает мастер-коды и прописанные ключи. Пошел в подъезд напротив, и открыл домофон используя полученный мастер-код от моего домофона. Выдрал оттуда eeprom и так-же вычитал его. Сравнил дампы, и понял, что в обоих домофонах прописаны ключи-вездеходы.
Мне захотелось иметь возможность аудита используемых ключей, и я наваял на ардуино сниффер считывателя+RTC+флешкарта, подключив это собственно к не моему оборудованию. Когда ограбили квартиру соседа этажом ниже, оказалось что вошли «парни» используя вездеход.
Насколько мои действия были законны? Это ли главный вопрос?
Главный вывод я сделал — домофон «от компании» — по дефолту большая дыра, за которую ещё и платишь. Так что если ставить — то свой, менять мастера, не вносить/убивать вездеходы, ставить марку к которой нет решения «в лоб» открытия без метки…
sumanai
Нет трубки- нет оплаты. Кому нужно- тот позвонит на сотовый. Хотя это удобно только для первых этажей, как у меня.
Зато никаких левых звонков с просьбой открыть, которые, судя по моему опыту, чаще всего удовлетворяются. Так что никакие уникальные двери не защитят в случае, когда открывают сами жильцы.
Почтальоны/ЖЭК/ прочие службы. Всё это конечно решается, но больно много геморроя.
Merkat0r
настолько, что при желании вам легко пришьют то, что это вы домушникам помогли и еще вагон и тележечку.
Про ключи — как и выше — да, бесполезно — всегда есть код, который добрые соседи расскажут по секрету всему свету.
А, есть трубка или нет — пофиг, оно в общую платежку включено — все равно платить придется
electronus
Код как-раз был в секрете, и никто него не знал. Но то что он был одинаков для ближайших 10 подъездов — это проблема. Желание и действительность — разные вещи. Мой пассаж о рассуждениях о законности сводится к тому, что камеру ставить нужно в любом случае, не взирая на законность. А то получается: обычным гражданам — закон, а злоумышленникам — всё.
sumanai
У меня не так, я без трубки и ничего не плачу. Только раз в 3 месяца в последний год начала приходить слёзная бумажка, мол, без ваших денег весь подъезд загнётся. То, что основная проблема в этих самых жителях подъезда, они не знают.