mqtt_to_mysql.py — скрипт сервис экспорта данных в mysql базы iot системы
23.11.2025 | коды из категории: IOT умный дом
обновлено 27.12.2025
Скрипт /home/mazzick/mqtt_to_mysql.py
Назначение: Перехват MQTT-сообщений от Zigbee2MQTT и сохранение их в базу данных MySQL/MariaDB для последующей обработки автоматизациями.
Основные функции
Подписывается на все топики zigbee2mqtt/#.
Сохраняет полное JSON-сообщение «как есть» в таблицу sensor_data (полезно для отладки и полного лога).
Разбирает JSON и создаёт отдельные записи для каждого поля (например, zigbee2mqtt/motion_sensor/presence, .../battery и т.д.).
Преобразует булевые значения:
true → строка "1"
false → строка "0"
Это необходимо для корректной работы правил автоматизации, использующих операторы сравнения (== 1).
Игнорирует технические поля: linkquality, countdown_*, last_seen, update и др.
Для заданных топиков ведёт историю значений в таблице sensor_history (с ограничением по количеству записей).
Технические детали
MQTT-клиент:paho-mqtt (версия с callback API v2).
База данных: MariaDB/MySQL через pymysql.
Таблица назначения:sensor_data (topic VARCHAR(255) PRIMARY KEY, value TEXT, timestamp DATETIME).
Метод записи:INSERT ... ON DUPLICATE KEY UPDATE — гарантирует, что для каждого топика хранится только актуальное значение.
Логирование: Ведётся в файл /home/mazzick/mqtt_logger.log и в консоль.
Запуск: Работает как systemd-сервис mqtt-to-mysql.service.
Зачем это нужно?
Без этого скрипта автоматизации (например, «включить свет при движении») не могут работать, потому что:
PHP-движок автоматизаций читает данные только из базы, а не напрямую из MQTT.
Требуется нормализованная структура данных: отдельный топик на каждое поле (а не один JSON на устройство).
Булевые значения должны быть приведены к единому формату ("1"/"0"), совместимому с SQL-сравнениями.
Важно!
При изменении логики обработки значений (особенно булевых) необходимо проверять синтаксис Python и правильность отступов — ошибка приведёт к падению systemd-сервиса.