Initial: backup from Claude Project 'Весовое оборудование'

- PROTOCOL.md: topology, JSON schema, MQTT topic, auth, retry logic
- HARDWARE.md: components, GPIO map, ASCII wiring, power, calibration
- FIRMWARE_NOTES.md: stack (ESP32 core 3.x), libraries, main loop, known issues, TODO
- INDEX.md: manifest + current status + blockers

Current blocker: TITAN 9 P5 default = no RS232 output.
Fix: call Zemic +7(472)277-71-19, set P5=3, then test on-site.
Related server repo: admin/scales
This commit is contained in:
admin
2026-04-30 12:26:31 +03:00
commit 35e5ffea1e
7 changed files with 464 additions and 0 deletions
+103
View File
@@ -0,0 +1,103 @@
# Протокол передачи данных с весов на сервер
## Топология
```
Zemic TITAN 9 (RS232/DB25)
↓ TXD + GND (3-4 провода)
MAX3232 (RS232 ↔ 3.3V TTL)
↓ UART TTL
ESP32 (GPIO16/RX2)
↓ SPI
W5500 Ethernet модуль
↓ TCP/IP (LAN)
Mosquitto MQTT Broker (порт 1884 plain / 8883 MQTTS — в планах)
↓ подписчик
Node.js / server.js (порт 3016, PM2)
↓ WebSocket
Web UI (https://scales.zeroday.su)
```
## Формат сообщения (JSON-схема)
Топик: `scales/weighing/event`
```json
{
"device_id": "scales_01",
"timestamp": "2026-03-01T10:23:45Z",
"weight_kg": 18450.5,
"weight_raw": "ww018450.500kg",
"stable": true,
"plate": null
}
```
| Поле | Тип | Описание |
|-------------|---------|-------------------------------------------------------------|
| device_id | string | Идентификатор контроллера (если весов несколько) |
| timestamp | string | ISO 8601, UTC. Берётся с DS3231 RTC (синхронизируется NTP) |
| weight_kg | float | Распарсенный вес в кг (удобно для БД) |
| weight_raw | string | Сырая строка с весов (`ww000.000kg`) |
| stable | bool | true = вес стабилизировался перед отправкой |
| plate | null | Зарезервировано — номер авто добавляет внешняя АСУ |
### Формат строки с весов (Zemic A12E / TITAN 9)
```
ww000.000kg — вес брутто
wn000.000kg — вес нетто
wt000.000kg — вес тары
```
ASCII, 1 стартовый бит, 8 бит данных, 1 стоповый бит. Скорость — P3 (9600 по умолчанию).
## MQTT-топик и QoS
| Параметр | Значение |
|---------------|----------------------------|
| Топик | `scales/weighing/event` |
| QoS | 1 (at least once) |
| Retain | false |
| Брокер | Mosquitto на scales.zeroday.su |
| Порт (plain) | 1884 (для тестовой фазы) |
| Порт (TLS) | 8883 (планируется) |
## Аутентификация / TLS / credentials
Анонимный доступ к брокеру **запрещён** (`allow_anonymous false`).
| Пользователь | Пароль | Роль |
|----------------|--------------------|-------------------------------|
| esp32 | Esp32Scales#2026 | ESP32 контроллер (publisher) |
| scales-server | ScalesServer#2026 | Node.js backend (subscriber) |
Конфиг Mosquitto: `/etc/mosquitto/conf.d/acs.conf`
Файл паролей: `/etc/mosquitto/passwd`
TLS (MQTTS port 8883) — **запланировано** после подтверждения RS232-потока.
## Логика стабилизации и retry
### На стороне ESP32 (firmware)
Весы настроены на P5=3 (передача только при стабильном весе) — т.е. строка приходит уже стабильная.
Дополнительная логика на ESP32:
1. Читаем строку каждые ~500 мс с Serial2
2. Если последние 5–10 показаний отличаются не более чем на ±20–50 кг — считаем вес стабильным
3. Отправляем MQTT-событие **один раз**
4. Ждём пока вес упадёт ниже порога (машина уехала) → сбрасываем флаг
5. Готовы к следующему взвешиванию
### Retry при обрыве MQTT
- При `rc=-2` (не удалось подключиться) — ESP32 делает повторную попытку каждые N секунд
- Данные не буферизуются локально (TODO: добавить очередь на случай длительного обрыва)
## Текущие ограничения / TODO по протоколу
- [ ] MQTTS (порт 8883) — включить после подтверждения RS232
- [ ] Локальная очередь на ESP32 при обрыве связи
- [ ] Поле `plate` — заполняется внешней АСУ распознавания номеров
- [ ] Подтвердить навигацию в меню TITAN 9 для выставления P5=3 (контакт: Zemic +7 (472) 277-71-19)