В системе автоматизации наблюдались множественные срабатывания правил — до 8 раз подряд за секунду. Это приводило к:
# 🔴 Логи ДО оптимизации
2026-02-21 11:16:43 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
2026-02-21 11:16:44 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
2026-02-21 11:16:45 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
2026-02-21 11:16:46 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
2026-02-21 11:16:47 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
2026-02-21 11:16:48 нагрев_выкл_рыб → zigbee2mqtt/fish_power/set {"state_l3": "OFF"}
Внедрены три уровня защиты от повторных срабатываний:
Правило срабатывает только при изменении значения датчика, а не каждую секунду.
// Было: срабатывало всегда
if ($condMet) { handleAction(); }
// Стало: только при изменении
if ($condMet && $previousState !== $actual) {
handleAction();
}
Между действиями одного правила — минимум 60 секунд.
// Защита от частых команд
if (time() - $lastAction >= 60) {
sendCommand();
}
В процессе анализа пришли мысли, что кормушка реализована через PHP-скрипт двумя правилами:
🔍 Рекомендация: Для таких задач лучше использовать CRON — это снизит нагрузку на систему и упростит логику.
# CRON для кормушки (оптимально)
0 10,19 * * * /usr/bin/mosquitto_pub -h 127.0.0.1 -t "zigbee2mqtt/feeder/set" -m '{"state": "ON"}'
# Через 3 секунды выключение (отдельным скриптом)
| Компонент | Было | Стало |
|---|---|---|
| Проверка триггеров | Каждую секунду | Только при изменении |
| Интервал между действиями | 0 секунд | 60 секунд |
| Перезагрузка правил | Каждую секунду | Раз в 30 секунд |
| Отладочные сообщения | Все подряд | Только важные |
Система работает стабильно, логи чистые, реле не щелкают без остановки.
Кормушка включится в 12:05 как обычно, но теперь без лишних команд!
Чтобы просто включить лампочку
⚡ Я тут поймал себя на мысли: мой PHP скрипт каждую секунду проверяет 16 правил, лезет в БД, анализирует, логирует, защищает от дребезга...
...ЧТОБЫ ПРОСТО ВКЛЮЧИТЬ КОРМУШКУ ДЛЯ РЫБ В 12:05! 🐠
while(true) {
checkAllRules();
sleep(1);
}
# crontab
0 12 * * * /usr/bin/mosquitto_pub -t "fish/feed" -m "ON"
# И отдельно скрипт выключения через 3 сек
Я построил распределенную систему с микросервисной архитектурой, чтобы включить свет в туалете.
...но оно работает и это главное
CRON существует — и он реально создан для расписаний. Не надо эмулировать его в PHP.
KISS — Keep It Simple, Stupid. Если задачу можно решить одной строкой в crontab — решай её одной строкой.
Но опыт бесценен — теперь я точно знаю, КАК работают системы автоматизации изнутри. И какой ценой 😅
⚡ Сложные вещи — в PHP скрипт.
⏰ Простое расписание — в CRON.
Рыбкам вообще все равно, кто их кормит — PHP или CRON
Комментарии
Пока нет комментариев. Будьте первым!