Дисклеймер
Это моя первая статья на хабре, буду рад обратной связи в комментариях! Надеюсь, мой опыт пригодится вам, если вы столкнулись с похожей задачей и не нашли удобного материала на эту тему.
Путь к автоматизации
Всем привет! Меня зовут Владислав Хажинов, я архитектор информационных систем и руководитель разработки. В свободное от работы время люблю развивать функции своего умного дома
Как любитель в области автоматизации, я добился полного управления всеми устройствами умного дома по локальной сети без использования интернета на умных устройствах. Именно такой формат управления позволяет не думать на тему случайного отупения умного дома, например в случае поломки интернета или обстоятельства непреодолимой силы, вроде блокировок облаков со стороны вендоров. Да и просто круто это, почему бы и да!
Но долгое время единственным устройством (их на самом деле два одинаковых), которое управлялось через облако вендора, был кондиционер - Electrolux EACS/I-09HSK/N3 (in+out)

Когда встал вопрос выбора кондиционеров в квартиру, мой взор упал на данную модель.
Во-первых, для электролюкса у него была достаточно комфортная цена на момент покупки (33 тысячи в августе 2023).
Во-вторых, среди моделей данного ценового сегмента, этот был чуть ли не единственным вариантом, в карточке товара которого было написано:

Почему-то в тот момент мне не пришла в голову мысль открыть его инструкцию в интернете и узнать заранее кое что важное об этой функции, но получилось как получилось)
Дело в том, что на тот момент я уже попробовал управление через Яндекс.Пульт

Кто не знает, это такая "шайба", которая воспроизводит ИК-сигналы с пультов для любой техники с пультом. Можно выбрать готовый набор команд из обширного каталога устройств или запустить в режиме обучения: просто нажимаешь на пульте команды, а она их запишет.
Основной проблемой данной группы управляющих устройств является отсутствие обратной связи. Т.е. если управлять целевым устройством только через эту шайбу, то ты не можешь быть на 100% быть уверен, что команда на устройство была передана, что устройство находится в ожидаемом режиме. И когда ты управляешь устройством с родного пульта - состояние устройства в облаке меняется, разумеется, не будет.
Поэтому при покупке новых сплит-систем хотелось эту проблему решить на пороге. Отсюда и выбор в пользу вышесказанной модели.
Сюрприз после получения
Основным моментом, который я не учёл, оказалось отсутствие у сплит-системы возможности подключения WIFI по-умолчанию. Первое, что бросилось в глаза, что где-то на коробке внутреннего блока было написано "Wi-Fi Ready", что немного насторожило. И не случайно, потому что в инструкции будет написано так:

Т.е. для управления своим кондиционером, мне надо было ещё приобретать некие "умные" модули отдельно. Чем я и был вынужден заняться.
Сам модуль
В качестве управляющего устройства предлагается использовать некую USB-A флешку, которая устанавливается во внутренний блок сплит-системы. Недолгий поиск привозит нас к следующему экспонату:

Устройство называется HOMMYN HDN/WFN-02-01 и по описанию является универсальным модулем управления для разнообразного набора устройств.

Подключение простое — вставил флешку в нужный слот, открыл приложение, запитал кондиционер, запустил поиск устройств, осуществил сопряжение, выбирал своё устройство из списка и всё. Дальше в умном доме Яндекса добавляешь стороннее устройство стандартным способом и уже можешь управлять голосом.
Разумеется, перед покупкой я попытался найти альтернативы, потому что предварительный анализ на тему подключения к Home Assistant не дал должного результата. Было одно не особо обнадёживающее упоминание на сайте производителя, которого уже и вовсе нет на странице с помощью по устройствам:

К моему сожалению, альтернатив устройству я не нашел. Возможно, что плохо искал. Самостоятельно сделать управляющий модуль было не в моих силах, да и времени тогда не было на решение этой задачи, поэтому купил что имелось на рынке.
После установки несколько раз пытался ввести это устройство в экосистему умного дома, но в тот момент не хватило усидчивости разобраться в вопросе до конца. Выглядел этот путь крайне тернистым и костыльным.
Спустя несколько лет эксплуатации начал замечать деградацию пинга между голосовой командой и выполнением на устройстве. А иногда и вовсе игнорировались команды/сценарии по времени из-за "Устройство недоступно, проверьте соединение с интернетом или подключено ли оно к сети". Момент настал, подумал я, да решил разобраться в вопросе.
Настройка локального управления по MQTT
Разумеется, всё начинается с гуглёжки. Первое, что огорчило, что к текущему моменту убрали даже упоминание этой функции на странице помощи. Это насторожило, что реализовать не получится. Но недолгий поиск приводит нас на Github репозиторий, а затем на главное обсуждение по этой теме: https://github.com/Hommyn/local_mqtt/issues/1
Умные люди выяснили, что устройство по умолчанию подключается к MQTT серверу Hommyn, используя адрес mqtt.cloud.rusklimat.ru
Так же умные люди выяснили, что устройство подключается по порту 8883 (MQTT с сертификатом, стандартный запускается на 1883).
Имея данные вводные, мы можем приступить к конфигурации.
У меня используется Home Assistant (версии 2025.10.3 на момент написания статьи), установленный в формате Supervised (HA заявили, что в конце 2025 года прекращают поддержку этого варианта установки...) на небольшом безвентиляторном Chatreey TK12F.
В виду активного использования различных устройств умного дома, у меня уже был установлен Mosquitto MQTT брокер. Останавливаться на его установке не будем, оставим это официальной инструкции: https://www.home-assistant.io/integrations/mqtt/
От себя добавлю, что для следующих шагов нужно включить режим отладки этого дополнения. Заходим в Настройки > Дополнения > Mosquitto Broker, переходим во вкладку "Конфигурация", далее немного ниже в разделе "Параметры" будет выключатель с текстом "Показать неиспользуемые дополнительные параметры конфигурации", нажимаем его и включаем "Debug" (ссылка будет в формате http://HA_ADDRESS/hassio/addon/core_mosquitto/config)

При сохранении настроек будет оповещение, что сервер будет перезагружен.
Далее нам требуется запустить MQTT на порту 8883, при этом не нарушая работы порта 1883. В моём случае уже была группа устройств, которые общались с HA через этот порт и его выключение для меня вызвало бы проблемы. Благо, делается это просто.
Для следующего шага нам потребуется доступ на сервер HA по SSH. Дополнение SSH Server является стандартным, устанавливается через раздел дополнений. После настройки и подключения к серверу делаем выпуск локального сертификата.
Важно отметить, что описанные ниже команды выполнены именно в оболочке Home Assistant. Если у вас установка как и у меня в режиме Supervised, то не подключайтесь к серверному SSH, удобнее сделать всё сразу в SSH самого Home Assistant.
Устанавливаем OpenSSL:
apk add openssl
Затем выпускаем сертификат:
openssl req -new -x509 -days 365 -nodes -out mqtt.crt -keyout mqtt.key -subj "/CN=HA_ADDRESS"
Вместо HA_ADDRESS вставляем свой IP адрес HA или локальный домен. Порт указывать не нужно, например: 192.168.1.3 или myhome.ru
Далее переносим полученные файлы в требуемую папку:
mv mqtt.* /ssl/
На этом магия почти окончена. Всё что нам нужно сделать далее - это встроить сертификат в MQTT брокера. Снова открываем Настройки > Дополнения > Mosquitto Broker, переходим во вкладку "Конфигурация", справа от "Параметры" тыкаем на 3 точки и выбираем "Текстовый редактор"

В открывшемся окне заполняем настройки следующим образом:
logins:
- username: youruser
password: yourpassword
require_certificate: false
certfile: mqtt.crt
keyfile: mqtt.key
debug: true
customize:
active: false
folder: mosquitto
В указанном примере в секции logins в будущем появится ещё один пользователь, но об этом позднее. На текущем этапе мы уже можем сохранить настройки и получить MQTT с сертификатом. Для проверки сервера рекомендую использовать MQTT Explorer: https://community.home-assistant.io/t/addon-mqtt-explorer-new-version/603739
После установки, зайдите в Настройки > Дополнения > MQTT Explorer и включение "Добавить на боковую панель" для быстрого доступа

После этого открываем MQTT Explorer и пробуем подключиться к нашему MQTT серверу с новыми настройками:

После успешного подключения увидим примерно такую картину:

У меня на скрине уже видно топик rusclimate, у вас он появится немного позднее.
Теперь нам потребуется выполнить некоторые настройки на роутере, чтобы получить заветное состояние устройства на своём сервере Home Assistant.
К сожалению, вендор не даёт никакой настройки устройства в части указания сервера MQTT, что вынуждает прописать маршрут на роутере до требуемого нам узла, подменяя DNS запись. У меня в домашней сети используется Keenetic Sprinter (KN-3710), но в любом Keenetic достаточно открыть http://ROUTER_ADDRESS/a или http://ROUTER_ADDRESS/webcli/parse и выполнить команду:
ip host mqtt.cloud.rusklimat.ru HA_ADDRESS
После выполнения команды потребуется обесточить кондиционер и запитать заново, это сбросит кэш DNS на устройстве и оно начнёт пытаться стучаться на наш сервер MQTT по указанному адресу.
При подключении, Hommyn будет использовать предустановленную комбинацию пользователя и пароля, которую нам нужно получить.
Если всё вышесказанное уже сделано, нам требуется перейти в Настройки > Дополнения > Mosquitto Broker, переходим во вкладку "Журнал" и внимательно поискать строки, похожие на эти:

Теперь мы знаем, что нам нужно создать пользователя rusclimate, но с каким паролем? Для этого нужно взять строку с ASCII символами в квадратных скобках и привести в человеческий вид. Можете воспользоваться онлайн сервисами или любимой LLM моделью, но уточню основную особенность: в конце есть 20 непечатных байт, которые дописываются с какой-то целью (может в комментариях подскажут, стандартное ли это поведение MQTT). По факту, если выбросить 20 последних байт из этой строки, то получим заветный пароль. По факту, на всех Hommyn устройствах пароль одинаковый, но его получение оставлю вам с целью научного интереса. В результирующей строке вы получите что-то вроде: auth-rusclimate-PASSWORD, где PASSWORD - требуемый нам пароль.
Идём во вкладку "Конфигурация", открываем текстовый редактор и корректируем нашу настройку:
logins:
- username: youruser
password: yourpassword
- username: rusclimate
password: PASSWORD
require_certificate: false
certfile: mqtt.crt
keyfile: mqtt.key
customize:
active: false
folder: mosquitto
Свойство debug убрано намеренно, потому что более оно нам не потребуется. Сохраняем, перезагружаем и открываем MQTT Explorer. Если всё сделано правильно, то у вас должен был появится топик rusclimate с определенной вложенной иерархией, а значит дело в шляпе!
Настройка виртуального устройства
Home Assistant очень гибкая платформа и позволяет создавать устройство из чего угодно, чем мы и займёмся.
Для начала немного изучим основные свойства в MQTT Explorer, на основании которых будем программировать наш кондиционер в виде объекта

На самом деле, в топике устройства содержится не так уже много информации, но её достаточно для управления. В начале топика идёт стандартное название rusclimate, после чего идёт числовой идентификатор, в моём случае 20. По всей видимости, это код устройства (модель), который вы выбрали при настройке в приложении Hommyn.
Затем идёт токен устройства, он уникален для каждой флешки и является секретом вашего устройства.
Внутри находится основной топик state, внутри которого описывается текущее состояние устройства. Настоятельно рекомендую на данном этапе воспользоваться родным пультом и попробовать попереключать режимы функционирования: включить/выключить, поменять режим, скорость обдува, температуру и так далее.
Уже на этом этапе вы испытаете некое удовольствие от "реверс-инжиниринга" своего кондиционера, несмотря на простоту установки.
В моём случае было несколько важных для меня функций, которые в MQTT передавались в топик program_data. Например в топик state/program_data/0 передаётся информация о работе жалюзи, они же SWING на пульте.
Состояние топика в зависимости от режима
swing выключен - program_data/0 = 00000000
swing (по горизонтали) - program_data/0 = 00010000
swing (по вертикали) - program_data/0 = 01000000
swing (оба) - program_data/0 = 01010000
А в топике state/program_data/1 храниться самая главная функция - бесшумный режим (на пульте кнопка silence). В моём случае абсолютный мастхэв и ранее я не мог включить этот режим голосом - Яндекс не видел это как опцию кондиционера от Hommyn. Благо, с этим всё просто: 0000 - выключен, 0001 - включен
Теперь приступим к формированию виртуального устройства. Для этого открываем любым удобным способом ваш configuration.yml и добавляем туда секцию вида:
mqtt:
- climate:
name: "Кондиционер в зале"
unique_id: "aircondition_livingroom"
device:
identifiers: 348518e4ae6c
manufacturer: Rusklimat
name: Electrolux Air Condition
model: Electrolux Air Condition Scandi
availability:
- topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/error/connection"
payload_available: "false"
payload_not_available: "true"
retain: true
initial: 22
icon: mdi:air-conditioner
temperature_state_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/temperature"
temperature_command_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/control/temperature"
fan_mode_state_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/speed"
fan_mode_command_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/control/speed"
mode_state_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/mode"
mode_command_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/control/mode"
optimistic: true
precision: 1.0
min_temp: 16
max_temp: 32
modes:
- "off"
- "auto"
- "cool"
- "dry"
- "heat"
- "fan_only"
temperature_command_template: >
{{value | int}}
fan_mode_state_template: >
{% if value == "3" %}
high
{% elif value == "2" %}
medium
{% elif value == "1" %}
low
{% else %}
auto
{% endif %}
fan_mode_command_template: >
{% if value == "high" %}
{{ 3 }}
{% elif value == "medium" %}
{{ 2 }}
{% elif value == "low" %}
{{ 1 }}
{% else %}
{{ 0 }}
{% endif %}
mode_state_template: >
{% if value == "5" %}
fan_only
{% elif value == "4" %}
heat
{% elif value == "3" %}
dry
{% elif value == "2" %}
cool
{% elif value == "1" %}
auto
{% else %}
off
{% endif %}
mode_command_template: >
{% if value == "fan_only" %}
{{ 5 }}
{% elif value == "heat" %}
{{ 4 }}
{% elif value == "dry" %}
{{ 3 }}
{% elif value == "cool" %}
{{ 2 }}
{% elif value == "auto" %}
{{ 1 }}
{% else %}
{{ 0 }}
{% endif %}
- switch:
name: "Кондиционер в зале бесшумный режим"
unique_id: "aircondition_livingroom_silence"
device:
identifiers: 348518e4ae6c
manufacturer: Rusklimat
name: Electrolux Air Condition
model: Electrolux Air Condition Scandi
state_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/program_data/1"
command_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/control/program_data/1"
payload_on: "0001"
payload_off: "0000"
value_template: >
000{{ value[3] }}
icon: mdi:air-conditioner
availability:
- topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/error/connection"
payload_available: "false"
payload_not_available: "true"
- switch:
name: "Кондиционер в зале подсветка"
unique_id: "aircondition_livingroom_light"
device:
identifiers: 348518e4ae6c
manufacturer: Rusklimat
name: Electrolux Air Condition
model: Electrolux Air Condition Scandi
state_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/backlight"
command_topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/control/backlight"
payload_on: "1"
payload_off: "0"
value_template: >
{{ value | int }}
icon: mdi:air-conditioner
availability:
- topic: "rusclimate/20/9d39dd867996e08e9e248220a11200f3/state/error/connection"
payload_available: "false"
payload_not_available: "true"
Обязательно не забываем заменить 20/9d39dd867996e08e9e248220a11200f3 на свое значение.
После добавления этой секции идём в "Панель разработчика" и в блоке "Перезагрузка конфигурации YAML" выбираем "Объекты интеграции "MQTT", настроенные вручную". Если у вас потом не появляется устройство (проверяю через Панель разработчика > Состояния, в поиск вбиваем climate.название_устройства либо через Настройки > Устройства и службы > MQTT), рекомендую перезапустить Home Assistant целиком. У меня пару раз не срабатывала перезагрузка именно устройств MQTT.


На самом деле, если у вас устройство такое же как у меня, вы уже всё сделали. Можно смело брать полученное устройство climate + switch (две штуки) и гордо располагать их на своём дашборде. Для тех, кто подключает другую технику через Hommyn, дам некоторое важное описание:
-
Для объединения устройств (climate и switch) в одно целое со стороны Home Assistant, обязательно заполняйте секцию
deviceв каждом типе устройства.В
device.identifiersя подставляю mac адрес, полученный из топикаstate/mac. Просто для уникальности.Остальные поля можете заполнить по аналогии
Секция
availabilityфундаментально важна, это единственный способ дать понять Home Assistant, что устройство доступно и в каком оно состоянии-
Специфичные для climete параметры:
retainя выставляю вtrue, чтобы в случае недоступности устройства по сети, в момент восстановления соединения команда дошлаinitialговорит об умолчательной температуреoptimisticвыставлен вtrue, потому что устройство не совсем мгновенно читает команды и если этот пункт игнорировать, то получите ящик Пандоры со стороны HA, просто из-за постоянно сбивающегося состоянияprecisionвыставлен в1.0, это шаг температуры. Несмотря на то, что кондиционер поддерживает шаг в половину градуса (0.5), Hommyn не умеет с этим работать и требуется явное приведение к целому числу-
Дальше уже идут комбинации вида:
temperature_state_topic,temperature_command_topic,fan_mode_state_template,temperature_command_templateдля каждой требуемой функции (температура, режим, скорость вентилятора и т.д.), о них по отдельности:*_state_topic- путь к состоянию требуемой характеристики в MQTT, например для температуры: .../state/temperature*_command_topic- путь к топику, куда будут отправляться команды устройству. Например, для температуры:.../control/temperature. Обратите внимание, что команды отправляются не в топик состоянияstate, а в новый для устройства топикcontrol. Почему именно туда? не знаю, на Gihub в обсуждении указывали такие примеры, сделал по аналогии :)*_state_template- это шаблонизация, которая позволяет конвертировать состояние из MQTT в состояние Home Assistant. Например, в Hommyn скорость обдува 3, а в HA надо передать это как high.*_command_template- это шаблонизация команд HA в требуемую форму в MQTT. В случае с температурой, несмотря на указание выше precision в виде 1.0, HA пытается отправлять целые числа в формате 22.0, что устройство не понимает и просто выставляет максимальную температуру. Из-за этого в шаблоне команды температуры я делаю{{value | int}}, чтобы попросту конвертировать передаваемое значение в целое число.
Детальнее почитать обо всех свойствах можно в официальной документации. Для climate устройств: https://www.home-assistant.io/integrations/mqtt/
В моей конфигурации присутствует три элемента: само устройство вида climate и два устройства switch для управления подсветкой (световая индикация температуры) и бесшумным режимом. Большая благодарность пользователю volkov-d на Gihub, который выложил свою конфигурацию в открытый доступ: https://github.com/volkov-d/Electrolux-Rusklimat-Heater-Home-Assistant-config/blob/main/Electrolux Air Gate DI 4.0.yaml
После множества итераций с настройками кондиционера, я получил описанную выше конфигурацию, которая полностью удовлетворяет моей задумке. После всех дел я с чистой совестью перекрыл доступ в интернет для кондеев, прокинул их в УДЯ и получил желаемые скорость и качество работы.
Бонусный контент
Я много времени потратил на разработку дашбордов для HA, основной выглядит как-то так:

В качестве элемента управления кондиционером решил выбрать компонент mushroom-climate-card (https://github.com/piitaya/lovelace-mushroom), благодаря его компактности, удобству и приятному визуалу. Вот его конфигурация:
type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: Кондиционер
- type: custom:mushroom-climate-card
entity: climate.konditsioner_v_zale
fill_container: false
layout: horizontal
hvac_modes:
- heat
- cool
show_temperature_control: true
collapsible_controls: false
grid_options:
columns: 12
rows: 1
- type: custom:mod-card
style:
hui-horizontal-stack-card$: |
hui-button-card {
flex: unset !important;
height: 50px;
}
card:
type: horizontal-stack
cards:
- show_name: false
show_icon: true
icon: hue:scene-bright
type: button
tap_action:
action: toggle
entity: switch.electrolux_air_condition_konditsioner_v_zale_podsvetka
- show_name: false
show_icon: true
type: button
icon: mdi:fan-off
tap_action:
action: toggle
entity: >-
switch.electrolux_air_condition_konditsioner_v_zale_besshumnyi_rezhim
Как можно заметить, я использую так же mod-card (https://github.com/thomasloven/lovelace-card-mod) и набор иконок Philips Hue (https://github.com/arallsopp/hass-hue-icons)
В результате получите примерно такой компонент:


Надеюсь, предложенный материал окажется кому-то полезен и позволить смягчить углы при пусконаладке данной конфигурации в своём умном доме!
Буду рад комментариям и до новых встреч!
NutsUnderline
Про HOMMYN HDN/WFN-02-01 не совсем понятно по процедуре подключения с WiFi - судя по инструкции ssid и пароль к сети пользователя задается через приложение? при первом включении/режиме сопряжения оно должно поднимать свою точку доступа, можно подключиться посмотреть что там есть.
так же можно вставить в эту штуку в комп и как минимум посмотреть pid и vid, а возможно увидим сетевой адаптер который стоит изучить насчет tcp портов. Не похоже что там обычный простой WiFi адаптер
DaemonGloom
Там обычная esp32-c3, но это не usb по итогу - там выведен uart вместо линии данных. В комп засовывать не стоит, шьют их после вскрытия, подключаясь к отладочным пинам.
NutsUnderline
ага, значит все таки копались (мне что то гугл вообще ничего не показал). тогда разбирать протокол и лепить свое без левых серверов