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

Сегодня у нас на столе (и в наших шкафах) контроллер EliWell ID Plus974.

Что же это за зверь такой?

Приборы серий ID Plus 974 – это контроллеры с тремя цифровыми выходами (реле), двумя температурными датчиками (регулятора и испарителя), одним мультифункциональным входом, который может использоваться как цифровой вход или как датчик температуры и одним цифровым входом, подключаемым к TTL порту прибора.

Собственно сам контроллер. Мозг холодильной установки. Почему не сердце? Да потомучто сердце это копмрессор.

Кстати, кто там постоянно в интернете воет что время восьмибитных контроллеров прошло? Что их место на свалке истории. Что они кроме как моргать светодиодами ни на что серьезное не годятся. И что их 10 битный АЦП, в современной жизни, ни на что не годится. И так далее. Так вот. Это чудо техники построено на Atmel mega32a.

Долго мне не давал покоя, находящийся у него на борту разъем с подписью TTL. Раз есть TTL значит его можно использовать. Если производитель не "закоммерциализировал" все то, что там происходит. Собственно это так и оказалось. В какой-то степени. На борту по умолчанию активирован соственный протокол компании под названием "televis". Но мы люди простые. Не нужны нам всякие там televis`ы. Нам подавай наш любимый modbus. К счастью он там есть.

Жизнь начинает налаживаться. Осталось определиться как подключиться к нему физически.

Разъем выделен на схеме желтым. Контакты по порядку: VCC RX TX D.I.2 GND

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

Обновленная карточка холодильника.

Теперь помимо температуры видим что камера включена, работает компрессор и вентилятор. Дефрост отключен.

А тут у нас дефростация.

Наша панель становится информативнее. Более наглядно состояние оборудования в определенный момент времени.

Продолжение следует....