Управление кондиционером через Wi-Fi

Тема уже неоднократно поднималась, и даже есть варианты решения, но я Вам расскажу о еще одном. Просматривая одну из популярных онлайн площадок я наткнулся на устройство, до этого мне не известное, Broadlink RM Mini 3. Цена на тот момент была 9,90 $. Что значительно дешевле аналогов. Но были и свои недостатки о которых ниже.

image

Устройство представляет из себя цилиндр, в верхней части которого на 360 градусов располагаются ИК датчики. Управление устройством происходит через приложение. Можно управлять любой техникой, обладающей ИК приемником. Но моя цель была одна, управлять кондиционером. Что бы приехав домой, он уже успел создать комфортную температуру.

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

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

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

С помощью сниффинга трафика на WiFi роутере выяснилось, что приложение и устройство общаются между собой UDP пакетами на 80 порту.

tcpdump -w /tmp/dump.cap host 

image

Было решено сделать консоль на локальном web сервере для управления кондиционером. С начало создаем пульт в фирменном приложении:

image

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

image

После чего я закрыл устройству доступ в интернет.

Весь код выложен на GitHub

© Geektimes