From 09ee206906ef1c5cca5be86b6a8e2a7433256734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20von=20B=C3=BClow?= <48244604+rvbuelow@users.noreply.github.com> Date: Fri, 25 Sep 2026 17:39:41 +0200 Subject: [PATCH] feat(station): Montana-Black-Produkt-ID -> Ziel ledshield_rgb Meldet eine Lampe @qcx.montana.black.ledshield.rgb(-dev), sucht die Station jetzt ledshield_rgb_(dev|prod).img statt zufaellig das E27-Image. Produktname/Ziel aus qcl_product_info.c der Original-Firmware. --- README.md | 2 +- tools/release.sh | 2 +- tools/station/products.py | 1 + tools/station/server.py | 3 ++- tools/station/tests/test_products.py | 6 +++--- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a89d0e7..2f62695 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Native Builds (mit lokal installierter ARM-Toolchain): cmake -S . -B build/evk -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE=evk cmake --build build/evk -**Geräte:** evk, e27_rgb, e14_rgb, gu10_rgb, e27_cw, e14_cw, gu10_cw, g95_cw. +**Geräte:** evk, e27_rgb, e14_rgb, gu10_rgb, e27_cw, e14_cw, gu10_cw, g95_cw, ledshield_rgb (Montana Black LED Shield, nur RGB). **Lokale Einstellungen** (Token, später WLAN): `config.local.cmake.example` → `config.local.cmake`. diff --git a/tools/release.sh b/tools/release.sh index ad3716c..ffa26fe 100755 --- a/tools/release.sh +++ b/tools/release.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Baut ein Auslieferungsarchiv: alle acht Ziele, OHNE einkompilierte WLAN-Zugangsdaten +# Baut ein Auslieferungsarchiv: alle Ziele, OHNE einkompilierte WLAN-Zugangsdaten # (die Lampen starten also im Onboarding-AP), in allen drei Bildformen - OTA, Migration # (dev und prod signiert) und serielle Erstbespielung. # diff --git a/tools/station/products.py b/tools/station/products.py index 110d516..fa5c7ff 100644 --- a/tools/station/products.py +++ b/tools/station/products.py @@ -40,6 +40,7 @@ _BASE = [ ("klyqa.lighting.cw-ww.e14", "e14_cw", "Klyqa E14 CW/WW"), ("klyqa.lighting.cw-ww.gu10", "gu10_cw", "Klyqa GU10 CW/WW"), ("klyqa.lighting.cw-ww.g95", "g95_cw", "Klyqa G95 Vintage CW/WW"), + ("qcx.montana.black.ledshield.rgb", "ledshield_rgb", "Montana Black RGB LED Shield"), ] _UNSAFE = re.compile(r"[^0-9A-Za-z+\-_.]") diff --git a/tools/station/server.py b/tools/station/server.py index 2ec9fd1..f79994b 100755 --- a/tools/station/server.py +++ b/tools/station/server.py @@ -33,7 +33,8 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) import products -TARGETS = ("evk", "e27_rgb", "e14_rgb", "gu10_rgb", "e27_cw", "e14_cw", "gu10_cw", "g95_cw") +TARGETS = ("evk", "e27_rgb", "e14_rgb", "gu10_rgb", "e27_cw", "e14_cw", "gu10_cw", "g95_cw", + "ledshield_rgb") PATH_RE = re.compile(r"^/ninlight_(" + "|".join(TARGETS) + r")_ota\.img$") TRAILER_SIZE = 512 TRAILER_MAGIC = b"NINL" diff --git a/tools/station/tests/test_products.py b/tools/station/tests/test_products.py index c6c7a28..dde5e30 100644 --- a/tools/station/tests/test_products.py +++ b/tools/station/tests/test_products.py @@ -7,12 +7,12 @@ import products # noqa: E402 def test_table_is_complete(): - """Sieben Geraete in beiden Schreibweisen der Produkt-ID, plus das EVK, das nur eine + """Acht Geraete in beiden Schreibweisen der Produkt-ID, plus das EVK, das nur eine Produktions-ID hat.""" - assert len(products.PRODUCTS) == 15 + assert len(products.PRODUCTS) == 17 targets = {p.target for p in products.PRODUCTS.values()} assert targets == {"evk", "e27_rgb", "e14_rgb", "gu10_rgb", - "e27_cw", "e14_cw", "gu10_cw", "g95_cw"} + "e27_cw", "e14_cw", "gu10_cw", "g95_cw", "ledshield_rgb"} def test_table_carries_no_variant():