Для интерграции с Home Assistant нужно выполнить следующие действия:
- Выбираем "Base64 Encode"
- В первое поле вводим ваше логин и пароль в формате "login:passoword" (без ковычек)
- Жмем "Encode" и получаем закодированное значение во втором поле. Сохраняем его в надежном месте.
- Выбираем метод "POST"
- В адрес вставляем URL: https://lk.zont-online.ru/api/get_authtoken
- Во вкладке "Headers" выбираем "Text editor"
- Вставляем набор Header'ов:
content-type: application/json
authorization: Basic XXXXXXXX
x-zont-client: your@email
client_name: "Home Assistant"
где вместо XXXXXXXX закодированное значение логина и пароля из пункта №1.
- Жмем кнопку отправки запроса. Если все верно, внизу будет код ответ "200", а в теле ответа нас интересует значение "token". Сохраняем его в надежном месте.
- Выбираем метод "POST"
- В адрес вставляем URL: https://lk.zont-online.ru/api/devices
- Во вкладке "Headers" выбираем "Text editor"
- Вставляем набор Header'ов:
content-type: application/json
x-zont-client: your@email
x-zont-token: YYYYYYYY
где вместо YYYYYYYY значение токена из пункта №2.
- Во вкладке "Body" заполняем значение: {"load_io":true}
- Жмем кнопку отправки запроса. Если все верно, внизу будет код ответ "200", а в ответе будет большой JSON с параметрами вашего устройства, с которым далее и будем работать. Рекомендую его вставить в какой-нибудь обработчик JSON (можно веб версии, можно через notepad++), так удобнее работать.
Далее все сильно зависит от модели вашего устройства и ваших потребностей, как выяснилось, у разных устройств разные структуры ответов и команд. Например, то что описано в статье на sprut.ai не подошло для моего устройства и я обращался в тех. поддержку ZONT, которая мне предоставила команды для моего устройства. А офф. документация к API была устаревшая. По этому, если мои команды не работают, пробуйте из статьи на sprut.ai, а если и они не работают, то пишите в поддержку ZONT.
Итак, теперь вам из ответа в пункте №3 необходимо получать id компонентов, которие вы ходите читать или управлять, а точнее не просто id, а JSON-путь до атрибутов. Основное, что тут требуется это значение для device_id. А разные значения - температура, статусы и т.д. ищутся ниже по дереву. Идентификатор прибора (device_id) можно увидеть в настройках. Идентификатор отопительного контура (object_id): нужно отправить запрос на https://zont-online.ru/api/devices, найти нужный контур в ответе в массиве devices[].z3k_config.heating_circuits, и у нужного контура взять значение поля id.
- Запрос для смены целевой температуры выглядит так:
https://zont-online.ru/api/send_z3k_command
{
"device_id": ..., // идентификатор прибора
"object_id": ..., // идентификатор контура
"command_name": "TargetTemperature",
"command_args": {"value": 56}, // желаемая целевая
"is_guaranteed": false/true
}
- Запрос для смены режима:
https://zont-online.ru/api/send_z3k_command
{
"device_id": ..., // идентификатор прибора
"object_id": ..., // идентификатор режима
"command_name": "SelectHeatingMode",
"command_args": null,
"is_guaranteed": false/true
}
Идентификатор режима можно найти также в ответе на запрос devices в devices[].z3k_config.heating_modes [].id.
is_guaranteed — признак гарантированной доставки команды. Если команду не удастся доставить сразу же, сервер запомнит её и будет пытаться доставить снова при выходе прибора на связь, пока прибор не подтвердит получение. Если false, сервер сделает однократную попытку доставить команду.
Все зависит от ваших желаний и потребностей, ниже два варианта сделанных через Packages. Плюс приложу мой конфиг, который работает уже пару лет. По примерам, думаю, каждый сможет разобраться.
Получает только используемые атрибуты. Более правильный метод
climate_heating:
rest:
- resource: https://zont-online.ru/api/devices
method: POST
scan_interval: 60
timeout: 20
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"load_io": true}'
sensor:
- name: "zont_rest_first_floor_temperature"
json_attributes_path: "$.devices[0].io.z3k-state.4099"
value_template: "OK"
json_attributes:
- "temperature"
- name: "zont_rest_moduletion"
json_attributes_path: "$.devices[0].io.z3k-state.20600.ot"
value_template: "OK"
json_attributes:
- "rml"
- name: "zont_rest_status_heating"
json_attributes_path: "$.devices[0].io.z3k-state.20496"
value_template: "OK"
json_attributes:
- "target_temp"
- "setpoint_temp"
- "status"
- name: "zont_rest_burner_gvs"
json_attributes_path: "$.devices[0].io.z3k-state.20603"
value_template: "OK"
json_attributes:
- "status"
- name: "zont_rest_temp_coolant"
json_attributes_path: "$.devices[0].io.z3k-state.20600.ot"
value_template: "OK"
json_attributes:
- "bt"
#
template:
sensor:
- name: 'temperature_1st_floor'
state: "{{ state_attr('sensor.zont_rest_first_floor_temperature', 'temperature') }}"
availability: "{{is_state('sensor.zont_rest_first_floor_temperature', 'OK') }}"
unit_of_measurement: '°C'
icon: mdi:home-thermometer
#
- name: 'target_temperature_heating'
state: "{{ state_attr('sensor.zont_rest_status_heating', 'target_temp') }}"
availability: "{{is_state('sensor.zont_rest_status_heating', 'OK') }}"
unit_of_measurement: '°C'
icon: mdi:temperature-celsius
#
- name: 'moduletion_burner'
state: "{{ state_attr('sensor.zont_rest_moduletion', 'rml')|round(0) }}"
availability: "{{is_state('sensor.zont_rest_moduletion', 'OK') }}"
unit_of_measurement: '%'
icon: mdi:gas-burner
#
- name: 'temperature_coolant'
state: "{{ state_attr('sensor.zont_rest_burner_gvs', 'status')|round(0) }}"
availability: "{{is_state('sensor.zont_rest_burner_gvs', 'OK') }}"
unit_of_measurement: '°C'
icon: mdi:coolant-temperature
#
- name: 'calculation_temperature_coolant'
state: "{{ state_attr('sensor.zont_rest_status_heating', 'setpoint_temp')|round(0) }}"
availability: "{{is_state('sensor.zont_rest_status_heating', 'OK') }}"
unit_of_measurement: '°C'
icon: mdi:thermometer
#
- name: 'burner_heating'
state: "{{ state_attr('sensor.zont_rest_status_heating', 'status') }}"
availability: "{{is_state('sensor.zont_rest_status_heating', 'OK') }}"
icon: mdi:fire
#
- name: 'burner_gvs'
state: "{{ state_attr('sensor.zont_rest_burner_gvs', 'status') }}"
availability: "{{is_state('sensor.zont_rest_burner_gvs', 'OK') }}"
icon: mdi:fire
#
- name: 'zont_status_heating'
state: >
{% if (state_attr('sensor.zont_rest_burner_gvs', 'status') == 1 ) and (state_attr('sensor.zont_rest_status_heating', 'status') == 0 ) %}
ГВС
{% elif (state_attr('sensor.zont_rest_burner_gvs', 'status') == 0 ) and (state_attr('sensor.zont_rest_status_heating', 'status') == 1 ) %}
Отопление
{% elif (state_attr('sensor.zont_rest_burner_gvs', 'status') == 1 ) and (state_attr('sensor.zont_rest_status_heating', 'status') == 1 ) %}
Отопление | ГВС
{% else %} Не активно {% endif %}
icon: mdi:radiator
Получает весь JSON от ZONT и уже из него получаем желаемые атрибуты. Не очень правильный метод, тянет много, историю сохраняет не совсем корректно.
climate_heating:
sensor:
- platform: rest
resource: https://zont-online.ru/api/devices
name: zont
method: POST
timeout: 30
scan_interval: 10
force_update: true
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"load_io": true}'
value_template: '{{ value_json.ok }}'
json_attributes:
- devices
- platform: template
sensors:
zont_first_floor_temperature:
value_template: '{{ states.sensor.zont.attributes.devices[0].io["z3k-state"]["4099"].temperature }}'
friendly_name: 'Температура 1-й этаж'
device_class: temperature
unit_of_measurement: '°C'
- platform: template
sensors:
zont_moduletion:
value_template: '{{ states.sensor.zont.attributes.devices[0].io["z3k-state"]["20600"]["ot"].rml |round(0) }}'
friendly_name: 'Модуляция горелки'
unit_of_measurement: '%'
- platform: template
sensors:
zont_target_temperature:
value_template: '{{ states.sensor.zont.attributes.devices[0].io["z3k-state"]["20496"].target_temp }}'
friendly_name: 'Целевая температура'
device_class: temperature
unit_of_measurement: '°C'
- platform: template
sensors:
zont_burner_heat:
value_template: '{{ states.sensor.zont.attributes.devices[0].io["z3k-state"]["20496"].status }}'
friendly_name: 'Горелка Отопление'
- platform: template
sensors:
zont_burner_gvs:
value_template: '{{ states.sensor.zont.attributes.devices[0].io["z3k-state"]["20603"].status }}'
friendly_name: 'Горелка ГВС'
# Установка режима "Комфорт"
rest_command:
zont_set_comfort:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 20501, "command_name": "SelectHeatingMode", "command_args": null, "is_guaranteed": true}'
# Установка режима "Расписание"
zont_set_scheduled:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 20503, "command_name": "SelectHeatingMode", "command_args": null, "is_guaranteed": true}'
# Установка режима "Выключен"
zont_set_off:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 20504, "command_name": "SelectHeatingMode", "command_args": null, "is_guaranteed": true}'
# Установить +1 к текущей целевой температуре
zont_up_target_temp:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 20496, "command_name": "TargetTemperature", "command_args": {"value": {{ (states.sensor.zont_target_temperature.state) | round(0) +1 }}}, "is_guaranteed": true}'
# Установить -1 к текущей целевой температуре
zont_down_target_temp:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 20496, "command_name": "TargetTemperature", "command_args": {"value": {{ (states.sensor.zont_target_temperature.state) | round(0) -1 }}}, "is_guaranteed": true}'
# Установить целевую температуру из input_number (можно задавать дробные от 0.1)
zont_set_target_temp:
url: https://zont-online.ru/api/send_z3k_command
method: POST
headers:
X-ZONT-Client: !secret zont_client
X-ZONT-Token: !secret zont_token
Content-Type: application/json
payload: '{"device_id": 123456, "object_id": 33333, "command_name": "TargetTemperature", "command_args": {"value": {{ (states.input_number.target_heating_temperature.state) | round(1) }}}, "is_guaranteed": true}'
- https://sprut.ai/client/article/2292
- Информации от технической поддержки ZONT и точно актуально для Zont H2000+, Zont Connect+. Причина обращения в том, что частично официальная документация описывающая API не актуальна.