Seite 1 von 2

Transformation von MQTT Strings in Number

Verfasst: 18. Feb 2026 17:01
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!

Re: Transformation von MQTT Strings in Number

Verfasst: 18. Feb 2026 17:54
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"

Re: Transformation von MQTT Strings in Number

Verfasst: 18. Feb 2026 19:38
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.

Re: Transformation von MQTT Strings in Number

Verfasst: 18. Feb 2026 21:21
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)"

Re: Transformation von MQTT Strings in Number

Verfasst: 19. Feb 2026 13:54
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.

Re: Transformation von MQTT Strings in Number

Verfasst: 19. Feb 2026 20:59
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?

Re: Transformation von MQTT Strings in Number

Verfasst: 19. Feb 2026 21:50
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...

Re: Transformation von MQTT Strings in Number

Verfasst: 20. Feb 2026 10:54
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 !!

Re: Transformation von MQTT Strings in Number

Verfasst: 20. Feb 2026 11:56
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

Re: Transformation von MQTT Strings in Number

Verfasst: 20. Feb 2026 15:13
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.