Всё началось с простой цели: добавить в систему умного дома розетку за 400 рублей. Но вместо примитивного включения/выключения, она стала интеллектуальным устройством, способным защищать мою технику от скачков напряжения, анализировать потребление энергии и даже предсказывать неисправности. Вот как это было.
Проблема: Бесконечные дубликаты устройств
При первом подключении розетки через MQTT и Zigbee2MQTT, я столкнулся с кошмаром: при каждом нажатии на карточку в веб-интерфейсе создавались новые, вложенные копии устройства. Вместо одного топика zigbee2mqtt/0xa4c1385d1ba39457/status появлялись .../set/status, затем .../set/set/status, и так до бесконечности.
Причина: JavaScript-функция sendCommand() заменяла /status на /set. Но если топик уже содержал /set/ (например, .../set/status), то получалось .../set/set. Устройство отвечало на этот некорректный топик, а скрипт mqtt_to_mysql.py создавал новую запись в базе данных, добавляя /status — и цикл повторялся.
Решение: Фильтрация и защита
Мы применили двухуровневую защиту:
- На уровне интерфейса (index.php): Добавили проверку, чтобы кнопки управления отображались ТОЛЬКО для топиков, которые НЕ содержат
/set/в середине строки. Для "битых" топиков кнопки скрываются, а вместо них появляется предупреждение: "⚠️ Служебный топик (управление отключено)". - На уровне базы данных: Выполнили SQL-запрос для удаления всех существующих "битых" записей:
DELETE FROM sensor_data WHERE topic LIKE '%/set/%';
Это полностью остановило лавину дубликатов.
Аналитика: От мгновенных значений к умным решениям
Розетка отправляет три ключевых параметра:
- voltage (напряжение): 217-218 В — норма для сети.
- current (ток): Значения вроде "5" или "21" — это миллиамперы (мА), а не амперы. То есть 0.005 А или 0.021 А.
- power (мощность): 1-4 Вт — типично для устройства в режиме ожидания (например, телевизор).
Чтобы эти данные стали полезными, мы:
- Добавили типы
'voltage','current','power'в белый список вindex.php, чтобы карточки с этими параметрами отображались на панели. - Добавили единицы измерения: для
current— "мА", чтобы избежать путаницы. - Включили сбор истории для этих топиков, чтобы строить графики потребления.
Автоматизация: Розетка как реле напряжения
Самая крутая фишка — превращение розетки в устройство безопасности. Мы создали автоматизацию через SQL, которая отключает розетку при опасных значениях напряжения:
INSERT INTO automations (
name, schedule_type, trigger_topic, condition_operator, condition_value,
action_topic, action_payload, enabled
) VALUES (
'Защита от перенапряжения',
'none',
'zigbee2mqtt/0xa4c1385d1ba39457/voltage',
'>',
'250',
'zigbee2mqtt/0xa4c1385d1ba39457/set',
'{"state": "OFF"}',
1
);
Аналогичное правило создано для защиты от просадки напряжения (меньше 200V). Теперь розетка сама отключит телевизор, если в сети что-то пойдет не так.
Анализ тенденций: Не путать батарейки с сетью
Сначала система выдавала ложные тревоги: "Напряжение упало до 3V!". Оказалось, она анализировала напряжение батареек датчиков (3V) как сетевое напряжение (220V).
Решение: Мы разделили логику анализа на три типа:
- Сетевое напряжение — ищем резкие скачки (>10V/мин).
- Напряжение батареек — ищем быстрый разряд (<0.05V/мин).
- Температура и заряд батареи — стандартные правила.
Теперь система умнее: она понимает контекст и не пугает меня ложными срабатываниями.
Чего не хватает и что можно улучшить
Главная "фишка", которой нет у этой розетки — счетчик потребленной энергии (kWh). У нее есть только мгновенная мощность (power). Но это не проблема:
- Можно попробовать активировать счетчик через команды в zigbee2mqtt (если модель поддерживает).
- Или реализовать "виртуальный" счетчик в скрипте
mqtt_to_mysql.py, который будет накапливать энергию по формуле: Энергия = Мощность × Время.
Вывод
За 400 рублей я получил не просто розетку, а полноценный элемент системы умного дома, который:
- Управляется удаленно.
- Мониторит напряжение, ток и мощность в реальном времени.
- Строит графики потребления.
- Автоматически отключается при опасных скачках напряжения.
- Интегрирован в единую панель управления со всеми остальными датчиками.
Это отличный пример того, как открытый софт (Zigbee2MQTT, PHP, MySQL) и немного смекалки позволяют превратить бюджетное устройство в мощный инструмент. И да, теперь я сплю спокойно — моя техника под защитой.
Комментарии