В статье описывается личный опыт интеграции вентиляционной установки в умный дом Home Assistant и управление ей голосом через Алису.

1. Железо

  • Вентиляционная установка Minibox Home 350 с автоматикой GTC и интернет‑модулем GTC Ethernet EM-LAN. Данный модуль подключается сетевым кабелем к роутеру. В моём случае сразу при монтаже было настроено управление установкой через родное приложение GTC Remote Access 2.0 со смартфона

  • Home Assistant OS — это операционная система для управления умным домом, которую можно запустить практически на чём угодно: одноплатные ПК (Raspberry Pi), мини‑ПК, NAS (Synology), старый ноутбук или виртуальная машина. А ещё в Home Assistant можно сделать управление умными устройствами из любых экосистем (Яндекс, Xiaomi, Aqara и пр.). Я использовал сетевое хранилище NAS Synology DS920+.

  • Любая колонка с Алисой. У меня 1.5 года работала старая JBL Link Portable, сейчас обновился до Яндекс Станции 3.

2. Запуск Home Assistant

Подробные описания установки и настройки Home Assistant можно найти тут. Ниже опишу очень кратко свой вариант. Совет: не устанавливайте Home Assistant через Docker, нам нужен Home Assistant OS

  1. Создаётся виртуальная машина в Synology NAS

  2. На официальном сайте Home Assistant скачивается образ.ova (~360 Мб) и импортируется в виртуальную машину

  3. Всё. Дальше просто по ссылке будет открываться в браузере домашняя страница вашего умного дома. Можно скачать отдельное приложение на телефон (iOS, Android и пр.). Для управления вентиляцией через Алису этого шага достаточно.

  4. Прямой доступ к умному дому Home Assistant по умолчанию будет только из локальной сети, то есть когда смартфон подключен к домашнему Wi‑Fi. Для настройки удалённого доступа есть неплохие бесплатные варианты, рекомендую, например, Dataplicity или Tailscale. Я в итоге докупил у провайдера белый IP и настроил прямой доступ ко всему NAS и в том числе к умному дому. Для меня это оказался самый удобный вариант, так как нет ограничений скорости для работы с домашним облаком.

3. Подключение автоматики GTC к Home Assistant

Спасибо Роману Громову за статью, которая когда‑то очень помогла с настройкой мне.

Сенсоры

Первичная настройка подключения происходит через редактор файлов Home Assistant. Для его запуска перейдите в Настройки > Дополнения > Магазин дополнений. Найдите «File Editor» и нажмите Установить. Включите опцию «Показывать в боковой панели» и нажмите Запустить.

Через File Editor открываем файл configuration.yaml и дописываем код:

modbus:
  - name: GTC
    type: tcp
    host: 192.168.1.49
    port: 502
    delay: 5
    timeout: 30
    sensors:
      - name: minibox_target_temp(sensor)
        unique_id: minibox_target_temp(sensor)
        unit_of_measurement: °C
        slave: 1
        address: 31
        precision: 1
        scale: 0.1
        data_type: int16
      - name: minibox_target_fs(sensor)
        unique_id: minibox_target_fs(sensor)
        slave: 1
        address: 32
        data_type: int16
      - name: minibox_current_temp(sensor)
        unique_id: minibox_current_temp(sensor)
        unit_of_measurement: °C
        slave: 1
        address: 7
        input_type: input
        precision: 1
        scale: 0.1
        data_type: int16
      - name: minibox_current_fs(sensor)
        unique_id: minibox_current_fs(sensor)
        slave: 1
        address: 25
        input_type: input
        data_type: int16

Этот код подключает интеграцию modbus и создаёт 4 переменные (сенсора) в системе Home Assistant, которые будут постоянно считывать свои значения с установки. Для управления через Алису достаточно только первых двух (minibox_target_temp(sensor) и minibox_target_fs(sensor)), но для контроля состояния удобно иметь все 4.

«minibox_target_temp(sensor)» — это целевая температура
«minibox_target_fs(sensor)» — целевая скорость вентилятора
«minibox_current_temp(sensor)» — фактическая температура
«minibox_current_fs(sensor)» — фактическая скорость вентилятора

У каждого сенсора в коде выше есть параметр address. Значение его можно найти в документации к автоматике (я её нашёл на форуме по названию «Список регистров Оазис v.5», правда там все адреса указаны на единицу больше). Таким образом можно в принципе получить значения и других сенсоров установки.

В коде измените 192.168.1.49 на IP адрес вашей установки. Следите за числом пробелов в начале строк, — это важно. Синтаксис modbus может поменяться со временем, с исправлениями кода отлично помогает СhatGPT.

Далее надо перезагрузить Home Assistant и зайти в Настройки > Устройства и службы > вкладка Объекты. Там по названию можно найти наши созданные сенсоры и проверить считывают ли они значения. Моя установка сейчас выключена, поэтому сенсор температуры показывает просто температуру на улице.

Скрипты для включения/выключения установки

Для включения и выключения установки в Home Assistant идём в настройки — скрипты и создаём два скрипта:

С названием «Включить вентиляцию». Справа сверху нажимаем три точки — текстовый редактор и вставляем код:

data_template:
  hub: GTC
  unit: 1
  address: 2
  value: "1"
action: modbus.write_register

«Выключить вентиляцию» с кодом также в режиме текстового редактора:

data_template:
  hub: GTC
  unit: 1
  address: 2
  value: 0
action: modbus.write_register

Кавычки там стоят неслучайно, помню какое‑то время помучался, без них не работало. Скрипты можно выполнить сразу после создания и проверить, что они работают.

4. Автоматизация для двухсторонней связи Home Assistant с пультом

Для управления установкой нам потребуется создать 2 вспомогательных числа. Идём Настройки > Устройства и службы > Вспомогательное > Создать вспомогательный объект > Число:

«minibox_target_fs» — переменная для изменения и хранения целевой скорости вентилятора (значения от 1 до 10)
«minibox_target_temp» — переменная для изменения и хранения целевой температуры (значения от 5 до 30)

Теперь создадим автоматизацию. Логика работы простая: если кто‑то поменял значение скорости на пульте, то изменится значение «minibox_target_fs(sensor)», и это значение надо переписать во вспомогательную переменную «minibox_target_fs», которая и будет основным отображаемым параметром. Если же мы внутри Home Assistant изменим вспомогательную переменную «minibox_target_fs», то нужно отправить команду на вентиляционную установку для смены скорости. С температурой аналогично.

Идём Настройки > Автоматизации и сцены > Создать автоматизацию. Справа сверху нажимаем три точки — текстовый редактор, вставляем следующий код:

Скрытый текст
alias: Взаимодействие с minibox
description: ""
triggers:
  - entity_id:
      - input_number.minibox_target_fs
    trigger: state
    id: minibox_target_fs изменяется
    for:
      hours: 0
      minutes: 0
      seconds: 4
  - entity_id:
      - input_number.minibox_target_temp
    trigger: state
    id: minibox_target_temp изменяется
    for:
      hours: 0
      minutes: 0
      seconds: 6
  - entity_id:
      - sensor.minibox_target_fs_sensor
    trigger: state
    id: minibox_target_fs(sensor) изменяется
  - entity_id:
      - sensor.minibox_target_temp_sensor
    trigger: state
    id: minibox_target_temp(sensor)
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - minibox_target_fs изменяется
        sequence:
          - data_template:
              hub: GTC
              unit: 1
              address: 32
              value: "{{ (states('input_number.minibox_target_fs'))|int }}"
            action: modbus.write_register
      - conditions:
          - condition: trigger
            id:
              - minibox_target_temp изменяется
        sequence:
          - data_template:
              hub: GTC
              unit: 1
              address: 31
              value: >-
                {{ (((states('input_number.minibox_target_temp'))|float)*10)|int
                }}
            action: modbus.write_register
      - conditions:
          - condition: trigger
            id:
              - minibox_target_fs(sensor) изменяется
        sequence:
          - if:
              - condition: not
                conditions:
                  - condition: state
                    entity_id: sensor.minibox_target_fs_sensor
                    state: unavailable
              - condition: not
                conditions:
                  - condition: state
                    entity_id: sensor.minibox_target_fs_sensor
                    state: unknown
            then:
              - action: input_number.set_value
                metadata: {}
                data:
                  value: "{{ states('sensor.minibox_target_fs_sensor')|round(0) }}"
                target:
                  entity_id: input_number.minibox_target_fs
      - conditions:
          - condition: trigger
            id:
              - minibox_target_temp(sensor)
        sequence:
          - if:
              - condition: not
                conditions:
                  - condition: state
                    entity_id: sensor.minibox_target_temp_sensor
                    state: unavailable
              - condition: not
                conditions:
                  - condition: state
                    entity_id: sensor.minibox_target_fs_sensor
                    state: unknown
            then:
              - action: input_number.set_value
                metadata: {}
                data:
                  value: "{{ states('sensor.minibox_target_temp_sensor')|int }}"
                target:
                  entity_id: input_number.minibox_target_temp
mode: queued
max: 10

Потом можно снова нажать три точки и вернуться в режим «форма ввода», так можно наглядно увидеть блоки кода. В автоматизации есть 4 триггера: это изменение «minibox_target_fs(sensor)» или «minibox_target_fs» и аналогично для температуры. Для каждого триггера стоит небольшая задержка. Это полезно, например, когда значение целевой скорости меняется несколько раз подряд. Автоматизация дождётся хотя бы 4 сек без изменений переменных и тогда отправит последнюю команду на установку. Задержка для температуры 6 сек, потому что, например перед сном (в другой автоматизации) мне удобно менять температуру и скорость одновременно, но на установку две команды всё равно придут последовательно (через 4 и 6 сек). 

5. Интерфейс Home Assistant и проверка автоматизации

Для управления через Алису этот раздел неактуален, просто удобство.

Самое простое — на вкладке «обзор» — добавить наши вспомогательные переменные «minibox_target_fs» и «minibox_target_temp». Теперь при изменении их значений, должна запускаться автоматизация и менять значения на пульте. В обратную сторону аналогично: ручные изменения на пульте должны менять значения переменных.

Если хочется компактно, рекомендую карточки Mushroom (нужно установить дополнение). На скриншоте как раз они, установка выключена, поэтому значок фактической скорости показывает 0, а температура ниже заданной.

Код mushroom карточек со скрина:

Скрытый текст

Код mushroom карточки с вентилятором:

features:
  - type: numeric-input
    style: buttons
type: custom:mushroom-template-card
entity: input_number.minibox_target_fs
icon: mdi:fan
tap_action:
  action: more-info
features_position: inline
badge_text: >-
  {{ '?' if is_state('sensor.minibox_current_fs_sensor', 'unknown') else
  states('sensor.minibox_current_fs_sensor') }}
grid_options:
  columns: 6
  rows: 1
color: >-
  {{ 'grey' if is_state('sensor.minibox_current_fs_sensor', '0') else '#42a5f5'
  }}

Карточка с нагревом:

features:
  - type: numeric-input
    style: buttons
type: custom:mushroom-template-card
entity: input_number.minibox_target_temp
icon: mdi:heating-coil
tap_action:
  action: more-info
features_position: inline
badge_text: >-
  {{ '?' if is_state('sensor.minibox_current_temp_sensor', 'unknown') else 
  states('sensor.minibox_current_temp_sensor') | float | round(0)}}
grid_options:
  columns: 6
  rows: 1
color: |2-
    {% if (states('sensor.minibox_current_temp_sensor')|float>states('input_number.minibox_target_temp')|int+1) or is_state('sensor.minibox_current_fs_sensor', '0') %}
      'grey'
    {% else %} #FFA500 {% endif %}

6. Получение команд от Алисы в Home Assistant

Для получения команд через Алису потребуется интеграция yandex‑station‑intents. После её установки через File Editor открываем файл configuration.yaml и дописываем код:

yandex_station_intents:
  intents:
    вентиляция 1: готово 1
    вентиляция 2: готово 2
    вентиляция 3: готово 3
    вентиляция 4: готово 4
    вентиляция 5: готово 5
    вентиляция 6: готово 6
    вентиляция 7: готово 7
    вентиляция 8: готово 8
    вентиляция 9: готово 9
    вентиляция 10: готово 10
    выключи вентиляцию: выключаю
    включи вентиляцию: включаю

До двоеточия — это голосовая команда, после двоеточия — ответ Алисы. Затем нужно перезагрузить Home Assistant. Я не стал здесь писать команды для управления температурой, они у меня реализованы аналогично скорости: нагрев 5, нагрев 6, …, нагрев 30. Громоздко, но работает. К сожалению, написать как‑то красиво с переменной, судя по всему, нельзя.

7. Автоматизация для управления Minibox через Алису

Осталось лишь создать автоматизацию, которая будет запускаться после получения команды Алисой и менять значения вспомогательных переменных вентиляции или запускать скрипты включения — выключения. Идём Настройки > Автоматизации и сцены > Создать автоматизацию. Код:

Скрытый текст
alias: Голосовое управление вент. 
description: ""
triggers:
  - event_type: yandex_intent
    event_data:
      text: вентиляция 1
    id: вентиляция 1
    trigger: event
    alias: вентиляция 1
  - event_type: yandex_intent
    event_data:
      text: вентиляция 2
    id: вентиляция 2
    trigger: event
    alias: вентиляция 2
  - event_type: yandex_intent
    event_data:
      text: вентиляция 3
    id: вентиляция 3
    trigger: event
    alias: вентиляция 3
  - event_type: yandex_intent
    event_data:
      text: вентиляция 4
    id: вентиляция 4
    trigger: event
    alias: вентиляция 4
  - event_type: yandex_intent
    event_data:
      text: вентиляция 5
    id: вентиляция 5
    trigger: event
    alias: вентиляция 5
  - event_type: yandex_intent
    event_data:
      text: вентиляция 6
    id: вентиляция 6
    trigger: event
    alias: вентиляция 6
  - event_type: yandex_intent
    event_data:
      text: вентиляция 7
    id: вентиляция 7
    trigger: event
    alias: вентиляция 7
  - event_type: yandex_intent
    event_data:
      text: вентиляция 8
    id: вентиляция 8
    trigger: event
    alias: вентиляция 8
  - event_type: yandex_intent
    event_data:
      text: вентиляция 9
    id: вентиляция 9
    trigger: event
    alias: вентиляция 9
  - event_type: yandex_intent
    event_data:
      text: вентиляция 10
    id: вентиляция 10
    trigger: event
    alias: вентиляция 10
  - event_type: yandex_intent
    event_data:
      text: выключи вентиляцию
    id: выключи вентиляцию
    trigger: event
    alias: выключи вентиляцию
  - event_type: yandex_intent
    event_data:
      text: включи вентиляцию
    id: включи вентиляцию
    trigger: event
    alias: включи вентиляцию
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - вентиляция 1
        sequence:
          - metadata: {}
            data:
              value: 1
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 2
        sequence:
          - metadata: {}
            data:
              value: 2
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 3
        sequence:
          - metadata: {}
            data:
              value: 3
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 4
        sequence:
          - metadata: {}
            data:
              value: 4
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 5
        sequence:
          - metadata: {}
            data:
              value: 5
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 6
        sequence:
          - metadata: {}
            data:
              value: 6
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 7
        sequence:
          - metadata: {}
            data:
              value: 7
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 8
        sequence:
          - metadata: {}
            data:
              value: 8
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 9
        sequence:
          - metadata: {}
            data:
              value: 9
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - вентиляция 10
        sequence:
          - metadata: {}
            data:
              value: 10
            target:
              entity_id: input_number.minibox_target_fs
            action: input_number.set_value
      - conditions:
          - condition: trigger
            id:
              - выключи вентиляцию
        sequence:
          - metadata: {}
            data: {}
            action: script.unknown
      - conditions:
          - condition: trigger
            id:
              - включи вентиляцию
        sequence:
          - metadata: {}
            data: {}
            action: script.unknown_2
mode: parallel
max: 10

После сохранения, вернитесь в режим «форма ввода» и скорректируйте как минимум имена скриптов включения/выключения. У вас при создании их имена будут другими.

На этом всё. Теперь голосовая команда Алисе «вентиляция 5» активирует триггер последней автоматизации и она изменит значение вспомогательной переменной «minibox_target_fs». После 4 с ожидания на изменение переменной среагирует наша первая автоматизация и отправит команду на пульт.

Что дальше

Следующим важным шагом была доработка трёхскоростного вытяжного вентилятора и интеграция в Home Assistant. При монтаже мне поставили вытяжной вентилятор Soler&Palau TD 500/160 Silent. Вентилятор хороший, тихий, но как оказалось слишком мощный для приточной установки. Если мощность вытяжки превышала скорость приточки, то в квартиру начинало тянуть воздух из всех щелей: стен, окон и даже из канализации при чистке сифона, например. Проблема была решена питанием вентилятора через понижающий трансформатор с 220 В на 110 В. После этого каждая скорость вытяжки подходила для определённых скоростей приточки. Ещё одна автоматизация в Home Assistant взяла управление на себя: она регулирует скорость вытяжного вентилятора в зависимости от скорости приточки так, чтобы приточка всегда чуть опережала вытяжку. Это оказалось очень удобно, после настройки прошло уже 1.5 года и про управление вытяжкой мы просто забыли.

Когда дома появился датчик CO2, появились и новые автоматизации Home Assistant. Теперь, если пришли гости, и мы забыли увеличить скорость вентиляции, то она увеличится сама по датчику CO2. Если увеличивать уже некуда, то Алиса напомнит открыть окошки. Другая автоматизация делает проветривание перед сном, уменьшает скорость ночью, снова увеличивает утром, снова снижает когда нас нет дома, выключает установку, если нас нет дома больше суток и включает обратно, когда мы вернулись. С ростом числа автоматизаций, необходимость управления голосом снижается, но всё равно остаётся.

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