Fehler in Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
KlausPi
Beiträge: 27
Registriert: 12. Sep 2019 19:53

Fehler in Rule

Beitrag von KlausPi »

Hallo zusammen,

folgende Regel will einfach nicht so wie ich es will, und ich verstehe nicht warum.

Item:

Code: Alles auswählen

Number test1_hoch 
Rule:

Code: Alles auswählen

rule "test1_hoch"
when Item ESP8266_1 changed
then
var State = ((ESP8266_1.state as DecimalType).intValue)
if (State <= 65)
{
test1_hoch.postUpdate(0)
}
if ((State >= 65) && (test1_hoch.state == 0))
{
    sendTelegram("ak", (ESP8266_1.state))
test1_hoch.postUpdate(1)
}
end
LOG:
2019-10-15 11:05:26.704 [vent.ItemStateChangedEvent] - ESP8266_1 changed from 65.20 to 65.40

2019-10-15 11:05:26.722 [vent.ItemStateChangedEvent] - test1_hoch changed from 1 to 0

2019-10-15 11:05:26.956 [vent.ItemStateChangedEvent] - test1_hoch changed from 0 to 1

2019-10-15 11:05:36.679 [vent.ItemStateChangedEvent] - ESP8266_1 changed from 65.40 to 65.50

2019-10-15 11:05:36.698 [vent.ItemStateChangedEvent] - test1_hoch changed from 1 to 0

2019-10-15 11:05:36.914 [vent.ItemStateChangedEvent] - test1_hoch changed from 0 to 1

2019-10-15 11:05:56.674 [vent.ItemStateChangedEvent] - ESP8266_1 changed from 65.50 to 65.60

2019-10-15 11:05:56.691 [vent.ItemStateChangedEvent] - test1_hoch changed from 1 to 0

2019-10-15 11:05:56.896 [vent.ItemStateChangedEvent] - test1_hoch changed from 0 to 1

2019-10-15 11:06:16.674 [vent.ItemStateChangedEvent] - ESP8266_1 changed from 65.60 to 65.50

2019-10-15 11:06:16.691 [vent.ItemStateChangedEvent] - test1_hoch changed from 1 to 0

2019-10-15 11:06:16.913 [vent.ItemStateChangedEvent] - test1_hoch changed from 0 to 1


Warum wird test1_hoch immer wieder auf 0 geschaltet?
In der Rule heisst es doch ganz klar if (State <= 65)

ollis112
Beiträge: 109
Registriert: 18. Aug 2018 11:36
Wohnort: Alsbach-Hähnlein

Re: Fehler in Rule

Beitrag von ollis112 »

Muss es nicht so sein?

Code: Alles auswählen

if (ESP8266_1.state <= 65)
Openhab3.3.0, openhabian auf Ubuntu, Gigabyte Brix, Z-Wave, Zigbee, Enocean

KlausPi
Beiträge: 27
Registriert: 12. Sep 2019 19:53

Re: Fehler in Rule

Beitrag von KlausPi »

Code: Alles auswählen

var State = ((ESP8266_1.state as DecimalType).intValue)
if (State <= 65)
Hier runde ich den Wert, damit ich nicht die ganze Zeit Meldungen bekomme. Funktioniert aber auch nicht so ganz, weil immer nur aufrundet.

Vielleicht kann mir da auch noch einer einen Tip geben.
Wenn der Wert zwischen 64,9 und 65,1 öfters hin und her wechselt, bekomme ich die ganze Zeit Nachrichten.
Ich könnte das mit einem Timer lößen , aber vielleicht gibt es auch noch eine gute Lösung in dem er sauber auf und abrundet.


Das erste Problem abe ich jetzt gelößt.

Code: Alles auswählen

rule "test1_hoch"
when Item ESP8266_1 changed
then
var State = ((ESP8266_1.state as DecimalType).intValue)
if (State < 65)
{
test1_hoch.postUpdate(0)
}
if ((State > 65) && (test1_hoch.state == 0))
{
    sendTelegram("ak", (ESP8266_1.state))
test1_hoch.postUpdate(1)
}
>= & <= ersetzt durch < & > :roll:

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

Re: Fehler in Rule

Beitrag von udo1toni »

Dein Problem dürfte einfach sein, dass Du zwei if-Anweisungen hintereinander eingebaut hast, die beide gleichzeitig erfüllt sein können (<= 65, >= 65 -> Bei Wert 65 treffen beide zu).
Das zweite Problem könnte noch sein, dass Du im 2. if auf den Wert von test1_hoch zugreifst, den Du unmittelbar vorher eventuell gesetzt hast. Meine Frage hierzu: Gehst Du davon aus, dass der Wert vom vorigen Befehl dann schon gesetzt ist? Das ist nämlich ziemlich sicher nicht der Fall, könnte aber auch vorkommen.

Aber vielleicht fangen wir noch vorher an: Was möchtest Du erreichen? Es handelt sich bei ESP8266_1 wohl um einen Messwert. Allgemein bei Messwertauswertung ist es sinnvoll, eine Hysterese zu definieren. Wird die Untergrenze unterschritten, wird auf 0 geschaltet, wird die Obergrenze überschritten, wird auf 1 geschaltet. Mit der letzten Version hast Du das ja schon erreicht, <65 -> 0 > 65 -> 1, = 65 -> nix tun.

Wichtig wäre noch, da Du ja mit .intValue arbeitest, 64,999 -> 64. Weiterhin birgt die Verwendung von as DecimalType einfach so eine gewisse Gefahr, in eine null Pointer Exception zu laufen. Also besser vorher prüfen, ob das Item auch tatsächlich eine Zahl enthält. Es ist auch besser, die allgemeinere Variante Number zu verwenden. Weiterhin, da Du den Wert im Laufe der Rule nicht veränderst, wäre eine Konstante genauso gut.

Code: Alles auswählen

    if(ESP8266_1.state instanceof Number) {
        val Integer iState = ((ESP8266_1.state as Number) + 0.5).intValue
    }
iState um zu verdeutlichen, dass es sich um einen Integer Wert handelt :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

KlausPi
Beiträge: 27
Registriert: 12. Sep 2019 19:53

Re: Fehler in Rule

Beitrag von KlausPi »

Perfekt, Danke schön Udo.
Danke auch für die unzähligen Beiträge von dir hier im Forum, die mir des öfteren schon geholfen haben.

Antworten