@bbernhard @Osorkon @dp20eic
Moin zusammen,
ich dachte, ich teile mal die ungeschönte Wahrheit hinter dem, was es bedeutet, eine “funktionierende” Home Assistant Integration in etwas wirklich Stabiles zu verwandeln. Ich habe die letzten Stunden damit verbracht, meine “ESC Easy Sensor Creation”-Integration von Grund auf zu sanieren, und dabei einige Lektionen auf die harte Tour gelernt. Vielleicht bewahrt das ja den einen oder anderen vor den gleichen Fehlern.
Ausgangslage: Lief, aber irgendwie… falsch.
Meine Integration hatte drei Features: Einen Summen-Sensor, einen Statistik-Sensor und einen selbstgestrickten kWh-Sensor. Auf den ersten Blick tat alles, was es sollte. Aber unter der Haube war es Murks.
- Das Rad neu erfunden: Mein ganzer Stolz, ein eigener Riemann-Sensor für die kWh-Berechnung. Spoiler: War eine dumme Idee.
- Geräte-Chaos: Jeder Sensor, den man erstellte, hat sich als eigenes Gerät in HA registriert. 10 Sensoren = 10 neue Geräte, die alles zumüllen.
- Peinlicher Git-Fail: Dazu komme ich später…
Lektion 1: Begrab dein Ego und lass den HA-Core die Arbeit machen.
Mein eigener kWh-Sensor war mein Baby. Ich hab ihn Zeile für Zeile geschrieben, er hat den Recorder gepollt und irgendwie kWh ausgespuckt. Aber ehrlich gesagt war er langsam, ungenau und ein Wartungsalbtraum.
Die Lösung war brutal, aber richtig: Ich habe die komplette Klasse ESCKwhIntegrationSensor gelöscht. Weg damit. Stattdessen ruft der config_flow jetzt einfach den nativen integration-Helfer von Home Assistant auf.
Der Code dafür ist lächerlich einfach:
`Python# Im Config Flow…
await self.hass.config_entries.flow.async_init(
“integration”,
context={“source”: “user”},
data={
“name”: “Name des neuen Sensors”,
“source”: “sensor.mein_power_sensor”,
# …und der Rest der Config
},
)
Eigenen Flow abbrechen, fertig.
return self.async_abort(reason=“kwh_helper_created”)`
Die Verantwortung liegt jetzt zu 100% beim HA-Core. Stabiler, schneller, zukunftssicher. Manchmal ist der beste Code der, den man löscht.
Lektion 2: Ein Gerät, sie alle zu knechten.
Kennt ihr das? Man will nur schnell ein paar Sensoren hinzufügen und hat plötzlich eine überflutete Geräteliste. Genau das hat meine Integration gemacht.
Der Fix war zum Glück einfacher als gedacht:
- In
__init__.py: Ich erstelle jetzt EIN einziges Gerät für die ganze Integration. Der Trick ist ein statischer Identifier, der nicht von der ConfigEntry abhängt.Python# identifiers ist jetzt immer gleich device_registry.async_get_or_create( identifiers={(DOMAIN, DOMAIN)}, name="ESC Easy Sensor Creation", ... )
- In
sensor.py: Jede Entität, die ich erstelle, verweist auf genau diesen statischen Identifier.Pythonself._attr_device_info = { "identifiers": {(DOMAIN, DOMAIN)}, }Das Ergebnis ist so viel sauberer. Ein Gerät, unter dem alle meine erstellten Sensoren als Entitäten hängen. So wie es sein soll.
Lektion 3: PRÜFT EURE GIT CONFIG, BEVOR IHR PUSHED!
Und dann kam der peinlichste Teil. Alles fertig, Code sauber, bereit für den Release-Candidate. Ich pushe den Commit, erstelle den Release und sehe es: Alles verschachtelt und wirr… Die Reparatur war ein Ritt durch die Hölle (ich weiß schon warum sonst nie auf GitHub veröffentliche)
Bonus-Tipp: Wenn ihr ein Skript in die zsh auf dem Mac kopiert, passt auf das #! am Anfang auf. Die Shell hält das für einen History-Befehl und wirft einen “event not found”-Fehler. Hat mich auch noch mal 10 Minuten gekostet.
TL;DR
- Wirf deinen eigenen Code weg, wenn der HA-Core eine native Funktion dafür hat.
- Ein Gerät pro Integration, nicht pro Sensor. Deine Nutzer werden es dir danken.
- Prüf deine verdammte
git config, bevor du einen öffentlichen Commit machst.
War ein langer Weg, aber die Integration ist jetzt um Welten besser. Hoffe, das hilft jemandem.
Viel Spaß beim Testen… und nochmals vielen Dank (besonders für den Hinweis mit den Geräten)
Zara,
What`s next release…
- Experten-Modus um SQL-Befehle anhand der Meta_ID Werte auszuführen und in einen Sensor zu überführen ( Jahresvergleiche, Langzeit-Statistiken VOR Erstellung eines Senors und unabhängig von PURGE)
- Merge via SQL um Daten eines alten Sensors einem neuen zuzuweisen,
- Datenbank Dumps
- Import von alten Sensoren mit unterschiedlicher ID
- …