Files

272 lines
10 KiB
Markdown
Raw Permalink 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.
# 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*