5.3 KiB
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.