bekoz

Настенная панель управления умным домом поверх MQTT / zigbee2mqtt. Быстрая, офлайновая, без облаков: панель разговаривает напрямую с вашим брокером, а вся «умная» логика живёт в Node-RED.

О панели

bekoz — Android-приложение для настенного планшета-терминала. Основные идеи:

Быстрый старт

  1. Установите APK и запустите приложение.
  2. Откройте меню (кнопка или свайп от левого края) → Настройки → Подключение и синхронизация.
  3. Укажите адрес и порт брокера (например 192.168.1.10 : 1883), при необходимости логин/пароль. Нажмите «Подключиться».
  4. Задайте ID панели (например kitchen). Панели с одинаковым ID делят одну конфигурацию; сервисные топики примут вид bekoz/<panelId>/….
  5. Добавьте устройства: на главном экране карандаш +. Если zigbee2mqtt публикует bridge/devices, панель сама предложит найденные устройства — отметьте галочками, выберите комнату, готово.
  6. Для таймеров, режимов дома и уведомлений о падении панели настройте Node-RED.
Availability-бейджи («Не в сети») работают, только если в zigbee2mqtt включён availability: true в конфигурации.

Интерфейс

Комнаты и жесты

Плитки

Режим редактирования

Карандаш в шапке включает режим как на лаунчере:

Детальная шторка

Открывается долгим касанием плитки. Содержимое зависит от типа устройства:

Устройства

Типы устройств

ТипЧто умеет на панели
LIGHTВкл/выкл, яркость, цветовая температура, цвет — панель показывает только то, что устройство реально отдаёт в состоянии.
SWITCHВкл/выкл; если устройство шлёт метеринг (power/energy/voltage) — показания и график мощности.
SENSORТолько чтение: температура, влажность, давление, CO₂, освещённость, контакт, движение, батарея. Открытый контакт и движение подсвечиваются.
COVERОткрыть/закрыть/стоп, позиция 0–100.
SCENEКнопка-триггер: касание шлёт {"state":"ON"} в командный топик. Состояния нет.
CLIMATEТекущая температура, уставка (5–35°, шаг 0.5), режим (off/heat/auto/cool), индикация нагрева.
LOCKЗапереть/открыть; открытие всегда через подтверждение.
MEDIAPlay/pause/next/previous/stop, громкость, название трека.
CAMERARTSP-поток на весь экран; на плитке — HTTP JPEG-снапшот раз в 15 с (если задан snapshotUrl). Работает не по MQTT.

Добавление

Два источника:

Для устройств со своими топиками состояние само не возвращается — нужен echo-flow в Node-RED: команда из …/set → мерж с текущим состоянием → публикация состояния retained. Пример есть в node-red-bekoz-test.json (узел fn_ctrl).

Сцены

Пользовательские сцены — это снапшоты текущих состояний выбранных устройств (свет: вкл/выкл + яркость + температура; розетки: вкл/выкл; шторы: позиция).

Возможности

Режимы дома нужен Node-RED

Четыре крупные кнопки в меню : Дома / Ухожу / Ночь / Гости. Включаются тумблером «Режимы дома» в Настройки → Экран.

Таймер выключения нужен Node-RED

В детальной шторке света и розетки — чипы 5 / 15 / 30 / 60 мин и «Отменить». Панель публикует запрос, а отсчёт ведёт Node-RED, поэтому таймер переживает перезапуск и зависание панели.

Ночной режим

Настраивается в Настройки → Экран. Когда активен: палитра становится тёплой и приглушённой, фон затемняется сильнее, яркость экрана падает до ночного уровня.

Скринсейвер и погода

Состояние дома

Меню → «Состояние дома»: единый список проблем — кто не в сети, у кого батарея ≤ 20 %, какие сенсоры молчат больше 12 часов.

Алерты

Автоматизация может показать на панели баннер поверх всего (и разбудить экран): протечка, дверь открыта, стирка закончилась… Публикация в bekoz/<panelId>/alert, уровни info / warn / crit, опциональный звук, таймаут или закрытие касанием.

Камеры и домофон

MQTT-контракт

Полная машинная спецификация — в MQTT.md репозитория (единый источник правды). Здесь — краткая версия. Если ID панели пуст, префикс топиков — просто bekoz/….

Сервисные топики панели

ТопикНаправлениеPayload / смысл
bekoz/<id>/availability retained панель → все online при подключении, offline при отключении. Last-Will: при обрыве/зависании брокер сам публикует offline. Пока панель жива — heartbeat: online переиздаётся раз в ~60 с.
bekoz/<id>/screen retained панель → все {"state":"ON|OFF"} — бодрствует экран или спит (скринсейвер). Панель — датчик присутствия.
bekoz/<id>/screen/set все → панель Разбудить/усыпить: ON/OFF или {"state":"ON"}. Расширения: {"state":"ON","room":"Прихожая"} — проснуться и открыть комнату; {"state":"ON","camera":"…"} — проснуться и открыть камеру.
bekoz/<id>/alert все → панель {"text":"Протечка!","level":"info|warn|crit","timeout":30,"sound":true} (или голая строка = info). Баннер поверх всего, будит экран.
bekoz/<id>/doorbell все → панель {"camera":"<id|имя>","lock":"<id|имя>","sound":true} — звонок: камера на весь экран + кнопка открытия замка. НЕ retained.
bekoz/<id>/mode retained Node-RED → панель {"mode":"home|away|night|guest"} — активный режим (подсветка кнопки).
bekoz/<id>/mode/set панель → Node-RED {"mode":"…"} — пользователь нажал кнопку режима.
bekoz/<id>/timer/set панель → Node-RED {"topic":"<командный топик>","payload":{"state":"OFF"},"minutes":15} — выполнить payload через N минут; {"topic":"…","minutes":0} — отменить.
bekoz/<id>/config retained панель ↔ панель Снапшот конфигурации {"updatedAt":…,"devices":[…],"scenes":[…]}. Новее — побеждает.

Payload устройств (кратко)

Состояние читается из state-топика, команды публикуются в <state>/set. Формат единый для z2m и своих топиков:

# LIGHT — состояние
{"state":"ON","brightness":180,"color_temp":350,"color":{"hex":"#FF9F0A"}}
# LIGHT — команды
{"state":"OFF"} · {"state":"ON","brightness":128} · {"state":"ON","color_temp":454}

# SWITCH (+ опциональный метеринг в состоянии)
{"state":"ON","power":42,"energy":1.5,"voltage":230}

# SENSOR — только состояние, любые из полей
{"temperature":21.5,"humidity":48,"co2":800,"illuminance_lux":120,
 "contact":true,"occupancy":false,"battery":90}

# COVER
{"position":75} · {"state":"OPEN|CLOSE|STOP"}

# CLIMATE
{"local_temperature":21.5,"current_heating_setpoint":22,
 "system_mode":"heat","running_state":"heat"}

# LOCK
{"state":"LOCK|UNLOCK"}

# MEDIA
{"state":"PLAYING","volume":35,"title":"…","artist":"…"}
# команды: {"state":"PLAY|PAUSE|NEXT|PREVIOUS|STOP"} · {"volume":50}

Синхронизация панелей

Подключение по коду

С версии 1.5.0 панель подключается к дому кодом из админки: Панели → «Подключить панель» → имя панели → шестизначный код (действует четверть часа, одноразовый). На новой панели код вводится на экране «Подключение к дому», на уже настроенной — в Настройки → Подключение → «Подключить по коду». Адреса хаба и релея и ключ приезжают сами. Дом без интернета: на панели нажмите «Дом без интернета» и укажите адрес хаба вида 192.168.3.100 — код обменяется у самого хаба. Ручная настройка спрятана под «Настроить вручную»; адрес хаба там вводится без схем и портов.

Привязанная панель пустая, пока админ не применит ей конфигурацию (Панели → панель → «Конфигурация»). Конфигурация — это разрешённые устройства и сцены, настройки экрана, раскладка, PIN и киоск; одну конфигурацию можно применить к нескольким панелям, тогда они клоны и правки на одной появляются на остальных.

Приложение жильцов и админка — один сайт: дома http://<хаб>:3000, снаружи app.bekoz.ru. Вход один (пароль дома или Bekoz ID); админ дома видит в шапке приложения кнопку «Админка» (раздел /admin), жильцы и гости — нет.

Строка подключения

Настройки → Подключение → «Настроить вручную» → «Строка подключения»: канал, адреса, ключ и ID панели упаковываются в одну строку вида BEKOZ1:…. Ту же строку показывает админка при выпуске кода — для ручного ввода или ADB.

Строка содержит пароль брокера открытым текстом — храните её как пароль.
Старая сборка приложения не прочитает конфиг с неизвестными ей типами устройств — обновляйте APK на всех панелях группы, прежде чем добавлять новые типы.

Node-RED

Node-RED — «мозг» связки. Минимальный набор флоу для полного функционала панели:

1. Echo для устройств со своими топиками

Устройство-эмуляция или мост: команда из …/set → мерж с текущим состоянием → публикация состояния (retained). Без этого панель не увидит результат своих команд.

[mqtt in: home/+/set][function: мерж состояния][mqtt out (retained)]

2. Режимы дома

Слушаем bekoz/<id>/mode/set, исполняем логику режима (сцены, отопление, охрана), подтверждаем режим публикацией (retained) в bekoz/<id>/mode:

[mqtt in: bekoz/kitchen/mode/set][switch по mode] → …действия…
                                  ↘ [mqtt out: bekoz/kitchen/mode, retained]

3. Таймер выключения

Слушаем bekoz/<id>/timer/set; на minutes>0 ставим отложенную публикацию payload → topic, на minutes:0 отменяем таймер этого топика. Готовая реализация — в тестовом флоу node-red-bekoz-test.json (узел «таймер → отложенная команда»).

4. Уведомление «панель офлайн»

bekoz/<id>/availability: пришло offline — шлём пуш/телеграм. Дополнительно можно ловить «протухший» heartbeat: если online не переиздавался дольше ~3 минут — панель, вероятно, зависла.

5. Пробуждение по движению

Датчик движения в прихожей → bekoz/<id>/screen/set = {"state":"ON"}. Человек подошёл — панель уже проснулась. Обратное направление: по retained-состоянию bekoz/<id>/screen панель сама работает датчиком присутствия.

В репозитории лежит node-red-bekoz-test.json — готовый тестовый стенд: эмуляция ~30 устройств всех типов, echo-флоу, обработчики режимов и таймера, индикатор присутствия панели. Импортируйте его в Node-RED и подставьте свой брокер.

Настройки и сервис

Частые вопросы

Плитка «висит» в старом состоянии

Откройте детальную шторку (долгий тап): строка «Обновлено …» покажет, когда устройство последний раз выходило на связь. Если давно — проверьте батарею/сеть устройства. У датчиков движения/контакта там же видно, с какого момента держится состояние.

На плитках нет бейджа «Не в сети», хотя лампа обесточена

Включите availability в zigbee2mqtt (availability: true) — панель читает zigbee2mqtt/<name>/availability.

Кнопки режимов не подсвечиваются

Подсветку задаёт Node-RED, публикуя активный режим (retained) в bekoz/<id>/mode. Проверьте флоу режимов и что тумблер «Режимы дома» включён.

Таймер «не сработал»

Отсчёт исполняет Node-RED — проверьте, что флоу таймера запущен и подключён к тому же брокеру. Панель только отправляет запрос.

Своё устройство (не z2m) не обновляет состояние

Нужен echo-flow в Node-RED: команды из …/set должны превращаться в публикацию состояния (retained) в state-топик. См. раздел Node-RED.

Как понять, что панель зависла?

Подпишитесь в Node-RED на bekoz/<id>/availability: offline придёт автоматически (Last-Will). Для подстраховки следите за свежестью heartbeat (online раз в ~60 с).

Как перенести панель на новое устройство / после сброса?

Заранее сохраните строку подключения (Настройки → Подключение → «Скопировать»). На новом устройстве: установить APK → «Из буфера» → панель подключится к брокеру и сама заберёт устройства, сцены, раскладку и все настройки экрана. Останется только заново выбрать обои (файл локальный).

Несколько панелей показывают разное

Проверьте, что у них одинаковый ID панели и обе подключены к одному брокеру. Конфигурация сходится по retained-сообщению; побеждает более новая (updatedAt).