== 1 не срабатывали.
В ходе анализа выявлено, что правила с условием == 1 перестали срабатывать. Причина оказалась в изменённой логике обработки данных (если точнее, sql запрос поменял): изначально изменения вводились с целью снижения нагрузки на базу данных, однако это привело к полному игнорированию событий со значением 1.
В основном цикле mqtt_listener.php данные из таблицы sensor_data загружались один раз:
SELECT topic, value FROM sensor_data ORDER BY timestamp DESC
Но при наличии множества записей от разных датчиков свежее значение (например, presence = '1') могло не попасть в массив $sensorData, потому что:
timestamp DESC не гарантирует уникальность по топикуfetchAll(PDO::FETCH_KEY_PAIR) более старые записи с тем же топиком могли перезаписать новые
→ Правило видело старое значение ('0'), даже если в БД уже было '1'.
'1' при движении (через SQL)$sensorData
Для триггерных правил (schedule_type = 'none') заменить использование общего $sensorData на прямой SQL-запрос:
$stmt = $pdo->prepare("SELECT value FROM sensor_data WHERE topic = ? ORDER BY timestamp DESC LIMIT 1");
$stmt->execute([$triggerTopic]);
$actualValue = $stmt->fetchColumn();
Это гарантирует, что правило всегда видит самое свежее значение из БД.
✅ После этого правила == 1 заработали мгновенно.
При опросе БД раз в секунду критически важно получать актуальные данные.
Использование единого снимка ($sensorData) удобно, но опасно, если нет гарантии уникальности по топику.
Для триггерных правил — лучше прямой запрос.
Комментарии
Пока нет комментариев. Будьте первым!