Автор купил потолочный вентилятор Dreo CLF513S и сразу упёрся в проблему: управление работало только через облако. Штатная интеграция с Home Assistant была, но полагаться на интернет для включения света в спальне не хотелось. Поэтому он решил взломать пульт дистанционного управления.
Пульт не требовал прямой видимости — значит, RF, а не ИК. FCC ID на корпусе подтвердил: это радиопередатчик на частоте 433.92 МГц. Автор взял RTL-SDR с программой gqrx и захватил сигналы с разных кнопок. В документации FCC было написано про FSK, но практика показала другое: пульт использовал обычную амплитудную манипуляцию ASK, а точнее On-Off Keying (OOK). Сигнал оказался похож на азбуку Морзе — короткие и длинные всплески амплитуды.
Автор разобрал структуру пакета. Каждая команда повторялась пять раз с паузой 8.8 мс. Пакет содержал преамбулу из восьми нулей, общую 20-битную синхронизацию и уникальную 13-битную полезную нагрузку. Например, у кнопки Fan On/Off payload был 0111110010000. Логический 0 кодировался как 1000, а единица как 1110 — каждый импульс длился 300 мкс.
Для повторной передачи автор собрал передатчик на плате Xiao ESP32-C6 с модулем RFM69HCW на 433 МГц. Пул библиотек вроде RadioHead не понимал проприетарный протокол, поэтому пришлось работать через raw-режим — вручную дёргать пин данных по таймингам, расшифрованным с пульта. Самое сложное было поймать точные задержки: вентилятор игнорировал команды, если импульс или пауза между пакетами немного плавали. RTL-SDR снова пригодился — автор сравнивал свою генерацию с оригиналом.
Подключили к Home Assistant через MQTT. ESP32 подписался на топики, каждый — под конкретную команду. Home Assistant публикует сообщение по нужному топику, ESP32 принимает и ретранслирует RF-сигнал. Поскольку вентилятор ничего не передаёт обратно, контроллер хранит внутреннее состояние (свет, яркость, скорость), которое синхронизируется с реальностью только при старте. Если рассинхрон случается, автор просто жмёт нужную кнопку на пульте — и всё встаёт на место.
Проект работает почти год. Передатчик лежит на полке, а вентилятором управляют через Siri. Все расшифрованные команды лежат в репозитории на GitHub.