d4aa9c7be17e640fe15e9425d1b04d51198f7609
- Firmware: status.ptp.offset_avg_ns = mean |offset| over the last 2 min (one bucket per second, cleared on a clock step). - Main panel: Time Offset (2 min avg) shows only the Bolero bracket of the average. Details: the current offset (coloured by the same brackets), hops, time/frequency traceable, version and own clock class. - Uptime shown as "1d 2h 3m 4s". - Preset buttons renamed: "Riedel PTP defaults", "AES67 Media PTP defaults". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aes67-ESP32-P4
AES67 sender for the Waveshare ESP32-P4-ETH (PoE): Spotify Connect and HLS/m3u8 internet radio (with failover between them) go out as an AES67 multicast stream, locked to PTP. Everything is set up from a built-in web page, with SAP announcements and SDP export for receivers (tested with Riedel PTP).
Using it: see the user guide.
Quick start: power the board over PoE and open http://p4-aes67.local/. Pick a source and save. Then find "P4 AES67" via SAP on the receiver, or import the SDP from the page.
Building and flashing
- ESP-IDF 5.5 or later, target
esp32p4:idf.py set-target esp32p4 && idf.py build - cspot submodule:
git submodule update --init external/cspot && git -C external/cspot submodule update --init cspot/bell - New board over USB:
tools/flash_board.py - Update over the network: web page → Firmware, or
curl -f --data-binary @build/aes67_p4.bin -H 'Content-Type: application/octet-stream' http://p4-aes67.local/api/ota
Toolchain details and caveats (chip revision, Python packages for cspot) are in CLAUDE.md.
Documentation
docs/user-guide.md: setup, web page, sources, Spotify, AES67, PTP, network, updates, player API, troubleshootingdocs/aes67-core-base.md: reusable AES67 core design (PTP, RTP, SDP/SAP, syslog, web UI and API contract)docs/hardware-and-design-notes.md: board details and project-specific designweb/index.html: the web page (served by the device)CLAUDE.md: working rules, build order and status
Languages
C
74.9%
HTML
11.9%
C++
7.7%
Python
3.3%
CMake
2.2%