272 lines
10 KiB
Markdown
272 lines
10 KiB
Markdown
# PROJECT_KNOWLEDGE.md — ACS Monitoring (СКУД + Датчики воды)
|
||
|
||
## Что это
|
||
|
||
ACS Monitoring — система мониторинга и контроля доступа на базе ESP32.
|
||
|
||
**Два направления:**
|
||
1. **Датчики воды** — мониторинг расхода воды, давления, утечек. ESP32-сенсоры → MQTT → backend → frontend.
|
||
2. **СКУД (контроль доступа)** — 15 дверей с Wiegand RFID. ESP32-контроллер на каждую дверь, управление через веб-панель.
|
||
|
||
---
|
||
|
||
## Сервер
|
||
|
||
| Параметр | Значение |
|
||
|---|---|
|
||
| IP | 77.222.43.248 |
|
||
| SSH | root@77.222.43.248 |
|
||
| Домен | acs.zeroday.su |
|
||
| OS | Ubuntu 24.04 |
|
||
| Node.js | v22.22.0 |
|
||
| Nginx | 1.24.0 |
|
||
| MCP коннектор | dev.zeroday.su (server-connector) |
|
||
|
||
---
|
||
|
||
## Пути на сервере
|
||
|
||
```
|
||
/var/www/acs-monitoring/
|
||
├── backend/
|
||
│ ├── src/
|
||
│ │ ├── index.ts # точка входа, Express + MQTT
|
||
│ │ ├── api/ # REST routes
|
||
│ │ │ ├── access-keys.ts # СКУД: ключи доступа
|
||
│ │ │ ├── access.ts # СКУД: журнал событий
|
||
│ │ │ ├── alerts.ts
|
||
│ │ │ ├── auth.ts # JWT авторизация
|
||
│ │ │ ├── backups.ts
|
||
│ │ │ ├── dashboard.ts
|
||
│ │ │ ├── devices.ts # СКУД: устройства (двери)
|
||
│ │ │ ├── dictionaries.ts
|
||
│ │ │ ├── discovery.ts # обнаружение новых устройств
|
||
│ │ │ ├── employees.ts # СКУД: сотрудники
|
||
│ │ │ ├── firmware.ts # управление прошивками
|
||
│ │ │ ├── registration-station.ts # станция регистрации карт
|
||
│ │ │ ├── sensors.ts # датчики воды
|
||
│ │ │ ├── telegram.ts
|
||
│ │ │ ├── users.ts
|
||
│ │ │ └── water.ts # данные расхода воды
|
||
│ │ ├── mqtt/
|
||
│ │ │ ├── index.ts # MQTT клиент (mosquitto)
|
||
│ │ │ ├── handlers.ts # обработчики датчиков воды
|
||
│ │ │ └── skud-handlers.ts # обработчики СКУД
|
||
│ │ ├── database/ # pg pool, migrations
|
||
│ │ ├── middleware/ # JWT, CORS, rate limit
|
||
│ │ ├── services/
|
||
│ │ └── utils/
|
||
│ └── .env # переменные окружения
|
||
├── frontend/
|
||
│ ├── src/
|
||
│ │ ├── App.tsx # роутинг (hash routing)
|
||
│ │ ├── pages/
|
||
│ │ │ ├── SCUD/ # страницы контроля доступа
|
||
│ │ │ │ ├── AccessLogPage.tsx # журнал событий (группировка по дате, пагинация, CSV)
|
||
│ │ │ │ ├── AccessKeysPage.tsx # RFID карты
|
||
│ │ │ │ ├── DevicesPage.tsx # двери (open door, сеть, команды)
|
||
│ │ │ │ ├── EmployeesPage.tsx # сотрудники
|
||
│ │ │ │ ├── FirmwarePage.tsx # прошивки (OTA push, стабильная/бета)
|
||
│ │ │ │ └── DiscoveryPage.tsx # поиск новых устройств
|
||
│ │ │ ├── Sensors/ # датчики воды
|
||
│ │ │ ├── Dashboard/
|
||
│ │ │ ├── Auth/
|
||
│ │ │ └── Admin/
|
||
│ │ └── services/
|
||
│ │ └── api.ts # все API вызовы
|
||
│ └── dist/ # собранный фронтенд (nginx)
|
||
├── firmware/
|
||
│ ├── door-controller-v2.0/ # Production СКУД прошивка
|
||
│ │ ├── door_controller_v2.ino
|
||
│ │ ├── config.h
|
||
│ │ ├── mqtt_handler.h
|
||
│ │ ├── web_config.h # AP Mode web configurator
|
||
│ │ ├── wiegand_reader.h
|
||
│ │ ├── card_cache.h # NVS кеш до 10,000 карт
|
||
│ │ ├── event_queue.h # offline очередь до 500 событий
|
||
│ │ └── README.md
|
||
│ ├── water-sensor-v3.3.2/ # Последняя стабильная прошивка датчика воды
|
||
│ └── ota_module.ino
|
||
└── scripts/ # bash скрипты
|
||
```
|
||
|
||
---
|
||
|
||
## PM2 процессы
|
||
|
||
```bash
|
||
pm2 list # все процессы
|
||
pm2 logs acs-monitoring --lines 50 # логи СКУД
|
||
pm2 restart acs-monitoring # рестарт
|
||
```
|
||
|
||
> ⚠️ Сейчас `acs-monitoring` в статусе **stopped** (238+ рестартов). Вероятно упал по ошибке.
|
||
|
||
---
|
||
|
||
## База данных PostgreSQL
|
||
|
||
- **Хост**: localhost:5432
|
||
- **База**: acs_monitoring
|
||
- **Пользователь**: acs_user
|
||
- **Пароль**: в `/var/www/acs-monitoring/backend/.env`
|
||
|
||
### Таблицы
|
||
|
||
| Таблица | Назначение |
|
||
|---|---|
|
||
| `devices` | ESP32 устройства (двери, датчики) |
|
||
| `employees` | Сотрудники |
|
||
| `access_keys` | RFID карты и RF брелоки |
|
||
| `access_events` | Журнал событий доступа |
|
||
| `device_commands` | Очередь команд устройствам |
|
||
| `device_discovery` | Обнаруженные новые устройства |
|
||
| `device_network_config` | Сетевые настройки устройств (static IP) |
|
||
| `firmware` | Версии прошивок |
|
||
| `firmware_updates` | История OTA обновлений |
|
||
| `sensors` | Датчики воды |
|
||
| `water_data` | Показания расхода воды |
|
||
| `pressure_data` | Данные давления |
|
||
| `electricity_data` | Электроэнергия (планируется) |
|
||
| `alerts` | Алерты системы |
|
||
| `users` | Пользователи веб-панели |
|
||
| `departments` | Отделы |
|
||
| `positions` | Должности |
|
||
| `telegram_settings` | Настройки Telegram уведомлений |
|
||
|
||
---
|
||
|
||
## Стек технологий
|
||
|
||
### Backend
|
||
- Node.js v22 + Express + TypeScript
|
||
- PostgreSQL + pg
|
||
- MQTT: Mosquitto (порт 1883, WS: 8883)
|
||
- Socket.IO — real-time обновления
|
||
- JWT авторизация
|
||
- PM2 (порт 3003)
|
||
|
||
### Frontend
|
||
- React 18 + Vite + TypeScript
|
||
- shadcn/ui (Card, Table, Dialog, Badge, Select, Input...)
|
||
- Lucide React иконки
|
||
- Hash routing (без React Router)
|
||
- Chart.js — графики
|
||
|
||
### ESP32 (СКУД — Door Controller v2.0)
|
||
- Arduino Framework
|
||
- WiFi (встроенная)
|
||
- PubSubClient (MQTT)
|
||
- ArduinoJson
|
||
- ArduinoOTA
|
||
- Preferences/NVS — хранение конфига и кеша карт
|
||
|
||
### ESP32 (Датчики воды — v3.5.x)
|
||
- Arduino Framework + SPIFFS (журналирование)
|
||
- MQTT с journal-first архитектурой
|
||
- NTP синхронизация времени
|
||
- OTA обновления
|
||
|
||
---
|
||
|
||
## Распиновка ESP32 (СКУД)
|
||
|
||
```
|
||
GPIO 26 ← Wiegand D0 (зелёный провод)
|
||
GPIO 27 ← Wiegand D1 (белый провод)
|
||
GPIO 25 → Relay IN (управление замком)
|
||
GPIO 33 ← Кнопка выхода → GND
|
||
GPIO 32 → Buzzer (опционально)
|
||
GPIO 2 LED статус (встроенный)
|
||
VIN/5V ← Mini560 OUT+ (5.0V!)
|
||
GND ← Общий GND
|
||
```
|
||
|
||
---
|
||
|
||
## MQTT топики (СКУД)
|
||
|
||
| Топик | Направление | Описание |
|
||
|---|---|---|
|
||
| `skud/{device_id}/status` | ESP→Server | Heartbeat каждые 30 сек |
|
||
| `skud/{device_id}/access` | ESP→Server | Событие прохода |
|
||
| `skud/{device_id}/sync` | ESP↔Server | Синхронизация карт / batch offline событий |
|
||
| `devices/provision` | ESP→Server | Активация нового устройства |
|
||
| `skud/{device_id}/command` | Server→ESP | Команды (open_door, reboot, sync_cards...) |
|
||
| `skud/{device_id}/provision/ack` | Server→ESP | Ответ на provision |
|
||
|
||
---
|
||
|
||
## Команды устройствам (СКУД)
|
||
|
||
| Команда | Описание |
|
||
|---|---|
|
||
| `open_door` | Открыть дверь (+duration мс) |
|
||
| `close_door` | Закрыть дверь |
|
||
| `sync_cards` | Пересинхронизация кеша карт |
|
||
| `sync_time` | Синхронизация NTP |
|
||
| `reboot` | Перезагрузка |
|
||
| `factory_reset` | Сброс настроек |
|
||
| `set_door_duration` | Изменить время открытия |
|
||
|
||
---
|
||
|
||
## Переменные окружения (без секретов)
|
||
|
||
```env
|
||
PORT=3003
|
||
NODE_ENV=production
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_NAME=acs_monitoring
|
||
DB_USER=acs_user
|
||
DB_PASSWORD=<в .env на сервере>
|
||
MQTT_HOST=localhost
|
||
MQTT_PORT=1883
|
||
MQTT_WS_PORT=8883
|
||
JWT_SECRET=<в .env на сервере>
|
||
FRONTEND_URL=https://acs.zeroday.su
|
||
TELEGRAM_CHAT_ID=<опционально>
|
||
```
|
||
|
||
---
|
||
|
||
## Деплой
|
||
|
||
```bash
|
||
# Frontend — сборка и деплой
|
||
cd /var/www/acs-monitoring/frontend
|
||
npm run build
|
||
# nginx отдаёт из /var/www/acs-monitoring/frontend/dist/
|
||
|
||
# Backend — применить изменения
|
||
cd /var/www/acs-monitoring/backend
|
||
npm run build
|
||
pm2 restart acs-monitoring
|
||
|
||
# Логи
|
||
pm2 logs acs-monitoring --lines 100
|
||
```
|
||
|
||
---
|
||
|
||
## Hardware (1 дверь)
|
||
|
||
| Компонент | Модель | Примечание |
|
||
|---|---|---|
|
||
| Контроллер | ESP32 DevKit 30-pin Type-C | — |
|
||
| Считыватель | Wiegand RFID 26/34 bit | 12V питание |
|
||
| Реле | 5V 1-канальное | IN: GPIO 25 |
|
||
| Преобразователь | Mini560 (12V→5V) | Точно 5.0V! |
|
||
| БП | 12V 2A | — |
|
||
| АКБ | 12V 7Ah | Резерв питания 2-6 дней |
|
||
| Замок | Электромагнитный 12V | NO контакты реле |
|
||
| Кнопка | Кнопка выхода | GPIO 33 → GND |
|
||
|
||
**Стоимость 1 двери:** ~4 750 ₽
|
||
**Стоимость 15 дверей:** ~71 250 ₽
|
||
|
||
---
|
||
|
||
*Обновлено: май 2026*
|