Расскажу свой опыт работы с ioBroker для управления шлагбаумами на ферме и интеграции их в голосовые ассистенты Алису и Siri. А также, познакомлю с контроллером JetHome D1 и особенностями его использования для ioBroker.
Рассказывать буду не очень подробно, но указывая на методы решения, так что многие, кто увлекается автоматизацией, смогут повторить это у себя. Если интересны детали или не понимаете как реализован конкретный функционал - спрашивайте тут или ищите меня в Телеграме.
Проблематика
В агропарке, на территории которого моя жена организовала свою ферму, установили шлагбаумы по периметру. Несколько штук.
Оказалось, что много машин будут перемещаться без пульта, для которых надо эти шлагбаумы открывать. Шлагбаумы располагаются далеко от построек и очень не хотелось человека с пультом постоянно гонять открывать их.
Вариантов решений, конечно, можно придумать много. Я предложил использовать Телеграм-бот для открывания шлагбаума (в дополнение к пультам). Те сотрудники, кому выдали бота смогут открывать шлагбаум при подъезде, а для остальных приезжающих/уезжающих шлагбаум можно будет открыть удаленно.
Подключение к шлагбауму
Благо, к решению вопроса подключились заранее - у шлагбаумов установлены камеры, а значит есть возможность получить доступ к общей сети. Расстояния были большие и до шлагбаумов идет “оптика”, в шкафу есть коммутаторы со свободными ethernet-разъемами.
Шлагбаумы были настроены в режим, когда нажатие кнопки на пульте открывало его и через некоторое время он сам закрывался, если нет помехи. В шлагбаумах используется управляющая плата CAME ZL38. Согласно инструкции, для открывания шлагбаума достаточно организовать замыкание пары контактов на плате управления (контакты 2 и 7). С этим может справиться реле с сухими контактами.
Я выбрал ethernet-реле, которое может принимать команды по нескольким протоколам: MQTT, Modbus, TCP, UDP и др. Дополнительно, оно позволяет подключить вход, чтобы например, отслеживать открытие шлагбаума. Для этого необходимо подключить датчик напряжения вместо лампы индикатора на управляющей плате(контакты E и 10). Запитать реле так же можно от блока управления шлагбаумом, подключив к 24v (контакты 10 и 11).
Контроллер JetHome D1
Для реализации Телеграм-бота я планировал добавить небольшой контроллер в общую сеть и на нем запустить бота, который будет управлять шлагбаумами.
Год назад у меня появился хороший кандидат на эту роль - контроллер JetHome D1. http://jethome.ru/jethub-d1
Это такой сервер на Armbian с готовой обвязкой, интерфейсами Ethernet, Wifi, Bluetooth, Zigbee, RS-485, 1-Wire. А также имеет 4 сухих входа и 3 релейных выхода. Он удобен для размещения в шкафу на DIN-рейку. В моей версии был 1Гб оперативной памяти и 8Гб на карте.
Для управления шлагбаумами ресурсов предостаточно и также можно будет в дальнейшем расширять функционал для управления другими устройствами - интерфейсы позволяют.
Ставим ioBroker
Вариантов софта было много, но так как я чаще использую ioBroker, то решил поставить его.
Для того чтобы управлять сетевыми реле необходимо поднять mqtt-брокер - поэтому ставим mqtt-адаптер и запускаем его в режиме “Server/Broker”.
Адрес и реквизиты этого сервиса указываем в настройках реле и оно появляется в объектах:
Для открытия шлагбаума нужно на короткое время замкнуть реле, в моем случае r1. Отправляем команду ON в топик /in/r1 и через секунду отправляем команду выключения.
При открытии шлагбаума у нас выставится признак на входе i1 и это сигнал к тому что шлагбаум открывается.
// подпишемся на ловлю открытия
const openhandler = on({id: "mqtt.0.dingtian.relay4207.out.i1", ack: true, val: 'ON'}, function(){
// уведомим что открывается
sendToTelegram("Восточный шлагбаум открывается");
// отпишемся
unsubscribe(openhandler);
});
setState("mqtt.0.dingtian.relay4207.in.r1", "ON");
setStateDelayed("mqtt.0.dingtian.relay4207.in.r1", "OFF", 1000);
Для реализации Телеграм-бота ставим Telegram-адаптер. А для написания логики бота и других сценариев добавляем javascript-адаптер.
Простое меню для открывания и уведомления об открытии шлагбаума пишется на JS.
С камерами можно поступить так: начать запись короткого видео, когда шлагбаум начал открываться - чтобы поймать того кто рядом со шлагбаумом или подъезжает к нему. Затем, записанное видео отправить “заинтересованным” пользователям Телеграм, но не всем.
Улучшение (или усложнение)
Для себя лично я решил сделать чуть улучшенный вариант управление шлагбаумами - подключить их к своим голосовым ассистентам Алисе и Сири. Для этого необходимо было “пробросить” управление устройствами с фермы до дачи, где у меня уже были подключены ассистенты.
Этот вопрос я решил посредством VPN сети, в которую я подключаю свои контроллеры. Тем самым они начинают видеть друг-друга и могут взаимодействовать.
Это можно организовать разными способами:
использовать сервис zerotier
получить бесплатный vps сервер в облаке, например на oracle и поднять простой сервис openvpn
Мне очень понравился контроллер JetHome D1 и я решил установить его также у себя на даче, вместо старого Атома (хотя он был мощнее и памяти там было 4Гб).
И вот тут важное замечание! На контроллере всего 1Гб, “а сил для игр и роста нужно много”. По умолчанию, контроллер ioBroker работает в классическом для него режиме: сам контроллер и каждый экземпляр адаптеров запускается в отдельном изолированном процессе. При большом количестве экземпляров адаптеров - памяти 1Гб не хватит и всё будет рушится.
Для этих целей в ioBroker реализован новый режим запуска контроллера и адаптеров - Compact. Он позволяет объединить все или несколько адаптеров в compact-группу и запускать ее единым процессом, тем самым экономя ресурсы. Но при падении одного из адаптеров группы, упадет вся группа. Этим он отличаются от раздельного запуска.
Включение Compact-режима запуска нужно сделать на контроллере и на адаптерах, поддерживающих такой режим запуска.
Включение compact-режима на контроллере:
iob compact on
Включение compact-режима на экземпляре адаптера (после on можно указать номер группы, в которую будут объединены экземпляры):
iob compact zigbee.0 on 0
Пришлось немного поколдовать над группами и набором адаптеров, чтобы запустить всё желаемое для дачи на этом контроллере. В итоге я перенес на него почти всю действующую логику:
телеграм-бота
голосовые ассистенты
устройства sonoff на прошивке tasmota
zigbee-устройства, на встроенный в контроллер модуль cc2538
управление котлом через OpenTherm
температурные датчики и построение графиков
Для доступа к контроллеру на ферме, достаточно подключиться к тому же mqtt-брокеру, что и реле. Сеть у нас общая и поэтому ставим mqtt-адаптер в режиме клиент, указываем адрес из vpn-сети и настройки передачи топиков.
Вуаля, все параметры реле теперь доступны и на этом контроллере. Можно добавлять их в свой бот или к своим ассистентам.
Добавляем устройства для Алисы
Теперь, когда топики управления шлагбаумами доступны, добавим управление ими в Алису.
Для каждого шлагбаума создадим состояния, отвечающие за состояние “открыт”/”закрыт”.
Дополнительно напишем скрипты которые меняют эти состояния при изменении топика реле. И наоборот, будем отправлять в топик команду при смене состояния. Тут важно не ошибиться с ack-подтверждением, чтобы не зациклить изменения.
on({id: "mqtt.0.dingtian.relay4207.in.r1", change: 'any'}, function(obj){
log(`выставим состояние Шлагбаум_восточный ${obj.state.val} по топику`);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный", (obj.state.val == 'ON'), true);
});
on({id: "0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный", ack: false, change: 'any'}, function(obj){
log(`пожелали переключить Шлагбаум_восточный ${obj.state.val}`);
// если попросили открыть
if (obj.state.val) {
setState("mqtt.0.dingtian.relay4207.in.r1", "ON");
setStateDelayed("mqtt.0.dingtian.relay4207.in.r1", "OFF", 1000);
} else {
setState("mqtt.0.dingtian.relay4207.in.r1", "OFF");
}
});
Теперь в адаптере “Устройства” добавим устройства с типом “ворота” и укажем у них соответствующие созданные состояния.
А в настройках адаптера iot для устройств будут найдены соответствия и созданы устройства Алисы, достаточно будет их переименовать. Про подключение Алисы к ioBroker можно почитать тут или тут.
Теперь устройства появятся в подключенном к Алисе навыке ioBroker:
И можно открывать шлагбаумы с любого устройства где есть Алиса.
Добавляем устройства для Сири
Для работы через Homekit также создадим вспомогательные состояния. В этом случае состояния должны быть разделены на current (текущее состояние, в имя состояния добавил окончание '_с') и target (целевое состояние, в имя состояния добавил '_t').
Также напишем скрипты для выполнения соответствующих изменений, при изменении топиков выставляем наши состояния в одинаковые значения, а при изменении target-состояний - отправляем в топики команды управления.
on({id: "mqtt.0.dingtian.relay4207.in.r1", change: 'any'}, function(obj){
log(`выставим состояние Шлагбаум_восточный ${obj.state.val} по топику`);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_c", (obj.state.val == 'ON') ? 0 : 1, true);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_t", (obj.state.val == 'ON') ? 0 : 1, true);
});
on({id: "0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_t", ack: false, change: 'any'}, function(obj){
log(`пожелали переключить Шлагбаум_восточный ${obj.state.val}`);
// если попросили открыть
if (obj.state.val == 0) {
setState("mqtt.0.dingtian.relay4207.in.r1", "ON");
setStateDelayed("mqtt.0.dingtian.relay4207.in.r1", "OFF", 1000);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_c", 1, true);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_t", 0, true);
setStateDelayed("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_c", 0, true, 1000);
setStateDelayed("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_t", 0, true, 1000);
} else {
setState("mqtt.0.dingtian.relay4207.in.r1", "OFF");
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_c", 1, true);
setState("0_userdata.0.Шлагбаумы_и_ворота.Шлагбаум_восточный_t", 1, true);
}
});
И соответственно, добавляем устройства в адаптере “yahka”.
После этого, подключаем наш виртуальный шлюз в приложении Дом на iphone и оставляем настроенный Apple TV на даче, чтобы иметь возможность управлять удаленно. Теперь, моя жена просит Сири открыть нужный шлагбаум не открывая Телеграм и ища нужный чат с ботом.