Цель: предотвратить отправку лишних MQTT-команд, когда устройство уже находится в нужном состоянии (например, повторная отправка {"state_l3":"OFF"} каждую секунду).
В блоке обработки триггерных правил (те, что с условиями вроде temperature > 25) добавлена проверка через существующую функцию shouldSkipAction().
Найдите в файле цикл:
// 🔍 Проверяем триггерные правила через кэш $sensorData (БЕЗ запросов!)
foreach ($rules as $rule) {
if ($rule['schedule_type'] !== 'none') continue;
...
Внутри этого цикла, после проверки условия (if ($condMet)), была простая конструкция:
if ($condMet) {
echo "🎉 Сработало правило: " . $rule['name'] . "\n";
handleAction($rule);
}
Она заменена на:
if ($condMet) {
// Проверяем, нужно ли вообще отправлять команду
if (shouldSkipAction($rule, $pdo)) {
echo "⏭️ Устройство уже в нужном состоянии — пропускаем правило: " . $rule['name'] . "\n";
} else {
echo "🎉 Сработало правило: " . $rule['name'] . "\n";
handleAction($rule);
}
}
shouldSkipAction() сравнивает желаемое состояние (из action_payload) с текущим состоянием устройства (из таблицы sensor_data).state, state_l3 и т.д., главное — чтобы топик действия заканчивался на /set, а топик состояния — был без него.Теперь правила типа «если температура > 25 — выключи реле» срабатывают только один раз, пока состояние не изменится. Это:
Для корректной работы убедитесь, что:
zigbee2mqtt/устройство/setzigbee2mqtt/устройство (без /set)state_l3)
Комментарии
Пока нет комментариев. Будьте первым!