Расскажу свой опыт работы с ioBroker для управления шлагбаумами на ферме и интеграции их в голосовые ассистенты Алису и Siri. А также, познакомлю с контроллером JetHome D1 и особенностями его использования для ioBroker.

Рассказывать буду не очень подробно, но указывая на методы решения, так что многие, кто увлекается автоматизацией, смогут повторить это у себя. Если интересны детали или не понимаете как реализован конкретный функционал - спрашивайте тут или ищите меня в Телеграме.

Проблематика

В агропарке, на территории которого моя жена организовала свою ферму, установили шлагбаумы по периметру. Несколько штук.

Оказалось, что много машин будут перемещаться без пульта, для которых надо эти шлагбаумы открывать. Шлагбаумы располагаются далеко от построек и очень не хотелось человека с пультом постоянно гонять открывать их.

Вариантов решений, конечно, можно придумать много. Я предложил использовать Телеграм-бот для открывания шлагбаума (в дополнение к пультам). Те сотрудники, кому выдали бота смогут открывать шлагбаум при подъезде, а для остальных приезжающих/уезжающих шлагбаум можно будет открыть удаленно.

Подключение к шлагбауму

Благо, к решению вопроса подключились заранее - у шлагбаумов установлены камеры, а значит есть возможность получить доступ к общей сети. Расстояния были большие и до шлагбаумов идет “оптика”, в шкафу есть коммутаторы со свободными ethernet-разъемами.

Шлагбаумы были настроены в режим, когда нажатие кнопки на пульте открывало его и через некоторое время он сам закрывался, если нет помехи. В шлагбаумах используется управляющая плата CAME ZL38. Согласно инструкции, для открывания шлагбаума достаточно организовать замыкание пары контактов на плате управления (контакты 2 и 7). С этим может справиться реле с сухими контактами.

Схема для подключения
Схема для подключения
После подключения
После подключения

Я выбрал ethernet-реле, которое может принимать команды по нескольким протоколам: MQTT, Modbus, TCP, UDP и др. Дополнительно, оно позволяет подключить вход, чтобы например, отслеживать открытие шлагбаума. Для этого необходимо подключить датчик напряжения вместо лампы индикатора на управляющей плате(контакты E и 10). Запитать реле так же можно от блока управления шлагбаумом, подключив к 24v (контакты 10 и 11).

Ethernet-реле
Ethernet-реле
Датчик напряжения
Датчик напряжения

Контроллер JetHome D1

Для реализации Телеграм-бота я планировал добавить небольшой контроллер в общую сеть и на нем запустить бота, который будет управлять шлагбаумами.

Год назад у меня появился хороший кандидат на эту роль - контроллер JetHome D1. http://jethome.ru/jethub-d1 

Контроллер JetHome D1
Контроллер JetHome D1

Это такой сервер на Armbian с готовой обвязкой, интерфейсами Ethernet, Wifi, Bluetooth, Zigbee, RS-485, 1-Wire. А также имеет 4 сухих входа и 3 релейных выхода. Он удобен для размещения в шкафу на DIN-рейку. В моей версии был 1Гб оперативной памяти и 8Гб на карте.

Для управления шлагбаумами ресурсов предостаточно и также можно будет в дальнейшем расширять функционал для управления другими устройствами - интерфейсы позволяют.

Ставим ioBroker

Вариантов софта было много, но так как я чаще использую ioBroker, то решил поставить его.

Минимальный набор адаптеров для фермы
Минимальный набор адаптеров для фермы

Для того чтобы управлять сетевыми реле необходимо поднять mqtt-брокер - поэтому ставим mqtt-адаптер и запускаем его в режиме “Server/Broker”.

Простые настройки MQTT-адаптера
Простые настройки MQTT-адаптера

Адрес и реквизиты этого сервиса указываем в настройках реле и оно появляется в объектах:

Набор состояний после подключения реле по MQTT
Набор состояний после подключения реле по MQTT

Для открытия шлагбаума нужно на короткое время замкнуть реле, в моем случае 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 сети, в которую я подключаю свои контроллеры. Тем самым они начинают видеть друг-друга и могут взаимодействовать.

Это можно организовать разными способами:

Мне очень понравился контроллер 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-сети и настройки передачи топиков.

Подключение MQTT-клиента
Подключение MQTT-клиента
Настройка трансляции топиков
Настройка трансляции топиков

Вуаля, все параметры реле теперь доступны и на этом контроллере. Можно добавлять их в свой бот или к своим ассистентам.

Добавляем устройства для Алисы

Теперь, когда топики управления шлагбаумами доступны, добавим управление ими в Алису.

Для каждого шлагбаума создадим состояния, отвечающие за состояние “открыт”/”закрыт”.

Все созданные состояния, как для Алисы, так и для Сири
Все созданные состояния, как для Алисы, так и для Сири

Дополнительно напишем скрипты которые меняют эти состояния при изменении топика реле. И наоборот, будем отправлять в топик команду при смене состояния. Тут важно не ошибиться с 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");
    }
});

Теперь в адаптере “Устройства” добавим устройства с типом “ворота” и укажем у них соответствующие созданные состояния.

Список устройств
Список устройств
Настройка соответствия устройства и состояния ioBroker
Настройка соответствия устройства и состояния ioBroker

А в настройках адаптера 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”.

Настройка соответствия homekit-устройств и состояний ioBroker
Настройка соответствия homekit-устройств и состояний ioBroker

После этого, подключаем наш виртуальный шлюз в приложении Дом на iphone и оставляем настроенный Apple TV на даче, чтобы иметь возможность управлять удаленно. Теперь, моя жена просит Сири открыть нужный шлагбаум не открывая Телеграм и ища нужный чат с ботом.

Комментарии (2)


  1. DimaPushka
    03.12.2021 09:41

    Это гениально!


    1. eurol
      03.12.2021 10:51

      Гениально, что 1Гб может не хватать для решения относительно несложной задачи? :)