277 lines
5.3 KiB
Markdown
277 lines
5.3 KiB
Markdown
# UART Protocol
|
|
|
|
This document describes the optional UART JSON protocol supported by the ESP32 controller.
|
|
|
|
UART is not the primary dashboard/control link. The current dashboard target is the Waveshare ESP32-S3 display over WiFi/HTTP.
|
|
|
|
Keep this protocol for diagnostics, simulator work, service tools, or alternate clients. Do not treat it as evidence that a Pico dashboard is planned.
|
|
|
|
## Serial Settings
|
|
|
|
- Baud: 115200
|
|
- Format: 8N1
|
|
- Encoding: UTF-8 JSON
|
|
- Framing: one JSON object per line
|
|
- Line ending: newline
|
|
|
|
## Design Goals
|
|
|
|
UART should support:
|
|
|
|
- Status requests
|
|
- Relay control
|
|
- Device configuration
|
|
- Relay configuration
|
|
- Temperature sensor configuration
|
|
- BMS configuration
|
|
- BMS setup mode
|
|
- BLE scanning
|
|
- BMS selection
|
|
- Factory reset
|
|
- Error reporting
|
|
|
|
## Generic IDs
|
|
|
|
Relays:
|
|
|
|
relay_1
|
|
relay_2
|
|
|
|
Temperature sensors:
|
|
|
|
temp_1 through temp_8
|
|
|
|
## Status Request
|
|
|
|
Client sends:
|
|
|
|
{"type":"status_request"}
|
|
|
|
ESP32 responds with the same shape as HTTP /status.
|
|
|
|
## Relay Control
|
|
|
|
Client sends:
|
|
|
|
{"type":"set_relay","relay":"relay_1","enabled":true}
|
|
|
|
ESP32 responds:
|
|
|
|
{"type":"relay_response","relay":"relay_1","enabled":true,"ok":true}
|
|
|
|
## Config Request
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_request"}
|
|
|
|
ESP32 responds:
|
|
|
|
{"type":"config_response","config":{}}
|
|
|
|
## Device Name Update
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_device","device_name":"Overland Controller"}
|
|
|
|
## Relay Config Update
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_relay","id":"relay_1","name":"Aux Power","enabled":true}
|
|
|
|
## Temperature Sensor Config Update
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_temp","id":"temp_1","name":"Cabin","address":"","enabled":true}
|
|
|
|
## BMS Config Update
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_bms","enabled":true,"name":"House Battery","address":"aa:bb:cc:dd:ee:ff","address_type":"public"}
|
|
|
|
## Save Config
|
|
|
|
Client sends:
|
|
|
|
{"type":"save_config"}
|
|
|
|
## Factory Reset
|
|
|
|
Client sends:
|
|
|
|
{"type":"factory_reset"}
|
|
|
|
## BMS Setup Mode
|
|
|
|
Enter setup:
|
|
|
|
{"type":"enter_bms_setup"}
|
|
|
|
Scan BLE:
|
|
|
|
{"type":"scan_ble"}
|
|
|
|
Expected scan response:
|
|
|
|
{"type":"ble_scan_response","devices":[{"index":1,"name":"House Battery","address":"aa:bb:cc:dd:ee:ff","rssi":-65}]}
|
|
|
|
Select BMS:
|
|
|
|
{"type":"select_bms","index":1}
|
|
|
|
Exit setup:
|
|
|
|
{"type":"exit_bms_setup"}
|
|
|
|
## Error Response
|
|
|
|
ESP32 returns errors as:
|
|
|
|
{"type":"error","message":"unknown_message_type"}
|
|
|
|
Common errors:
|
|
|
|
- invalid_json
|
|
- unknown_message_type
|
|
- unknown_relay
|
|
- unknown_temp_sensor
|
|
- invalid_bms_selection
|
|
- config_save_failed
|
|
- message_too_long
|
|
|
|
## UART / HTTP Parity Goal
|
|
|
|
The UART protocol should eventually support the same management capabilities as HTTP:
|
|
|
|
- /status equals status_request
|
|
- /config equals config_request
|
|
- /config/device equals config_device
|
|
- /config/relay equals config_relay
|
|
- /config/temp equals config_temp
|
|
- /config/bms equals config_bms
|
|
- /relay/relay_1/on equals set_relay
|
|
- /config/factory-reset equals factory_reset
|
|
|
|
## Notes
|
|
|
|
- HTTP is the preferred dashboard/control path.
|
|
- UART is useful for diagnostics and alternate clients.
|
|
- USB serial remains the emergency service/debug interface.
|
|
- No Pico dashboard is currently planned.
|
|
|
|
## WiFi Config Request
|
|
|
|
Client sends:
|
|
|
|
{"type":"wifi_request"}
|
|
|
|
ESP32 responds:
|
|
|
|
{"type":"wifi_config_response","ok":true,"wifi":{}}
|
|
|
|
## WiFi Config Update
|
|
|
|
Client sends:
|
|
|
|
{"type":"config_wifi","ssid":"Starlink","password":"password_here"}
|
|
|
|
## WiFi Connect
|
|
|
|
Client sends:
|
|
|
|
{"type":"wifi_connect"}
|
|
|
|
## WiFi Clear
|
|
|
|
Client sends:
|
|
|
|
{"type":"wifi_clear"}
|
|
|
|
AP mode remains enabled as the recovery path.
|
|
|
|
## WiFi Priority
|
|
|
|
WiFi configuration supports multiple saved networks.
|
|
|
|
Lower priority numbers are tried first.
|
|
|
|
Example:
|
|
|
|
{"type":"config_wifi","networks":[{"ssid":"Starlink","password":"password","priority":1},{"ssid":"Home WiFi","password":"password","priority":2}]}
|
|
|
|
Runtime behavior:
|
|
|
|
If STA disconnects, the ESP32 retries saved networks by priority every 30 seconds.
|
|
AP mode remains available as a recovery path.
|
|
|
|
|
|
---
|
|
|
|
# UART Parity Notes
|
|
|
|
UART should use the same generic command model as HTTP.
|
|
|
|
## Preferred Relay Command
|
|
|
|
Preferred:
|
|
|
|
{"type":"set_relay","id":"relay_1","state":true}
|
|
|
|
Legacy accepted shape:
|
|
|
|
{"type":"set_relay","relay":"relay_1","enabled":true}
|
|
|
|
Preferred response:
|
|
|
|
{"type":"relay_response","ok":true,"id":"relay_1","state":true}
|
|
|
|
## WiFi Priority Config
|
|
|
|
{"type":"config_wifi","networks":[{"ssid":"Starlink","password":"password","priority":1},{"ssid":"Home WiFi","password":"password","priority":2}]}
|
|
|
|
Lower priority numbers are tried first.
|
|
|
|
---
|
|
|
|
# Temperature Probe Setup
|
|
|
|
## Scan Temperature Sensors
|
|
|
|
Client sends:
|
|
|
|
{"type":"scan_temps"}
|
|
|
|
ESP32 responds:
|
|
|
|
{"type":"temp_scan_response","ok":true,"devices":[{"index":1,"address":"28:AA:BB:CC:DD:EE:FF:00"}]}
|
|
|
|
## Assign Temperature Sensor
|
|
|
|
Client sends:
|
|
|
|
{"type":"assign_temp","id":"temp_1","index":1}
|
|
|
|
Alternative:
|
|
|
|
{"type":"assign_temp","slot":1,"index":1}
|
|
|
|
## Clear Temperature Sensor
|
|
|
|
Client sends:
|
|
|
|
{"type":"clear_temp","id":"temp_1"}
|
|
|
|
Alternative:
|
|
|
|
{"type":"clear_temp","slot":1}
|
|
|
|
### Temperature weather flag
|
|
|
|
`status_response.config.temperature_sensors[]` and `status_response.temps[]` include `weather: false`.
|
|
|
|
`config_temp` may include `weather: true` to mark one configured sensor as the outside/weather sensor. Clients should treat this as optional and default missing values to `false`.
|