Files
led-controller/src/util
Jimmy ac9fca8d4b Pi port: serial transport, addressed ESP-NOW bridge, port 80
- Run app on Raspberry Pi: serial to ESP32 bridge at 912000 baud, /dev/ttyS0
- Remove ESP-NOW/MicroPython-only code from src (espnow, p2p, wifi, machine/Pin)
- Transport: always send 6-byte MAC + payload; optional to/destination_mac in API and WebSocket
- Settings and model DB use project paths (no root); fix sys.print_exception for CPython
- Preset/settings controllers use get_current_sender(); template paths for cwd=src
- Pipfile: run from src, PORT from env; scripts for port 80 (setcap) and test
- ESP32 bridge: receive 6-byte addr + payload, LRU peer management (20 max), handle ESP_ERR_ESPNOW_EXIST
- Add esp32/main.py, esp32/benchmark_peers.py, scripts/setup-port80.sh, scripts/test-port80.sh

Made-with: Cursor
2026-03-15 17:16:07 +13:00
..

ESPNow Message Builder

This utility module provides functions to build ESPNow messages according to the LED Driver API specification.

Usage

Basic Message Building

from util.espnow_message import build_message, build_preset_dict, build_select_dict

# Build a message with presets and select
presets = {
    "red_blink": build_preset_dict({
        "pattern": "blink",
        "colors": ["#FF0000"],
        "delay": 200,
        "brightness": 255,
        "auto": True
    })
}

select = build_select_dict({
    "device1": "red_blink"
})

message = build_message(presets=presets, select=select)
# Result: {"v": "1", "presets": {...}, "select": {...}}

Building Select Messages with Step Synchronization

from util.espnow_message import build_message, build_select_dict

# Select with step for synchronization
select = build_select_dict(
    {"device1": "rainbow_preset", "device2": "rainbow_preset"},
    step_mapping={"device1": 10, "device2": 10}
)

message = build_message(select=select)
# Result: {"v": "1", "select": {"device1": ["rainbow_preset", 10], "device2": ["rainbow_preset", 10]}}

Converting Presets

from util.espnow_message import build_preset_dict, build_presets_dict

# Single preset
preset = build_preset_dict({
    "name": "my_preset",
    "pattern": "rainbow",
    "colors": ["#FF0000", "#00FF00"],  # Can be hex strings or RGB tuples
    "delay": 100,
    "brightness": 127,
    "auto": False,
    "n1": 2
})

# Multiple presets
presets_data = {
    "preset1": {"pattern": "on", "colors": ["#FF0000"]},
    "preset2": {"pattern": "blink", "colors": ["#00FF00"]}
}
presets = build_presets_dict(presets_data)

API Specification

See docs/API.md for the complete ESPNow API specification.

Key Features

  • Version Field: All messages include "v": "1" for version tracking
  • Preset Format: Presets use hex color strings (#RRGGBB), not RGB tuples
  • Select Format: Select values are always lists: ["preset_name"] or ["preset_name", step]
  • Color Conversion: Automatically converts RGB tuples to hex strings
  • Default Values: Provides sensible defaults for missing fields