diff --git a/README.md b/README.md index 71fd7a9..cb32678 100644 --- a/README.md +++ b/README.md @@ -49,16 +49,18 @@ Ohne mDNS geht es auch von Hand über Adresse und Token. | `light` | Hauptschalter und Helligkeit des ganzen Strips | | `select` | aufgeschaltete Szene (acht Plätze in der Firmware) | | `button` | Neustart | -| `sensor` | WLAN-Signal, Laufzeit, freier Speicher, Leistungsbegrenzung | +| `sensor` | IP-Adresse, WLAN-Signal, Laufzeit, freier Speicher, Leistungsbegrenzung | | `switch` | sACN-Empfang an/aus | | `number` | sACN-Universe und -Startslot | | `select` | Verhalten nach Stromende (`release` / `hold`) | | `binary_sensor` | sACN aktiv, Multicast beigetreten (letzterer standardmäßig aus) | | `update` | Firmware-Aktualisierung aus dem Abbild-Ordner | -Die Diagnose-Sensoren sind standardmäßig abgeschaltet; die -Leistungsbegrenzung ist an, weil sie verrät, ob die Strombegrenzung gerade -herunterregelt (100 % heißt: tut sie nicht). +Standardmäßig an sind die **IP-Adresse** — sie ist das, was man im Alltag +sucht — und die **Leistungsbegrenzung**, weil sie verrät, ob die +Strombegrenzung gerade herunterregelt (100 % heißt: tut sie nicht). WLAN- +Signal, Laufzeit und freier Speicher sind aus; die braucht man erst im +Fehlerfall. **Eine Lichtentität je Gerät, nicht je Segment.** `device/state` ist der Hauptschalter und trägt keine Farbe — bei mehreren Segmenten gäbe es keine diff --git a/custom_components/ninstrip/sensor.py b/custom_components/ninstrip/sensor.py index 5d8adaa..09c0753 100644 --- a/custom_components/ninstrip/sensor.py +++ b/custom_components/ninstrip/sensor.py @@ -43,6 +43,15 @@ def _strip(data: NinstripData, key: str) -> Any: SENSORS: tuple[NinstripSensorDescription, ...] = ( + # Von Haus aus an: die Adresse ist das, was man im Alltag sucht - fuer die + # Firmware-API, zum Anpingen oder um ein Geraet wiederzufinden. Wie in + # ha-ninlight. + NinstripSensorDescription( + key="ip_address", + translation_key="ip_address", + entity_category=EntityCategory.DIAGNOSTIC, + value=lambda d: _wifi(d, "ip"), + ), NinstripSensorDescription( key="rssi", translation_key="rssi", diff --git a/custom_components/ninstrip/strings.json b/custom_components/ninstrip/strings.json index 0a59995..59af84b 100644 --- a/custom_components/ninstrip/strings.json +++ b/custom_components/ninstrip/strings.json @@ -72,6 +72,9 @@ } }, "sensor": { + "ip_address": { + "name": "IP-Adresse" + }, "rssi": { "name": "WLAN-Signal" }, diff --git a/custom_components/ninstrip/translations/de.json b/custom_components/ninstrip/translations/de.json index 0a59995..59af84b 100644 --- a/custom_components/ninstrip/translations/de.json +++ b/custom_components/ninstrip/translations/de.json @@ -72,6 +72,9 @@ } }, "sensor": { + "ip_address": { + "name": "IP-Adresse" + }, "rssi": { "name": "WLAN-Signal" }, diff --git a/custom_components/ninstrip/translations/en.json b/custom_components/ninstrip/translations/en.json index c16f6d5..c7d445d 100644 --- a/custom_components/ninstrip/translations/en.json +++ b/custom_components/ninstrip/translations/en.json @@ -72,6 +72,9 @@ } }, "sensor": { + "ip_address": { + "name": "IP address" + }, "rssi": { "name": "Wi-Fi signal" }, diff --git a/tests/test_sensor.py b/tests/test_sensor.py index aa404a6..728688e 100644 --- a/tests/test_sensor.py +++ b/tests/test_sensor.py @@ -15,7 +15,13 @@ from tests.helpers import abfragen, entity_id_for @pytest.mark.parametrize( ("key", "wert"), - [("rssi", "-68"), ("uptime", "1459"), ("free_heap", "156848"), ("power_scale", "100")], + [ + ("ip_address", "192.168.2.238"), + ("rssi", "-68"), + ("uptime", "1459"), + ("free_heap", "156848"), + ("power_scale", "100"), + ], ) async def test_werte( hass: HomeAssistant, init_integration: MockConfigEntry, key: str, wert: str @@ -32,15 +38,17 @@ async def test_werte( assert hass.states.get(entity_id).state == wert -async def test_nur_die_leistungsbegrenzung_ist_von_haus_aus_an( +async def test_welche_sensoren_von_haus_aus_an_sind( hass: HomeAssistant, init_integration: MockConfigEntry ) -> None: registry = er.async_get(hass) an = [ registry.async_get(entity_id_for(hass, "sensor", key)).disabled_by is None - for key in ("rssi", "uptime", "free_heap", "power_scale") + for key in ("ip_address", "rssi", "uptime", "free_heap", "power_scale") ] - assert an == [False, False, False, True] + # Die Adresse und die Leistungsbegrenzung sind an, der Rest ist Diagnose + # fuer den Fehlerfall. + assert an == [True, False, False, False, True] async def test_fehlender_wifi_block_ergibt_keinen_wert( @@ -53,3 +61,14 @@ async def test_fehlender_wifi_block_ergibt_keinen_wert( strip_info.pop("strip") await abfragen(hass, freezer) assert hass.states.get(entity_id_for(hass, "sensor", "power_scale")).state == "unknown" + + +async def test_ohne_wifi_block_bleibt_die_adresse_leer( + hass: HomeAssistant, + init_integration: MockConfigEntry, + strip_info: dict[str, Any], + freezer: FrozenDateTimeFactory, +) -> None: + strip_info.pop("wifi") + await abfragen(hass, freezer) + assert hass.states.get(entity_id_for(hass, "sensor", "ip_address")).state == "unknown"