Rule soll auslösen, wenn Wert unter- oder überschritten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von peter-pan »

Absinthe hat geschrieben: 30. Apr 2022 12:00 Mit Gmail habe ich es auch nicht zum Laufen gebracht.
Hab meinen Fehler gefunden. Jetzt funktioniert es bei mir auch, auch mit Gmail.

Der Grund: Ich hatte in meiner Thing-Konfiguration (Text-File) den Port als Integer(Zahl) definiert. Den Lösungsansatz habe ich hier gefunden. Es muss ein String sein.

Hast du bei GMail mal diese beiden Parameter probiert ? ->

Code: Alles auswählen

security="SSL", port="465"
Die "Gänsefüsschen" brauchst du aber wahrscheinlich bei der Konfiguration über die UI nicht.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Absinthe
Beiträge: 83
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von Absinthe »

Absinthe hat geschrieben: 30. Apr 2022 11:38 DANKE! Mit .state funktioniert es. Wichtig sind die Leerzeichen dabei.
Kommando zurück... die Prüfung im IF liefert anscheinend immer ein false zurück, womit immer der Codeteil im ELSE ausgeführt wird.

Code: Alles auswählen

if (Shelly_Humidity_02.state < 0.40) {
val mailActions = getActions("mail","mail:smtp:Mail_SMTP")  
val success = mailActions.sendMail("mail@mail.de", "ALERT - OPENHAB", "IF") 
} else {
val mailActions = getActions("mail","mail:smtp:Mail_SMTP")  
val success = mailActions.sendMail("mail@mail.de", "ALERT - OPENHAB", "ELSE") 
}

Die Frage ist nun warum?!

Die Zahl im ITEM ist "Number:Dimensionless"... Warum scheitert die Prüfung im IF? Jemand eine Idee?
OpenHAB 4.3.0
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von peter-pan »

Wahrscheinlich wird dann die Dimension (UoM) % mit geliefert. Dann kannst du u.a. so vergleichen:

Code: Alles auswählen

if ((Shelly_Humidity_02.state as Number).floatValue < 0.40)
Dadurch wird die Dimension eliminiert.

Da kommt mir aber der Wert 0.40 in Verbindung mit der Luftfeuchtigkeit komisch vor. Kannst den tatsächlichen Wert/Status auch anderweitig sehen, z.B. in VSCode oder in der Karaf-Konsole?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von udo1toni »

Eigentlich sollte der Wert dann 40 sein, weil automatisch umgerechnet wird. Es gibt aber wohl auch Geräte, die das anders handhaben (kommt darauf an, welcher Datentyp die Zahl liefert). Der Wert sollte ja im Log bei jeder Werteänderung zu sehen sein, im Klartext, mit (oder eben ohne) Einheit. Sobald eine Zeile der events.log in der Form

Code: Alles auswählen

2022-04-30 21:49:47.645 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MeinItem' changed from 143 ms to 109 ms
Einheiten enthält (in diesem Beispiel halt Millisekunden, ms) wird der Status diese Einheit mitliefern. Nur so

Code: Alles auswählen

2022-04-30 21:49:47.645 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MeinItem' changed from 143 to 109
liefert .state die reine Zahl ohne Einheit. Items vom Typ Number:Dimensionless sind eben nicht Unitless. Dazu müsste man den Typ auf Number (ohne Doppelpunkt und Schlüsselwort dahinter) ändern, was aber abhängig vom verlinkten Channel auch zu Fehlern führen kann. Deshalb ist es besser, in den Rules grundsätzlich die Einheit zu entfernen (mit .floatValue oder .intValue) oder aber diese gezielt zu berücksichtigen ( mit | <Einheit>)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von int5749 »

Absinthe hat geschrieben: 30. Apr 2022 16:24 .. die Prüfung im IF liefert anscheinend immer ein false zurück, womit immer der Codeteil im ELSE ausgeführt wird.

Die Frage ist nun warum?!
Also andere mögen mit den wenigen Info's arbeiten können, mir fehlt noch die Konfiguration des Items.

Trortdem habe ich mir gerade mal den Spaß gemacht und dies mit meinem ShellyHT getestet, da ich z.B. einen Feuchtigkeitswert meines Gardena Sensors in einer Rule vergleiche und dies problemlos läuft. Da der Versand der Info per Mail erst einmal nur zusätzliche Komplexität und Fehlerquellen birgt, habe ich erst einmal nur ein Logging erstellt um zu sehen, ob der Vergleich klappt.

Da ich noch alles über DSL Rule definiere, hier meine Konfig.
Item

Code: Alles auswählen

Number:Dimensionless ShellyHTBedroomHumidity	"Luftfeuchtigkeit [%d %unit%]"	<humidity>	(Shelly_Humidity_Chart)	["Measurement", "Humidity"]	{channel="shelly:shellyht:084711:sensors#humidity"}
Rule Vergleich auf kleiner als

Code: Alles auswählen

rule Schalter_Test
when
	Item Testschalter changed
then
	if (Testschalter.state == ON) {

        if ((ShellyHTBedroomHumidity.state as Number).intValue < 40) {
            logInfo("Test", "Kleiner Feuchtigkeit: {}", (ShellyHTBedroomHumidity.state as Number).intValue)
            logInfo("Test", "Kleiner Feuchtigkeit: {}", ShellyHTBedroomHumidity.state)
        } else {
            logInfo("Test", "Groesser Feuchtigkeit: {}", (ShellyHTBedroomHumidity.state as Number).intValue)
        }

    }
end
Ergebnis
11:54:32.478 [INFO ] [org.openhab.core.model.script.Test ] - Groesser Feuchtigkeit: 43
Rule Vergleich auf größer als

Code: Alles auswählen

rule Schalter_Test
when
	Item Testschalter changed
then
	if (Testschalter.state == ON) {

        if ((ShellyHTBedroomHumidity.state as Number).intValue > 40) {
            logInfo("Test", "Kleiner Feuchtigkeit: {}", (ShellyHTBedroomHumidity.state as Number).intValue)
            logInfo("Test", "Kleiner Feuchtigkeit: {}", ShellyHTBedroomHumidity.state)
        } else {
            logInfo("Test", "Groesser Feuchtigkeit: {}", (ShellyHTBedroomHumidity.state as Number).intValue)
        }

    }
end
Ergebnis
11:55:29.763 [INFO ] [org.openhab.core.model.script.Test ] - Kleiner Feuchtigkeit: 43
11:55:29.763 [INFO ] [org.openhab.core.model.script.Test ] - Kleiner Feuchtigkeit: 43 %
Ja, ich hätte noch den Text anpassen können, es ging aber um den Vergleich ;-)

Evtl. hilft dies ja weiter, dem Rätsel auf die Spur zu kommen. Evtl. mal als DSL Rule anlegen und dann den yaml code kopieren?

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von udo1toni »

Wie an anderer Stelle schon erläutert, der Teil zwischen when und then gehört in den Kopf der UI Rules (eben in den when Teil).
Der Teil zwischen then und end (ohne diese Schlüsselworte) gehört dann in den Code Teil, dabei muss als Code Art DSL gewählt werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Absinthe
Beiträge: 83
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von Absinthe »

udo1toni hat geschrieben: 30. Apr 2022 22:07

Code: Alles auswählen

2022-04-30 21:49:47.645 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'MeinItem' changed from 143 ms to 109 ms
Einheiten enthält (in diesem Beispiel halt Millisekunden, ms) wird der Status diese Einheit mitliefern.
Asche auf mein Haupt!!! Bitte entschuldigt. Ich habe in der GUI nur 0.6 gesehen und bin fälschlicherweise von einer einheitsloser Zahl ausgegangen.

Code: Alles auswählen

2022-05-01 13:36:13.337 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shelly_Humiditiy_1' changed from 73 % to 74 %
Ich werde dies nun mal über die Woche testen.
OpenHAB 4.3.0
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule soll auslösen, wenn Wert unter- oder überschritten

Beitrag von peter-pan »

Wie Udo und ich schon vermutet haben, handelt es sich um einen mit einer Einheit behafteten numerischen Wert (UoM). Deshalb auch der Vorschlag diese Einheit beim Vergleich zu eliminieren. Ob das nun mit

Code: Alles auswählen

if ((Shelly_Humidity_02.state as Number).floatValue < 40)
oder mit

Code: Alles auswählen

if ((Shelly_Humidity_02.state as Number).intValue< 40)
passiert, hängt wohl davon ab, ob noch Nachkomma-Stellen vom Item-Status geliefert werden und als Vergleich gebraucht werden. Es sollten aber beide Versionen klappen.

Eine weitere Option wäre noch die Einheit mit in den Vergleich aufzunehmen:

Code: Alles auswählen

if(Shelly_Humidity_02.state< 40 | %)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten