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:
+103
@@ -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)
|
||||
Reference in New Issue
Block a user