Интеграция Zigbee-устройств через IoT-хаб в мобильное приложение
Zigbee — беспроводной протокол на частоте 2.4 GHz (IEEE 802.15.4) с ячеистой топологией. Устройства ретранслируют сигнал друг через друга, что даёт хорошее покрытие без Wi-Fi. Прямого Zigbee API в мобильных приложениях нет — смартфоны не имеют Zigbee-радио. Всегда нужен хаб.
Варианты хабов и их API
Zigbee2MQTT — open-source мост: Zigbee USB-координатор (SONOFF Zigbee 3.0, Conbee II, CC2652P) → MQTT-брокер. Самый гибкий вариант для кастомных приложений. Каждое устройство публикует состояние в топик zigbee2mqtt/{friendly_name}, принимает команды из zigbee2mqtt/{friendly_name}/set.
JSON состояния датчика движения Aqara:
{
"battery": 85,
"occupancy": true,
"tamper": false,
"voltage": 2985,
"linkquality": 102
}
Zigbee2MQTT также предоставляет REST API через zigbee2mqtt/bridge/request/device/options для управления конфигурацией — полезно для настройки из приложения.
Home Assistant — если Zigbee2MQTT запущен как HA addon, мобильное приложение работает через HA REST API или WebSocket API. Унифицированный интерфейс для всех устройств независимо от протокола. POST /api/services/light/turn_on с entity_id — вместо прямого MQTT.
Philips Hue Bridge — поддерживает только Zigbee-устройства Philips Hue. Закрытая экосистема, но с отличным REST API.
IKEA Hub — поддерживает устройства TRÅDFRI. Proprietary протокол поверх CoAP. Интеграция через реверс-инжиниринг или Home Assistant.
Amazon Echo (4-е поколение) / SmartThings Hub / Aqara Hub — имеют встроенный Zigbee-координатор. API у каждого свой.
Zigbee2MQTT как основа для мобильного приложения
Для кастомного мобильного приложения Zigbee2MQTT — лучший выбор. MQTT протокол прост, документация у Zigbee2MQTT отличная, поддерживает 3000+ устройств.
Подключение мобильного клиента к MQTT-брокеру (Mosquitto) через WebSocket (ws://broker-ip:9001). На Flutter — mqtt_client:
final client = MqttServerClient.withPort('192.168.1.100', 'mobile_app_client', 9001);
client.websocketProtocols = MqttClientConstants.protocolsSingleDefault;
await client.connect();
client.subscribe('zigbee2mqtt/+', MqttQos.atLeastOnce);
client.updates!.listen((messages) {
final topic = messages[0].topic;
final payload = MqttPublishPayload.bytesToStringAsString(
messages[0].payload.message
);
// парсим JSON, обновляем UI
});
Команда на устройство:
final builder = MqttClientPayloadBuilder();
builder.addString('{"state": "ON", "brightness": 200}');
client.publishMessage('zigbee2mqtt/living_room_light/set', MqttQos.atLeastOnce, builder.payload!);
Парование новых устройств из приложения
Zigbee2MQTT поддерживает режим парования через MQTT: zigbee2mqtt/bridge/request/permit_join с {"value": true, "time": 60} — 60 секунд открытого окна для новых устройств.
Мобильное приложение запускает режим парования кнопкой. Подписывается на zigbee2mqtt/bridge/event — при появлении нового устройства приходит {"type": "device_joined", "data": {"friendly_name": "0x...", "ieee_address": "0x..."}}. Показываем пользователю найденное устройство, предлагаем дать имя и добавить в комнату.
Переименование: zigbee2mqtt/bridge/request/device/rename с {"from": "0x12345678", "to": "bedroom_sensor"}.
Сетка устройств и маршрутизация
Zigbee-сеть самоорганизуется: маршрутизаторы (розетки, лампы с постоянным питанием) ретранслируют сигнал для конечных устройств (батарейные датчики). Для диагностики — zigbee2mqtt/bridge/request/networkmap с {"type": "raw", "routes": true}.
Визуализация сети в приложении: граф узлов и рёбер. На Flutter — graphview пакет или CustomPainter для кастомной отрисовки. Узлы: координатор, маршрутизаторы (зелёные), конечные устройства (серые). Рёбра: толщина пропорциональна LQI (Link Quality Indicator, 0–255).
Типичные проблемы
Выпадение устройств. Датчик перестал публиковать данные. Zigbee2MQTT устанавливает last_seen timestamp — проверяем его в приложении, предупреждаем при задержке > N минут. Часто причина — разрядилась батарея или устройство вышло из зоны покрытия.
Interference с Wi-Fi. Zigbee и Wi-Fi работают на 2.4 GHz. Wi-Fi каналы 1, 6, 11 перекрываются с Zigbee каналами 11–26. Если сеть нестабильна — проверяем выбор канала в Zigbee2MQTT (configuration.yaml, channel: 25).
Coordinator не поднимается. SONOFF Zigbee 3.0 USB Dongle Plus на некоторых Linux требует явного указания порта в /dev/ttyUSB0 и user в группе dialout. Для Docker — devices: ["/dev/ttyUSB0:/dev/ttyUSB0"].
Сроки
Zigbee2MQTT + MQTT-клиент в приложении, базовое управление устройствами — 2–3 недели. Парование из приложения, визуализация сети, диагностика, автоматизация — 5–8 недель. Стоимость зависит от количества типов устройств и дополнительных функций.







