Я, как и любой владелец дома-дурачка, страх как люблю поуправлять кондиционером. А потому не смог отказать себе в удовольствии и в России:
Заваривайте чаю, будем прикручивать кондиционер от 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 дней, как я привык в Таиланде.
Ну и, главное, обошёлся без вендорского говна для управления кондиционером — это всегда особенно приятно :)
А пока у меня всё. Всем кота! (づ˶•༝•˶)づ♡