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

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

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

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

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

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

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

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

Разъем выделен на схеме желтым. Контакты по порядку: VCC RX TX D.I.2 GND
Разъем выделен на схеме желтым. Контакты по порядку: 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 считываются его состояния.Теперь мы можем сделать более подробную карточку холодильной камеры в дежурке. Где все становится подробнее.

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

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

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

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

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

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