Подключение кондиционеров Haier к Home Assistant

12 апреля 2020, 18:01

Предисловие

Лето 2019-го года выдалось холодным, что дало некоторый люфт по времени для изучения вопроса как по установке кондиционеров, так и по их интеграции в систему умного дома Home Assistant. В моем случае, в каждую комнату застройщиком изначально были заведены трассы хладагента, конденсата и электропроводки, которые выведены в специальное техническое помещение на этаже, в котором и подразумевается монтаж одного внешнего блока на всю квартиру. Все вышесказанное вынуждает устанавливать дорогостоящую мультисплит систему. Осложнением было еще то, что моя квартира находится довольно далеко от этого помещения, а конфигурация и длина коммуникаций диктуют необходимые параметры внешнего блока и его ценник. Опуская долгий процесс поиска и анализа представленных на рынке мультисплит систем, обращения к различным специалистам и компаниям по установке, выбор пал на единственный адекватный по цене вариант - Haier (конкретную модель внешнего блока не указываю, т.к. для реализации управления из умного дома она вообще не принципиальна, будь-то обычный кондиционер или мултисплит). Далее я освещу все необходимые шаги для интеграции кондиционеров Haier в Home Assistant, начиная с железа и заканчивая интерфейсом управления.

Способ управления

Для интеграции кондиционера Haier в HA он должен иметь модуль управления по Wi-Fi (я установил внутренние блоки серии Lightera). Штатное управление кондиционером по Wi-Fi осуществляется через серверы Haier, как и любые другие аналогичные решения, например, Xiaomi. Такой подход нам не годится.
Модуль Wi-Fi в кондиционерах Haier сделан в виде простой "флешки", которую можно спокойно извлечь и заменить на "что-то свое". Вот так это выглядит в стоке:


Блок управления кондиционером


Штатный Wi-Fi модуль

И тут мне повезло наткнуться на одну статью, в которой представлена вся техническая часть по созданию собственного модуля для управления кондиционерами Haier по протоколу MQTT, в качестве сервера у автора использовался ioBrocker. В силу того, что с изготовлением подобных устройств я никогда не сталкивался, то просто связался с автором статьи и заказал сразу 3 модуля - по 1 штуке на каждую комнату.

Итого для интеграции требуется:

  • внутренний блок Haier с поддержкой Wi-Fi (в моем случае - Lightera);
  • специальный модуль управления;
  • сервер умного дома с MQTT (в моем случае - hassio, в связке с mosquitto).

Подключение

Получив заказанные модули аккурат перед первой неделей самоизоляции, я принялся к подключению кондиционера к Home Assistant, его дальнейшей настройке и написанию интерфейса.

Далее по шагам:

1. Извлекаем штатный Wi-Fi модуль, устанавливаем новый. Берем телефон, находим Wi-Fi сеть с именем "Haier", подключаемся.

2. Находим в окне настройки свою Wi-Fi сеть 2,4ГГц, вводим пароль и заполняем следующие поля:

  • ip адрес MQTT сервера - у меня это адрес малины;
  • порт сервера MQTT, не трогаем;
  • логин от mosquitto;
  • пароль от mosquitto;
  • имя кондиционера (как я понял, ни на что не влияет);
  • путь к топикам MQTT для конкретного модуля. Если у вас 1 кондиционер - можно не править. Если 2 и более - у каждого должен быть уникальный путь, у меня это "myhome/topic", "myhome/topic2" и "myhome/topic3".

После заполнения граф и нажатия кнопки "save", модуль подключится к домашней сети Wi-Fi и к MQTT-серверу.

3. Для проверки работоспособности подключенного модуля, я использую MQTT explorer. Тут все довольно просто: логинимся на свой MQTT сервер, включаем кондиционер с пульта, и если все работает - видим все топики кондиционера. Самые важные:

  • Power - питание - on, off;
  • Set_Temp - целевая температура - от 16 до 30 градусов по Цельсию;
  • Current_Temp - температура, которую измеряет кондиционер;
  • Mode - режим работы кондиционера - cool, heat, smart, vent, dry;
  • Fan_speed - скорость потока - min, mid, max, auto;
  • Swing - направление потока воздуха - ud (вверх/вниз), lr (влево/вправо), off, (нет движения), all (движение шторок в обоих направлениях);
  • Lock_Remote - блокировка кнопок пульта - true, false;
  • RAW - код команды, который считывает кондиционер.

Настройка

Убедившись, что кондиционер подключён к MQTT-серверу, добавляем в configuration. yaml компонент климата:

climate:
  - platform: mqtt
    name: cond_zal
    modes:
      - "cool"
      - "heat"
      - "smart"
      - "vent"
      - "dry"
    fan_modes:
      - "min"
      - "mid"
      - "max"
      - "auto"
    swing_modes:
      - "ud"
      - "lr"
      - "all"
      - "off"
    max_temp: 30
    min_temp: 16
    precision: 1.0
    retain: true
    power_command_topic: "myhome/topic/set/Power"
    mode_command_topic: "myhome/topic/set/Mode"
    mode_state_topic: "myhome/topic/Mode"
    temperature_command_topic: "myhome/topic/set/Set_Temp"
    temperature_state_topic: "myhome/topic/Set_Temp"
    fan_mode_command_topic: "myhome/topic/set/Fan_Speed"
    fan_mode_state_topic: "myhome/topic/Fan_Speed"
    swing_mode_command_topic: "myhome/topic/set/Swing"
    swing_mode_state_topic: "myhome/topic/Swing"
    current_temperature_topic: "myhome/topic/Current_Temp"

P.S. Опытным путем установлено, что топик для чтения состояния имеет путь "myhome/topic/***", а топик для изменения состояния - "myhome/topic/set/***". 
Однако со штатным компонентом климата не все так гладко.

Во-первых. Выбор режимов работы кондиционера ограничивается встроенными в компонент состояниями: “auto”, “off”, “cool”, “heat”, “dry”, “fan_only”, из-за чего режимами "smart" и "vent" воспользоваться не удастся.

Во-вторых. Выставлять и мониторить температуру, можно регулировать скорость и направление потока воздуха, а банальное включение / выключение кондиционера не работает. Причина, как я понял, в том, что питание и режимы кондиционера разнесены по разным топикам, а HA такое разбиение корректно не поддерживает. Здесь нужно либо внимательно изучить матчасть, либо пойти другим путем, что я собственно и сделал.

P.S. Если Вам известна возможность отладить эту интеграцию при помощи средств HA, прошу отписаться в комментариях :) 

Настройка. Другой путь

Альтернативный вариант настройки работы кондиционера лежит через создание одного переключателя, нескольких сенсоров и горстки скриптов. Начинаем.

1. Питание. Включение и выключение кондиционера отдельным переключателем.

switch:
  - platform: mqtt
    name: ac_zal_power
    icon: mdi:power-standby
    command_topic: "myhome/topic/set/Power"
    state_topic: "myhome/topic/Power"
    payload_off: "off"
    payload_on: "on"
    state_off: "off"
    state_on: "on"

2. Сенсоры. Прописываем необходимые сенсоры: целевая температура, текущая температура, режим работы, скорость и направление потока. Остальное не нужно, если им не пользоваться.

# Выставленная температура
- platform: mqtt
  name: ac_zal_set_temp
  state_topic: 'myhome/topic/Set_Temp'
  unit_of_measurement: "°C"
  icon: mdi:thermometer

# Текущая температура
- platform: mqtt
  name: ac_zal_current_temp
  state_topic: 'myhome/topic/Current_Temp'
  unit_of_measurement: "°C"
  icon: mdi:thermometer

# Режим работы
- platform: mqtt
  name: ac_zal_mode
  state_topic: 'myhome/topic/Mode'
  icon: mdi:hvac

# Скорость потока
- platform: mqtt
  name: ac_zal_fan_speed
  state_topic: 'myhome/topic/Fan_Speed'
  icon: mdi:concourse-ci

# Направление потока
- platform: mqtt
  name: ac_zal_swing
  state_topic: 'myhome/topic/Swing'
  icon: mdi:tailwind

3. Скрипты. Для управления кондиционером создаем скрипты. Для себя я сделал дополнительные условия их срабатывания - кондиционер должен быть включен. Вы же эту часть кода можете вырезать без потери основного функционала.

##############################
####        Режимы        ####
##############################
# Обогрев
ac_zal_heat_on:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_mode', 'heat') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Mode'
        payload: 'heat'

# Охлаждение
ac_zal_cool_on:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_mode', 'cool') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Mode'
        payload: 'cool'

# Автоматический режим
ac_zal_smart_on:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_mode', 'smart') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Mode'
        payload: 'smart'

# Режим вентиляции
ac_zal_vent_on:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_mode', 'vent') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Mode'
        payload: 'vent'

# Осушение
ac_zal_dry_on:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_mode', 'dry') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Mode'
        payload: 'dry'

#################################
#### Регулировка температуры ####
#################################
# Прибавить
ac_zal_temp_up:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: numeric_state
        entity_id: sensor.ac_zal_set_temp
        below: 30      
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Set_Temp'
        payload_template: "{{ states.sensor.ac_zal_set_temp.state|int   1 }}"

# Убавить
ac_zal_temp_down:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: numeric_state
        entity_id: sensor.ac_zal_set_temp    
        above: 16   
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Set_Temp'
        payload_template: "{{ states.sensor.ac_zal_set_temp.state|int - 1 }}"

##############################
####   Скорость  потока   ####
##############################
# Минимальная
ac_zal_fan_speed_min:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'min') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Fan_Speed'
        payload: 'min'

# Средняя
ac_zal_fan_speed_mid:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'mid') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Fan_Speed'
        payload: 'mid'

# Максимальная
ac_zal_fan_speed_max:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'max') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Fan_Speed'
        payload: 'max'

# Автоматическая
ac_zal_fan_speed_auto:
    sequence:
    - condition: and
      conditions:
      - condition: state
        entity_id: switch.ac_zal_power
        state: "on"
      - condition: template
        value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'auto') }}"            
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Fan_Speed'
        payload: 'auto'

############################
#### Регулировка шторок ####
############################
# Регулировка по вертикали
ac_zal_swing_up_down:
    sequence:
    - condition: state
      entity_id: switch.ac_zal_power
      state: "on"   
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Swing'
        payload_template: >
          {% if is_state('sensor.ac_zal_swing', 'all') %}
            {{ "lr" }}
          {% elif is_state('sensor.ac_zal_swing', 'lr') %}
            {{ "all" }}
          {% elif is_state('sensor.ac_zal_swing', 'off') %}
            {{ "ud" }}
          {% else %}
            {{ "off" }}
          {% endif %}

# Регулировка по горизонтали
ac_zal_swing_left_right:
    sequence:
    - condition: state
      entity_id: switch.ac_zal_power
      state: "on"   
    - service: mqtt.publish
      data_template:
        topic: 'myhome/topic/set/Swing'
        payload_template: >
          {% if is_state('sensor.ac_zal_swing', 'all') %}
            {{ "ud" }}
          {% elif is_state('sensor.ac_zal_swing', 'ud') %}
            {{ "all" }}
          {% elif is_state('sensor.ac_zal_swing', 'off') %}
            {{ "lr" }}
          {% else %}
            {{ "off" }}
          {% endif %}

По поводу регулировки шторок.
Когда топик "Swing" имеет значение "ud" (или "all"), шторки, регулирующие направление потока по вертикали, начинают плавно двигаться, при смене значения топика на "lr" или "off" - останавливаются и фиксируются в нужном положении.

Когда топик "Swing" имеет значение "lr" (или "all"), шторки, регулирующие направление потока по горизонтали, начинают плавно двигаться. Однако, при отключении этой регулировки (значение топика "ud" или "off"), они возвращаются в центральное положение. Т.е. тут реализуется либо постоянное изменение направления потока воздуха по горизонтали, либо блокировка потока только по направлению "вперед". Как быть в такой ситуации:

  • установить комфортное направление потока воздуха по горизонтали с пульта ДУ и больше никогда не трогать эту регулировку;
  • периодически пользоваться пультом.
Т.к. используемый Wi-Fi модуль повторяет функционал штатного модуля и приложения "Smart Air", то приходится мириться с некоторыми ограничениями данной интеграции.

Интерфейс

Для управления кондиционером через lovelace можно воспользоваться следующими решениями:

  • специальные карточки, например: раз, два, три. Однако, как написано выше, часть функционала может быть недоступна;
  • проявить фантазию и воспользоваться всеми доступными инструментами HA.
Например, можно использовать button-card или button-card в связке с browser_mod, для придания компактного вида интерфейсу.
Прописать все кнопки управления в lovelace, используя button-card.


Вывести только основные кнопки в lovelace, используя button-card. При помощи browser_mod создать всплывающие окна для выбора режимов работы, установки скорости и регулировки шторок.


Пример всплывающих окон.

Заключение

В данной статье я постарался изложить основные положения интеграции кондиционеров Haier в Home Assistant. Штатные функции кондиционера, доступные с пульта ДУ (например, "sleep" и "здоровый сон"), можно воссоздать при помощи автоматизаций, а при желании - создать свои уникальные связки с другими компонентами вашей системы.

Спасибо за внимание! Буду рад почитать ваши решения по интеграции и автоматизации кондиционеров в системы умного дома!


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Валерий Чистяков (airens)
    Валерий Чистяков (airens) 6 месяцев назад
    А не проще было подыграть родному модулю при помощи компонента REST в Home Assistant?

    • Александр Подосинников (alex.pod)

      Я компонентом REST никогда не пользовался. Как через него это можно сделать?

      • Валерий Чистяков (airens)
        Валерий Чистяков (airens) отредактировано 6 месяцев назад

        REST компонент позволяет делать веб-запросы. Очевидно, что устройство управляется через родной стик именно ими. Нужно лишь "подслушать" его протокол общения с родным приложением и воспроизвести его компонентом

  2.  Георгий Александрович (Georgy_Benelli)

    Отличная статья!А что слать в топик для опроса?Я чуть иначе опрос сделал, шлю команду FF FF 0A 00 00 00 00 00 01 01 4D 01 5A в топик RAW

    • Александр Подосинников (alex.pod)
      Александр Подосинников (alex.pod) отредактировано 6 месяцев назад

      Спасибо!

      Достаточно включить кондиционер либо с пульта, либо из HA и все состояния топиков (сенсоров и переключателя) считаются автоматически. Топиком ROW я вообще не пользуюсь, достаточно топиков Power, Set_Temp и т.п.

      •  Георгий Александрович (Georgy_Benelli)

        Да не)Пульты я убрал в шкаф.Делаю автоматически опрос каждые 2 сек.Чтоб текущее состояние всегда актуально было.Та же температура

        • (instalator)
          (instalator) 6 месяцев назад

          Модуль самостоятельно опрашивает кондей каждые 2 сек.

  3. (meta11ist87)
    (meta11ist87) 6 месяцев назад

    Автор, дайте, пожалуйста, контакт того, кто делал этот стик) тоже хочу такой, готов приобрести.

  4. Александр Подосинников (alex.pod)
    Александр Подосинников (alex.pod) отредактировано 6 месяцев назад

    UPD

    Откорректирована прошивка Wi-Fi модуля, теперь кондиционер полностью работает через MQTT HVAC

    • (sandrosov85)
      (sandrosov85) отредактировано 6 месяцев назад

      Т.е. теперь можно пользоваться стандартным компонентом Home-assistant и работает ВКЛ/ВЫКЛ.

      Просто недели 2 назад купил модуль, только сегодня руки дошли, все заработало, а вот вкл/выкл не работает - печалька...

      UPD. Если добавить в конфиг строчки 

      • aux_command_topic: "myhome/topic/set/Power" 
      • aux_state_topic: "myhome/topic/Power

      Можно через дополнительный переключатель включать и выключать кондер. т.е. не нужны кастомные скрипты.

      • Александр Подосинников (alex.pod)

        Выходит эту проблему можно было каким-то образом доделать штатными средствами :)

        Однако обновление прошивки позволило добавить в HA режимы "авто" и "вентиляция".

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

    • (atorch)
      (atorch) 5 месяцев назад

      Прошивку сами допиливали? у автора статьи  по ссылке в гите прошивка обновлялась два года тому назад

      • Александр Подосинников (alex.pod)
        Прошивку доделал Instalator по выявленным мной особенностям работы модуля в HA.
        По поводу версии прошивки на гитхабе - не могу сказать какая именно выгружена, но описание уже отредактировано с учетом доработок кода, таких как замена "smart" на "auto", "vent" на "fan_only", а включение\выключение продублировано через режимы работы кондиционера.

        • Александр Дег (sashadeg)
          Александр Дег (sashadeg) 5 месяцев назад

          Статья на гитхабе, на которую вы ссылаетесь относится к ioBroker. Это ошибка или я что-то не понимаю? 

        • (atorch)
          (atorch) отредактировано 4 месяца назад

          Скажите, а configuration.yaml в статье актуальный?
          Сегодня пришел модуль, mqtt его видит, при прописывании в home assistant конфига из статьи ловлю ошибки:
          ERROR (MainThread) [homeassistant.components.mqtt.climate] Invalid modes mode: auto
          ERROR (MainThread) [homeassistant.components.mqtt.climate] Invalid modes mode: off


          Подозреваю  что проблема примитивная но опята с  hass очень мало.

          • Александр Подосинников (alex.pod)
            Остальные режимы работают?

            • (atorch)
              (atorch) 4 месяца назад
              Я просто до конца не понял, про какой из  топиков ругань.
              Если про  modes, то в конфиге есть режимы modes: - "cool" - "heat" - "smart" - "vent" - "dry", а управляя с пульта и смотря что видит mqtt explorer мой внутренний блок умеет только  cool, heat и dry.
              Еще раз - с hass опыта маловато - мне надо понять, про какой кусок конфига ошибка.
  5. (irkernel491)
    (irkernel491) 6 месяцев назад

    Подскажите в ХК будет работать? И буде ли работать такой свисток с кондиционерами midea, принцип работы через облако один в один?

  6. Александр Подосинников (alex.pod)

    В HomeKit работает.

    Свисток сделан специально haier.

    1000x_image.png?1587118502
  7. Александр Дег (sashadeg)
    Александр Дег (sashadeg) 5 месяцев назад

    Здравствуйте. Я ни как не могу понять, прямо сейчас в данный момент у вас что зашито в esp8266 чтобы работало по mqtt с HomeAssistant? 

    Можете прямо ссылку дать? Насколько я понял, в данный момент автор данного шилда использует его просто как шлюз обмена данных между его системой ioBroker и кондиционером. Что делать нам, HomeAssistant'цам?  Что шить? 

    Кондиционер приедет только через неделю, но уже сейчас готовлю модуль.

  8. (lashkov8)
    (lashkov8) 5 месяцев назад
    А какого размера smd компоненты под эту плату?
  9. (lashkov8)
    (lashkov8) отредактировано 5 месяцев назад
    Комментарий удален
  10. (lashkov8)
    (lashkov8) отредактировано 5 месяцев назад
    Комментарий удален
  11. (o01482)
    (o01482) отредактировано 4 месяца назад
    Комментарий удален
  12. Сергей Назаренко (sated)
    Сергей Назаренко (sated) 3 месяца назад

    Супер конечно, спасибо. Но это только для Haier, а есть хоть какое-то решение для любого тупого кондиционера сделать его умный с помощью какой-нибудь платы ESP? Перерыл весь интернет. Не нашел решения. Универсальные пульты не вариант. Не берут большинство моделей. Да ИК не надежные.

  13. (Renga)
    (Renga) месяц назад

    Александр, если не сложно, дайте пожалуйста кусок Lovelace, относящийся к button-card.

  14. Руслан Закиров (2i99i5)
    Руслан Закиров (2i99i5) отредактировано 25 дней назад

    Если кто (как я) проникнется покупкой инверторного Haier на 35кв.м., делюсь своим опытом. Самый дешевый выходит HSU-12HTM103/R3(DB), на маркетах указана опциональная поддержка wi-fi. На прошлой неделе получил такой. Во внутреннем блоке есть место для wi-fi  модуля, но порта USB "мама" не оказалось. На плате порт CN35 распаян. В техподдержке Haier сказали, что нужно в сервисе купить кабель парт-номер A0010402992 (в zip-магазинах 850р., у официалов 300р.) или wi-fi модуль (не наш случай) KZW-W002(W).

К списку статей

Скидки для сообщества

Z-Wave Ukraine

+380 68 641 9670
Промокод:
Sprut-UA
Размер скидки:
15%

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
15 ноября 2018, 09:42
Способы автоматизации механических ворот
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
02 июля 2020, 07:24
Я хочу поделиться своей разработкой: "умным открывателем пластикового окна". В статье вы найдете все необходимое, чтобы повторить проект и изготовить собственный привод для открывания окна с использованием штатной фурнитуры окна.
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации
29 октября 2019, 07:59
Умный домофон на базе nodeMCU с прошивкой ESPHome.