Автор: Инженер-самоделкин, прошедший путь от одного PHP-файла до распределённой архитектуры
Поправил свою систему, больше не спамит, расписание починил. но вот есть мысль а стоит ли переходить на новый уровень, или спустится в cron. Лично для меня cron удобнее. Может быть потом сделаю более глобальную систему. Но пока нет такой необходимости. И вообще все что я тут понаделал, это просто ради эксперимента, так можно сделать умный дом через скрипты и крон, но мы извращенцы и мазохисты, будем копаться дальше )
Ссылка на обновленный файл будет тут, пока нету )
Вы начинаете с одного файла mqtt_listener.php. Всё работает. Потом правил становится 20, датчиков — 50. Вы теряетесь в собственном коде, спамит логами, расписание не срабатывает, а новую функцию добавить страшно.
Признаки того, что пора переходить на профессиональную архитектуру:
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 # Документация, чтобы через год не забыть
-- Правила автоматизации (упрощённо)
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
| Масштаб | Архитектура | Примеры |
|---|---|---|
| 1-5 правил | Один PHP-скрипт, sleep(1) | Ваш текущий вариант ✅ |
| 5-20 правил | Разделение на классы, логи в файл | Engine + MqttClient |
| 20-100 правил | Event-driven, Redis, несколько воркеров | Home Assistant, Node-RED |
| 100+ правил | Микросервисы, Kafka, кластеризация | Промышленные SCADA-системы |
Мой совет: Остановитесь на втором уровне. Разделите код на 3-4 класса, добавьте нормальные логи и .env файл. Этого хватит для дома и небольшого офиса на годы вперёд.
Напишите в комментариях, на каком уровне сейчас ваша система и что хотите добавить! 👇
Комментарии
Пока нет комментариев. Будьте первым!