Seite 1 von 3

Itemwert spliten

Verfasst: 14. Dez 2020 07:59
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

Re: Itemwert spliten

Verfasst: 14. Dez 2020 23:49
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.

Re: Itemwert spliten

Verfasst: 15. Dez 2020 18:20
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

Re: Itemwert spliten

Verfasst: 15. Dez 2020 20:45
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...

Re: Itemwert spliten

Verfasst: 15. Dez 2020 21:13
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

Re: Itemwert spliten

Verfasst: 16. Dez 2020 09:55
von udo1toni
Was gibt das Log aus?


Gesendet von iPad mit Tapatalk

Re: Itemwert spliten

Verfasst: 16. Dez 2020 11:02
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 :(

Re: Itemwert spliten

Verfasst: 16. Dez 2020 11:58
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]"

Re: Itemwert spliten

Verfasst: 16. Dez 2020 12:18
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"}

Re: Itemwert spliten

Verfasst: 16. Dez 2020 12:45
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)