Всё началось с простой цели: добавить в систему умного дома розетку за 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 — и цикл повторялся.
Мы применили двухуровневую защиту:
/set/ в середине строки. Для "битых" топиков кнопки скрываются, а вместо них появляется предупреждение: "⚠️ Служебный топик (управление отключено)".DELETE FROM sensor_data WHERE topic LIKE '%/set/%';Это полностью остановило лавину дубликатов.
Розетка отправляет три ключевых параметра:
Чтобы эти данные стали полезными, мы:
'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).
Решение: Мы разделили логику анализа на три типа:
Теперь система умнее: она понимает контекст и не пугает меня ложными срабатываниями.
Главная "фишка", которой нет у этой розетки — счетчик потребленной энергии (kWh). У нее есть только мгновенная мощность (power). Но это не проблема:
mqtt_to_mysql.py, который будет накапливать энергию по формуле: Энергия = Мощность × Время.За 400 рублей я получил не просто розетку, а полноценный элемент системы умного дома, который:
Это отличный пример того, как открытый софт (Zigbee2MQTT, PHP, MySQL) и немного смекалки позволяют превратить бюджетное устройство в мощный инструмент. И да, теперь я сплю спокойно — моя техника под защитой.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии