Категории

Как я подключил умную розетку Zigbee к своей самописной IoT-панели

2025-09-17 15:13:02 | IOT умный дом
Подключение zigbee розетки в iot систему

Вступление

У меня есть самописная IoT-система на Raspberry Pi: данные с датчиков летят через MQTT → сохраняются в MySQL → отображаются в красивой веб-панели на PHP. Всё работает, графики строятся, автоматизации срабатывают — но сегодня я добавил первое управляемое устройство: умную розетку Zigbee (модель TS011F, IEEE: 0xa4c1385d1ba39457).

Цель: чтобы розетка появилась в панели с кнопками ВКЛ/ВЫКЛ и отображала статус, а заодно — показывала напряжение, ток и потребление.

Вот как я это сделал — чтобы ты (и я через год) мог повторить без гугла.


Шаг 1: Проверил, что данные приходят

Сначала убедился, что Zigbee2MQTT публикует сообщения от розетки:

mosquitto_sub -h localhost -t "zigbee2mqtt/0xa4c1385d1ba39457" -v
    

Увидел:

{"state":"ON","power":0,"voltage":217,"current":8,...}
    

Отлично — данные есть. Значит, проблема не в устройстве, а в том, что моя система их не отображает.


Шаг 2: Разобрался, почему розетка не отображалась

Моя панель берёт данные из таблицы sensor_data, но отображает только те топики, для которых есть запись в sensor_info (там хранятся имя, комната, группа, иконка).

Проверил:

SELECT * FROM sensor_info WHERE topic LIKE '%0xa4c1385d1ba39457%';
    

Пусто. Значит — нужно добавить.

Но сначала — нужно, чтобы в sensor_data появился топик с состоянием (ON/OFF), а не только voltage.


Шаг 3: Доработал парсер MQTT → MySQL

Мой парсер (mqtt_to_mysql.py) раньше сохранял только известные ключи: temperature, humidity и т.д. А state игнорировал.

Добавил в функцию on_message:

if 'state' in data:
    status_topic = f"{topic}/status"
    save_to_sensor_data(status_topic, data['state'])
    

Теперь приходит:

topic: zigbee2mqtt/0xa4c1385d1ba39457/status
value: ON
    

Также добавил сохранение power, current — для мониторинга.


Шаг 4: Добавил устройство в sensor_info

Выполнил в MySQL:

INSERT INTO sensor_info (topic, name, room, group_name, icon)
VALUES (
    'zigbee2mqtt/0xa4c1385d1ba39457/status',
    'Розетка ТВ',
    'Гостиная',
    'Розетки',
    '🔌'
);
    

⚠️ Возникла ошибка с emoji — исправил, установив кодировку таблицы в utf8mb4.


Шаг 5: Исправил index.php

В панели устройства фильтруются по типу. Тип определяется как basename(topic). Для .../status — это status.

Добавил 'status' в список разрешённых типов:

if (!in_array($type, [..., 'status'])) { continue; }
    

И сделал маппинг: если тип status → считаем его valve (чтобы отображались кнопки):

if ($type === 'status') { $type = 'valve'; }
    

Шаг 6: Добавил кнопки управления

В карточке устройства добавил:

<button onclick="sendCommand('...', 'ON')">ВКЛ
<button onclick="sendCommand('...', 'OFF')">ВЫКЛ
    

Функция sendCommand() заменяет /status на /set и отправляет команду через send_mqtt.php.

⚠️ Была ошибка: топик URL-кодировался (%2F вместо /) — исправил через decodeURIComponent().


Шаг 7: Добавил энергомониторинг

Добавил в sensor_info:

INSERT INTO sensor_info (topic, name, room, group_name, icon) VALUES
('zigbee2mqtt/0xa4c1385d1ba39457/power', 'Потребление', 'Гостиная', 'Энергия', '⚡'),
('zigbee2mqtt/0xa4c1385d1ba39457/voltage', 'Напряжение', 'Гостиная', 'Энергия', '🔌'),
('zigbee2mqtt/0xa4c1385d1ba39457/current', 'Ток', 'Гостиная', 'Энергия', '🔋');
    

Теперь в панели — отдельные карточки с графиками!


Шаг 8: Почистил мусор

В админке плодились дубли вроде .../set/status — удалил их из sensor_data:

DELETE FROM sensor_data WHERE topic LIKE '%/set/%';
    

Теперь в интерфейсе — только нужные устройства.


Итог

Теперь я знаю, как подключать любое Zigbee-устройство с state — просто добавляю в sensor_info и, при необходимости, дорабатываю парсер.

Следующая цель — автоматическое обнаружение новых устройств. Но это — уже другая статья 😉


Полезные команды (шпаргалка)

-- Проверить данные устройства
SELECT * FROM sensor_data WHERE topic LIKE '%0xa4c1385d1ba39457%';

-- Добавить устройство в sensor_info
INSERT INTO sensor_info (topic, name, room, group_name, icon) VALUES (...);

-- Почистить мусор
DELETE FROM sensor_data WHERE topic LIKE '%/set/%';

-- Проверить кодировку таблицы
SHOW CREATE TABLE sensor_info;
    

Удачи в автоматизации дома! 🚀

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион