Transformation von MQTT Strings in Number

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Boris
Beiträge: 18
Registriert: 19. Okt 2024 11:07
Answers: 0

Transformation von MQTT Strings in Number

Beitrag von Boris »

Hallo zusammen,
ich versuche seit Stunden einen Batteriestatuswert, welche ich von einem Zigbeegerät über ZigBee2MQTT in OH einlese in einen Numberwert umzuwandeln.
Das Topic, welches ich einlese, sieht so aus:

Code: Alles auswählen

{"battery_state":"medium","humidity":62,"linkquality":84,"temperature":11.1,"temperature_unit":"celsius"}
im .thingsfile lese ich dann den Batteriestatus ein, welcher "low", "medium" oder "high" sein kann, und möchte ihn gleich in einen Prozentwert umwandeln.

Code: Alles auswählen

Type number : cBattBuero                     "Batteriestatus H/T im Buero"      [ stateTopic="zigbee2mqtt/tempHumiBuero", transformationPattern="JSONPATH:$.battery_state|MAP:zigbeeBattery.map"]

Dabei sieht die Transformationsdatei zigbeeBattery.map so aus:

Code: Alles auswählen

low=20
medium=60
high=100
-=0
Leider kommt dort immer nur NULL beim verlinkten Item an. Lasse ich die MAP Transformation weg, und übergebe es als String, sehe ich, dass das "medium" übertragen wird.
Hat jemand eine Idee? Danke im Vorraus!

Harka
Beiträge: 583
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Transformation von MQTT Strings in Number

Beitrag von Harka »

Moin,
was mir auffällt ist das Du nicht das richtige Verknüpfungszeichen für die Verwendung mehrerer Transformationen nutzt. Versuch mal (mit "∩"):

Code: Alles auswählen

transformationPattern="JSONPATH:$.battery_state∩MAP:zigbeeBattery.map"

Boris
Beiträge: 18
Registriert: 19. Okt 2024 11:07
Answers: 0

Re: Transformation von MQTT Strings in Number

Beitrag von Boris »

Hi Harka,
interessant. Das war es aber leider nicht. Bekomme immer noch NULL auf dem Item raus.
Ich habe das Gefühl, dass die Transformation überhaupt nicht beachtet wird.
Gibt es da evtl. noch andere Hebel, die man ansetzen könnte?
Danke auf jeden Fall schonmal.

Harka
Beiträge: 583
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Transformation von MQTT Strings in Number

Beitrag von Harka »

mmmh,
bei einer map-Datei in der Text-Konfiguration kann ich nicht mit reden.
Ich habe aber gerade mit einem Präsenzmelder rumgespielt weil der vergleichbare Parameter zurück gibt. Da ging es mit der Inline-Variante und mit einer in der UI angelegter Datei nach diesen Methoden

Code: Alles auswählen

transformationPattern="JSONPATH:$.battery_state∩MAP(|low=20;medium=60;high=100;=0)"
oder
transformationPattern="JSONPATH:$.battery_state∩MAP(Transformation UID)"

Benutzeravatar
peter-pan
Beiträge: 2839
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Transformation von MQTT Strings in Number

Beitrag von peter-pan »

Bist du sicher, dass dein Item-Typ (Number) der richtige ist ?

Edit: Mir ist gerade noch was aufgefallen! Die Schreibweise(Beschreibung) des Items ist ebenfalls nicht korrekt.

Number wird gross geschrieben und der Doppelpunkt ist für eine nachfolgende Dimension (UoM) bestimmt.

Ein Number-Item mit %-Angabe könnte so aussehen:

Code: Alles auswählen

Number:Dimensionless        snzb01_02_battery          "Taster SNZB-01 02 Batterie"                      <snzb_01>               (gsnzb01_02,gBattLevelEG)          ["LowBattery"]                              { channel="mqtt:topic:danny:snzb0102:battery", unit="%" }       
Ein String-Item so:

Code: Alles auswählen

String                      snzb01p_01_action          "Taster SNZB-01P 01 Zustand"                      <snzb_01p>              (gsnzb01p_01)                      ["Switch"]                                  { channel="mqtt:topic:danny:snzb01p01:action" }     
Das dazu gehörige Thing sieht so aus:

Code: Alles auswählen

//                          Mini Switch SNZB01 - 02 contact_snzb01_02
Thing mqtt:topic:danny:snzb0102 "Sonoff SNZB01 02"  (mqtt:broker:danny )   @ "zigbee2mqtt"
      [ availabilityTopic="zigbee2mqtt/contact_snzb01_02/availability", transformationPattern="JSONPATH:$.state", payloadNotAvailable="offline", payloadAvailable="online" ] 
    {
    Channels:
        Type string  : action       "SNZB01 02 Ein/Aus"                      [ stateTopic="zigbee2mqtt/contact_snzb01_02/action" ]
        Type number  : voltage      "SNZB01 02 Batterie-Spannung"            [ stateTopic="zigbee2mqtt/contact_snzb01_02/voltage", unit="mV" ]
        Type number  : battery      "SNZB01 02 Batterie-Level"               [ stateTopic="zigbee2mqtt/contact_snzb01_02/battery", unit="%" ] 
        Type number  : linkquality  "SNZB01 02 Empfangsstärke LQI"           [ stateTopic="zigbee2mqtt/contact_snzb01_02", transformationPattern="JSONPATH:$.linkquality" ]
        Type trigger : click        "SNZB01 02 Trigger"                      [ stateTopic="zigbee2mqtt/contact_snzb01_02/action" ]
        Type switch  : reachable    "SNZB01 01 Reachable"                    [ stateTopic="zigbee2mqtt/contact_snzb01_02/availability", transformationPattern="JSONPATH:$.state", on="online", off="offline" ]
   }
Evtl. geht eine Umwandlung in ein Number-Item per Inline-Script, aber da kann ich dir nicht weiterhelfen. Oder aber mit einer Regel in ein neues Item.
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.2 openhabian
(Test openHAB 5.2.0 Build #5140 - snapshot)

Boris
Beiträge: 18
Registriert: 19. Okt 2024 11:07
Answers: 0

Re: Transformation von MQTT Strings in Number

Beitrag von Boris »

Vielen Dank für die ganzen Antworten... leider funktioniert es immer noch nicht. Habe nun auch die Inline-Variante getestet... aber genau mit gleichem Ergebnis. Lasse ich die Transformation weg, und schreibe das Thing und Item auf String um, erhalte ich "medium". Also rüber kommt der Wert.
peter-pan hat geschrieben: 19. Feb 2026 13:54 Edit: Mir ist gerade noch was aufgefallen! Die Schreibweise(Beschreibung) des Items ist ebenfalls nicht korrekt.
Die Zeile da oben ist das Thing. Der korrespondierende Itemeintrag sieht so aus:

Code: Alles auswählen

Number  iBattBuero                      "Batteriestatus H/T Buero [%d %%]"      (gZigbee)     {channel = "mqtt:topic:Victron:Venus:cBattBuero"}
Die Thingzeile so:

Code: Alles auswählen

Type number : cBattBuero                     "Batteriestatus H/T im Buero"      [ stateTopic="zigbee2mqtt/tempHumiBuero", transformationPattern="JSONPATH:$.battery_state ∩ MAP(low=20;medium=60;high=100;=0)"]
Hat noch jemand eine Idee?

Boris
Beiträge: 18
Registriert: 19. Okt 2024 11:07
Answers: 0

Re: Transformation von MQTT Strings in Number

Beitrag von Boris »

Habe es gerade mal anders versucht und wollte das inline transformieren in der Itemzeile testen.

Code: Alles auswählen

String  iBattBuero                      "Batteriestatus H/T Buero [%d %%]"      (gZigbee)     {channel = "mqtt:topic:Victron:Venus:cBattBuero"[profile="transform:MAP", function="|high=100;medium=60;low=20"]}
Im Thingfile geht es als String raus. Im Itemfile habe ich beides versucht String und Number. Definiere ich es als Number, kommt NULL raus. Definiere ich es als String, bekomme ich "medium" zurück... ergo, es findet keine transformation statt...

Benutzeravatar
peter-pan
Beiträge: 2839
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Transformation von MQTT Strings in Number

Beitrag von peter-pan »

Ich weiss nicht was das für ein Teil ist, aber in der Z2M-Doku ist das bestimmt nicht als Number definiert. Wie heisst denn das Teil ?

Ausserdem scheint der Payload des Things nicht ganz vollständig zu sein !!
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.2 openhabian
(Test openHAB 5.2.0 Build #5140 - snapshot)

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

Re: Transformation von MQTT Strings in Number

Beitrag von udo1toni »

Ich möchte ein paar Schritte zurück gehen und zunächst die Systemdaten abfragen :) insbesondere, welche Version von openHAB Du nutzt (Tipp an dieser Stelle: es ist hilfreich, diese Info als Signatur einzutragen - leider geht das nicht automatisch, d.h. man muss dran denken, die Signatur zu aktualisieren, wenn man updatet)
Unterschiedliche Verhaltensweisen zwischen unterschiedlichen Versionen können nie ganz ausgeschlossen werden :)

Ich habe das Ganze bei mir mit einer unstable Version durchgespielt, es wird aber genauso mit der aktuellen stable Version funktionieren :)
Channel:

Code: Alles auswählen

Type number : battery "Batteriestatus" [ stateTopic="test/test/topic", transformationPattern="JSONPATH:$.battery_state∩MAP:zigbeeBattery.map"]
Item:

Code: Alles auswählen

Number Battery "Batteriestatus" {channel="mqtt:topic:mymqtt:test:battery"}
funktioniert bei mir einwandfrei.
Wahlweise ginge das auch genauso mit dem "korrekten" Itemtyp Number:Dimensionless:

Code: Alles auswählen

Type number : battery "Batteriestatus" [ stateTopic="test/test/topic", transformationPattern="JSONPATH:$.battery_state∩MAP:zigbeeBattery.map",unit="%"]

Code: Alles auswählen

Number:Dimensionless Battery "Batteriestatus" {channel="mqtt:topic:mymqtt:test:battery",unit="%",stateDescription=""[pattern="%d %%"]}
Beide Varianten funktionieren bei mir fehlerfrei.
Mögliche Fehlerquellen die mir gerade einfallen:
  • jsonpath und/oder map Transformation nicht installiert
  • Datei zigbeeBattery.map in falschem Ordner oder unter falschem Namen angelegt ($OPENHAB_CONF/transform/, Groß/Kleinschreibung beachten!)
  • Falscher Aufbau der map-Datei (z.B. Leerzeichen zu Beginn der Zeile - links vom Gleichheitszeichen muss der exakte String angegeben sein)
  • Falsches Verknüpfungszeichen. Das gibt es in der Windows Zeichentabelle unter dem Namen "Durchschnitt" (Übersetzungsfehler in Windows, im englischen heißt es korrekt "Intersection", also "Schnittmenge"). Am einfachsten kopiert man das Symbol aus dem Hilfstext in der WebUI (Channel -> show advanced -> incoming value transformations -> Hilfetext, letztes Zeichen
  • Leerzeichen um das Intersection Symbol sind meines Wissens nicht gestattet
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Benutzeravatar
peter-pan
Beiträge: 2839
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Transformation von MQTT Strings in Number

Beitrag von peter-pan »

Ich habe den Ansatz von Udo gleich mal ausprobiert und das hat auf Anhieb gepasst, einschl. Umwandlung des "Strings(medium, etc)" in einen Number-Wert mit Dimension.

Ich wusste doch, dass Udo hier eine einfache praktikable Lösung hat. Hab das bei mir gleich mal abgespeichert, obwohl ich's im Moment noch nicht brauche. Aber der Appetit kommt ja bekanntlich mit dem Essen.
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.2 openhabian
(Test openHAB 5.2.0 Build #5140 - snapshot)

Antworten