Часть 2.
Предыдущая часть1.
Для интеграции modbus TCP нам понадобится изменить конфигурационные файлы. В свою очередь, для этого нам нужно установить редактор. Сделать это можно, перейдя в «Настройки» на левой боковой панели, и выбрав пункт «Приложения». Справа внизу будет кнопка «Установить приложение». Нажав не нее, вы перейдете на вкладку с приложениями и поисковой строкой поверх приложений. Нужно набрать в поиске «file editor» (он уже предустановлен) и выбрать его (рис. 1).

Рис.1 Установка File Editor.
После автоматических процедур он появится в списках ваших приложений. Можно заходить в него через «Настройка»->«Приложения»->«File editor», а можно добавить на левую боковую панель. Для этого нужно зайти в это приложение и выбрать пункт «Показывать на боковой панели».
Для редактирования файлов нужно зайти в это приложение и нажать на кнопку «Открыть веб-интерфейс». Для выбора конкретного файла нужно в открывшемся окне нажать на папку сверху слева. Нам понадобятся 2 файла «configuration.yaml» и «automations.yaml».
Настройки файла «configuration.yaml» следующие:
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
# group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
input_select:
boiler_mode:
name: "Режим работы котла"
options:
- "Отопление"
- "Недельный график1"
- "Комнатный"
- "Уличный"
- "Антизамерзание"
- "Недельный график2"
max_tan_day:
name: "Максимальное число ТЭНов днем"
options:
- "1 ТЭН"
- "2 ТЭНа"
- "3 ТЭНа"
max_tan_night:
name: "Максимальное число ТЭНов ночью"
options:
- "1 ТЭН"
- "2 ТЭНа"
- "3 ТЭНа"
street_mode_value:
name: "Температурная зависимость для уличного режима"
options:
- "Температурная зависимость номер 22"
- "Температурная зависимость номер 25"
- "Температурная зависимость номер 30"
- "Температурная зависимость номер 35"
- "Температурная зависимость номер 40"
- "Температурная зависимость номер 45"
- "Температурная зависимость номер 50"
- "Температурная зависимость номер 55"
- "Температурная зависимость номер 60"
extern_cntrl:
name: "Внешнее управление"
options:
- "Запрещено"
- "Opentherm"
- "Термостат"
input_boolean:
dhw_switch:
name: "Включение ГВС"
icon: mdi:water
modbus:
- name: modbus_tcp_hub
type: tcp
host: 192.168.0.103
port: 502
delay: 500
timeout: 10
close_comm_on_error: false
sensors:
- name: "Текущий режим" # Текущий режим работы котла
slave: 1
scale: 1
data_type: uint16
input_type: holding
address: 0
unique_id: current_mode
precision: 1
- name: "Температура теплоносителя" # Измеренная температура теплоносителя
unit_of_measurement: °C
slave: 1
scale: 0.1
data_type: int16
input_type: input
address: 0
device_class: temperature
unique_id: "carrier_temp"
precision: 1
- name: "Температура в помещении" # Измеренная температура воздуха в помещении
unit_of_measurement: °C
slave: 1
scale: 0.1
data_type: int16
input_type: input
address: 1
device_class: temperature
unique_id: "room_temp"
precision: 1
- name: "Температура на улице" # Измеренная температура воздуха на улице
unit_of_measurement: °C
slave: 1
scale: 0.1
data_type: int16
input_type: input
address: 2
device_class: temperature
unique_id: "out_temp"
precision: 1
- name: "Температура ГВС" # Измеренная температура ГВС
unit_of_measurement: °C
slave: 1
scale: 0.1
data_type: int16
input_type: input
address: 4
device_class: temperature
unique_id: "dhw_temp"
precision: 1
- name: "Статус уантификации"
slave: 1
data_type: int16
input_type: input
address: 17
unique_id: "code_value"
precision: 1
- name: "Текущая мощность" # Используемая мощность в %
unit_of_measurement: "%"
slave: 1
scale: 0.01
data_type: uint16
input_type: input
address: 3
device_class: power_factor
unique_id: "curr_pwr"
precision: 1
- name: "Текущее давление" # Текущее давление *100
unit_of_measurement: "бар"
slave: 1
scale: 0.01
data_type: uint16
input_type: input
address: 18
device_class: pressure
unique_id: "curr_prssr"
precision: 0.01
climates:
- name: Set_Carrier_Temp
address: 1
input_type: holding
data_type: int16
max_temp: 85
min_temp: 8
slave: 1
precision: 0.1
scale: 0.1
target_temp_register: 1
temp_step: 0.5
temperature_unit: °C
unique_id: "Heat_mb"
- name: set_air_temp
address: 2
input_type: holding
data_type: int16
max_temp: 85
min_temp: 8
slave: 1
precision: 0.1
scale: 0.1
target_temp_register: 2
temp_step: 0.5
temperature_unit: °C
unique_id: "air_mb"
- name: "Максимальная температура теплоносителя"
address: 4
input_type: holding
data_type: int16
max_temp: 85
min_temp: 18
slave: 1
precision: 0.1
scale: 0.1
target_temp_register: 4
temp_step: 0.5
temperature_unit: °C
unique_id: "max_temp_mb"
- name: DHW_temp_set_mb
address: 5
input_type: holding
data_type: int16
max_temp: 75
min_temp: 40
slave: 1
precision: 1
scale: 0.1
target_temp_register: 5
temp_step: 0.5
temperature_unit: C
unique_id: "DHW_mb"
mqtt: !include mqtt.yaml
logger:
default: warning
logs:
homeassistant.components.modbus: debug
pymodbus.client: debug
Настройки файла «automations.yaml» следующие
:
- alias: "Установить код доступа"
id: set_key
description: "Записать код в регистр 17 котла"
trigger:
- platform: state
entity_id: input_boolean.boiler_code_trigger
to: "on"
action:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 17
value: 36704
- delay:
seconds: 2
- service: input_boolean.turn_off
target:
entity_id: input_boolean.boiler_code_trigger
- service: persistent_notification.create
data:
title: "Modbus"
message: "Код отправлен в регистр 17 котла"
mode: single
max_exceeded: silent # чтобы не засорять логи при частых срабатываниях
- alias: "Установить режим котла"
description: "Записать код режима в регистр 0 при изменении режима"
trigger:
- platform: state
entity_id: input_select.boiler_mode
action:
- choose:
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Отопление"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 0
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Отопление (код 0)"
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Недельный график1"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 1
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Недельный график1 (код 1)"
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Комнатный"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 2
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Комнатный (код 2)"
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Уличный"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 3
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Уличный (код 3)"
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Антизамерзание"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 4
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Антизамерзание (код 4)"
- conditions:
- condition: state
entity_id: input_select.boiler_mode
state: "Недельный график2"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 0
value: 5
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Режим: Недельный график2 (код 5)"
- alias: "Количество ТЭНов днем"
id: tan_day_switch
description: "Выбрать количество"
trigger:
- platform: state
entity_id: input_select.max_tan_day
action:
- choose:
- conditions:
- condition: state
entity_id: input_select.max_tan_day
state: "1 ТЭН"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 7
value: 1
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор днем: 1 ТЭН (код 1)"
- conditions:
- condition: state
entity_id: input_select.max_tan_day
state: "2 ТЭНа"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 7
value: 2
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор днем: 2 ТЭНа (код 2)"
- conditions:
- condition: state
entity_id: input_select.max_tan_day
state: "3 ТЭНа"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 7
value: 3
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор днем: 3 ТЭНа (код 3)"
- alias: "Количество ТЭНов ночью"
id: tan_night_switch
description: "Выбрать количество"
trigger:
- platform: state
entity_id: input_select.max_tan_night
action:
- choose:
- conditions:
- condition: state
entity_id: input_select.max_tan_night
state: "1 ТЭН"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 3
value: 1
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор ночью: 1 ТЭН (код 1)"
- conditions:
- condition: state
entity_id: input_select.max_tan_night
state: "2 ТЭНа"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 3
value: 2
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор ночью: 2 ТЭНа (код 2)"
- conditions:
- condition: state
entity_id: input_select.max_tan_night
state: "3 ТЭНа"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 3
value: 3
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбор ночью: 3 ТЭНа (код 3)"
- alias: "Установить температурную зависимость"
description: "Установить номер температурной зависимости для уличного режима"
trigger:
- platform: state
entity_id: input_select.street_mode_value
action:
- choose:
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 22"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 0
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№22 (код 0)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 25"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 1
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№25 (код 1)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 30"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 2
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№30 (код 2)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 35"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 3
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№35 (код 3)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 40"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 4
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№40 (код 4)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 45"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 5
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№45 (код 5)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 50"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 6
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№50 (код 6)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 55"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 7
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№55 (код 7)"
- conditions:
- condition: state
entity_id: input_select.street_mode_value
state: "Температурная зависимость номер 60"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 14
value: 8
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Режим уличный"
message: "№60 (код 8)"
- alias: "Внешнее управление"
id: extern_cntrl_switch
description: "Подключить внешнее управление"
trigger:
- platform: state
entity_id: input_select.extern_cntrl
action:
- choose:
- conditions:
- condition: state
entity_id: input_select.extern_cntrl
state: "Запрещено"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 16
value: 0
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Запрет внешнего управления"
- conditions:
- condition: state
entity_id: input_select.extern_cntrl
state: "Opentherm"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 16
value: 1
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбан opentherm"
- conditions:
- condition: state
entity_id: input_select.extern_cntrl
state: "Термостат"
sequence:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 16
value: 2
- delay:
seconds: 2
- service: persistent_notification.create
data:
title: "Котёл"
message: "Выбран термостат"
- alias: "Включение ГВС"
description: "Включить ГВС"
trigger:
- platform: state
entity_id: input_boolean.dhw_switch
to: "on"
action:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 6
value: 1 # код для включения ГВС
- alias: "Выключение ГВС"
description: "Выключить ГВС"
trigger:
- platform: state
entity_id: input_boolean.dhw_switch
to: "off"
action:
- service: modbus.write_register
data:
hub: modbus_tcp_hub
slave: 1
address: 6
value: 0 # код для выключения ГВС
Эти два файла создают сущности параметров управления котлом, а также указывают, что нужно делать при нажатии или выборе того или иного параметра. IP-адрес в настройках modbus в разделе «host» указать нужно тот, что у котла (чтобы он не менялся, его можно задать статически при подключении к WiFi-сети, в противном случае, с включенным dhcp, он будет периодически меняться).
Важно также заметить, что среди создаваемых автоматизаций есть одна особая — «Установить код доступа». Без отправки этого кода задание настроек котлу (если код ранее не вводился) не будет применяться. Для отправки кода нужно посмотреть код modbus в локальном веб-интерфейсе (рис.2).

Рис.2 Ключ modbus.
И прописать в automations.yaml (рис.3).

Рис.3 Запись ключа modbus.
Запуск же этой автоматизации происходит при нажатии на «Запустить действия», если зайти в автоматизацию. А подтверждение о том, что авторизация прошла можно увидеть в «Состоянии подключения», если 1, то прошла, если 0, то нет.
Немаловажно сделать также правильную организацию рабочего пространства. Чтобы все параметры котла находились в одном рабочем пространстве. Например, я создал для этого рабочее пространство «Котел» и переместил все, что к нему относится туда (рис.4).

Рис.4 Организация рабочего пространства.
Создается пространство в разделе «Настройки»->«Пространства, зоны и ярлыки» нажатием на кнопку в нижнем правом углу «Добавить пространство». А перемещается сущность в это пространство при заходе в ее настройки и выборе пространства (рис.5).

Рис.5 Выбор пространства для сущности.
После выбора пространства сущность перемещается туда.
Если все сделано верно, то в течение минуты с момента включения должны появиться значения температур и выбранных режимов, и котлом можно управлять через Home Assistant.
В завершении хочу отметить, что представлены не все параметры котла, а только самые основные. Однако все они могут быть настроены по аналогии. С полным списком параметров, а также их регистрами можно ознакомиться ниже.
код- 0х06 write registers (Запись одного AO).
| смещение | параметр |
| 0 | Задание режима работы: 0 — отопление, 1 — недельный график1, 2 — комнатный, 3 — уличный, 4 — антизамерзание, 5 — недельный график2. |
| 1 | Заданная температура теплоносителя от 8 до 85 |
| 2 | Заданная температура воздуха от 5 до 35 |
| 3 | Задание максимального количества ступеней мощности ночью(ограничение) |
| 4 | Задание максимальной температуры теплоносителя |
| 5 | Заданная температура ГВС от 40 до 75 |
| 6 | Задание работы ГВС: 1 — включено, 0 — выключено. |
| 7 | Задание максимального количества ступеней мощности днем(ограничение) |
| 8 | Задание начала ночного времени. 0хММЧЧ, ММ — минуты, ЧЧ — часы. |
| 9 | Задание начала дневного времени. 0хММЧЧ, ММ — минуты, ЧЧ — часы. |
| 10 | Задание алгоритма нагрева. Бит 0 — алгоритм теплоносителя, бит 1 — ГВС. |
| 11 | Команда на перезагрузку пульта управления. |
| 12 | Не задан. |
| 13 | Не задан. |
| 14 | Задание номера температурной кривой для уличного режима:
0 — кривая номер 22; |
| 15 | Задание времени выбега насоса (доступно для «Эксперт» и «Stout»)
Бит 7 = 0 — настройка скрыта. 0х80- постоянная работа насоса; 0х81 — выбег 5 мин; 0х82 — выбег 10 мин; 0х83 — выбег 15 мин. |
| 16 | Подключить внешнее управление. 0 — запрещено, 1 — opentherm, 2 — термостат. |
| 17 | Ввод ключа для авторизации. |
| 18 | Не задан. |
| 19 | Не задан. |
| 20 | Не задан. |
| 21 | Не задан. |
код- 0х03 holding registers (Чтение AO).
| смещение | параметр |
| 0 | Режим работы: 0 — отопление, 1 — недельный, 2 — комнатный, 3 — уличный, 4 — антизамерзание. |
| 1 | Заданная температура теплоносителя от 8 до 85 |
| 2 | Заданная температура воздуха от 0 до 35 |
| 3 | Максимальное количество ступеней мощности ночью (ограничение) |
| 4 | Максимальная температура теплоносителя |
| 5 | Заданная температура ГВС от 40 до 75 |
| 6 | Задано состояние ГВС 1 — включено, 0 — выключено. |
| 7 | Роль первого датчика т. воздуха: 1 — не задан; 2 — уличный; 3 — комн; 4 -откл-ся. |
| 8 | Роль второго датчика т. воздуха: 1 — не задан; 2 — уличный; 3 — комн; 4 — откл-ся. |
| 9 | Роль третьего датчика т. воздуха: 1 — не задан; 2 — уличный; 3 — комн; 4 — откл-ся. |
| 10 | Роль первого радиодатчика: 1 — не задан; 2-уличный; 3-комн;4 -откл-ся(доступно для «Эксперт»). |
| 11 | Роль второго радиодатчика:1 -не задан; 2-уличный; 3-комн; 4 -откл-ся(доступно для «Эксперт»). |
| 12 | Тип котла, 1 — Эксперт, 2 — Стаут, 3 — Практик. |
| 13 | Количество ступеней мощности в котле. |
| 14 | Номер температурной кривой для уличного режима. |
| 15 | Время выбега насоса (доступно для «Эксперт» и «Stout»), 0 — постоянная работа, 1 -5, 2- 10, 3 — 15 минут. 0..6 биты – значение , 7 – бит поддерживаемость выбега насоса силовой платой, 1 – поддерживает, 0 – нет. |
| 16 | Версия ПО платы контроллера 1 и 2 байт (символы char) |
| 17 | Версия ПО платы контроллера 3 и 4 байт (символы char) |
| 18 | Версия ПО платы контроллера 5 байт (символы char) |
| 19 | Версия ПО платы управления 1 и 2 байт (символы char) |
| 20 | Версия ПО платы управления 3 и 4 байт (символы char) |
| 21 | Версия ПО платы управления 5 байт (символы char) |
| 22 | Роль метеосервера: 1- не задан; 2- уличный; 3 — комн; 4 — откл-ся. |
| 23 | Максимальное количество ступеней мощности днем(ограничение) |
| 24 | Значение регистра котла flagsIn |
код- 0х04 input registers (Чтение AI).
| смещение | параметр |
| 0 | Измеренная температура теплоносителя (int16_t) |
| 1 | Измеренная температура воздуха в помещении (int16_t) |
| 2 | Измеренная температура воздуха на улице (int16_t) |
| 3 | Процент задействованной мощности в текущий момент (uint8_t) |
| 4 | Измеренная температура ГВС от 40 до 75 (int16_t) |
| 5 | Фактическое состояние ГВС: 1 — ГВС, 0 — Отопление. |
| 6 | Флаги ошибок:
0x0001 — обрыв датчика давления 0x0002 — давление ниже разрешенного 0x0004 — давление выше разрешенного 0x0008 — обрыв датчика температуры теплоносителя 0x0010 — сработал датчик перегрева 0x0100 — обрыв комнатного датчика температуры в режимах: комнатный, недельный, теплый пол 0x0200 — обрыв уличного датчика температуры в режиме уличный 0x0400 — есть активные сообщения (проблемы с реле) 0x8000 — нет связи по rs485 |
| 7 | 10 *Температура воздуха — датчик 1 (int16_t). |
| 8 | 10 *Температура воздуха — датчик 2 (int16_t). |
| 9 | 10 *Температура воздуха — датчик 3 (int16_t). |
| 10 | Режим внешнего управления:
0 — запрещено; 1 — OpenTherm; 2 — Thermostat. |
| 11 | 10 *Температура воздуха первого радиодатчика (int16_t, доступно для «Эксперт»). |
| 12 | 10 *Температура воздуха второго радиодатчика (int16_t, доступно для «Эксперт»). |
| 13 | 10 *Температура воздуха полученная от метеосервера (int16_t). |
| 14 | Мак-адрес1 и 2 байт |
| 15 | Мак-адрес 3 и 4 байт |
| 16 | Мак-адрес 5 и 6 байт |
| 17 | Состояние активации modbus, 1 — вкл., 0 — выкл. |
| 18 | Текущее давление умноженное на 100 |
Уведомление: Установка Home Assistant на ПК | Жизнь, бизнес и IT