bekoz
Настенная панель управления умным домом поверх MQTT / zigbee2mqtt. Быстрая, офлайновая, без облаков: панель разговаривает напрямую с вашим брокером, а вся «умная» логика живёт в Node-RED.
О панели
bekoz — Android-приложение для настенного планшета-терминала. Основные идеи:
- MQTT — единственный протокол. Устройства zigbee2mqtt подхватываются по friendly name, любые другие — через произвольные топики (формат payload одинаковый, в стиле z2m).
- Панель — пульт и приборная доска, а не мозг. Автоматизации (таймеры, режимы, реакции на датчики) исполняет Node-RED; панель шлёт команды и показывает состояние.
- Производительность прежде всего. Интерфейс рассчитан на слабое железо: минимум перерисовок, никаких тяжёлых эффектов.
- Несколько панелей — одна конфигурация. Панели с одинаковым ID автоматически делятся списком устройств и сценами через retained-сообщение на брокере.
Быстрый старт
- Установите APK и запустите приложение.
- Откройте меню (кнопка ☰ или свайп от левого края) → Настройки → Подключение и синхронизация.
- Укажите адрес и порт брокера (например
192.168.1.10 : 1883), при необходимости логин/пароль. Нажмите «Подключиться». - Задайте ID панели (например
kitchen). Панели с одинаковым ID делят одну конфигурацию; сервисные топики примут видbekoz/<panelId>/…. - Добавьте устройства: на главном экране карандаш ✎ → +. Если zigbee2mqtt публикует
bridge/devices, панель сама предложит найденные устройства — отметьте галочками, выберите комнату, готово. - Для таймеров, режимов дома и уведомлений о падении панели настройте Node-RED.
availability: true в конфигурации.Интерфейс
Комнаты и жесты
- Свайп влево/вправо — переключение комнат. Точки внизу показывают текущую.
- Вертикальная прокрутка — лента плиток внутри комнаты.
- Заголовок комнаты — это выпадающий список всех комнат. Под названием каждой показывается сводка: «2 вкл · 1 открыто» (включённый свет/розетки и открытые контакты).
- Меню ☰: режимы дома (если включены), «Выключить весь свет» (с подтверждением), «Камеры» (если добавлены), «Состояние дома», «Настройки».
- В шапке — часы и статус подключения к брокеру (в меню).
Плитки
- Короткое касание — основное действие: свет/розетка — вкл/выкл, штора — открыть/закрыть, замок — запереть (открытие требует подтверждения), сцена — запустить, камера — открыть поток.
- Долгое касание — детальная шторка устройства.
- Плитки со слайдером (яркость, позиция шторы): горизонтальный драг прямо по полосе.
- В комнате с двумя и более лампами автоматически появляется плитка «Весь свет».
- У офлайн-устройства к «Не в сети» добавляется давность данных: «Не в сети · 12 мин» — так видно, когда устройство замолчало.
- У сенсоров в статусе — давность данных: «Данные сейчас / 12 мин / 3 ч».
Режим редактирования
Карандаш ✎ в шапке включает режим как на лаунчере:
- Долгий тап + перетаскивание — поменять плитки местами (порядок сохраняется).
- Короткий тап по плитке — меню: размер (Авто / Компактная / Высокая / Широкая / Большая) и «Убрать с экрана».
- Не на экране — список убранных плиток этой комнаты в конце ленты (с версии 1.4.2); тап по имени возвращает плитку. Устройство при этом остаётся в доме: Алиса, сценарии и приложение его видят.
- Какие устройства и сцены вообще могут быть на этом экране, их имена, комнаты и иконки — решает админка дома; панель хранит лишь вид. Пунктирная плитка в конце ленты об этом напоминает.
- Галочка ✓ — выход из режима.
Детальная шторка
Открывается долгим касанием плитки. Содержимое зависит от типа устройства:
- Строка «Обновлено: 14:12 · 8 мин назад» — время последнего MQTT-сообщения (у всех устройств).
- Свет: питание, яркость, цветовая температура, цвет (пресеты), быстрые сцены (Ярко / Тёплый / Ночник / Закат / Кино), таймер выключения.
- Розетка: питание, мощность/энергия/напряжение, график мощности за 24 ч, таймер выключения.
- Датчик: все показания; для движения/контакта — с какого момента держится состояние («Движение — с 09:15 (5 ч назад)»); графики за 24 ч (температура, влажность, CO₂, давление).
- Штора: открыть/стоп/закрыть, позиция. Термостат: уставка ±0.5°, режимы. Замок: запереть/открыть (с подтверждением). Медиа: транспорт, громкость.
Устройства
Типы устройств
| Тип | Что умеет на панели |
|---|---|
LIGHT | Вкл/выкл, яркость, цветовая температура, цвет — панель показывает только то, что устройство реально отдаёт в состоянии. |
SWITCH | Вкл/выкл; если устройство шлёт метеринг (power/energy/voltage) — показания и график мощности. |
SENSOR | Только чтение: температура, влажность, давление, CO₂, освещённость, контакт, движение, батарея. Открытый контакт и движение подсвечиваются. |
COVER | Открыть/закрыть/стоп, позиция 0–100. |
SCENE | Кнопка-триггер: касание шлёт {"state":"ON"} в командный топик. Состояния нет. |
CLIMATE | Текущая температура, уставка (5–35°, шаг 0.5), режим (off/heat/auto/cool), индикация нагрева. |
LOCK | Запереть/открыть; открытие всегда через подтверждение. |
MEDIA | Play/pause/next/previous/stop, громкость, название трека. |
CAMERA | RTSP-поток на весь экран; на плитке — HTTP JPEG-снапшот раз в 15 с (если задан snapshotUrl). Работает не по MQTT. |
Добавление
Два источника:
- Z2M — устройство zigbee2mqtt: достаточно friendly name; состояние читается из
zigbee2mqtt/<name>, команды идут вzigbee2mqtt/<name>/set. Панель сама предлагает список с координатора (retainedzigbee2mqtt/bridge/devices) — экран «найденные устройства» с галочками. - MQTT (свои топики) — любое устройство: явно указываются
state-топикиcommand-топик(напримерhome/lampиhome/lamp/set). Формат payload тот же.
…/set → мерж с текущим состоянием → публикация
состояния retained. Пример есть в node-red-bekoz-test.json (узел fn_ctrl).Сцены
Пользовательские сцены — это снапшоты текущих состояний выбранных устройств (свет: вкл/выкл + яркость + температура; розетки: вкл/выкл; шторы: позиция).
- Создание: Настройки → Сцены → выставьте устройства как нужно → выберите их галочками → сохраните.
- Сцена появляется плиткой в своей комнате; касание воспроизводит снапшот.
- Сцены синхронизируются между панелями вместе с устройствами.
- Помимо этого у ламп в детальной шторке есть встроенные быстрые сцены (Ярко, Тёплый, Ночник…).
Возможности
Режимы дома нужен Node-RED
Четыре крупные кнопки в меню ☰: Дома / Ухожу / Ночь / Гости. Включаются тумблером «Режимы дома» в Настройки → Экран.
- Касание кнопки публикует
bekoz/<panelId>/mode/set→{"mode":"home|away|night|guest"}. - Что делает режим — решает Node-RED (сцены, отопление, охрана…). Панель — только пульт.
- Активный режим Node-RED публикует (retained) в
bekoz/<panelId>/mode— панель подсвечивает соответствующую кнопку.
Таймер выключения нужен Node-RED
В детальной шторке света и розетки — чипы 5 / 15 / 30 / 60 мин и «Отменить». Панель публикует запрос, а отсчёт ведёт Node-RED, поэтому таймер переживает перезапуск и зависание панели.
Ночной режим
Настраивается в Настройки → Экран. Когда активен: палитра становится тёплой и приглушённой, фон затемняется сильнее, яркость экрана падает до ночного уровня.
- По времени — окно «Начало … Конец» (например 22:00–07:00).
- По датчику — выбирается сенсор с полем
illuminance_luxи порог (лк): стемнело → ночной вид включился. Работают оба триггера одновременно (ИЛИ).
Скринсейвер и погода
- Включается в Настройки → Экран; срабатывает после простоя (30 с … 10 мин), касание будит.
- Показывает часы; опционально — погоду (Open-Meteo, без API-ключа; город ищется по названию).
- Сводка проблем: до трёх строк — устройство не в сети, открытый контакт, движение, батарея ≤ 20 %, сенсор молчит > 12 ч. Появляются только при отклонениях.
- Пока скринсейвер активен, панель не тратит ресурсы на перерисовку плиток; состояния применяются пачкой при пробуждении.
- Панель можно будить/усыплять извне по MQTT (см. топик screen) — например, от датчика движения в прихожей.
Состояние дома
Меню ☰ → «Состояние дома»: единый список проблем — кто не в сети, у кого батарея ≤ 20 %, какие сенсоры молчат больше 12 часов.
Алерты
Автоматизация может показать на панели баннер поверх всего (и разбудить экран):
протечка, дверь открыта, стирка закончилась… Публикация в
bekoz/<panelId>/alert, уровни info / warn / crit, опциональный звук,
таймаут или закрытие касанием.
Камеры и домофон
- Камера добавляется как устройство с
streamUrl(RTSP) и опциональнымsnapshotUrl(HTTP JPEG для превью на плитке, раз в 15 с). - Экран «Камеры» в меню — все камеры разом; касание — на весь экран.
- Домофон: сообщение в
bekoz/<panelId>/doorbellбудит панель, открывает камеру на весь экран и показывает кнопку «Открыть замок» (шлёт UNLOCK связанному замку).
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}
Синхронизация панелей
- Панели с одинаковым ID делят конфигурацию через retained
bekoz/<id>/config; побеждает более новыйupdatedAt. - Синхронизируется практически всё: устройства, сцены, раскладка и размеры плиток, все настройки экрана и оформления (яркость, ночной режим, скринсейвер, погода, акцент, прозрачность карточек, «Режимы дома»), PIN настроек, режим киоска.
- Новая панель, получив тот же ID, автоматически подхватывает всё это с брокера.
- Не синхронизируются: настройки брокера и ID панели (нужны, чтобы до брокера добраться — переносятся строкой подключения), файл обоев, история сенсоров.
Подключение по коду
С версии 1.5.0 панель подключается к дому кодом из админки: Панели → «Подключить панель» →
имя панели → шестизначный код (действует четверть часа, одноразовый). На новой панели код вводится на
экране «Подключение к дому», на уже настроенной — в Настройки → Подключение → «Подключить по коду».
Адреса хаба и релея и ключ приезжают сами. Дом без интернета: на панели нажмите «Дом без интернета» и
укажите адрес хаба вида 192.168.3.100 — код обменяется у самого хаба. Ручная настройка
спрятана под «Настроить вручную»; адрес хаба там вводится без схем и портов.
Привязанная панель пустая, пока админ не применит ей конфигурацию (Панели → панель → «Конфигурация»). Конфигурация — это разрешённые устройства и сцены, настройки экрана, раскладка, PIN и киоск; одну конфигурацию можно применить к нескольким панелям, тогда они клоны и правки на одной появляются на остальных.
Приложение жильцов и админка — один сайт: дома http://<хаб>:3000, снаружи
app.bekoz.ru. Вход один (пароль дома или Bekoz ID); админ дома видит в шапке приложения
кнопку «Админка» (раздел /admin), жильцы и гости — нет.
Строка подключения
Настройки → Подключение → «Настроить вручную» → «Строка подключения»: канал, адреса, ключ
и ID панели упаковываются в одну строку вида BEKOZ1:…. Ту же строку показывает админка при
выпуске кода — для ручного ввода или ADB.
- Скопировать — строка попадает в буфер обмена; сохраните её в заметках.
- Из буфера — на новой панели вставьте строку: она подключится к брокеру, а вся остальная конфигурация приедет с него сама. Полное восстановление в один шаг.
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 и подставьте свой брокер.Настройки и сервис
- Экран: обои (своё фото + затемнение), яркость, оформление (цвет акцента, прозрачность карточек, готовые темы), ночной режим, режимы дома, скринсейвер, погода.
- Режим киоска: полноэкранный режим с блокировкой выхода. С Device Owner (провижининг через adb) — неубиваемый lock task и скрытие системных панелей; без DO — деградация до обычного закрепления экрана.
- PIN настроек: PIN на вход в настройки — защита от детей и случайных гостей. Общий для панелей группы (синхронизируется); сбрасывается очисткой данных приложения.
- Диагностика: живой лог MQTT-сообщений (последние 200) с фильтром по топику. Пишется только пока экран открыт — в фоне ресурсы не тратятся.
- Резервная копия: экспорт/импорт конфигурации (устройства, сцены, настройки экрана и раскладка) в JSON-файл через системный диалог. Настройки → Подключение → «Резервная копия». Для переноса брокера и ID есть «Строка подключения».
Частые вопросы
Плитка «висит» в старом состоянии
Откройте детальную шторку (долгий тап): строка «Обновлено …» покажет, когда устройство последний раз выходило на связь. Если давно — проверьте батарею/сеть устройства. У датчиков движения/контакта там же видно, с какого момента держится состояние.
На плитках нет бейджа «Не в сети», хотя лампа обесточена
Включите 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).