2.9 KiB
2.9 KiB
Software LED Effects and Moonlight API Integration
Date: 2026-02-22 Project: lego-dimensions-reader Status: resolved Tags: led-effects, threading, moonlight-drive-in, nfc-card-id, api, gui, v1.3.0
Context
With the core reader working (Jan 2026), the portal's LED behaviour was unreliable — the hardware flash command didn't behave as expected and flashes kept running after a tag was removed. Separately, the reader needed to drive the Moonlight Drive-In player using the same card IDs that the existing single-tag NFC reader produces, so the existing video mappings could be reused. Work ran 2026-02-20 to 2026-02-22.
Key Decisions
- Software-driven LED effects (threads in Python) instead of the portal's hardware flash/fade commands — the hardware effects weren't controllable enough and couldn't be cancelled cleanly.
- Stop an effect when its tag is removed (v1.2.2) — effects are tracked per pad so removal cancels the running thread.
- Remove the default LED blink on tag insert (v1.3.0) — themed colours come from
tag_colors.jsoninstead of a hardcoded response. nfc_card_id= bytes 3–6 of the UID as decimal — matches the ID a standard NFC reader emits, so Moonlight's existing mappings work unchanged. A 10-digit zero-padded form (nfc_card_id_str) is also available.- Briefly tried sending the ID as keyboard-style plain text, then settled on the player's HTTP API —
POST /api/video/playwith JSON{"nfc_id": "<card id>"}. - Portal Configuration GUI (tkinter) with an effect speed control, so colours/effects can be tuned without editing JSON.
Technical Details
- Portal: vendor
0x0e6f, product0x0241. - Moonlight API (port 8547):
POST /api/video/play{"nfc_id": "..."},POST /api/video/skip,GET /api/stats. moonlight_integration.pyv1.3.0 — takesapi_url(base URL of the player).tag_colors.json— per-tag colour/effect config, now including aspeedparameter.- Prefer finish states/callbacks (e.g.
finish_coloronflash_pad()) over sleep-based sync for background LED threads.
Code Changes
lego_dimensions_reader.py— softwareflash_pad(v1.2.1), stop flash on removal (v1.2.2), removed default blink + software effects (v1.3.0),nfc_card_idfield.portal_config_gui.py— new Portal Configuration GUI v1.1.0 with speed control.moonlight_integration.py— usesnfc_card_idand the correct/api/video/playendpoint.video_mappings.json.example,tag_colors.json.example,README.md— examples and docs.
Open Questions / Next Steps
- Superseded in part by the 2026-04-06 session (cycle effect, full colour set).
Artifacts
8a9faac— Fix API to use correct Moonlight endpoint203ea48— Add nfc_card_id field (bytes 3-6 as decimal)727ed71— v1.3.0: Remove default LED blink, add software effects13f0ae5— Portal Configuration GUI v1.1.0