Здравствуйте, уважаемые читатели моего блога!

Не так давно мой умный дом претерпел разительные изменения, хоть ничего не предвещало беды – всего-то перестала работать Алиса в связке с Home Assistant.

Но локальная проблема быстра переросла в глобальную – в итоге я обновил Home Assistant и настроил всё с нуля. Бэкап, увы, не восстановился, так как разрыв в версиях был приличным.

В ходе работ появилось желание сделать какое-нибудь устройство умным, но вот с самим устройством определиться я не мог. Бытовая техника в доме достаточно сложная и дорогая, чтобы в неё лезть, да и устройства были неподходящими.

Отказ от ответственности!
Автор статьи не несёт ответственности за последствия вмешательства в электрический прибор.
Всё описанное здесь Вы делаете на свой страх и риск.
При наличии гарантии на техническое средство – она будет аннулирована производителем.

Поиск устройства для эксперимента

Интереса ради решил найти примеры в интернете и наткнулся на видео с увлажнителем воздуха. На вид ничего сложного – припаялись к кнопке и имитировали её нажатие с помощью какой-то ESP.

Зашёл на WB и начал искать подходящий вариант для модернизации. Мне понравился вариант за 600 рублей (в качестве бонуса – питание от USB, что упрощало задачу).

Увлажнитель
Мой подопытный перед препарацией

Сделал заказ и получил увлажнитель, смочил фильтры, залил воду и включил в зарядку на один ампер. Всё отлично заработало.

Разборка увлажнителя и его модернизация

Работает увлажнитель следующим образом – одно нажатие на кнопку включает самый мощный режим увлажнения + подсветку, два нажатия – туман выходит попеременно из каждого генератора тумана, три нажатия – туман выходит одновременно из двух генераторов, но с паузой.

Четвертое нажатие выключает увлажнитель.

Разбирается увлажнитель воздуха элементарно – вставляем металлический предмет между пластиком в районе ушей и раздвигаем пластмассу (болтов нет, всё на пластиковых штырьках).

Внутри видим маленькую плату увлажнителя. Решил узнать напряжение на контактах платы – взял мультиметр, отсоединил генераторы тумана (важно) и включил питание.

Плата увлажнителя в разборе
Минимализм в действии

Замер кнопки показал, что на ней 5 вольт (что не давало повторить опыт парня, который я ранее посмотрел на видео) – под рукой у меня была плата nodemcu с esp8266 – на цифровых контактах там не более 3,3 вольта – именно поэтому нельзя подключить её к кнопке напрямую.

Зато сразу определился с питанием платы – есть два пустых контакта (сверху-слева) с 5 вольтами от USB.

Для того, чтобы подключиться к кнопке, использовал транзистор 2N2007, он отлично подошёл для решения указанной задачи (я не Левша, поэтому когда он пришёл в пункт выдачи, я был в шоке от его размера – реально чуть больше блохи).

Вооружившись паяльником, я решил припаять транзистор напрямую к плате, соединив контакт S – с землёй кнопки, а D – с её плюсом. Управляющий контакт G соединил с контактом D2 nodemcu с помощью провода (не самый элегантный вариант, но что делать).

Плата увлажнителя после модернизации
Первый раз паял такую кроху

Касательно настройки nodemcu – подключил её usb проводом к компьютеру, открыл esphome web и выполнил первичную инициализацию.

Далее на сервере умного дома (у меня orange Pi 3 LTS) развернул docker с esphome (примеры команд на официальном сайте) и залил на nodemcu следующую конфигурацию:

esphome:
  name: esphome-web-65b316
  friendly_name: ESPHome Web 65b316
  min_version: 2025.11.0
  name_add_mac_suffix: false

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
- platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

switch:
  - platform: gpio
    id: btn_press
    pin: GPIO4
    restore_mode: ALWAYS_OFF
    internal: true

# Глобальная переменная для хранения режима (0–3)
globals:
  - id: current_mode
    type: int
    restore_value: true
    initial_value: '0'

# Текстовый сенсор для отображения режима словами
text_sensor:
  - platform: template
    name: "Humidifier Mode"
    id: humidifier_mode_text
    lambda: |-
      switch (id(current_mode)) {
        case 0: return {"Выключено"};
        case 1: return {"Максимум"};
        case 2: return {"Низкий"};
        case 3: return {"Средний"};
        default: return {"Неизвестно"};
      }

# Скрипты для нажатий
script:
  - id: press_button
    mode: queued
    then:
      - switch.turn_on: btn_press
      - delay: 200ms
      - switch.turn_off: btn_press
      - lambda: |-
          id(current_mode) = (id(current_mode) + 1) % 4;
          // обновляем текстовый сенсор
          switch (id(current_mode)) {
            case 0: id(humidifier_mode_text).publish_state("Выключено"); break;
            case 1: id(humidifier_mode_text).publish_state("Максимум"); break;
            case 2: id(humidifier_mode_text).publish_state("Низкий"); break;
            case 3: id(humidifier_mode_text).publish_state("Средний"); break;
          }

  - id: turn_off
    mode: queued
    then:
      - lambda: |-
          while (id(current_mode) != 0) {
            // Нажимаем кнопку через MOSFET
            digitalWrite(4, HIGH);
            delay(200);
            digitalWrite(4, LOW);
            delay(500);
            // обновляем режим
            id(current_mode) = (id(current_mode) + 1) % 4;
            // обновляем текстовый сенсор
            switch (id(current_mode)) {
              case 0: id(humidifier_mode_text).publish_state("Выключено"); break;
              case 1: id(humidifier_mode_text).publish_state("Максимум"); break;
              case 2: id(humidifier_mode_text).publish_state("Низкий"); break;
              case 3: id(humidifier_mode_text).publish_state("Средний"); break;
            }
          }

# Кнопки для Home Assistant
button:
  - platform: template
    name: "Humidifier Press"
    icon: "mdi:gesture-tap-button"
    on_press:
      then:
        - script.execute: press_button

  - platform: template
    name: "Humidifier Turn Off"
    icon: "mdi:power"
    on_press:
      then:
        - script.execute: turn_off

Так как я не знаю состояние увлажнителя, nodemcu считает его режимы от 0 до 3. Соответственно, выключение – это последовательное переключение режима до 0 (да, с кнопкой на самом увлажнителе в данной реализации синхронизации нет).

Далее собрал увлажнитель и запустил. В качестве питания взял зарядку на 2 ампера (1 ампер – уже маловато).

В Home Assistant установил интеграцию ESP Home, она автоматически нашла устройство.

И вот я управляю увлажнителем через смартфон – ура!

Результат работы - управление через HA
Цель достигнута – управляем увлажнителем через смартфон

Что можно улучшить?

На данный момент увлажнитель не имеет обратной связи с кнопкой – стоит нажать на неё, и режимы собьются.

Решить эту проблему можно установкой оптопары (требуется изучить этот вопрос более детально), может, позже решусь на это, а пока потестирую работу увлажнителя без данной доработки.

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

На этом прощаюсь с Вами! Хорошего времени суток и до новых встреч.

UPD 04.01.2026 г.

Всё таки не мог я спокойно жить без обратной связи увлажнителя.

Вчера вечером понял, что никакая оптопара не нужна, достаточно разорвать управляющую линию кнопки от микроконтроллера увлажнителя и поручить NodeMCU управлять ею.

Таким образом и решается проблема рассинхронизации увлажнителя.

Отпаял транзистор от кнопки, вскрыл дорожки и припаял транзистор к ним.

Разрезал управляющую дорожку выше контакта D транзистора и соединил контакт D4 с кнопкой.

Место вмешательства в плату теперь выглядит следующим образом:

Для меня пока это высший пилотаж
Общий вид платы

В завершении покрыл места вмешательства и NodeMCU цапонлаком.

В код выше вставил дополнительный блок отвечающий за кнопку.

# Физическая кнопка
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO2   # D4
      mode: INPUT_PULLUP
      inverted: true
    name: "Physical Button D4"
    internal: true
    filters:
      - delayed_on: 30ms
    on_press:
      then:
        - script.execute: press_button
Александр Марухин
sandro331k@yandex.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *