Itemwert spliten
- lenschith
- Beiträge: 314
- Registriert: 11. Dez 2020 22:36
Itemwert spliten
Hallo zusammen,
ich habe ein Problem mit einem String in einem Item.
Ich frage mit dem SNMP Binding mein NAS ab und bekomme Werte zurück geliefert.
Im Temperaturwert steht jedoch "Centigrade:49 Fahrenheit:120"
Wie kann ich das Item jetzt spliten damit ich nur die 49°C bekomme, also nur die Number 49
Danke für die Hilfe.
Gruß Lenschi
ich habe ein Problem mit einem String in einem Item.
Ich frage mit dem SNMP Binding mein NAS ab und bekomme Werte zurück geliefert.
Im Temperaturwert steht jedoch "Centigrade:49 Fahrenheit:120"
Wie kann ich das Item jetzt spliten damit ich nur die 49°C bekomme, also nur die Number 49
Danke für die Hilfe.
Gruß Lenschi
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Itemwert spliten
Wenn der String exakt so formatiert ist, kannst Du versuchen, den String mittels REGEX zu zerlegen. Dabei wäre es von Vorteil, wenn die Zerlegung VOR der Übernahme in das Item stattfindet. Ich habe bisher mit SNMP noch nichts gemacht, leider scheint es keine Möglichkeit zu geben, dies im Binding selbst zu erledigen.
Der einfachste Weg ist also, ein zweites Item anzulegen, welches dann den Zahlenwert enthalten wird, ein Rule kann dann aus dem gelieferten String die Zahl extrahieren, z.B. so:
Da ich nicht zu 100% sicher bin, ob das an allen Stellen genau so wie erwartet funktioniert, habe ich hier alles in kleinen Schritten eingebaut. Die eigentliche Rule könnte auch wesentlich kürzer ausfallen:
Nur ist das halt schlecht zu debuggen, falls etwas nicht wie erwartet funktioniert 
Die beiden Items snmpString und snmpNumber stehen stellvertretend fü die zwei Items von Dir (eben das mit dem gelieferten String und das 2. welches Du als Number Item anlegen musst und dann zur Anzeige verwenden kannst.
Der einfachste Weg ist also, ein zweites Item anzulegen, welches dann den Zahlenwert enthalten wird, ein Rule kann dann aus dem gelieferten String die Zahl extrahieren, z.B. so:
Code: Alles auswählen
rule "snmp String nach number"
when
Item snmpString changed
then
val str = snmpString.state.toString
logInfo("snmpstring","String: {}",str)
val str2 = transform("REGEX",".*:(.*) .*",str)
logInfo("snmpstring","Celsius (String): {}",str2)
val num = Float::parseFloat(str2)
logInfo("snmpstring","Celsius (Number): {}",num)
snmpNumber.postUpdate(num)
end
Code: Alles auswählen
rule "snmp String nach number"
when
Item snmpString changed
then
snmpNumber.postUpdate(FLoat::parseFloat(transform("REGEX",".*:(.*) .*",snmpString.state.toString)))
end

Die beiden Items snmpString und snmpNumber stehen stellvertretend fü die zwei Items von Dir (eben das mit dem gelieferten String und das 2. welches Du als Number Item anlegen musst und dann zur Anzeige verwenden kannst.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
- lenschith
- Beiträge: 314
- Registriert: 11. Dez 2020 22:36
Re: Itemwert spliten
Ich habe eine Rule mit dem Script erstellt aber bei einer Temperaturänderung bleit das neue Item auf NULL
Habe ich was falsch gemacht?
Gruß Lenschi
Code: Alles auswählen
Number WdmycloudtemperaturCelsius "System Temperatur [%d%°C]"
String Wdmycloudtemperatur "System Temperatur [%d%°C]" {channel="snmp:target:MyCloud:wdmycloudtemperatur"}
Code: Alles auswählen
rule "System snmp String nach number"
when
Item Wdmycloudtemperatur changed
then
val str = Wdmycloudtemperatur.state.toString
logInfo("snmpstring","String: {}",str)
val str2 = transform("REGEX",".*:(.*) .*",str)
logInfo("snmpstring","Celsius (String): {}",str2)
val num = FLoat::parseFloat(str2)
logInfo("snmpstring","Celsius (Number): {}",num)
WdmycloudtemperaturCelsius.postUpdate(num)
end
Gruß Lenschi
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Itemwert spliten
Gibt es eine Fehlermeldung?
Die Zeile musslauten (Nur der erste Buchstabe groß...) Ich hab den Tippfehler oben korrigiert...
Die Zeile muss
Code: Alles auswählen
val num = Float::parseFloat(str2)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
- lenschith
- Beiträge: 314
- Registriert: 11. Dez 2020 22:36
Re: Itemwert spliten
Hatte ich auch eben gesehen wie ich es im Visual Studio Code geöffnet habe. Aber leider bekommt das Item auch nach beheben des Fehlers keinen Wert.
Ich sehe im Item Wdmycloudtemperatur den String aber bei WdmycloudtemperaturCelsius ist NULL als Wert hinterlegt
Code: Alles auswählen
rule "System snmp String nach number"
when
Item Wdmycloudtemperatur changed
then
val str = Wdmycloudtemperatur.state.toString
logInfo("snmpstring","String: {}",str)
val str2 = transform("REGEX",".*:(.*) .*",str)
logInfo("snmpstring","Celsius (String): {}",str2)
val num = Float::parseFloat(str2)
logInfo("snmpstring","Celsius (Number): {}",num)
WdmycloudtemperaturCelsius.postUpdate(num)
end
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Itemwert spliten
Was gibt das Log aus?
Gesendet von iPad mit Tapatalk
Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
- lenschith
- Beiträge: 314
- Registriert: 11. Dez 2020 22:36
Re: Itemwert spliten
Wo kann ich den ein Logfile finden. Ich suche da schon ewig wo ich das finde 
Ich nutze Visual Studio Code und das openHAB läuft im Docker.
Sorry für die dumme Frage

Ich nutze Visual Studio Code und das openHAB läuft im Docker.
Sorry für die dumme Frage

openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED
- peter-pan
- Beiträge: 2769
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Itemwert spliten
Hast du schon mal folgende Item-Definition probiert?:
also ohne das % hinter %d 
Edit: So müsste es auch gehen:
Code: Alles auswählen
Number WdmycloudtemperaturCelsius "System Temperatur [%d °C]"

Edit: So müsste es auch gehen:
Code: Alles auswählen
Number WdmycloudtemperaturCelsius "System Temperatur [%.1f °C]"
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
- lenschith
- Beiträge: 314
- Registriert: 11. Dez 2020 22:36
Re: Itemwert spliten
Bleibt leider auf NULL bei Änderung
Code: Alles auswählen
Number WdmycloudtemperaturCelsius "System Temperatur [%.1f °C]"
String Wdmycloudtemperatur "System Temperatur [%d °C]" {channel="snmp:target:MyCloud:wdmycloudtemperatur"}
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED
- peter-pan
- Beiträge: 2769
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: Itemwert spliten
Ich hab das mit Udo's Regel probiert und bei mir klappt das.
Log:
Da ich kein passendes Item hatte, hab ich eine Konstante genommen:
Bist du sicher, dass dein String (String - str: Centigrade:49 Fahrenheit:120) auch wirklich so aussieht ? Und wenn ja, hast du auch gewartet, bis die Regel getriggert hat ? Ich hab hier nur einen "Dummy-Switch" zum Triggern genommen (Das kannst du übrigens auch)
Log:
Code: Alles auswählen
2020-12-16 12:03:40.481 [INFO ] [se.smarthome.model.script.snmpstring] - String - str: Centigrade:49 Fahrenheit:120
2020-12-16 12:03:40.487 [INFO ] [se.smarthome.model.script.snmpstring] - Celsius (String str2): 49
2020-12-16 12:03:40.493 [INFO ] [se.smarthome.model.script.snmpstring] - Celsius (Number - num): 49.0
Code: Alles auswählen
rule "snmp String nach number"
when
Item Dummy_4 changed to ON
then
val snmpString ="Centigrade:49 Fahrenheit:120"
val str = snmpString.toString
logInfo("snmpstring","String - str: {}",str)
val str2 = transform("REGEX",".*:(.*) .*",str)
logInfo("snmpstring","Celsius (String str2): {}",str2)
val num = Float::parseFloat(str2)
logInfo("snmpstring","Celsius (Number - num): {}",num)
WdmycloudtemperaturCelsius.postUpdate(num)
end
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian