Transformation MQTT

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Mic91
Beiträge: 12
Registriert: 15. Jan 2021 21:48
Answers: 0

Transformation MQTT

Beitrag von Mic91 »

Hallo,

ich nutze Openhab 3.0.0

Aktuell bin ich an meiner PV-Anlage dran, diese in OH einzubinden. Die ganzen Werte kommen per MQTT. Der MQTT Broker ist auf dem Raspberry auf welchem auch OH läuft installiert.
Das Python-Script welches die Daten per MQTT bereitstellt von meiner PV-Anlage läuft aktuell nicht auf dem Raspberry.

Folgendes Problem:

Meine PV-Anlage gibt verschiedene Statusnummern für den Wechselrichter, Notstrombetrieb usw.
Aktuell kriege ich die Nummern angezeigt. Aber gerne hätte ich eine Transformation, dass ich sehe was aktuell die Zahl 2 bedeutet.

Items:

Code: Alles auswählen

Group e3dcinfo
Number e3dcinfo1 "Batterieladezustand [%.1f %%]" <batterylevel>         (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcBatterieladezustand"}  
Number e3dcinfo3 "Netzleistung [%d W]"       <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcNetzleistung"}
Number e3dcinfo4 "Hausleistung [%d W]"       <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcHausleistung"}
Number e3dcinfo5 "Batterieleistung [%d W]"   <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcBatterieleistung"}
Number e3dcinfo6 "PV-Leistung [%d W]"        <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcPhotovoltaikleistung"}
Number e3dcinfo7 "Status Wechselrichter"     <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcStatusWechselrichter"}
Number e3dcinfo8 "Status Notstrom"           <energy>          (e3dcinfo)  {channel="mqtt:topic:e3dc:e3dcStatusNotstrom"}
Things:

Code: Alles auswählen

Thing mqtt:topic:e3dc "e3dc" (mqtt:broker:RPi){
    Channels:
        Type number : e3dcBatterieladezustand  "Batterieladezustand" [stateTopic= "/E3DC/EMS_DATA/EMS_BAT_SOC"]
        Type number : e3dcNetzleistung  "Netzleistung" [stateTopic= "/E3DC/EMS_DATA/EMS_POWER_GRID"]
        Type number : e3dcHausleistung  "Hausleistung" [stateTopic= "/E3DC/EMS_DATA/EMS_POWER_HOME"]
        Type number : e3dcBatterieleistung  "Batterieleistung" [stateTopic= "/E3DC/EMS_DATA/EMS_POWER_BAT"]
        Type number : e3dcPhotovoltaikleistung  "Photovoltaikleistung" [stateTopic= "/E3DC/EMS_DATA/EMS_POWER_PV"]
        Type number : e3dcStatusWechselrichter "Status Wechselrichter" [stateTopic= "/E3DC/PVI_DATA/0/PVI_SYSTEM_MODE"]
        Type number : e3dcStatusNotstrom "Status Notstrom" [stateTopic= "/E3DC/EMS_DATA/EMS_EMERGENCY_POWER_STATUS"]
}

Beim Wechselrichter gibt es die folgenden Status:

Code: Alles auswählen

0=IDLE
1=Normal
2=Gridcharge
3=Backuppower
>3=Unbekannt
Kann mir jemand hierbei helfen. Die Anzeige funktioniert soweit erstmal auch wenn es vielleicht einfacher/besser geht. Für Tipps bin ich gerne dankbar. Ich habe schon diverse Map Transformationen probiert aber ich krieg das nicht zum laufen.

Gruß Michael

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Transformation MQTT

Beitrag von udo1toni »

Zunächst einmal wäre es höchst sinnvoll, Dein System schnellstmöglich auf einen aktuellen Stand zu bringen ;) zumindest 3.4 wäre angesagt, allerdings sind wir mittlerweile mit stable bei 4.1.2 - je länger Du keine Updates von openHAB machst, desto mehr Arbeit häuft sich für Dich an, bis es schließlich unmöglich wird, einen vernünftigen Updatepfad zu gehen. Die Folge ist dann ein veraltetes System und Unzufriedenheit deinerseits, die in letzter Konsequenz dann vielleicht gar darin mündet, dass Du das ganze sein lässt, und das wäre ja schade.

Die IDs Deiner Channel sind mit unnötiger Redundanz versehen, das solltest Du ebenfalls ändern also z.B. statt e3dcPhotovoltaikleistung lieber Photovoltaikleistung oder vielleicht sogar gleich pvLeistung. UIDs sollten eindeutig sein, aber auch möglichst kurz. Da die vollständigen UIDs sich aus addon, broker, thing und channel zusammensetzen, können die einzelnen Teile jeweils sehr kurz und prägnant gehalten werden, ohne dass dadurch Informationen verloren gehen.

Die Meldung des Status als Klartext ist kein Problem, eher ist die Frage, was die beste Option ist.

Es gibt drei Stellen, an denen Du die Zahl in einen Text ändern kannst, direkt im Channel (dazu muss der Channel vom Typ string sein!), im Link zwischen Channel und Item (dazu muss das Item vom Typ String sein. Du kannst hierbei auch ein weiteres Item mit dem Typ Number mit dem selben Channel verlinken und so beide Varianten in separaten Items halten) oder als letzte Variante direkt bei der Anzeige. In diesem Fall verwendest Du ein Number Item, in dem auch die Zahl als Status gehalten wird. In der Anzeige wird die Zahl jedoch umgeformt.

Weiterhin gibt es zwei Möglichkeiten, aus der Zahl einen Text zu machen.
Variante 1 ist der MAP Transformation Service. Du erstellst eine Liste mit allen Wertezuordnungen.
Variante 2 ist der SCALE Transformation Service. SCALE funktioniert genau wie MAP, mit dem Unterschied, dass der Eingangswert zwingend eine Zahl sein muss. Dafür kannst Du aber Wertebereiche angeben (insbesondere auch ein "nach oben offenes Ende")

Die openHAB3 Doku ist gerade noch so online, ich würde mich aber nicht darauf verlassen, dass das so bleibt (siehe erster Absatz... UPDATE!!!). Variante 1.1:

Code: Alles auswählen

Type string : statusWR "Status Wechselrichter" [stateTopic= "/E3DC/PVI_DATA/0/PVI_SYSTEM_MODE", transformationPattern="MAP:wrstatus.map"]
Variante 1.2:

Code: Alles auswählen

Type string : statusWR "Status Wechselrichter" [stateTopic= "/E3DC/PVI_DATA/0/PVI_SYSTEM_MODE", transformationPattern="SCALE:wrstatus.scale"]
Variante 2.1:

Code: Alles auswählen

String e3dcStatus "Status Wechselrichter" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR"[profile="transform:MAP",function="wrstatus.map"]}
Variante 2.2:

Code: Alles auswählen

String e3dcStatus "Status Wechselrichter" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR"[profile="transform:SCALE",function="wrstatus.scale"]}
Variante 3.1:

Code: Alles auswählen

Number e3dcStatus "Status Wechselrichter" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR", stateDescription=""[pattern="MAP:wrstatus.map"]}
Variante 3.2:

Code: Alles auswählen

Number e3dcStatus "Status Wechselrichter" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR", stateDescription=""[pattern="SCALE:wrstatus.scale"]}
oder wenn Du lediglich Sitemaps nutzt alternativ:
Variante 3.1:

Code: Alles auswählen

Number e3dcStatus "Status Wechselrichter [MAP(wrstatus.map):%s]" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR"}
Variante 3.2:

Code: Alles auswählen

Number e3dcStatus "Status Wechselrichter [SCALE(wrstatus.scale):%s]" <energy> (e3dcinfo) {channel="mqtt:topic:e3dc:StatusWR"}
In allen Fällen brauchst Du eine von zwei Dateien, in denen das Mapping bzw. die Scale beschrieben sind:
/etc/openhab/transform/wrstatus.map:

Code: Alles auswählen

0=IDLE
1=Normal
2=Gridcharge
3=Backuppower
-=-
NULL=-
UNDEF=-
/etc/openhab/transform/wrstatus.scale:

Code: Alles auswählen

[..0]=IDLE
]0..1]=Normal
]1..2]=Gridcharge
]2..3]=Backuppower
]3..]=Unbekannt
Die Verwendung von MAP bzw. SCALE im stateDescription Pattern ist nicht explizit in der Doku beschrieben, sollte aber funktionieren. Es kann aber sein, dass die Schreibweise leicht anders ist (3.0 ist schon eine Weile her...)

Jede der Varianten hat Vorteile und Nachteile, am flexibelsten erscheint mir aber Variante 3.2, also behalte einfach das vorhandene Number Item und ändere lediglich die Ansicht des Items, das ist nicht weiter aufwändig.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten