Я, как и любой владелец дома-дурачка, страх как люблю поуправлять кондиционером. А потому не смог отказать себе в удовольствии и в России: Заваривайте чаю, будем прикручивать кондиционер от Electrolux к Home Assistant :)

Каков путь?

У меня дома стоит сплит-система Electrolux ATRIUM, которая меня полностью устраивает. Точную модель не помню, но это и не важно. А важно то, что её можно подключить к Wi-Fi с помощью специального донгла, например, от Русклимат:

Подключаемого через вот такой переходник:

К панельке кондиционера: Не обманывайтесь тем, что там используется USB-разъём — это 5-вольтный UART, инфа сотка.

Но связываться с вендорскими донглами и их облаками — не путь настоящего самурая. Настоящий самурай знает — вендорских облаков надо избегать как огня. Настоящий самурай подключается к интернетам и видит, что немалая часть кондиционеров использует один и тот же протокол, который давно отреверсили и добавили в ESPHome из коробки (см. Midea Air Conditioner). А значит, настоящий самурай идёт собирать собственный адаптер, на который прошьёт ESPHome, подключит к своему инстансу Home Assistant и будет удовлетворён. Таков план, таков путь.

MVP

Как вы могли догадаться, всё, что нам нужно — подключиться к кондиционеру по UART, а дальше компонент от ESPHome сделает своё дело. Одна беда: ESP32 работает с 3.3v, а кондиционер — с 5v. Беда небольшая: можно либо собрать делитель на резисторах, либо взять любой logic level shifter на MOSFET’ах. Я посчитал, что с делителем будет совсем уж ненадёжный соплестрой, а потому нашёл в коробке какой-то дешёвый 2-канальный logic level shifter 5v–3v3 (в духе такого) — его и взял.

Финальный BOM получился такой:

  • esp32c3 super mini;
  • 2-канальный logic level shifter 5v–3v3;
  • 4-пиновый JST XH2.54 коннектор для подключения к кондиционеру.

Дальше прикинул, как это дело подключать: Благо у esp32c3 super mini, как и у большинства других бордов, есть LDO на борту, так что проблем с питанием от 5v нет.

И собрал этот страх:

Дальше написал минимальный конфиг для ESPHome:

esphome:
  name: "livingroomac"
  friendly_name: LivingRoomAC
  platformio_options:
    board_build.f_flash: 40000000L
    board_build.flash_mode: dio
    board_build.flash_size: 4MB

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "XXXX"

ota:
  - platform: esphome
    password: "XXXX"

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

time:
  - platform: homeassistant

uart:
  id: ac_uart
  tx_pin: GPIO5
  rx_pin: GPIO6
  baud_rate: 9600

climate:
  - platform: midea
    uart_id: ac_uart
    name: Electrolux AC         # Use a unique name.
    autoconf: true              # Autoconfigure most options.
    beeper: false                # Beep on commands.
    visual:                     # Optional. Example of visual settings override.
      min_temperature: 17 °C    # min: 17
      max_temperature: 30 °C    # max: 30
      temperature_step: 0.5 °C  # min: 0.5
    supported_modes:            # Optional. All capabilities in this section may be detected by autoconf.
      - FAN_ONLY
      - HEAT_COOL
      - COOL
      - HEAT
      - DRY

Воткнул адаптер в кондиционер (показывать не буду, не для слабонервных), добавил его в Home Assistant — и тадам:

Можем, наконец-таки, не искать пульт от кондиционера :)

Антисопли

Как настоящий соплестройный MVP, вариант с esp32c3 super mini был нужен только для одной цели — понять, насколько эта конструкция вообще работает. А раз уж она завелась, пришло время уменьшать количество соплей. Тем более, что мне как раз нужно было понять, как можно заказывать платки в Россию и чего от них ждать.

Что ж, рисую незамысловатую схемку будущего адаптера на базе ESP32-C3-WROOM-02-N4 и двух MOSFET’ов BSS138 (можно взять что-нибудь вроде 2N7002, но я захотел BSS138):

Развожу платку адаптера:

Заказываю производство на PCBWave и жду… долго жду… Общий таймлайн получился такой:

  • 28 мая сделал заказ;
  • 4 июня отправили;
  • 1 июля курьер вручил мне конвертик с платками.

С таким шагом в месяц сильно не забалуешь, канешн :/ Но да не суть, приехали в Москву через Казахстан целёхонькие, почему-то в количестве 12 штук (вместо 5):

Дождавшись выходных, запаиваю их во что-то полезное:

Готовлю новый конфиг для ESPHome (поправил пины для UART и добавил status led):

esphome:
  name: "livingroomac"
  friendly_name: LivingRoomAC
  platformio_options:
    board_build.f_flash: 40000000L
    board_build.flash_mode: dio
    board_build.flash_size: 4MB

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "XXXX"

ota:
  - platform: esphome
    password: "XXXX"

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

time:
  - platform: homeassistant

status_led:
  pin:
    number: GPIO8
    inverted: false

uart:
  id: ac_uart
  tx_pin: GPIO6
  rx_pin: GPIO7
  baud_rate: 9600

climate:
  - platform: midea
    uart_id: ac_uart
    name: Electrolux AC         # Use a unique name.
    period: 1s                  # Optional
    timeout: 2s                 # Optional
    num_attempts: 3             # Optional
    autoconf: true              # Autoconfigure most options.
    beeper: false                # Beep on commands.
    visual:                     # Optional. Example of visual settings override.
      min_temperature: 17 °C    # min: 17
      max_temperature: 30 °C    # max: 30
      temperature_step: 0.5 °C  # min: 0.5
    supported_modes:            # Optional. All capabilities in this section may be detected by autoconf.
      - FAN_ONLY
      - HEAT_COOL
      - COOL
      - HEAT
      - DRY

Подключаю к компу по UART для прошивки и вижу:

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0xf (BROWNOUT_RST),boot:0x0 (USB_BOOT)
wait usb download

Это фиаско, т.к. мне USB_BOOT совсем не подходит — я развёл только UART и хотел прошить esp32c3 именно этим способом. Открыл документацию ESP32C3: Boot Mode Selection, и всё встало на свои места:

GPIO8 must also be driven High, in order to enter the serial bootloader reliably.

Тот самый GPIO8, который так удобно развёлся для лампочки статуса, отвечает за режим загрузки и должен быть подтянут к 3v3 для прошивки по UART, а не к земле, как у меня:

Уж не знаю, почему я сразу не пошёл смотреть на strapping pins у esp32c3. Видимо, как всегда, был сильно быстрее умных мыслей. Ничего не поделаешь: снял R3 (1K резистор), припаял 10K резистор одним концом к GPIO8, другим — к 3v3, и всё успешно прошил. Благо руками прошить нужно только один раз — дальше OTA зарешает.

После, разумеется, всё вернул обратно и подключил к кондиционеру:

И о чудо — он завёлся, аки родненький: иконка Wi-Fi на месте, на команды отзывается:

Кстати, если вдруг кому пригодится, я залил исправленную версию в EasyEDA:

  • подвигал status LED с GPIO8 на GPIO5;
  • подтянул GPIO8 через резистор к 3v3 линии.

Вот так выглядит с фиксом:

Заключение

Было несложное, но прикольное приключение, мне нравятся такие. Не выжимают тебя досуха, как это бывает. Для себя попробовал услуги PCBWave — им до JLCPCB ещё далековато, но сильно лучше предложений в России. Если кто знает вариант получше — напишите, плиз, на dev@buglloc.cc или в тележку. Ещё раз убедился, что пословица «семь раз отмерь, один — отрежь» особенно верна, когда у тебя одна итерация занимает месяц, а не 5–14 дней, как я привык в Таиланде.

Ну и, главное, обошёлся без вендорского говна для управления кондиционером — это всегда особенно приятно :)

А пока у меня всё. Всем кота! (づ˶•༝•˶)づ♡