Привет! Сегодня хочу рассказать, как я реализовал ядро системы автоматизации для своего IoT-проекта — а именно, два ключевых компонента:
Это не про весь “умный дом”, а именно про логику принятия решений: когда, почему и как система должна включить свет, обогреватель или закрыть шторы.
В IoT-системах устройства генерируют данные (температура, движение, открытие двери), а другие устройства должны на них реагировать. Но реакция должна быть умной:
Для этого нужен “мозг” — и я его сделал на PHP + MySQL + MQTT.
Всё хранится в одной таблице — automations
. Вот ключевые поля:
name
— название правила (для человека).trigger_topic
— MQTT-топик, который “запускает” правило (например, sensors/temperature/living_room
).condition_operator
и condition_value
— простое условие: >
, ==
, <=
и т.д.condition_script
— альтернатива: JS-подобное выражение для сложных условий (например, sensor.temp > 20 && sensor.humidity < 60
).condition_duration
— сколько секунд условие должно соблюдаться, прежде чем сработать.action_topic
и action_payload
— куда и что отправить (например, devices/heater/set
→ {"state": "ON"}
).schedule_type
— можно запускать не только по триггеру, но и по расписанию: daily
, weekly
.dependency_topic
и dependency_value
— дополнительное условие: “сработать только если окно закрыто”.confirmation_topic
— система может ждать подтверждения от устройства (например, что реле действительно включилось).delay_seconds
— задержка перед выполнением действия.enabled
— можно временно отключить правило.Таблица спроектирована так, чтобы одно правило могло охватывать множество сценариев — от простого “включил-выключил” до сложных сцен с подтверждениями, расписаниями и скриптами.
Это PHP-страница с формой, где можно создавать, редактировать и удалять правила. Ключевые фичи:
Можно выбрать один из двух типов:
температура > 25
).sensor.{topic}
и логических операторов.Условие работает и для триггеров, и для расписания. Например: “Каждый день в 8:00 включать обогрев, ЕСЛИ температура < 10”.
action_topic
и action_payload
.Дополнительный “флаг безопасности”: правило сработает только если другой топик имеет определённое значение. Например: “Включить полив, только если датчик дождя == сухо”.
Скриптовые условия выполняются через безопасный интерпретатор:
sensor.xxx
→ $sensorData['xxx']
.eval
, system
и т.д.).eval()
!).Это фоновый PHP-скрипт, который работает в бесконечном цикле. Он:
mosquitto_pub
.evaluateRuleCondition($rule, $pdo)
Проверяет, истинно ли условие правила — простое или скриптовое. Для скриптов использует тот же безопасный механизм, что и в logic.php
.
handleAction($rule)
Выполняет действие с учётом задержки и подтверждения. Если указана delay_seconds
— действие откладывается. Если указан confirmation_topic
— система ждёт подтверждения и может повторять попытки.
checkPendingConfirmations($pdo)
Проверяет, пришли ли подтверждения от устройств, сравнивает с ожидаемым состоянием и помечает правило как выполненное.
logic.php
, создаёшь правило: “Если температура < 10 — включить обогрев”.mqtt_listener.php
подхватывает его при следующей перезагрузке.Это основа. В будущем можно добавить:
Я не использовал готовые платформы вроде Node-RED или Home Assistant — мне хотелось полного контроля и понимания “под капотом”. PHP + MySQL + MQTT — оказалось, отличный стек для этого.
Система получилась гибкой, расширяемой и безопасной. И самое главное — она работает 😊
Код открыт, структура понятна — приходите, задавайте вопросы, кастомизируйте под себя. Умный дом — это не про покупку коробки, а про создание того, что действительно нужно именно тебе.
P.S. В следующей статье разберу код построчно — если хотите глубже понять, как всё устроено “под капотом”
Я специально не выкладываю полные исходники — хочу, чтобы вы задавали вопросы, предлагали улучшения, делились идеями.
👉 Хотите файлы logic.php
и mqtt_listener.php
?
Пишите в комментариях:
Самые активные и интересные комментаторы получат код в личку 🎁
(А потом, возможно, сделаю отдельную статью с построчным разбором!)
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!