Автоматизация старого кондиционера

Заметка о том, какими способами можно попытаться управлять старой техникой с компа, и в итоге добиться в этом успеха.

· 7 минуты на чтение
Автоматизация старого кондиционера
Аккуратные крючочки и неаккуратный желтоватый малярный скотч — такой вот ди-ай-уай...

В конце прошлого поста я вскользь упомянул о том, что старый кондиционер «поумнел», поскольку было страшно оставлять питомцев дома в жару надолго.

В этом посте хочу рассказать подробнее о том, как этот процесс происходил. Пройденный путь — это попытки попробовать несколько подходов, из которых сработал самый хардкорный.

Вводные

В съёмной квартире стоит кондиционер. Название ни о чём не говорит. На наклейке сбоку год производства — 2003. А номер модели не выдаёт никаких полезных результатов. Какие-то результаты есть при попытке найти пульт по фото, но и они в итоге оказываются бесполезными. Максимум, что из гугла удалось вытянуть — это сочетание «EG9», не снабжённое никакой документацией.

Задача — получить возможность управлять кондиционером с телефона или компа. Будь это новый кондиционер, он бы наверняка легко подключался к домашнему вайфаю. Но наш девайс весьма стар, поэтому кроме пульта он ничего не знает.

Поскольку я пользуюсь HomeAssistant, логичным вариантом решения кажется использование ESPHome: дома валяется несколько китайских ESP32, пачка разных модулей к ним, так что есть шансы на выходе получить что-то работающее и настраиваемое.

Вообще, сперва мне показалась уместной идея заказать «универсальный пульт» — готовое устройство с базой кодов, которым можно как-то управлять. Однако, вот процесс интеграции HomeAssistant с подобными устройствами в моих глаза не выглядел тривиальным, поэтому решил отмести этот вариант. До сих пор сомневаюсь, насколько такие девайсы способны работать с подобными малоизвестными кондиционерами. Возможно, это было бы для меня и вовсе пустой тратой денег.

Собираем и прошиваем

ESPHome компилирует и записывает прошивки через удобное приложение ESPHome Device Builder. Его можно развернуть и на сервере, но на локальной машине, скорее всего, он будет работать быстрее. Ну, кроме случаев, когда у вас ноут — это тонкий клиент с минимумом ресурсов.

Есть смысл сначала накидать в нём хотя бы минимальный функционал, пусть даже он и не будет сразу работать: сперва придётся решить, каким образом ESP32 будет взаимодействовать с вашим устройством, а для этого придётся посмотреть доступные компоненты для прошивки и изучить, как они настраиваются.

Возможно, вам даже не понадобится ИК-передатчик, если звёзды сойдутся.

Прямое подключение ESP32 к диагностическому разъёму

Это была одна из первых теорий, как можно управлять кондиционером. На некоторых кондиционерах есть разъём, позволяющий принимать внешние команды. Надо лишь припаять несколько проводков и, возможно, пару резисторов к ESP32, на другом конце получившегося шлейфа обжать разъём и воткнуть в плату кондиционера. Компактная еспшка спрячется целиком в корпусе и даже, возможно, сможет принять питание прямо с самого кондиционера.

Например, так можно подключаться к некоторым кондицинерам Mitsubishi Electric. Чем-то похоже на подключение к машине через OBD II.

Это не моё фото, я его нашёл в описании соответствующего компонента, автор там не указан

Но поскольку по моему кондиционеру инфы мало, оставался лишь подход «в лоб»: открыть внутренний блок и посмотреть, нет ли там какого-нибудь свободного разъёма с какой-нибудь говорящей маркировкой. Увы, не нашлось.

Есть ещё жёсткий вариант — попробовать раздебажить плату и врезаться в неё, подключаясь к существующим дорожкам. Так можно было бы заставить ESP эмулировать сигналы от пульта или даже самостоятельно считывать данные с датчиков и запускать компрессор с вентилятором. Но для меня тут есть риск накосячить и остаться вообще без кондиционера, на который даже запчасти нынче сложно найти. Так что переходим к неинвазивным способам.

Эмуляция пульта

Для начала, нам придется прикрутить к еспшке ик-диод. В моём случае дома уже валялся модуль с диодом и транзистором, и это нормальный вариант. В ESPHome добавил компонент Remote Transmitter, выбрал ногу и перешёл к следующему этапу.

В базе ESPHome сейчас 32 компонента в категории Climate. Часть из них эмулирует ИК-пульты, но какой выбрать? Не имея понимания, я по очереди попробовал несколько вариантов, которые мне казались наиболее логичными, опираясь на теорию, что кондиционер делала какая-нибудь OEM-корпорация. Результат нулевой — кондиционер их игнорирует.

И тут в игру вступает флиппер. Поскольку я не знаю, насколько концепция вообще работоспособна, делается следующее: флиппером считывается сигнал с пульта и повторно отправляется в кондиционер. Работает. Уже хорошо.

Берём этот сигнал, декодируем в понятный для ESPHome формат, и создаём отдельный компонент для кнопки, при нажатии которой будет отправляться этот сигнал. Компилируем, запускаем, открываем в HomeAssistant и... обнаруживаем, что яркости диода хватает лишь на полметра. То есть, вся эта конструкция должна быть размещена где-то рядом с внешним блоком. Ну, это лучше, чем ничего. Скотч в помощь. Клеим, тыкаем в кнопку — кондиционер пищит. Почти замечательно.

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

Так что переходим к сложному варианту, в котором больше всего уверенности.

Реверсим протокол пульта и делаем собственный компонент

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

С пультами от кондиционера же ситуация сложнее. Сложно не заметить, что они оборудованы дисплеями, отображающими выбранные настройки. На деле же, когда пользователь нажимает на кнопку, например, температуры, пульт обновляет какой-то параметр и отправляет в кондиционер длинный набор данных обо всех параметрах: режим (нагрев/охлаждение), температура, скорость вентилятора, положение дефлектора, таймер и т.п...

Взгляните на этого деда слева — и ведь хорошо работает для своих лет

Поэтому, снова вооружившись флиппером, идём разбираться. Засылаем разные комбинации по порядку, благо в cli-интерфейсе можно сделать дамп сразу на экран, подписываем каждую, декодируем, а затем скармливаем LLM, и получаем на выходе чёткий маппинг: какой байт за что отвечает.

Но и тут меня ждала засада. Последние два байта были странными. Предпоследний менялся только в зависимости от времени на пульте. Там было не слишком много вариантов, всего штук восемь. И, к счастью, кондиционер спокойно принимал «устаревшие» команды. Но последний байт был контрольной суммой. И как бы я ни пытался подобрать алгоритм для него — всё было тщетно.

Поэтому итоговая схема была такой: из 14 байт запроса первые 5 — префикс — всегда стандартные. Следующие 7 — полезная нагрузка — формируются исходя из настроек (правда, часть из обычно них забита нулями, видимо, резерв для таймеров). И последние 2 подбираются по словарю. Да, это означает, что для всех желаемых настроек надо сдампить пример данных с пульта. Всего надо сохранить более тысячи комбинаций из двух режимов, 16 температур, 7 вариантов положения шторки и 5 вариантов скорости.

Ну и затем дело за малым — описать всю задачу LLM, и пусть нейросеть что-нибудь накодит. Пара вечеров разработки, доработки, полировки и т.п. — и получается вполне приличный компонент, который умеет и в охлаждение, и в нагрев, а ещё при этом, рулит скоростью вентилятора и положением шторки. Тут, правда, тоже есть неприятная загвоздка — HomeAssistant так и не реализовали в интерфейсах возможность управления положением шторки, так что этот кусок пришлось костылить. Зато остальное очень удобно.

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

Ну и да, исходники этого компонента уже есть на гитхабе.

И какой в этом был смысл?

Вообще, после реализации, у меня появилось четыре причины полюбить это решение.

  1. Можно управлять температурой, находясь не дома. Приятно после долгой поездки прийти не в душную квартиру, а в прохладную. И спокойнее от мысли, что в лютую жару питомцам не придётся страдать.
  2. Не нужно пользоваться старым и не очень удобным пультом. У пульта нет подсветки и он постоянно теряется. Телефон же, хоть и требует пары дополнительных нажатий на экран, работает в любых условиях и легко находится с часов. Плюс, информация на экране телефона ощутимо нагляднее.
  3. Благодаря бриджу к HomeKit, можно вообще управлять кондиционером через Apple Home и даже с часов. И даже голосом без дополнительных примочек.
  4. Можно автоматизировать управление по данным с других сенсоров. Когда охлаждение происходит из одного угла комнаты, а температура измеряется в другом углу, появляется возможность точнее ловить подходящий момент для включения и отключения кондиционера.

Попробовав поэкспериментировать с автоматизацией, я смог наконец поймать такой диапазон температур на датчике у стола, при котором я не мёрзну и не обливаюсь потом, сидя за рабочим столом. При управлении кондиционера только с пульта, такое мне не удавалось. Да и тыкать пультом каждые полчаса — то ещё удовольствие.

И короткая прохладная история под конец

В день, когда я решил изучить внутренний блок и его платы, кондиционер перестал включаться. Сперва предположил, что где-то всё-таки накосячил. Всё перепроверил — всё на месте. Нигде никакой провод не оторвался, да и остальные компоненты целые.

Чудесная ретро-плата из Шенженя, на которой нет ни одного SMD-компонента

Не имея особо широкого арсенала измерительной техники, изучил лишь две вещи: потыкав мультиметром в разные клеммы, обнаружил подозрительно низкое сопротивление на компрессоре. И ещё посмотрел, что показывает «умная» розетка с замером потребления — кондиционер при включении пытался выжрать пять киловатт, после чего его отключалась сама розетка.

🔌
Кстати, помнится, пару лет назад в посте про свой подход к управлению домом, писал, что не вижу смысла в розетках со встроенными счётчиками. Вот теперь вижу этот смысл отчётливо, хехе.

В итоге оказалось, что помер пусковой конденсатор компрессора. Прибывший под вечер следующего дня мастер подтвердил это. А наклейка с датой производства конденсатора (всё тот же 2003 год) расставила всё по местам — он 23 года исправно работал в дикую жару и ни разу не был заменён. Ну, до недавних пор, конечно.


На этом всё. Надеюсь, этот пост послужит толчком к действию для тех, кто давно хочет добавить «умных возможностей» старым девайсам: с нынешними нейросетями это стало намного проще. Делитесь своими мнениями, как обычно, в телеграме.

Akkoma Mastodon 4erd.ac Misskey