Itemwert spliten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Itemwert spliten

Beitrag von lenschith »

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
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

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

Re: Itemwert spliten

Beitrag von udo1toni »

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:

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
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:

Code: Alles auswählen

rule "snmp String nach number"
when
    Item snmpString changed
then
    snmpNumber.postUpdate(FLoat::parseFloat(transform("REGEX",".*:(.*) .*",snmpString.state.toString)))
end
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.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Itemwert spliten

Beitrag von lenschith »

Ich habe eine Rule mit dem Script erstellt aber bei einer Temperaturänderung bleit das neue Item auf NULL

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
Habe ich was falsch gemacht?

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

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

Re: Itemwert spliten

Beitrag von udo1toni »

Gibt es eine Fehlermeldung?

Die Zeile muss

Code: Alles auswählen

    val num = Float::parseFloat(str2)
lauten (Nur der erste Buchstabe groß...) Ich hab den Tippfehler oben korrigiert...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Itemwert spliten

Beitrag von lenschith »

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.

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
Ich sehe im Item Wdmycloudtemperatur den String aber bei WdmycloudtemperaturCelsius ist NULL als Wert hinterlegt
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

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

Re: Itemwert spliten

Beitrag von udo1toni »

Was gibt das Log aus?


Gesendet von iPad mit Tapatalk
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Itemwert spliten

Beitrag von lenschith »

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 :(
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

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

Re: Itemwert spliten

Beitrag von peter-pan »

Hast du schon mal folgende Item-Definition probiert?:

Code: Alles auswählen

Number   WdmycloudtemperaturCelsius "System Temperatur [%d °C]"
also ohne das % hinter %d ;)


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

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Itemwert spliten

Beitrag von lenschith »

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

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

Re: Itemwert spliten

Beitrag von peter-pan »

Ich hab das mit Udo's Regel probiert und bei mir klappt das.
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
Da ich kein passendes Item hatte, hab ich eine Konstante genommen:

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
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)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten