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
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