Продолжаем делать свою систему мониторинга. Почему бы не добавить управления холодильным оборудованием?

Сегодня у нас на столе (и в наших шкафах) контроллер EliWell ID Plus974.
Что же это за зверь такой?
Приборы серий ID Plus 974 – это контроллеры с тремя цифровыми выходами (реле), двумя температурными датчиками (регулятора и испарителя), одним мультифункциональным входом, который может использоваться как цифровой вход или как датчик температуры и одним цифровым входом, подключаемым к TTL порту прибора.
Кстати, кто там постоянно в интернете воет что время восьмибитных контроллеров прошло? Что их место на свалке истории. Что они кроме как моргать светодиодами ни на что серьезное не годятся. И что их 10 битный АЦП, в современной жизни, ни на что не годится. И так далее. Так вот. Это чудо техники построено на Atmel mega32a.
Долго мне не давал покоя, находящийся у него на борту разъем с подписью TTL. Раз есть TTL значит его можно использовать. Если производитель не "закоммерциализировал" все то, что там происходит. Собственно это так и оказалось. В какой-то степени. На борту по умолчанию активирован соственный протокол компании под названием "televis". Но мы люди простые. Не нужны нам всякие там televis`ы. Нам подавай наш любимый modbus. К счастью он там есть.
Жизнь начинает налаживаться. Осталось определиться как подключиться к нему физически.
Modbus поверх TTL - уже большое дело. Превратить его в 485 - не большая проблема. Но об этом в другой раз.
Начинаем вытаскивать из нашего "друга" данные. и начнем им управлять из нашей системы home assistant.
Формат данных RTU:
8 бит данных
бит четности - по умолчанию отсутсвует. настраивается.
стоповых бита 2 - настраивается.
скорость обмена 9600 бод - не меняется.
Адрес устройства задается в настройках меню второго уровня. В папке параметров Add. Тут остановимся чуть подробнее, ибо есть особенности. Адрес хранится в двух параметрах. Старшая часть адреса в параметре FAA, а младшая часть в параметре dEA. Таким образом адрес устройства определяется по формуле: FAA x 16 + dEA
Например: FAA = 1, dEA = 5. 1 х 16 + 5 = 21
Проще мыслить в шестнадцатиричной системе. В одном параметре первая F, во втором - вторая. Конечный адресс FF = 255.
В стандартной инструкции отсутствует информация о modbus, кроме случая упоминания его в настройках. Пришлось покапаться в интернете что бы откопать инструкцию где это все написано. И она была найдена.
Из основного нас интересуют регистры: AI1, B_Alarm, Compressor, Defrost, Fans,stand-by, ROnOn, ROffOff. Этого нам уже достаточно.
Если с регистрами на чтение все просто - взяли и прочитали. То с командами управления немножко сложнее. Дело в том, что если послать контроллеру команду на выполнение, он ее проигнорирует. Для того что ты он ее не проигнорировал нужно запустить таймер в течение работы которого он принимает команды. Делается это записью времени в секундах в 115 регистр. То есть сначала записываем в 115 регистр время в секундах, а потом в течение этого времени успеваем дать команду которую надо выполнить. Не успели? Добро пожаловать в начало.
Перейдём теперь к настройке ESP и Home Assiatant.
У нас два типа, не знаю как сказать, данных. Это датчики и бинарные датчики. Начнем с датчика температуры. Тут все просто. Читаем регистр по адресу. У нас в нем находится слово. Точнее целочисленное 16 битное значение со знаком. Int16. Или в esphome S_WORD
sensor:
- platform: modbus_controller
name: "FR_17_Temperature"
register_type: holding
address: 0x127
value_type: S_WORD
filters:
- multiply: 0.1
unit_of_measurement: "°C"
device_class: temperature
accuracy_decimals: 1
С бинарными датчиками ситуация не сложнее. Считываем регистр и применяя битовую маску вычленяем нужный нам бит.
binary_sensor:
- platform: modbus_controller
name: FR_17_Compressor
register_type: holding
address: 32886
bitmask: 0x08
icon: mdi:snowflake
С управлением немного сложнее. Для включения и выключения контроллера нужно записывать единицы в разные регистры. Которые после выполнения команды обнуляются. А перед этим еще прописать время ожидания команды, что бы контроллер нас не проигнорировал. Таким образом нужно выполнить последовательно два действия: записать время в 115 регистр и записать единицу в регистр включения или отключения контроллера.
При работе с modbus в esphome мы можем использовать переключатель и бинарный сенсор. Они нам не подходят. Кнопку ( button ) мы использовать стандартными средствами не можем. А нам нужна именно кнопка. Нажал, отпустил и забыл. Тем более что состояние считывается из другого регистра.
Что ж. Тут нам на помощь приходят template. и lambda. Эти друзья помогают нам делать все что мы захотим. Ну или почти все.
Делаем кнопку типа template, а в lambda прописываем что нам нужно сделать с modbus.
button:
- platform: template
id: fr_17_press
on_press:
then:
- lambda: |-
modbus_controller::ModbusController *controller = id(modbus_17);
modbus_controller::ModbusCommandItem press = modbus_controller::ModbusCommandItem::create_write_single_command(controller, 115, 1);
controller->queue_command(press);
Как мы вдими при помощи template и lambda мы можем по нажатию кнопки отправить в modbus то что нам нужно.
В примере указана только фукция записи времени ожидания. А нужно еще следом сделать второй действие. И тут нам на помощь приходит script. С ним мы можем еще больше.
script:
- id: fr_17_start
then:
- button.press: fr_17_press
- button.press: fr_17_power_on
- id: fr_17_stop
then:
- button.press: fr_17_press
- button.press: fr_17_power_off
Таким образом мы с помощью скрипта нажимаем нужные нам последовательности виртуальных кнопок. А нажатием кнопки template просто запускаем скрипт. Одно нажатие - одно действие для пользователя. Одно нажатие - два действия для контроллера.
- platform: template
name: "Камера 17 Включить"
on_press:
then:
- script.execute: fr_17_start
- platform: template
name: "Камера 17 Выключить"
on_press:
then:
- script.execute: fr_17_stop
Таким образом у нас команды уходят из ESP в EliWell по modbus. И по modbus считываются его состояния.Теперь мы можем сделать более подробную карточку холодильной камеры в дежурке. Где все становится подробнее.
Теперь помимо температуры видим что камера включена, работает компрессор и вентилятор. Дефрост отключен.
Наша панель становится информативнее. Более наглядно состояние оборудования в определенный момент времени.
Продолжение следует....