↩️ На главную

Оптимизация скрипта mqtt-listener.php

21.02.2026 | Статья из категории: IOT умный дом

🔥 Проблема

В системе автоматизации наблюдались множественные срабатывания правил — до 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();
}

📊 Результат

🔴 До

11:16:43 ❌ OFF
11:16:44 ❌ OFF
11:16:45 ❌ OFF
11:16:46 ❌ OFF
11:16:47 ❌ OFF
11:16:48 ❌ OFF

✅ После

11:58:03 ✅ OFF (один раз!)
11:58:04 ⏱️ пропущено
11:58:05 ⏱️ пропущено
11:58:06 ⏱️ пропущено
11:58:07 ⏱️ пропущено
16
Активных правил
8x
Меньше команд
60с
Мин. интервал

💡 Важное открытие: Кормушка

В процессе анализа пришли мысли, что кормушка реализована через PHP-скрипт двумя правилами:

📌 корм_вкл
12:05:00
state_l5: ON
📌 корм_выкл
12:05:03
state_l5: OFF

🔍 Рекомендация: Для таких задач лучше использовать 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 как обычно, но теперь без лишних команд!

✅ 0 ошибок ✅ 16 правил ✅ 60с интервал
🤦‍♂️

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 сек
🏭

Датацентр для лампочки

Я построил распределенную систему с микросервисной архитектурой, чтобы включить свет в туалете.
...но оно работает и это главное

🤔 Мораль сей басни:

1

CRON существует — и он реально создан для расписаний. Не надо эмулировать его в PHP.

2

KISS — Keep It Simple, Stupid. Если задачу можно решить одной строкой в crontab — решай её одной строкой.

3

Но опыт бесценен — теперь я точно знаю, КАК работают системы автоматизации изнутри. И какой ценой 😅

⚡ Сложные вещи — в PHP скрипт.
⏰ Простое расписание — в CRON.
Рыбкам вообще все равно, кто их кормит — PHP или CRON

— с уважением, человек, чей скрипт пережил 8 версий оптимизации,
чтобы в 12:05 отправить {"state": "ON"} в кормушку для рыб
обновленный скрипт автоматизации


Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Посетителей сегодня: 0
о блоге | карта блога

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA