diff --git a/src/wled/models.py b/src/wled/models.py index 15e02908..9ca9f66b 100644 --- a/src/wled/models.py +++ b/src/wled/models.py @@ -294,6 +294,9 @@ class Segment(BaseModel): 255 indicates the coldest temperature """ + name: str | None = field(default=None, metadata=field_options(alias="n")) + """User-defined segment name (alias: "n").""" + @dataclass(kw_only=True) class Leds: diff --git a/tests/fixtures/state_with_segment_name.json b/tests/fixtures/state_with_segment_name.json new file mode 100644 index 00000000..a54042ea --- /dev/null +++ b/tests/fixtures/state_with_segment_name.json @@ -0,0 +1,85 @@ +{ + "on": false, + "bri": 128, + "transition": 7, + "ps": -1, + "pl": -1, + "ledmap": 0, + "AudioReactive": { "on": true }, + "nl": { "on": false, "dur": 60, "mode": 1, "tbri": 0, "rem": -1 }, + "udpn": { "send": false, "recv": true, "sgrp": 1, "rgrp": 1 }, + "lor": 0, + "mainseg": 0, + "seg": [ + { + "id": 0, + "start": 0, + "stop": 29, + "len": 29, + "grp": 1, + "spc": 0, + "of": 0, + "on": false, + "frz": false, + "bri": 255, + "cct": 127, + "set": 0, + "n": "Curtain", + "col": [ + [46, 255, 95, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ], + "fx": 0, + "sx": 128, + "ix": 128, + "pal": 0, + "c1": 128, + "c2": 128, + "c3": 16, + "sel": true, + "rev": false, + "mi": false, + "o1": false, + "o2": false, + "o3": false, + "si": 0, + "m12": 0 + }, + { + "id": 1, + "start": 29, + "stop": 55, + "len": 26, + "grp": 1, + "spc": 0, + "of": 0, + "on": false, + "frz": false, + "bri": 255, + "cct": 127, + "set": 0, + "n": "Wall", + "col": [ + [46, 255, 95, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ], + "fx": 0, + "sx": 128, + "ix": 128, + "pal": 0, + "c1": 128, + "c2": 128, + "c3": 16, + "sel": true, + "rev": false, + "mi": false, + "o1": false, + "o2": false, + "o3": false, + "si": 0, + "m12": 0 + } + ] +} diff --git a/tests/fixtures/state_without_segment_name.json b/tests/fixtures/state_without_segment_name.json new file mode 100644 index 00000000..a34a49cd --- /dev/null +++ b/tests/fixtures/state_without_segment_name.json @@ -0,0 +1,49 @@ +{ + "on": false, + "bri": 128, + "transition": 7, + "ps": 1, + "pl": -1, + "ledmap": 0, + "AudioReactive": { "on": false }, + "nl": { "on": false, "dur": 60, "mode": 1, "tbri": 0, "rem": -1 }, + "udpn": { "send": false, "recv": true, "sgrp": 2, "rgrp": 2 }, + "lor": 0, + "mainseg": 0, + "seg": [ + { + "id": 0, + "start": 0, + "stop": 26, + "len": 26, + "grp": 1, + "spc": 0, + "of": 0, + "on": true, + "frz": false, + "bri": 255, + "cct": 127, + "set": 0, + "col": [ + [4, 255, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ], + "fx": 0, + "sx": 128, + "ix": 128, + "pal": 0, + "c1": 128, + "c2": 128, + "c3": 16, + "sel": true, + "rev": false, + "mi": false, + "o1": false, + "o2": false, + "o3": false, + "si": 0, + "m12": 0 + } + ] +} diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 00000000..39ca73e4 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,29 @@ +"""Tests for WLED models.""" +import json +from pathlib import Path + +from wled.models import State + +ROOT_DIR = Path(__file__).parent.parent +FIXTURE_DIR = ROOT_DIR / "tests" / "fixtures" + +def load_fixture(file_name: str) -> dict: + """Load a fixture file from the fixtures directory.""" + fixture_path = FIXTURE_DIR / file_name + return json.loads(fixture_path.read_text()) + + +def test_state_with_segment_name() -> None: + """Test segment name is parsed correctly.""" + data = load_fixture("state_with_segment_name.json") + model_instance = State.from_dict(data) + + assert model_instance.segments[0].name == "Curtain" + assert model_instance.segments[1].name == "Wall" + +def test_state_without_segment_name() -> None: + """Test segment name is None when not provided.""" + data = load_fixture("state_without_segment_name.json") + model_instance = State.from_dict(data) + + assert model_instance.segments[0].name is None