Seite 2 von 2

Re: Regelfehler - Logik-fehler?

Verfasst: 14. Mai 2019 21:01
von peter-pan
@udo1toni
Hallo Udo, erst mal Danke für die Antwort.
Wenn ich das richtig verstanden habe, kann man das nur in der Regel selber abfragen :?: , oder?
Also nicht von aussen, z.B. in der Shell oder über die Konsole?

Re: Regelfehler - Logik-fehler?

Verfasst: 14. Mai 2019 21:04
von Zubertus
Hallo,
vielen Dank für Eure Antworten.
Auch ein großes Danke an Udo.
Da heißt es für mich wohl weiter einlesen in das Thema OHrules.
Aber nur so wird man schlauer :)

Beste Grüße

zubertus

Re: Regelfehler - Logik-fehler?

Verfasst: 14. Mai 2019 21:09
von peter-pan
Sorry Zubertus,
ich hab mich da einfach reingegrätscht und dabei den Bogen etwas überspannt. Wie ist denn der Stand der Dinge mit deinem eigentlichen Problem ?

Gruss
peter

Re: Regelfehler - Logik-fehler?

Verfasst: 14. Mai 2019 21:49
von Zubertus
Hallo Peter,

ich hab erstmal das .state hinzugefügt und meine Regel komplett überarbeitet.
d.h.
die ganzen (überflüssigen) Timer entfernt sowie um einiges eingekürzt. Um die Fehlerquote zu senken. Läuft scheinbar erst mal.

Jetzt bin ich im Netz auf der suche nach Zeiger/Action/Methode :-)

Was mir nicht ganz klar ist bzw. wie ich das beheben soll:
Du setzt voraus, dass jedes Item allzeit einen gültigen Wert enthält, das ist aber nicht sicher.
Grüße

für die Vollständigkeit hier meine überarbeitete rules
PS: das FensterTest_zu item fliegt natürlich raus wenn Sie so läuft wie ich es möchte :D

Code: Alles auswählen

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

Re: Regelfehler - Logik-fehler?

Verfasst: 14. Mai 2019 22:39
von peter-pan
Da kann dir @udo1toni bestimmt weiterhelfen. Dazu hab ich einfach zu wenig Erfahrung. Aber das mit der Zuweisung kann er dir sicher an an einem Beispiel erklären. Das habe ich auch schon "ein bisschen" verstanden. Aber in so komplexen Dingen wie du sie schon machst, brauchst's auch einen Profi.

Gruss
Peter

Re: Regelfehler - Logik-fehler?

Verfasst: 16. Mai 2019 13:02
von peter-pan
Schau mal hier rüber. Da hat Udo ein schönes Beispiel für den Pointer gemacht.

Erst wird die Variable vor der Regel mit "null" initialisiert, dann im "then"-Teil abgefragt, ob schon ein Timer gestartet ist und falls nicht wird der Timer gestartet.

Re: Regelfehler - Logik-fehler?

Verfasst: 17. Mai 2019 13:17
von udo1toni
Zubertus hat geschrieben: 14. Mai 2019 21:49 Was mir nicht ganz klar ist bzw. wie ich das beheben soll:
Du setzt voraus, dass jedes Item allzeit einen gültigen Wert enthält, das ist aber nicht sicher.
Du musst halt prüfen, ob ein gültiger Wert vorliegt. Gegeben ist ein Number Item meinNumberItem:

Code: Alles auswählen

rule "test"
when
    Item meinNumberItem changed
then
    if(!(meinNumberItem.state instanceof Number)) {                          // Prüfung auf Typ
        logWarn("testrule","meinNumberItem.state ist nicht vom Typ Number!") // Warnung
        logInfo("testrule","meinNumberItem.state = {}",meinNumberItem.state) // Information
        return;                                                              // Abbruch der Rule
    }
    var Number nZahl = meinNumberItem.state as Number
    logInfo("testrule","Die Zahl lautet {}",nZahl)
end
Wie weit man die Typen prüft, bleibt einem selbst überlassen. Man muss sich aber im Klaren sein, dass ein Number Item auch NULL als Status haben kann. Wenn man dann den Status einfach als Zahl verwendet, schmeißt openHAB ca. 40 Zeilen Fehlermeldung und bricht die Rule ab.
Man kann auch Default Werte definieren und mit dem Wert überschreiben:

Code: Alles auswählen

rule "test"
when
    Item meinNumberItem changed
then
    var Number nZahl = 5                     // default Wert
    if(meinNumberItem.state instanceof Number) 
        nZahl = meinNumberItem.state as Number
    logInfo("testrule","Die Zahl lautet {}",nZahl)
end
Es kommt halt darauf an, wie die Rule sich verhalten soll.

Re: Regelfehler - Logik-fehler?

Verfasst: 18. Mai 2019 10:46
von Zubertus
Hallo

vielen Dank für die Unterstüzung und Erklärung - das hilft mir schon mal enorm weiter um meine rules "sicher" zu machen.
Beste Grüße
zubetus