Разработка мобильного приложения для умного дома (освещение)
Управление освещением — технически простая задача только на первый взгляд. Включить/выключить — это три строки кода. Но когда появляются диммирование через DALI или 0-10V, синхронизация Philips Hue с LIFX в одном приложении, сцены с плавными переходами и динамическая цветотемпература по циркадному ритму — сложность растёт нелинейно.
Протоколы управления освещением
Умные лампы и выключатели работают через несколько протоколов, каждый со своим SDK:
Philips Hue — REST API через локальный Hue Bridge (http://{bridge-ip}/api/{username}/lights/{id}/state). Мобильное приложение работает напрямую с бриджем в локальной сети без облака. Для удалённого доступа — Hue Remote API через OAuth2. Поддерживает on/off, bri (0-254), hue (0-65535), sat (0-254), ct (цветотемпература в mired).
LIFX — UDP LAN протокол (порт 56700) или LIFX Cloud REST API. LAN-протокол быстрее (< 50ms), cloud — надёжнее при смене сети. Для Flutter есть неофициальный lifx_dart пакет, но надёжнее реализовать UDP через dart:io RawDatagramSocket напрямую.
Zigbee-лампы (Ikea TRÅDFRI, Xiaomi Aqara, Sengled) — через Zigbee2MQTT или Home Assistant REST API. Мобильное приложение не говорит напрямую с Zigbee — только с хабом/бриджем.
Wi-Fi лампы на Tuya — Tuya Open API (cloud) или tuyaopen-sdk для локального управления. Tuya Smart Life SDK для мобильных есть официальный: tuya-panel-kit для React Native.
Сцены и группировка
Сцена — это набор состояний нескольких устройств, активируемый одним действием. Простая сцена «Кино»: телевизор включён, лампа над диваном 20% тёплого света, остальное выключено.
Реализация через MQTT или REST зависит от платформы. На Hue Bridge сцены хранятся прямо на бридже — POST /api/{username}/scenes. Для кросс-платформенных сцен (Hue + LIFX + Tuya одновременно) нужен собственный сервис: запускает команды параллельно, отслеживает успех каждой.
Параллельная отправка команд через Future.wait на Flutter:
await Future.wait([
_hue.setState(lampId, brightness: 50, colorTemp: 370),
_lifx.setState(bulbSerial, brightness: 0.2, kelvin: 2700),
_tuya.setStatus(deviceId, {'20': false}), // выключить
]);
Проблема: разные устройства отвечают с разной задержкой. Hue Bridge — 50–100ms, LIFX UDP — 20–50ms, Tuya cloud — 300–800ms. Сцена «применилась» только когда последнее устройство подтвердило. Показываем прогресс в UI, не блокируем интерфейс.
Диммирование и цветотемпература в UI
Слайдер яркости — не Slider из стандартной библиотеки. Стандартный слайдер посылает событие на каждый кадр. При MQTT это сотни команд в секунду. Нужен дебаунс: отправляем команду не чаще чем раз в 100ms при перетаскивании, обязательно финальное значение при onChangeEnd.
На Flutter:
Slider(
value: _brightness,
onChanged: (v) {
setState(() => _brightness = v);
_debouncer.run(() => _setBrightness(v));
},
onChangeEnd: (v) => _setBrightness(v), // обязательно
)
Цветовое колесо (ColorPicker) — через flutter_colorpicker или кастомное на CustomPainter. Конвертация HSV в Hue hue/sat/bri — стандартная формула, ничего хитрого.
Цветотемпература: Kelvin → mired (mired = 1000000 / kelvin). Hue принимает mired (153–500, что соответствует 2000–6500K). LIFX принимает напрямую Kelvin.
Расписание и автоматизация
Включить свет на закате — нужны координаты пользователя + астрономический расчёт. Используем sunrise_sunset формулу или SunCalc.js на бэкенде. Push-уведомление + автоматическая команда в нужное время — через cron на сервере с учётом часового пояса пользователя.
На iOS нельзя запустить задачу точно в нужное время без push или пользовательского взаимодействия — Background App Refresh не гарантирует точность. Расписание управляется сервером, телефон — только UI.
Сроки
Поддержка одного протокола (например, Hue), базовое управление и сцены — 4–6 недель. Мультипротокольная интеграция (Hue + LIFX + Tuya + Zigbee), расписание, циркадный ритм — 3–4 месяца. Стоимость рассчитывается после определения набора поддерживаемых устройств и платформ (iOS/Android/Flutter).







