Категории
mqtt_listener.php скрипт сервис автоматизации iot-automation.service
23.11.2025 | коды из категории: IOT умный домобновлено 20.02.2026 (еще одну проблему с дублями попробор) Добавлено проверка состояния, чтобы не засорять эфир командами. Перед отправкой команды читаtn актуальное состояние устройства из базы данных и сравнивать его с желаемым. Если всё совпадает — пропускаем отправку.
Скрипт /var/www/html/iot/public_html/admin/mqtt_listener.php
Назначение: Движок автоматизаций. Постоянно проверяет таблицу sensor_data и выполняет правила из таблицы automations при срабатывании условий (по триггеру или по расписанию).
Основные функции
- Загружает все активные правила (
enabled = 1) из таблицыautomations. - Поддерживает два типа активации:
- По триггеру: реагирует на изменения в
sensor_data(например,presence == 1). - По расписанию: ежедневно, по дням недели и т.д.
- По триггеру: реагирует на изменения в
- Поддерживает условия:
- Простые:
A > B,A == 1и т.д. - Скриптовые: JavaScript-подобные выражения с переменными
sensor.topic.
- Простые:
- Отправляет MQTT-команды через
mosquitton_pubпри выполнении действия. - Поддерживает задержки, подтверждения, повторные попытки и зависимости от других устройств.
Что было изменено (исправлено)
-
Исправлена ошибка SQL:
Unknown column 'id'Исходный код пытался выполнить:
SELECT value FROM sensor_data WHERE topic = ? ORDER BY id DESC LIMIT 1
Но в таблице
sensor_dataнет столбцаid(используетсяPRIMARY KEY (topic)).Исправление: запрос заменён на:
SELECT value FROM sensor_data WHERE topic = ?
Так как для каждого топика хранится только одно (последнее) значение — сортировка не нужна.
-
Временно отключена логика
in_progressДвижок пытался помечать правила как «в обработке», но в таблице
automationsотсутствовал столбецin_progress, что вызывало скрытые ошибки и блокировку правил.Исправление: блоки кода, работающие с
in_progress, закомментированы до добавления соответствующего столбца в БД. -
Добавлена защита от повторного срабатывания (частично)
Хотя полная защита через
in_progressотключена, движок использует полеlast_triggeredдля логгирования времени срабатывания. В будущем можно будет добавить проверку «не чаще чем раз в N секунд» на его основе.
Как запускается
Работает как systemd-сервис iot-automation.service, запускается при старте системы и постоянно опрашивает базу данных с интервалом 1 секунда.
Важно!
Этот скрипт — не веб-интерфейс, а фоновый обработчик. Веб-интерфейс (logic.php) только редактирует правила. Без запущенного mqtt_listener.php автоматизации не работают.