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

Сегодня у нас на столе (и в наших шкафах) контроллер 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 считываются его состояния.Теперь мы можем сделать более подробную карточку холодильной камеры в дежурке. Где все становится подробнее.
Теперь помимо температуры видим что камера включена, работает компрессор и вентилятор. Дефрост отключен.
Наша панель становится информативнее. Более наглядно состояние оборудования в определенный момент времени.
Продолжение следует....
