🔥 Проблема
В системе автоматизации наблюдались множественные срабатывания правил — до 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"}
✅ Решение
Внедрены три уровня защиты от повторных срабатываний:
🔄 Проверка изменения состояния new
Правило срабатывает только при изменении значения датчика, а не каждую секунду.
// Было: срабатывало всегда
if ($condMet) { handleAction(); }
// Стало: только при изменении
if ($condMet && $previousState !== $actual) {
handleAction();
}
⏱️ Минимальный интервал new
Между действиями одного правила — минимум 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 как обычно, но теперь без лишних команд!
STOP! Хватит строить ядерный реактор
Чтобы просто включить лампочку
⚡ Я тут поймал себя на мысли: мой PHP скрипт каждую секунду проверяет 16 правил, лезет в БД, анализирует, логирует, защищает от дребезга...
...ЧТОБЫ ПРОСТО ВКЛЮЧИТЬ КОРМУШКУ ДЛЯ РЫБ В 12:05! 🐠
🔴 Мой "гениальный" подход
- ❶ PHP скрипт с while(true)
- ❷ Подключение к БД каждую секунду
- ❸ Защита от дребезга (своя)
- ❹ Система подтверждений
- ❺ Логирование каждого чиха
while(true) {
checkAllRules();
sleep(1);
}
🟢 Как могло быть
- ❶ CRON: 0 12 * * * /script.sh
- ❷ В скрипте: mosquitto_pub + sleep 3
- ❸ 0 подключений к БД
- ❹ 0 защиты от дребезга (и не надо)
- ❺ 0 логирования (и так сойдет)
# 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
чтобы в 12:05 отправить {"state": "ON"} в кормушку для рыб
Комментарии
Пока нет комментариев. Будьте первым!