Seite 1 von 1

Luftfeuchtigkeitswarnung per Telegram

Verfasst: 10. Apr 2021 12:59
von DarkOfSoul
Moin moin Zusammen,

ich habe mal wieder ein kleines Problem. Ich habe ein paar Zigbee Temperatur und Luftfeuchtigkeitssensoren angebracht und in Openhab 2.5 eingebunden. Funktioniert soweit tadellos. Nun würde ich gerne eine Warnung erhalten wenn die Luftfechtigkeit einen bestimmten Wert überschreitet. Ich dachte ich kann da einfach eine Regel umschreiben die ich auch für den Batteriestatus nutze, das funktioniert nur leider nicht. Ich habe gelesen das Openhab wohl die werte nicht vergleichen kann weil er die nicht mehr als Zahlen sieht und das man diese wieder umwandeln mus. Ich habe aber null verstanden wie man es mach. Vielleicht kann mir das jemand anhand eines Beispieles erklären.

Die Regel:

Code: Alles auswählen

rule "Luftfeuchtigkeit überwachen"
when
    Member of g_Luft_All changed or
    System started
then
    var Integer z = 0
    var String s = ''
    g_Luft_All?.members.forEach[i|
        if ((i.state) > 50) {
            s = s + "\n" + i.name
            z++
        }       
    ]
    if (z > 0) {
        var String meldetext = z + ' Luftfeuchtigkeits Warnungen für folgende Zimmer: ' + s
        logInfo('rules', meldetext)
        sendTelegram('benny', meldetext)
    }
end
Die Items:

Code: Alles auswählen

Number:Dimensionless         Ist_Luft_Schlafzimmer              "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffec4c613010405:humidity"}   
Number:Dimensionless         Ist_Luft_Wohnzimmer                "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffea35b46010405:humidity"}   
Number:Dimensionless         Ist_Luft_Kinderzimmer              "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffebbe89c010405:humidity"}   
Number:Dimensionless         Ist_Luft_Buero                     "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffebbe846010405:humidity"}   
Number:Dimensionless         Ist_Luft_Badezimmer                "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffea16075010405:humidity"}   
Number:Dimensionless         Ist_Luft_Flur                      "Die Luftfeuchtigkeit beträgt [%.1f %unit%]"                                (g_Luft_All)             {channel="deconz:humiditysensor:homeserver:5c0272fffec3db18010405:humidity"}   
Ich freue mich von euch zu hören.
Viele Grüße
DarkOfSoul

Re: Luftfeuchtigkeitswarnung per Telegram

Verfasst: 10. Apr 2021 20:52
von udo1toni
Da es sich um ein UoM Item handelt, hält der Status zusätzlich zur Zahl auch noch die Einheit (in diesem Fall %). Die einfachste Variante, den Wert als Zahlenwert zu betrachten ist folgende Funktion:

Code: Alles auswählen

(i.state as Number).floatValue

Re: Luftfeuchtigkeitswarnung per Telegram

Verfasst: 10. Apr 2021 22:09
von DarkOfSoul
Super das war die richtige Lösung. Also wenn ich es richtig verstehe funktioniert es bei allen Items so. Wo noch was hinzu formatiert wurde?

Re: Luftfeuchtigkeitswarnung per Telegram

Verfasst: 10. Apr 2021 22:12
von udo1toni
Das funktioniert bei allen UoM Items, also alle Number Items, die mit Number:<irgendwas> definiert sind. Kennzeichen ist, dass im log eine Einheit angezeigt wird (changed from xx.xx <Unit> to yy.yy >Unit>)

Re: Luftfeuchtigkeitswarnung per Telegram

Verfasst: 10. Apr 2021 22:23
von DarkOfSoul
Okay Verstanden... Als Ausgabewert kommt nun ja das Item rausgeworfen. Kann man den jetzt noch mapping oder so wecheln das da statt das Item z.B. Ist_Luft_Kinderzimmer nur Kinderzimmer steht?

Re: Luftfeuchtigkeitswarnung per Telegram

Verfasst: 11. Apr 2021 05:46
von udo1toni
Da Du Deine Itemnamen sinnvoll gestaltet hast, kannst Du einfach statt

Code: Alles auswählen

            s = s + "\n" + i.name
folgende Codezeile verwenden:

Code: Alles auswählen

            s = s + "\n" + i.name.split("_").get(2)
split() tut genau das, es teilt den übergebenen String - in diesem Fall der Name des Items - an dem angegebenen Zeichen auf - in diesem Fall der Unterstrich - und schreibt die Teilstrings (ohne das Trennzeichen) in eine Liste. get() greift auf die einzelnen Listenelemente zu. Der Zeiger ist 0-basiert, get(0) liefert also den 1. Teilstring (das wäre das Wort "Ist").