Розробка мобільного додатка для розумного дому (освітлення)
Управління освітленням здається технічно простим завданням на перший погляд. Включити/вимкнути — це три рядки коду. Але коли з'являється затемнення через 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).







