Die neun Effekte der Firmware waren in Home Assistant nicht erreichbar -
das Auswahlfeld, das es schon gab, sind die Szenen. Jetzt bietet die
Lichtentitaet sie an:
* Gewaehlt wird ueber den NAMEN aus der Firmware ("Regenbogen"),
geschickt wird die Kennung ("rainbow"). Eine Liste englischer
Kennungen waere in einer deutschen Oberflaeche unnoetig sperrig.
* Ein Effekt laeuft wie eine Farbe in ALLEN Segmenten; angezeigt wird er
nur, wenn alle denselben fahren.
* Eine Kennung, die nicht in der Liste steht (neuere Firmware, aeltere
Liste), wird roh angezeigt statt verschluckt.
* Ein unbekannter Name wird abgelehnt, statt stillschweigend nichts zu
tun.
Die Liste steht fest in der Firmware und wird deshalb einmal geholt,
nicht je Abfragezyklus - erneut erst, wenn sich die Version aendert. Eine
sechste Anfrage je Zyklus fuer etwas, das sich nie aendert, waere
Verschwendung.
Effekt-Parameter (Geschwindigkeit, Intensitaet, Palette) fehlen noch;
dafuer braucht es Entitaeten je Segment.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
"""Echte Nutzdaten zweier Geraete. Bewusst keine Grenzwerte - die stehen in den Tests selbst."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
TOKEN = "a201883d13a570dd3cf1f3b64b5e1df7"
|
|
|
|
HOST_K1Y = "192.168.2.238"
|
|
MAC_K1Y = "b0:81:84:49:ad:4c"
|
|
|
|
# Abgefragt an der Stehlampe (KL-LSC5C3WV2-K1Y, SK6812-RGBW, 60 Pixel).
|
|
STATE_K1Y: dict[str, Any] = {
|
|
"on": True,
|
|
"brightness": 100,
|
|
"power_on_behaviour": "last",
|
|
"fade_in": 500,
|
|
"fade_out": 500,
|
|
"transition_default": 300,
|
|
"wake_on_change": False,
|
|
"preset": 2,
|
|
"preset_modified": False,
|
|
"segment_count": 1,
|
|
"pixel_count": 60,
|
|
}
|
|
|
|
INFO_K1Y: dict[str, Any] = {
|
|
"product": "ninstrip",
|
|
"device_type": "ninstrip-k1y",
|
|
"fw_version": "0.1.0-12-g71a57",
|
|
"build_date": "2026-09-22",
|
|
"mac": MAC_K1Y,
|
|
"name": "",
|
|
"wifi": {"mode": "sta", "ssid": "ninIOT", "rssi": -68, "ip": HOST_K1Y, "error": None},
|
|
"sacn": {"enabled": True, "active": False, "universe": 1, "universes": 1, "multicast": True},
|
|
"uptime": 1459,
|
|
"free_heap": 156848,
|
|
"strip": {
|
|
"chipset": "sk6812_rgbw",
|
|
"color_order": "grb",
|
|
"data_pin": 19,
|
|
"pixel_count": 60,
|
|
"leds_per_pixel": 1,
|
|
"has_white": True,
|
|
"inverted": True,
|
|
"power_scale": 100,
|
|
"max_milliamps": 1800,
|
|
},
|
|
"render": {"fps": 50, "render_us": 900, "show_us": 1800, "dropped_frames": 0},
|
|
"last_ota_error": None,
|
|
}
|
|
|
|
# wifi.source "compiled": das Geraet kennt sein WLAN nur aus der Firmware.
|
|
SETTINGS_COMPILED: dict[str, Any] = {
|
|
"name": "",
|
|
"wifi": {"ssid": "ninIOT", "source": "compiled"},
|
|
"auth_all": False,
|
|
"sacn": {
|
|
"enabled": True,
|
|
"universe": 1,
|
|
"start_slot": 1,
|
|
"on_timeout": "release",
|
|
"channels_per_pixel": 3,
|
|
},
|
|
"strip": {
|
|
"chipset": "sk6812_rgbw",
|
|
"color_order": "grb",
|
|
"data_pin": 19,
|
|
"pixel_count": 60,
|
|
"leds_per_pixel": 1,
|
|
"max_milliamps": 1800,
|
|
"supply_volts": 12,
|
|
"inverted": True,
|
|
},
|
|
}
|
|
|
|
PRESETS_K1Y: dict[str, Any] = {
|
|
"presets": [
|
|
{"id": 0, "name": "Warmweiss", "used": True, "segment_count": 1},
|
|
{"id": 1, "name": "Kaltweiss", "used": True, "segment_count": 1},
|
|
{"id": 2, "name": "Regenbogen", "used": True, "segment_count": 1},
|
|
{"id": 3, "name": "Feuer", "used": True, "segment_count": 1},
|
|
{"id": 4, "name": "", "used": False, "segment_count": 0},
|
|
{"id": 5, "name": "", "used": False, "segment_count": 0},
|
|
{"id": 6, "name": "", "used": False, "segment_count": 0},
|
|
{"id": 7, "name": "", "used": False, "segment_count": 0},
|
|
],
|
|
"active": 2,
|
|
"modified": False,
|
|
}
|
|
|
|
# wifi.source "stored": ueber das Onboarding ins WLAN gebracht, also vom
|
|
# Abbild unabhaengig.
|
|
SETTINGS_STORED: dict[str, Any] = {
|
|
**SETTINGS_COMPILED,
|
|
"wifi": {"ssid": "ninIOT", "source": "stored"},
|
|
}
|
|
|
|
# Ein Segment ueber den ganzen Strip, warmweiss - so kommt ein Geraet aus dem
|
|
# Werkszustand. Farbe und Farbtemperatur stehen nur hier, nicht in state.
|
|
SEGMENTS_K1Y: dict[str, Any] = {
|
|
"segments": [
|
|
{
|
|
"id": 0,
|
|
"name": None,
|
|
"start": 0,
|
|
"end": 59,
|
|
"mode": "white",
|
|
"color_temp": 2700,
|
|
"brightness": 80,
|
|
}
|
|
]
|
|
}
|
|
|
|
# Die Effekttabelle der Firmware (nl_effects.c), gekuerzt auf drei Eintraege.
|
|
EFFECTS_K1Y: dict[str, Any] = {
|
|
"effects": [
|
|
{"id": "rainbow", "name": "Regenbogen", "params": ["speed", "palette"]},
|
|
{"id": "fire", "name": "Feuer", "params": ["speed"]},
|
|
{"id": "chase", "name": "Lauflicht", "params": ["speed", "intensity", "palette"]},
|
|
],
|
|
"palettes": ["rainbow", "warm", "cool"],
|
|
}
|