Категории
Как построить профессиональную IoT-систему автоматизации
11.05.2026 | из категории: IOT умный домАвтор: Инженер-самоделкин, прошедший путь от одного PHP-файла до распределённой архитектуры
Поправил свою систему, больше не спамит, расписание починил. но вот есть мысль а стоит ли переходить на новый уровень, или спуститься в cron. Лично для меня cron удобнее. Может быть потом сделаю более глобальную систему. Но пока нет такой необходимости. И вообще все что я тут понаделал, это просто ради эксперимента, так можно сделать умный дом через скрипты и крон, но мы извращенцы и мазохисты, будем копаться дальше )
Ссылка на обновленный файл будет тут, пока нету )
📌 Проблема: почему один скрипт — это плохо?
Вы начинаете с одного файла mqtt_listener.php. Всё работает. Потом правил становится 20, датчиков — 50. Вы теряетесь в собственном коде, спамит логами, расписание не срабатывает, а новую функцию добавить страшно.
Признаки того, что пора переходить на профессиональную архитектуру:
- ❌ Один PHP-файл на 700+ строк
- ❌ Переменные глобальные везде, где только можно
- ❌ Логи пишутся в консоль, а не в файл/БД
- ❌ Каждая ошибка останавливает весь движок
- ❌ Нет чёткого разделения: расписание, триггеры, действия — всё в одной каше
🏗️ Профессиональная архитектура IoT-автоматизации
1️⃣ Структура проекта
iot-platform/ │ ├── config/ # Вся конфигурация в одном месте │ ├── config.php # База, MQTT, часовые пояса │ ├── constants.php # Константы: интервалы, лимиты │ └── database.php # Подключение к БД (синглтон) │ ├── core/ # Ядро системы (не зависит от логики) │ ├── MqttClient.php # MQTT: подписка, публикация │ ├── Database.php # PDO wrapper с логами запросов │ ├── Logger.php # Логи в файл + БД + Telegram │ ├── Cache.php # Кэш состояний (Redis/APCu) │ └── EventBus.php # Внутренние события (PSR-14) │ ├── engine/ # Движок автоматизации (ваша логика) │ ├── RuleEngine.php # Главный оркестратор │ ├── ConditionEvaluator.php # Проверка условий (скрипты, длительность) │ ├── ActionExecutor.php # Выполнение действий (MQTT, HTTP, Shell) │ ├── ScheduleManager.php # Крон-подобный менеджер │ └── TriggerManager.php # Обработка событий от датчиков │ ├── modules/ # Дополнительные модули │ ├── TelegramBot.php # Уведомления и команды через бота │ ├── WebhookHandler.php # Входящие вебхуки от сторонних API │ ├── DashboardAPI.php # REST API для админки │ └── BackupManager.php # Автоматический бэкап конфигов │ ├── workers/ # Фоновые процессы (системные демоны) │ ├── automation.php # Основной поток (ваш текущий скрипт) │ ├── mqtt_subscriber.php # Подписка на MQTT в реальном времени │ ├── cleanup_worker.php # Чистка старых логов и истории │ └── health_checker.php # Проверка здоровья всех сервисов │ ├── web/ # Веб-интерфейс │ ├── public/ # Доступно из браузера │ │ ├── index.php # Админка (Vue.js или простой jQuery) │ │ ├── api.php # REST API для фронта │ │ └── dashboard.html # Дашборд с графиками │ └── templates/ # Шаблоны (Twig/Smarty) │ ├── scripts/ # Утилиты командной строки │ ├── reset_rule.php # Сбросить правило по ID │ ├── test_rule.php # Проверить правило без выполнения │ ├── migrate_db.php # Обновление структуры БД │ └── gen_docs.php # Генерация документации по правилам │ ├── logs/ # Логи (не в консоль, а в файлы) │ ├── automation.log │ ├── errors.log │ └── mqtt.log │ ├── vendor/ # Composer зависимости ├── .env # Переменные окружения (пароли не в коде) ├── docker-compose.yml # Контейнеризация всего зоопарка └── README.md # Документация, чтобы через год не забыть
2️⃣ Модель данных (таблицы в БД)
-- Правила автоматизации (упрощённо)
automations:
- id
- name
- enabled
- trigger_type: 'schedule' | 'sensor' | 'webhook'
- trigger_config: JSON # например {"topic":"motion","value":"ON"}
- condition_config: JSON # сложные условия
- action_config: JSON # {"topic":"...", "payload":"..."}
- cooldown_seconds # защита от спама
- persistent # повторять после выполнения
- created_at, updated_at
-- История срабатываний (для аналитики)
automation_log:
- id, rule_id
- triggered_at
- condition_met (bool)
- action_sent
- confirmed (bool)
- error_message
-- Датчики (история, для графиков)
sensor_data:
- topic
- value (JSON)
- timestamp
-- Глобальные переменные (для сложных сценариев)
globals:
- key (например 'house_mode': day/night/away)
- value
- updated_at
3️⃣ Паттерны проектирования, которые спасут жизнь
- Dependency Injection — не создавайте внутри классов новые объекты, передавайте через конструктор
- Repository Pattern — вся работа с БД через отдельные классы
- Event Sourcing — каждое изменение состояния датчика — это событие
- Command Bus — действия (включить свет, отправить уведомление) как команды
- State Machine — для сложных устройств (зарядка станции, полив)
4️⃣ Как работают большие системы (на примере Home Assistant / Node-RED)
- MQTT брокер — шина событий, а не опрос БД каждую секунду
- Правила компилируются в байткод или AST для быстрой проверки
- WebSocket — дашборд обновляется в реальном времени
- Redis — состояния датчиков в памяти (мгновенный доступ)
- Supervisord / systemd — управление несколькими воркерами
- Rate limiting + Circuit breaker — защита от DDoS и зацикленных правил
5️⃣ Что добавить в ваш текущий проект (просто и эффективно)
- ✅ Перенести конфиги в .env файл (пароль от БД не светить в коде)
- ✅ Вынести MQTT в отдельный класс — удобно тестировать и менять брокера
- ✅ Писать логи не только в консоль, но и в файл (с ротацией по дням)
- ✅ Добавить Web-интерфейс для просмотра логов в реальном времени
- ✅ Telegram бот — чтобы получать уведомления и управлять правилами
- ✅ Unit-тесты для критических функций (чтобы не бояться обновлять)
🚀 Итог: что выбрать для своего проекта?
| Масштаб | Архитектура | Примеры |
|---|---|---|
| 1-5 правил | Один PHP-скрипт, sleep(1) | Ваш текущий вариант ✅ |
| 5-20 правил | Разделение на классы, логи в файл | Engine + MqttClient |
| 20-100 правил | Event-driven, Redis, несколько воркеров | Home Assistant, Node-RED |
| 100+ правил | Микросервисы, Kafka, кластеризация | Промышленные SCADA-системы |
Мой совет: Остановитесь на втором уровне. Разделите код на 3-4 класса, добавьте нормальные логи и .env файл. Этого хватит для дома и небольшого офиса на годы вперёд.
📚 Полезные ссылки (для углублённого изучения)
- PSR-стандарты (как писать профессиональный PHP)
- PHP MQTT клиент — лучше чем shell_exec
- Symfony EventDispatcher — внутренние события
- Redis Pub/Sub — альтернатива MQTT для внутренних процессов
Напишите в комментариях, на каком уровне сейчас ваша система и что хотите добавить! 👇