TL;DR
Несколько кондиционеров Rovex серии RS-ALS1 были прокинуты в умный дом. Для них сделаны wifi-модули на базе esp8266 и прошивки ESPHome. Общение с кондиционером идет с помощью написанного с нуля кастомного компонента для ESPHome.
Управление кондиционером возможно как из веб-интерфейса (смотри документацию на опцию web_server в прошивке ESPHome), так и из любых систем, которые поддерживают ESPHome. Например, устройства ESPHome без всяких лишних посредников залетают в Home Assistant. А так как ESPHome поддерживает MQTT, то по факту интеграция возможна почти в любую систему умного дома.
Кондиционерами Rovex история не ограничивается - поддерживаются все кондиционеры, созданные на заводах AUX, и работающие через приложение AC Freedom.
Какие цели этой статьи?
Во-первых, я хочу показать достаточно подробно весь путь: как искал информацию, как изучал найденные решения, как расшифровывал протокол и т.п. Вряд ли эта информация будет совсем уж уникальна. Но так, чтобы всё сразу в одной статье - я не встречал. Мне кажется, многим DIY-щикам такая заметка пригодится и поможет похожим образом разобраться со своими устройствами (не обязательно кондиционерами).Во-вторых, хочется показать, что сделано. Возможно, мое решение кому-то поможет прокинуть кондиционер в систему умного дома.В-третьих, было бы здорово протестировать моё решение на разных кондиционерах. Наверняка есть баги, которые надо отловить и устранить. Чем больше людей протестируют мой компонент для ESPHome, тем быстрее ошибки будут обнаружены.
Как я готовое решение искал
Вначале я хотел купить оригинальные wifi-модули для своих сплит-систем. Мне казалось, это будет идеальное решение и полностью закроет все мои потребности. Но оказалось, что такие модули в продаже в моём городе отсутствуют. Из других городов вроде бы можно было заказать доставку, но по факту нигде в наличии этих модулей не было. В паре мест менеджеры интернет-магазинов говорили, что возможно скоро модули будут, но в итоге ожидание вылилось в без малого месяц потерянного времени. К тому же, продавцы в России хотели за один модуль 3000 руб. и более. Что при моём количестве сплитов выливалось в стоимость еще одного кондиционера. Жаба квакала, но за неимением альтернатив была задушена.
Параллельно с ожиданием модулей, я искал способ интеграции таких модулей в систему умного дома, а заодно не оставлял надежду найти вменяемое DIY-решение. Вся интеграция в умный дом сводилась к использованию MQTT как прокладки. Об этом решении даже статья на Спруте есть. Сохранил себе в закладки на случай, если ничего другого не получится.
К радости жабы, поставку оригинальных wifi-модулей российским перекупам я не дождался. К этому моменту я уже прочно встал на путь DIY и решил всё делать сам.
Кстати, судя по приведенной слева фотографии из интернета, AUX стали делать модули и с USB-разъемом. Так что теперь наличие USB-разъема в вашем сплите не гарантирует, что моё решение вам не подойдет. Надо копать глубже и пробовать подключать. Или вскрывать внутренний блок кондиционера и смотреть на материнскую плату и распиновку разъёма wifi-модуля на ней.
Поиск аналогов
Беглый поиск аналогов показал, что Rovex выпускает кондиционеры не самостоятельно, а на заводе крупного производителя кондиционеров - AUX. По крайней мере, мою модель они выпускают там. Такое производство называется OEM (original equipment manufacturer), а по простому - один производитель делает оборудование для другого производителя. Вы такие кондиционеры наверняка встречали: логотип производителя, название модели - всё разное, а внешне кондиционеры как близнецы!
В интернете была встречена вот такая картинка, поясняющая, на каких заводах какие кондиционеры производятся. Понятно, что перечень брендов не полный. Но крупных OEM-производителей в Китае действительно шесть и любой кондиционер на рынке, скорее всего, будет сделан на одном из их заводов.
Кстати, тут же видно один из моментов, сильно усложняющий жизнь DIY-щика: кондиционеры одного бренда могут создаваться на заводах разных производителей. Например, Rovex серии RS-ALS1 - это заводы AUX. А тот же Rovex, но модель RS-UIN1 - это уже Haier.
Подтверждение того, что Rovex RS-ALS1 производится на заводе AUX, пришло с неожиданной стороны. Изучая инструкцию к своему кондиционеру обнаружил, что в разделе про wifi, Rovex даже не стали стирать название OEM-производителя и в моей инструкции говорится о кондиционере AUX, а не Rovex :)
Поиск модулей для AUX подешевле вариантов не дал, поэтому началась эпопея шаловливых ручек.
В сети нашлась информация, что на заводах AUX выпускают свои модели следующие компании: Abion, AC ELECTRIC, Almacom, AUX, Ballu, CENTEK, Climer, DAX, Energolux, ERISSON, Green Energy, Hyundai, IGC, Kentatsu (некоторые серии; Kentatsu KSGMA26HFAN1 протестирован и точно не поддерживается моим модулем), Klimaire, KOMANCHI, LANZKRAFT, LEBERG, LGen, Monroe, Neoclima, NEOLINE, One Air, Pioneer (до 2016 года), Roda, Rovex, Royal Clima, SAKATA, SATURN, Scarlett, SmartWay, Soling, SUBTROPIC, Supra, Timberk, Vertex, Zanussi.
Берем инициативу в свои руки: вскрытие сплита
Не долго думая, я вскрыл внутренний блок кондиционера. Основное, чего хотелось - определить, какой пин в разъеме за какой сигнал отвечает.
У меня не было точного понимания, какой интерфейс используется сплитом для коммуникации с wifi-модулем. Изучая, как это работает у разных производителей, я нашел, что встречаются такие варианты:
Обычный UART (вроде бы самый распространенный).RS-485 (чаще всего не в бытовых, а в офисных, промышленных или околопромышленных системах).Всякая экзотика.К сожалению, на материнской плате сплит-системы маркировки выводов не было. Из надписей только "wifi CN8", что не сильно помогало.
В моём случае, на wifi-модуль производитель вывел 5 пинов. Для UART обычно достаточно четырех: TX, RX, GND и питание. Для RS-485 тоже много не надо: A, B, GND и питание. Из-за этого я поначалу думал, что в моём случае интерфейс какой-то экзотический.
Померил уровни на пинах:№ЦветОписание1
Желтый
14V DC (max: 14.70V; min: 13.70V)2
Черный
GND3
Белый
5V DC (max: 5.63V; min: 4.43V)4
Синий
Высокий уровень 5V. Периодически проходит какой-то сигнал.5
Красный
Высокий уровень 5V
Проверка распиновки
Поковырявшись в схемотехнике, я удостоверился, что силовое питание - это желтый и черный провода (пины 1 и 2 разъема). При этом на пине 1 производитель явно закладывался на питание до 16В.
Пин 3 (белый), на котором мультиметр и осцилограф показывали постоянные 5В, силовым быть не может, так как этот пин подключен напрямую на ногу контроллера через токоограничивающий резистор R21 номиналом 1kOhm. Возможно, это какой-то сигнальный пин.
Пин 4 (синий) - очевидно сигнальный. На нем видно периодический цифровой сигнал. Через резистор R20 номиналом 510Ohm подключен к контроллеру, никаких ответвлений нет.
Пин 5 (на разъеме красный, на фотографии платы выше рисовал желтым) - тоже кандидат на передачу сигнала. Через резистор R16 номиналом 510Ohm подключен к контроллеру, подтянут к питанию.
Определяем физический уровень протокола
Мельтешение сигнала на 4 пине подсказало, что с него и надо начинать.
Для таких случаев у меня уже давно приобретен дешевый китайский клон логического анализатора Saleae Logic на 8 каналов. Без такого инструмента мне бы пришлось крайне тяжело.
К анализатору была подключена земля и сигнальные пины №3, 4 и 5.
Никакие пляски с ИК-пультом кондиционера на сигналы на линиях не влияли. Сигнал на 4 линии был явно цифровой и от работы сплита не зависел. Сигнал проскакивал по линии каждые 3 секунды. Пришло время погружаться глубже.
Программа для Saleae Logic хороша тем, что можно записать сигнал на какой-лило линии, изучить его в ручном режиме со всеми таймингами и потом установить в программе параметры сигнала. Софт попробует расшифровать сигнал и выдаст полученные цифровые данные. При этом в таймлайне сигнала будут отмечены места, где сигнал ошибочен. Наличие таких мест как-бы намекает, что параметры сигнала выбраны неточно или ошибочно.
Измерения показали, что длительность минимального “бита” 0,207 мсек, что соответствует скорости 4831 бод. Это близко к “стандартной” скорости 4800 бод. Тест в программе логического анализатора показал, что сигнал вполне расшифровывается на этой скорости.
По стандарту, стартовый бит всегда 0, стоповый бит всегда 1. В получаемой от сплита посылке имеем 110 минимальных “бит” (если последний считать 1).
Получается, на посылку уходит 11 бит:
один стартовый "0",9 бит данных,одна стоповая "1".Если перебирать параметры USRT, то получается, что у нас либо 4800/9-N-1, либо 4800/8-E-1. Второй вариант мне показался более стандартным и я предположил такой формат передачи данных: один стартовый "0", 8 бит данных, один бит четности (равен 1, если в битах данных нечетное количество единиц) и одна стоповая единица.
Как показал опыт, предположение оказалось верное. Но на тот момент я этого еще не знал, и на всякий случай потестировал другие варианты.
Реверсинжиниринг протокола: первый блин комом
На этот момент у меня не было официального wifi-модуля, но я был окрылён успехами и думал сделать модуль самостоятельно. Какие-то сигналы от сплита я получал и мне казалось, что дальше уже дело техники. Я подключил сплит к простейшему USB-UART переходнику (как на фото справа) с помощью витой пары, воткнул переходник в ноутбук и принялся экспериментировать.
На самом деле, на разных этапах возни со сплитом я подключал к нему до трёх USB-TTL переходников одновременно: один из них входом RX мониторил пин 4. У второго линии TX и RX были закорочены и подключены к пину 3 сплита. У третьего аналогично линии TX и RX подключались к пину 5.
Первым делом был написан простенький скрипт на Python, который мог получать и отправлять данные в COM-порт. Из порта посылки уходили в сплит через USB-UART адаптер.
Скрипт использовался мной для записи лога получаемых данных. Моё предположение было в том, что команды ИК-пульта должны как-то влиять на передаваемые сплитом данные. И потыкав разные режимы, я смогу определить, какой байт в посылке за что отвечает. А там уже и до управления кондиционером недалеко.
В общем, я был крайне наивен. Никакие манипуляции со сплитом никак не влияли на данные в посылке, как я не изгалялся. И расшифровать таким образом протокол я не смог.
В один из многочисленных экспериментов случилось непонятное - после очередной команды сплиту, отправленной со штатного ИК-пульта, скрипт принял вместо обычной посылки на 10 байт, большую посылку на 34 байта. Радости не было предела! Вот только я сколько потом не пытался, повторить такой фокус не смог.
Это напоминало научные опыты с голубями, когда исследователи выдавали голубю еду в случайные моменты времени, а у голубя в клетке были кнопки, зеркала, побрякушки. Голубь подозревал, что для получения еды ему надо что-то делать. И он жал кнопки, крутился, кланялся, перекладывал побрякушки... И если еду голубь случайным образом получал в момент, когда он сделал оборот по часовой стрелке, то это поведение закреплялось и голубь потом начинал вращаться, чтобы получить еще еды.
Так и я, раз за разом повторял последовательность действий, после которой прошла новая посылка данных, но повторить колдовство мне не удавалось. Только позже, когда я догадался поставить запись лога надолго, я узнал, что кондиционер с периодичностью раз в 10 минут отправляет такие большие посылки с данными.
Протокол поддался, но не сильно
Полученная случайная посылка на 34 байта все равно оказалась не бесполезная. Во-первых, я сумел, сравнивая её с поступающими каждые 3 секунды посылками, предположить структуру пакетов. Во-вторых, начав передавать данные сплиту, я обнаружил некоторые изменения в передаваемых каждые 10 минут посылках. Это дало старт расшифровке протокола.
В частности, получилось определить, что каждая посылка состоит из заголовка пакета длиной 8 байт, тела пакета (длина может быть и ноль байт) и двух байт контрольной суммы.После того, как логгер записал передаваемые сплитом данные на протяжении почти суток, получилось собрать много пакетов длиной 34 байта. При этом, хоть сплит и был выключен всё это время, какая-то жизнь была - некоторые байты в пакете менялись. Это позволило окончательно убедиться, что последние 2 байта в пакете - это CRC. И потом методом подбора нашел, что это CRC16.
А вот дальше продвинуться не удалось. Попытки передать команду кондиционеру не увенчались успехом. Какие только варианты я не генерировал своим python-скриптом - результата не было. Я даже попробовал угадать команду тупым перебором. Но это надо быть очень удачливым, чтобы всё сработало...
В общем, я сдался.
Помощь, откуда не ждали
Я попытался найти оригинальный wifi-модуль у энтузиастов умного дома у меня в городе, чтобы поставить его временно себе или приехать с ноутом к кому-то в гости и снять протокол. Не получилось.
Но неожиданно в моём городе в продаже нашелся оригинальный wifi-модуль от моего сплита. Я его купил за безумные 3200 рублей. Больно уж хотелось добить тему.
Модуль был подключен к сплиту, на линии повешен логический анализатор, витая пара с USB-TTL адаптером и ноутбуком. Но с первого раза подключиться к родному приложению AC Freedom и поуправлять сплитом не получилось. И со второго тоже. Потому что приложение кривущее ужасно. Зато когда победить приложение удалось, прогресс не заставил себя долго ждать. И началось самое интересное.
Сбор данных по протоколу
В тот же огромный файл в excel, куда я сохранял логи ранее, были записаны все команды, которые я только смог найти в приложении.
Объем данных получился огромный, зато позволял сопоставлять разные события и искать закономерности.
Благодаря большому количеству собранных данных, удалось в некоторых посылках найти байты, отвечающие за внешнюю и внутреннюю температуру. Найти их удалось, сравнивая изменение для выключенного сплита с логом уличной температуры (см. графики справа).
Верхний график - сырые данные. Т1 - температура внутреннего датчика сплита. Т2 - температура внешнего датчика сплита. Air - температура воздуха на улице по гидрометцентру. Work на графике - это периоды, когда работал сплит. Видно, как скачет температура Т2 при включении сплита.
Нижний график - из значений температур Т1 и Т2 вычел 31, чтобы привести температуру Т2 ближе к температуре Air.
Всплеск Т1 ближе к концу записи - это я грел внутренний датчик сплита. Пляски температуры уличного воздуха Air примерно в период работы сплита - это так совпало. В тот период местами лили дожди. Скорее всего, в районе метеостанции пролилось очень хорошо.
В общем, если вам когда-нибудь понадобится разбирать закрытый протокол, то два самых главных инструмента для вас - это логический анализатор и Excel. Ну и мозги, конечно же.
Свой модуль
Реализовывать модуль решил на esp8266, собирая прошивку с помощью ESPHome.
Схема обвязки esp8266 простейшая и показана на рисунке справа.
Для прошивки esp8266 в первый раз нужно в дополнение к обвязке, показанной на схеме, притянуть к Земле пин IO0 (GPIO0). После этого ESPHome может быть загружена в esp8266 по UART0. Если при этом вы указали OTA в конфигурации ESPHome, то в дальнейшем пин IO0 можно подтянуть к питанию или оставить висеть в воздухе. Он никак не будет влиять на загрузку новых прошивок, потому что все апдейты можно будет делать "по воздуху" (то есть по wifi). Я никуда IO0 не подтягивал и ничего к нему не паял, потому что не вижу смысла это делать ради одного раза. Первую прошивку делал в самодельном переходнике на макетке.
Чтобы самоделка не выглядела как вязанка проводов, для неё был спроектирован и напечатан на 3D-принтере корпус. Модельки простейшие.
Файлы для печати корпуса выложены на гитхаб. Пользуйтесь.
В итоге модуль занимает своё штатное место и прекрасно работает!
Прошивка
Описание протокола здесь не привожу. Планирую выложить его в будущем на свой гитхаб. Пока его там нет - руки не дошли. Но если очень любопытно, то на гихаб по ссылке выше выложены исходники, в которых протокол более-менее описан.
Прошивка базируется на ESPHome. Для этой платформы был написан кастомный компонент, исходники которого опубликованы на гитхаб.
Вообще, ESPHome - весьма гибкая штука. А возможность писать свои компоненты и большое международное сообщество поднимает гибкость на внушительный уровень.
Процесс установки ESPHome описывать не буду. Коснусь только установки кастомного компонента. Необходимо выполнить пять шагов:
Шаг 1: Скопируйте файл aux_ac_custom_component.h (ищите в гитхаб по ссылке выше) в папку с вашими YAML-файлами ESPHome.
Шаг 2: В заголовочной части вашего YAML-файла пропишите инструкцию include. Например:
esphome: name: $devicename platform: ESP8266 board: esp12e includes: - aux_ac_custom_component.h
Шаг 3: Настройте UART для коммуникации с вашим кондиционером:
uart: id: ac_uart_bus tx_pin: GPIO1 rx_pin: GPIO3 baud_rate: 4800 data_bits: 8 parity: EVEN stop_bits: 1
Шаг 4: У ESP8266 два аппаратных UART - UART0 и UART1. Нам подходит только UART0, поскольку только он имеет и TX и RX. Поэтому в секции uart: выше мы настроили UART0 для нужд aux_ac. Но на том же УАРТе сидит и logger. Чтобы не было коллизий, настраиваем логгер на работу с UART1, у которого есть только TX, чего для нужд логгера более, чем достаточно:
logger: level: DEBUG # important: for avoiding collisions logger works with UART1 (for esp8266 tx = GPIO2, rx = None) hardware_uart: UART1
Шаг 5: объявление кастомного компонента:
climate: - platform: custom lambda: |- extern AirCon acAirCon; if (!acAirCon.get_initialized()) acAirCon.initAC(id(ac_uart_bus)); App.register_component(&acAirCon); return {&acAirCon}; climates: - name: "My awesome air conditioner"
Что в итоге?
Мой модуль точно работает со следующими моделями сплит-систем:
- Rovex (models: RS-07ALS1, RS-09ALS1, RS-12ALS1, RS-18ALS1, RS-24ALS1)
- AUX (models: ASW-H09A4/LK-700R1)
- IGC (models: RAK-07NH multysplit)
Как только мне кто-то из пользователей сообщает, что мой компонент успешно заработал с какой-то сплит-системой, я вношу её в перечень на гитхаб. Так что там список наиболее актуальный.
Протестированы и точно не совместимы:
- Kentatsu (models: KSGMA26HFAN1).
Я рад, что решил свою задачу и смог закинуть все свои кондиционеры в Home Assistant. Теперь они рулятся скриптами, автоматизациями, ручками из приложения и вообще по-всякому. Каждый сплит теперь отдаёт в систему температуру воздуха с внутреннего датчика (одним датчиком температуры в каждой комнате стало больше.
Была идея использовать уличный датчик кондиционера в своих целях. Но пока не получается. Во-первых, я, видимо, до конца не расшифровал протокол. Похоже, какие-то байты температуры я упустил, потому что температура отдается датчиком не всегда (когда на улице зима и мороз -20 градусов, датчик отдаёт ахинею). Во-вторых, поскольку датчик установлен на испарителе, то и температуру показывает испарителя. А она при работе кондиционера гуляет очень сильно и температуре уличного воздуха не соответствует совсем.
Настолько подробно описывал весь процесс и сложности для того, чтобы показать, как я решаю подобные задачи. Возможно, мой опыт окажется кому-то полезен. Чувствую, что налил слишком много воды. И можно было сделать описание более структурированным и сжатым. Но переписывать уже не осилю :)
Все исходники опубликованы на гитхабе. В том числе и файлы для печати корпуса wifi-модуля. Там же есть подробный readme.
Если кто-то решит повторить мой модуль, вопросы можно задать в специальном чате телеграма. Там я стараюсь помогать с установкой всем, кто решит использовать мою прошивку. Хотя там же мы часто помогаем людям найти решение, если их модель сплита не поддерживается моим модулем.