Files
ha-ninstrip/scripts/check_translations.py
Michael Sauer 2c77b2d325 feat: update-Entitaet fuer die Firmware und das Testgeruest
Aufgebaut wie ha-ninlight: die Abbilder liegen unter ninstrip_firmware im
Konfigurationsverzeichnis, Home Assistant liefert sie selbst unter einer
einmaligen Adresse aus, und zwar genau die Bytes, die vorher geprueft
wurden. Dazu firmware.py (Anhaenger, Versionsreihenfolge, WLAN-Pruefung,
Katalog), http.py, urls.py und shared.py.

Drei Unterschiede zu ninlight, alle aus der Firmware heraus:

* Verglichen wird device_type - die Platine -, nicht product. Letzteres ist
  bei allen Platinen 'ninstrip'; die Abbilder unterscheiden sich aber hart,
  die K1Y invertiert das Datensignal und die KL-RGBC3 nicht. Firmware ohne
  dieses Feld bekommt gar kein Angebot.
* Die WLAN-Pruefung sucht die SSID unverpackt: ein ESP32-Abbild ist nicht
  gzip-verpackt wie das des W600. An einem mit sdkconfig.local gebauten
  Abbild gegengeprueft - die SSID steht genau einmal NUL-gerahmt drin.
* Der Fehlerschluessel heisst device_url_too_long statt lamp_url_too_long.

Dazu das Testgeruest, das es hier bisher gar nicht gab: 204 Tests in
tests_unit/ (ohne HA-Instanz) und tests/ (mit), Abdeckung 97 %, dazu
scripts/check.sh als Ersatz fuer die fehlende CI. Die Nutzdaten in
tests_unit/samples.py sind an der Stehlampe abgefragt.

Beim Gegenpruefen per Mutation fiel auf, dass die Platinenpruefung
unmittelbar vor dem Senden ungeprueft war - der Test dazu ist jetzt da und
faellt, wenn man die Pruefung entfernt.
2026-09-22 23:10:07 +02:00

41 lines
1.3 KiB
Python

"""strings.json und translations/de.json muessen gleich sein; en.json braucht dieselben Schluessel.
Anders herum als bei ha-ninlight: dort steht in strings.json Englisch, hier
Deutsch - die Oberflaeche dieser Integration ist deutsch, und strings.json ist
die Quelle, aus der Home Assistant die Vorgabetexte nimmt.
"""
from __future__ import annotations
import json
from pathlib import Path
import sys
BASE = Path(__file__).parents[1] / "custom_components" / "ninstrip"
def keys(data: dict, prefix: str = "") -> set[str]:
out: set[str] = set()
for key, value in data.items():
out |= keys(value, f"{prefix}{key}.") if isinstance(value, dict) else {f"{prefix}{key}"}
return out
def main() -> int:
strings = json.loads((BASE / "strings.json").read_text(encoding="utf-8"))
de = json.loads((BASE / "translations" / "de.json").read_text(encoding="utf-8"))
en = json.loads((BASE / "translations" / "en.json").read_text(encoding="utf-8"))
if strings != de:
print("translations/de.json weicht von strings.json ab")
return 1
diff = sorted(keys(strings) ^ keys(en))
if diff:
print("en.json und strings.json haben unterschiedliche Schluessel:", diff)
return 1
print("Uebersetzungen vollstaendig")
return 0
if __name__ == "__main__":
sys.exit(main())