Files
pi-dashboard/docs/ALARM_PROTOCOL.md
Mikkeli Matlock dca989a01b feature: alarm
2026-02-15 21:11:33 +09:00

2.2 KiB

Alarm Audio Streaming Protocol

Overview

The Raspberry Pi streams alarm audio to the ESP32-S3 over a dedicated WebSocket connection on port 8766. The protocol uses mixed text and binary frames — text for control messages, binary for raw PCM data.

Connection

Parameter Value
Port 8766
Transport WebSocket
Direction Pi (server) → ESP32 (client)

The ESP32 connects and stays connected. The server initiates alarm playback when needed.

Message Sequence

Pi                          ESP32
 │                            │
 │◄──── WS connect ──────────│
 │                            │
 │  (idle until alarm fires)  │
 │                            │
 ├─ alarm_start (text) ──────►│  → open codec
 ├─ PCM chunk (binary) ──────►│  → queue + play
 ├─ PCM chunk (binary) ──────►│
 │  ...                       │
 ├─ alarm_stop (text) ────────►│  → drain + close codec
 │                            │

Control Messages (Text Frames)

alarm_start

Sent before the first PCM chunk. The ESP32 uses these parameters to configure the DAC.

{
  "type": "alarm_start",
  "sample_rate": 24000,
  "channels": 2,
  "bits": 16
}

alarm_stop

Sent after the last PCM chunk.

{
  "type": "alarm_stop"
}

PCM Data (Binary Frames)

  • Format: Raw signed 16-bit little-endian, interleaved stereo (L, R, L, R, ...)
  • Chunk size: 4096 bytes (1024 stereo samples at 16-bit)
  • Pacing: Chunks sent at ~90% real-time speed to maintain buffer without overflow
  • Byte order: Little-endian (native for both Pi and ESP32)

At 24kHz / 2ch / 16-bit:

  • Bytes per second: 96,000
  • Chunk duration: ~42.7 ms
  • Send interval: ~38.4 ms (90% pacing)

ESP32 Buffering

  • FreeRTOS queue: 10 slots of pointer-to-chunk
  • Total buffer capacity: ~427 ms of audio
  • Overflow policy: drop chunk and log warning

Future: Alarm Scheduling

Not yet implemented. Planned JSON format for alarm configuration:

{
  "alarm_time": "070000",
  "alarm_days": ["Mon", "Tue", "Wed"],
  "alarm_audio": "path/to/file.wav"
}