Розробка мобільного додатка для розумного дому (замки/домофон)
Відкрити двері зі смартфона — завдання, в якому нема права на помилку. Замок завис, API повернув 503, BLE-з'єднання не встановилось — користувач стоїть біля дверей. Це не UX-проблема, це інцидент. Тому архітектура додатка для управління замками будується не за принципом «як зробити простіше», а «що робити коли кожен канал зв'язку упав».
Протоколи та типи замків
BLE-замки (August, Schlage Encode, Nuki) — управління напряму через Bluetooth без інтернету. Дальність 5–15 метрів, затримка < 200ms. Нативна реалізація через CoreBluetooth (iOS) / Android BLE API. На Flutter — flutter_blue_plus. Кожен замок — GATT-сервіс зі своїми характеристиками. August замки використовують 00001523-1212-EFDE-1523-785FEABCD123 service UUID з проприетарним протоколом — офіційного SDK немає, працюємо через реверс-інжиніринг або August API.
Wi-Fi замки (Tuya, Yale Connect, Kwikset Halo) — управління через хмару. Затримка 300–2000ms, залежить від інтернету. Для Tuya — Tuya Open API: POST /v1.0/devices/{deviceId}/commands з {"commands": [{"code": "switch_1", "value": true}]}.
Zigbee замки (Samsung SmartThings, Kwikset) — через хаб. MQTT-команда на топік zigbee2mqtt/{device}/set з {"state": "UNLOCK"}.
Z-Wave замки (Schlage, Kwikset Z-Wave) — через Z-Wave JS або Home Assistant.
Резервні канали відкриття
Правило: мінімум два незалежних способи відкрити замок. Якщо основний упав — користувач не повинен звонити в техпідтримку стоячи на морозі.
Типична ієрархія каналів:
- BLE (локальний, без інтернету) — перший пріоритет при близькій відстані
- Wi-Fi/хмара — якщо BLE не доступен
- Резервний PIN-код на замку — при повному відказі системи
- Механічний ключ — фізичний fallback
Додаток автоматично визначає доступні канали та перемикається. BLE: перевіряємо Bluetooth state через FlutterBluePlus.adapterState. Нема BLE або пристрій далеко — пробуємо Wi-Fi/хмару. У UI показуємо активний канал користувачу.
Тимчасовий доступ та гості
Ключ для гостя на 24 години, для АірБнБ-жильця на тиждень, для домробітниці по вівторках з 10 до 14 — це основна функціональність.
Реалізація залежить від замку. Nuki Web API: POST /smartlock/{smartlockId}/auth створює authorization з allowedWeekDays, allowedFromDate, allowedUntilDate, allowedFromTime, allowedUntilTime. August API: POST /access_codes з access_code типом.
Для BLE-замків без хмари: тимчасовий ключ — це криптографічно підписаний токен з часовими обмеженнями, який додаток передає по BLE. Механізм залежить від виробника.
На бекенді: зберігаємо всі видані ключі доступу з метаданими (кому видан, ким, термін дії, список використань). Push-сповіщення власнику при кожному використанні гостевого ключа.
Домофон та відеозвонок
Відеозвонок з домофона на мобільний = WebRTC + VoIP push. Коли хтось натиснув кнопку домофона:
- Домофон публікує подію в MQTT
- Бекенд відправляє VoIP push на iOS (через PushKit) або FCM з
priority: highна Android - Додаток просипається в фоні, встановлює WebRTC з'єднання з домофоном
- Показує UI вхідного дзвінка через
CallKit(iOS) абоandroid.telecom.ConnectionService
VoIP push на iOS через PushKit — єдиний спосіб надійно розбудити додаток для відеозвонка. Звичайний push приходить з затримкою 2–30 секунд. PushKit — миттєво. Вимагає VoIP сертифікат в Apple Developer Portal, entitlement com.apple.developer.pushkit.unrestricted-dispatch.
На Android фоновий сервіс з startForeground тримає WebRTC з'єднання готовим. Починаючи з Android 14 — обмеження на фонові сервіси ужесточились, потрібен ForegroundServiceType.CAMERA + ForegroundServiceType.MICROPHONE у маніфесті.
Журнал подій
Кожне відкриття — запис у журнал: хто, яким методом, у який час. Для здаваного житла це юридично важливо.
Зберігання: PostgreSQL з таблицею access_log (id, lock_id, user_id, method, timestamp, result). Індекс по (lock_id, timestamp DESC). Мобільний додаток запрашує постранично: GET /api/locks/{id}/access-log?page=1&per_page=50.
Строки
Один тип замку (BLE або Wi-Fi/хмара), базове управління, тимчасовий доступ — 6–8 тижнів. Мультипротокол, домофон з відео, CallKit/VoIP, журнал, сповіщення — 4–6 місяців. Вартість розраховується після визначення моделі замків та вимог до гостевого доступу.







