Цель: Включать свет над аквариумом при обнаружении движения в коридоре.
Оборудование и стек
- Датчик движения Zigbee (например, Tuya/Aqara) → топик
zigbee2mqtt/motion_sensor - USB-реле Zigbee (3 канала) → топик
zigbee2mqtt/fish_usb_reley - Сервер на Raspberry Pi с:
- Zigbee2MQTT
- Mosquitto (MQTT-брокер)
- MySQL/MariaDB
- PHP-интерфейс управления автоматизациями
- Python-скрипт mqtt_to_mysql.py (запись MQTT → БД)
Логика автоматизации
- Триггер: топик
zigbee2mqtt/motion_sensor/presence - Условие: значение
== 1(движение обнаружено) - Действие: отправить в топик
zigbee2mqtt/fish_usb_reley/setpayload:{"state_l3": "ON"} - Повторять: да (галочка "Повторять" активна)
Проблемы и решения
1. Свет включался постоянно, даже без движения
Причина: Python-скрипт mqtt_to_mysql.py неправильно обрабатывал булевые значения из MQTT:
true→ записывалось как'1'✅false→ тоже записывалось как'1'❌ (из-за ошибки в логике)
Решение: Исправлен код скрипта:
if isinstance(value, bool):
value_to_save = "1" if value else "0"
else:
value_to_save = value
Теперь false → '0', и правило срабатывает только при реальном движении.
2. Ошибки в логике обработки правил
- Отсутствовал столбец
idв таблицеsensor_data→ исправлено изменением логики SQL-запроса. - Защита от повторного срабатывания (
in_progress) не работала из-за отсутствия столбца в БД → временно отключена.
Результат
При приближении к домику — свет над аквариумом включается автоматически. Через 30 секунд после исчезновения движения — гаснет. Всё работает стабильно.
Что можно улучшить
- Добавить условие по освещённости (включать только в темноте).
- Настроить задержку выключения (например, 2 минуты вместо 30 сек).
- Добавить зависимость от времени суток.
обновленный файл mqtt_to_mysql.py
обновленный файл mqtt_listener.php
Комментарии
Пока нет комментариев. Будьте первым!