↩️ Назад

Категории

Как построить профессиональную IoT-систему автоматизации

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

Автор: Инженер-самоделкин, прошедший путь от одного PHP-файла до распределённой архитектуры
Поправил свою систему, больше не спамит, расписание починил. но вот есть мысль а стоит ли переходить на новый уровень, или спустится в cron. Лично для меня cron удобнее. Может быть потом сделаю более глобальную систему. Но пока нет такой необходимости. И вообще все что я тут понаделал, это просто ради эксперимента, так можно сделать умный дом через скрипты и крон, но мы извращенцы и мазохисты, будем копаться дальше )
Ссылка на обновленный файл будет тут, пока нету )


📌 Проблема: почему один скрипт — это плохо?

Вы начинаете с одного файла mqtt_listener.php. Всё работает. Потом правил становится 20, датчиков — 50. Вы теряетесь в собственном коде, спамит логами, расписание не срабатывает, а новую функцию добавить страшно.

Признаки того, что пора переходить на профессиональную архитектуру:


🏗️ Профессиональная архитектура 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️⃣ Паттерны проектирования, которые спасут жизнь

4️⃣ Как работают большие системы (на примере Home Assistant / Node-RED)

  1. MQTT брокер — шина событий, а не опрос БД каждую секунду
  2. Правила компилируются в байткод или AST для быстрой проверки
  3. WebSocket — дашборд обновляется в реальном времени
  4. Redis — состояния датчиков в памяти (мгновенный доступ)
  5. Supervisord / systemd — управление несколькими воркерами
  6. Rate limiting + Circuit breaker — защита от DDoS и зацикленных правил

5️⃣ Что добавить в ваш текущий проект (просто и эффективно)


🚀 Итог: что выбрать для своего проекта?

Масштаб Архитектура Примеры
1-5 правил Один PHP-скрипт, sleep(1) Ваш текущий вариант ✅
5-20 правил Разделение на классы, логи в файл Engine + MqttClient
20-100 правил Event-driven, Redis, несколько воркеров Home Assistant, Node-RED
100+ правил Микросервисы, Kafka, кластеризация Промышленные SCADA-системы

Мой совет: Остановитесь на втором уровне. Разделите код на 3-4 класса, добавьте нормальные логи и .env файл. Этого хватит для дома и небольшого офиса на годы вперёд.


📚 Полезные ссылки (для углублённого изучения)


Напишите в комментариях, на каком уровне сейчас ваша система и что хотите добавить! 👇




Категории:

Категории

Комментарии

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

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

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

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

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