Files
home_automatization/README.md
T
2026-07-26 17:06:30 +05:00

103 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Платформа домашней автоматизации
Pet-проект на микросервисной архитектуре для портфолио, демонстрирующий Go
(конкурентность, очереди сообщений, MQTT), PHP/Laravel (API, авторизация)
и работу с разными БД по назначению (PostgreSQL, ClickHouse, Redis).
**Это не «проект гроубокса».** Гроубокс — первая реализованная **зона**
с первым набором **типов устройств** (свет, полив, вентиляция, датчик
температуры). Ядро системы — управление устройствами, телеметрия, правила
автоматизации, пользователи, уведомления — оперирует исключительно
абстракциями *зона*, *устройство*, *тип устройства*, *показание датчика*,
*команда*, *правило*. Ничего специфичного для гроубокса не зашито в ядре:
добавление зоны «гостиная» с типом устройства «умная розетка» не должно
требовать изменений в коде сервисов — только новые строки в
`device_types` / `zones` / `devices`.
## Архитектура
```
ESP32 (или эмулятор)
│ MQTT
ingest-service (Go) ──► ClickHouse (сырая телеметрия)
▼ RabbitMQ (событие "новое показание")
rule-engine-service (Go) ──► PostgreSQL (правила, кэшируются)
│ gRPC (при срабатывании правила)
device-control-service (Go) ──► MQTT (команда) ──► устройство
Redis (device shadow: desired/reported state, status, last_seen)
Laravel API (PHP) ──► PostgreSQL / ClickHouse / Redis
│ gRPC / HTTP
device-control-service (ручные команды из UI)
```
## Стек
| Назначение | Технология |
|---|---|
| Прошивка устройства / эмулятор | Go (`services/esp32-emulator`) |
| Протокол устройство ↔ сервер | MQTT (Mosquitto) |
| Backend телеметрии / команд / правил | Go |
| Бизнес-логика / API / дашборд | PHP (Laravel) |
| Пользователи, зоны, устройства, правила | PostgreSQL |
| Телеметрия (time-series) | ClickHouse |
| Состояние устройств в реальном времени | Redis (паттерн Device Shadow) |
| Асинхронные события между сервисами | RabbitMQ |
| Синхронные вызовы между сервисами | gRPC / Protobuf |
| Метрики (этап 2.5) | Prometheus + Grafana |
| Контейнеризация | Docker Compose |
| Веб-фронтенд (этап 3) | Vue.js + Inertia.js |
| Мобильное приложение (этап 3) | Flutter |
| Уведомления | Telegram-бот (MVP) / Firebase Cloud Messaging (позже) |
## Структура репозитория
```
services/
ingest-service/ Go — MQTT → ClickHouse + RabbitMQ
device-control-service/ Go — gRPC + MQTT + Redis device shadow
rule-engine-service/ Go — консьюмер RabbitMQ + оценка правил
health-check-service/ Go — тикер обнаружения офлайн-устройств
esp32-emulator/ Go — фейковое устройство для локальной разработки
laravel-app/ PHP/Laravel — API, авторизация, дашборд (этап 2)
proto/ Общие gRPC-контракты (device_control.proto)
migrations/
postgres/ users, zones, devices, device_types, automation_rules
clickhouse/ таблица telemetry
configs/mosquitto/ Конфиг MQTT-брокера
monitoring/ Конфиги Prometheus + Grafana (этап 2.5)
```
Каждый `services/*/README.md` описывает зону ответственности сервиса и явно
то, что в неё не входит, — ещё до того, как там появится код.
## Этапы разработки
1. **Go-сервисы** — ingest, rule-engine, device-control, эмулятор ESP32.
2. **Laravel** — авторизация (Sanctum, owner/viewer), CRUD для зон/устройств/
правил, Blade-дашборд, ручное управление устройствами. MVP считается
готовым на этом этапе.
3. *(опционально, но сильно повышает ценность)* **Observability** — метрики
Prometheus с Go-сервисов, один-два дашборда в Grafana.
4. **Расширения** (не спеша) — Telegram-уведомления, фронтенд на
Vue.js/Inertia, приложение на Flutter, подключение реального ESP32.
## Запуск локально
Пока только инфраструктура (сервисы добавляются в `docker-compose.yml` по
мере реализации):
```bash
cp .env.example .env
docker compose up -d
```
Поднимутся Mosquitto (`1883`), PostgreSQL (`5432`), ClickHouse (`8123`/`9000`),
Redis (`6379`) и RabbitMQ (`5672`, веб-интерфейс управления на `15672`).