Seite 2 von 2

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

Verfasst: 30. Apr 2022 13:32
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.

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

Verfasst: 30. Apr 2022 16:24
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?

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

Verfasst: 30. Apr 2022 20:13
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?

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

Verfasst: 30. Apr 2022 22:07
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>)

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

Verfasst: 1. Mai 2022 12:09
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

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

Verfasst: 1. Mai 2022 13:07
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.

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

Verfasst: 1. Mai 2022 13:42
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.

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

Verfasst: 2. Mai 2022 10:14
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 | %)