Regelfehler - Logik-fehler?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Zubertus
Beiträge: 19
Registriert: 12. Mai 2019 21:02
Answers: 1

Regelfehler - Logik-fehler?

Beitrag von Zubertus »

Hallo openHABforum.de-Mitglieder,

ich nutze OpenHab seit Oktober 2018 und bin bisher mit der suche im Internet oder Foren ausgekommen. Ob es die Einbindung von Shellys per MQTT, oder das störische "Velux-Binding" war, auch bei meinen Regeln hab ich mir alles aus dem Netz zusammen gesucht. Nur bei meiner aktuellen Regel scheine ich einen Fehler zu haben den ich nicht sehe:
Beim import meldet OpenHab keinen Fehler! Später, wahrscheinlich wenn es ausführen will steht in der LOG:

Code: Alles auswählen

Rule 'Fenster auf am Abend bei Wärme': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_lessThan(org.eclipse.smarthome.core.types.Type,java.lang.Number) on instance: null
Meine Rule kommt am Ende. Die sich aus meiner Sicht von selbst erklärt - aber das trifft nicht auf andere zu. Also erkläre ich mal möglichst genau

Was will ich mit der Regel bezwecken:

Ich hab 3 automatische Veluxfenster, 1 mit Insektenschutz (FensterMitte) und zwei Ohne (Fenster Links und rechts = FensterLuR)
Die Steuereung erfolg über Szenen d.h. jeder Vorgang ist mit einem SWITCH-Item gekoppelt (z.B. FensterMitte_auf)
Ich habe drei Modi festgelegt: -- auf=ganz geöffnet, -- zu=zu, -- Lüftung(mit luft abgekürzt)= die Lüftungsklappe geöffnet,Fenster aber zu.
Item-Fensterautomatik = Dummi zum an- und ausschalten der Regel
Item-Dachboden_Heizung = Heizkörperthermostat mit SOLL Termperatur
Im Sommer soll bei warmen Temperaturen z.B. Sonnenuntergang die Fenster geöffnet werden (das Fenster_Mitte dürfte die ganze Nacht geöffnet bleiben weil Insektenschutz) in der Heizperiode im Winter jedoch nicht (bzw. wenn Heizkörper SOLL erhöht ist - ich möchte ja nicht durch das offene Fenster heizen )
Die Veluxfenster verfügen über einen Regensensor der automatich schließt und erst bei "trockenheit" wieder öffnet

Ich hoffe ich hab bei meiner Einführung kein wichtiges Detail vergessen oder mich unverständlich ausgedrückt, und hier meine Regel:

Ich freue mich wenn Ihr mal drüber schauen könnt - da ich sie gern erweitern würde aber erst wenn Sie -bis hierher- ohne Probleme funktioniert. Ich glaube das ich ein Zirkelbezug habe- sehe Ihn aber nicht.

Code: Alles auswählen

rule "Fenster auf am Abend bei Wärme"
	
	when
		Item Dachboden_Temperature changed or
		Channel 'astro:sun:local:set#event' triggered START or
		Item FensterTest_zu changed to ON
				
	then
		if((Dachboden_Temperature.state >= 20) && (Dachboden_Heizung.state <= 18) && (Fensterautomatik.state == ON) && (Outside_Temperature.state <= Dachboden_Temperature)) {
		createTimer(now.plusSeconds(5)) [| sendCommand(FensterMitte_auf, ON) ]
		createTimer(now.plusSeconds(5)) [| sendCommand(FensterLuR_auf, ON) ]
		createTimer(now.plusMinutes(15)) [| sendCommand(FensterLuR_luft, ON) ]
		}
	end

rule "Fenster wieder zu bei kalte oder Luftung"
	when 
		Item Dachboden_Temperature changed or
		Item Outside_Temperature changed or
		Item FensterTest_zu changed to ON
		
	then
		if((Dachboden_Temperature.state <= 20) && (Fensterautomatik.state == ON) && (Outside_Temperature.state >= 15)) {
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterMitte_luft, ON) ]
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterLuR_luft, ON) ]
		}
		if((Dachboden_Temperature.state <= 20) && (Fensterautomatik.state == ON) && (Outside_Temperature.state <= 15)) {
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterMitte_zu, ON) ]
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterLuR_zu, ON) ]
		}
		if((Dachboden_Temperature.state <= 17) && (Fensterautomatik.state == ON)) {
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterMitte_zu, ON) ]
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterLuR_zu, ON) ]
		}
		if(Outside_Temperature.state <= 5) {
		createTimer(now.plusSeconds(45)) [| sendCommand(FensterMitte_zu, ON) ]
		createTimer(now.plusSeconds(45)) [| sendCommand(FensterLuR_zu, ON) ]
		}
		
	end
	
rule "rechts und Links am Abend zu"
	
	when
	
		Channel 'astro:sun:local:set#event' triggered END or
		Item FensterTest_zu changed to ON
	
	then
		if((Fensterautomatik.state == ON) && (Outside_Temperature.state >= 15)) {
		createTimer(now.plusSeconds(30)) [| sendCommand(FensterLuR_luft, ON) ]
		}
	end

Besten Dank und
viele Grüße
Zubertus

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

Re: Regelfehler - Logik-fehler?

Beitrag von peter-pan »

Hast du in der Regel "Fenster auf am Abend bei Wärme" nach "then" schon mal ein "logInfo" als DEBUG-Info eingebaut ? Und evtl. dann noch eins nach der if-Bedingung ? ....
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Zubertus
Beiträge: 19
Registriert: 12. Mai 2019 21:02
Answers: 1

Re: Regelfehler - Logik-fehler?

Beitrag von Zubertus »

Hallo perter-pan,

nein hab ich noch nicht
- da ich nicht wuste das so etwas möglich ist und ich grundsätzlich keine Ahnung von Java hab.
Über eine kurze info dazu oder ein Link der zu mehr infos darüber führt freue ich mich. - Ich lerne gern dazu....
thx

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

Re: Regelfehler - Logik-fehler?

Beitrag von peter-pan »

z.B. so:

Code: Alles auswählen

rule "Fenster auf am Abend bei Wärme"
    
    when
        Item Dachboden_Temperature changed or
        Channel 'astro:sun:local:set#event' triggered START or
        Item FensterTest_zu changed to ON
                
    then
       logInfo("Fenster auf am Abend bei Wärme "," Rule triggert nach then" )
        if((Dachboden_Temperature.state >= 20) && (Dachboden_Heizung.state <= 18) && (Fensterautomatik.state == ON) && (Outside_Temperature.state <= Dachboden_Temperature)) {
          logInfo("Fenster auf am Abend bei Wärme "," Rule triggert nach if" )
          createTimer(now.plusSeconds(5)) [| sendCommand(FensterMitte_auf, ON) ]
          createTimer(now.plusSeconds(5)) [| sendCommand(FensterLuR_auf, ON) ]
          createTimer(now.plusMinutes(15)) [| sendCommand(FensterLuR_luft, ON) ]
        }
end
Ich habe mal zwei logInfos eingebaut, aber nix getestet.
Soweit ich weiss hat das aber nichts mit Java zu tun, sondern ist die Rules-Sprache. Schau mal hier.

Gruss
Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Zubertus
Beiträge: 19
Registriert: 12. Mai 2019 21:02
Answers: 1

Re: Regelfehler - Logik-fehler?

Beitrag von Zubertus »

Hallo peter-pan,

zuerst vielen Dank!

ich schau es mir mal an und baue es ein- aber nicht mehr heute :-)

Grüße
Zubertus

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

Re: Regelfehler - Logik-fehler?

Beitrag von udo1toni »

Da fehlt ein .state (erstes if(), letzter Vergleich, Dachboden_Temperature sollte Dachboden_Temperature.state heißen :)

Aber der Reihe nach:
  • Du setzt voraus, dass jedes Item allzeit einen gültigen Wert enthält, das ist aber nicht sicher.
  • Du erzeugst in jeder Rule mindestens zwei Timer, die zeitgleich enden. Das ist nicht nur ineffizient, es blockiert auch die Ausführung anderer Timer in diesem Moment.
  • Du definierst keine Zeiger auf die Timer, womit Du keine Möglichkeit hast, die Timer zu beeinflussen, Du kannst auch nicht verhindern, dass Timer mehrfach erstellt werden (z.B. weil eine Rule mehrfach triggert oder durch Fehlbedienung mehrfach ausgeführt wird (kurz hintereinander Switch auf ON,OFF,ON geschaltet)
  • Du verwendest die Action statt der Methode, was zumindest ungünstig ist.
  • Jede der Rules triggert mindestens bei einem der events, welches auch bei anderen Rule verwendet wird. Der Unterschied zwischen set#event START und END beträgt ca. 2 Minuten (Sonne beginnt, den Horizont zu berühren und Sonne hört auf, den Horizont zu berühren)
  • unter Umständen sind verschiedene Bedingungen gleichzeitig erfüllt, womit die Steuerbefehle miteinander kollidieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Regelfehler - Logik-fehler?

Beitrag von peter-pan »

Hallo @udo1toni, hallo Zubertus,
mal wieder eine Anfängerfrage:
Ist der lange Timer (15 Minuten) nicht etwas lang? Ich meine, gelesen zu haben, dass man das möglichst vermeiden sollte!

Wäre es in diesem Falle evtl. besser ein Astro-Thing mit einem Offset zu definieren und dann in Abhängigkeit des Triggers in Verbindung mit der implicit Variablen "receivedEvent" im Ausführungsteil den "sendCommand(FensterLuR_luft, ON)"-Befehl oder besser "FensterLuR_luft.sendCommand(ON) zu benutzen?

Gruss
Peter

P.S.: Auch kritische Anmerkungen sind erlaubt. Ich vertrag das ;) :lol: :roll:
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Regelfehler - Logik-fehler?

Beitrag von udo1toni »

Nein, ein Timer ist komplett unkritisch, was die Wartezeit betrifft. Der einzige "Haken" dabei ist, dass es sein könnte, dass openHAB neu gestartet wird, während ein Timer noch nicht abgelaufen ist. Dieser Timer wird nicht automatisch neu angelegt, und daher kommen die Warnungen vor lang laufenden Timern.
Ich nutze weit vielen Jahren (seit OH 1.0) einen Timer mit einer Laufzeit von 15 Minuten (Lüfternachlauf), der hat mich noch nie im Stich gelassen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Regelfehler - Logik-fehler?

Beitrag von peter-pan »

Erst mal Danke für deine Antwort Udo.
Und gleich noch 'ne Frage. Kann man irgendwo sehen ob noch Timer laufen und wenn ja wie ?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Regelfehler - Logik-fehler?

Beitrag von udo1toni »

peter-pan hat geschrieben: 13. Mai 2019 21:39 Kann man irgendwo sehen ob noch Timer laufen und wenn ja wie ?
Haha, ja, das steht weit oben auf der Wunschliste. Leider geht das momentan nicht. Soweit ich mitbekommen habe, gibt es Bestrebungen, das für OH3 in den Core mit aufzunehmen, aber das wird auf jeden Fall noch eine ganze Zeit lang dauern.

Man kann sich nur mit einem Umweg behelfen, indem man den Zeiger auf den Timer einer Variablen zuordnet, das hat auch den Vorteil, dass man die Kontrolle behält.

Es gibt verschiedene Methoden für die Timer-Variable, z.B. cancel um den Timer zu stoppen und reschedule um den Timer neu zu planen. Es gibt noch eine Eigenschaft (wenn ich mich nicht irre active), diese zeigt allerdings an, ob der Code des Timers gerade ausgeführt wird, sprich, der Timer ist abgelaufen und hat den Code gerade gestartet. cancelled ist noch die Eigenschaft, ob der Timer abgebrochen wurde.

Wenn man die Timer-Variable mit null initialisiert und darauf achtet, an jeder Stelle, an der der Timer abgebrochen oder beendet wird, die Variable auch wieder auf null zurück zu setzen, kann man auf null testen und weiß somit, ob ein Timer angelegt wurde.

Ein anderer Wunsch ist, zu wissen, wie lang es noch dauert, bis der Timer abgelaufen ist. Auch das so nicht möglich.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten