Danke für diese wiedermal ausführliche und einleuchtende Antwort.udo1toni hat geschrieben: ↑17. Jun 2020 23:34 Kann es sein, dass ich das mal in einem anderen Thread erläutert habe? Die Timer in dieser Form zu verwenden ist Mist.
Wenn Du mit zwei Timern arbeiten willst, ist das ok (obwohl unnötig), aber zumindest solltest Du die Kontrolle über die Timer behalten:Die Rule macht weitgehend das gleiche, nur ein wenig andersCode: Alles auswählen
var Timer tEins = null var Timer tZwei = null rule "Beregnung" when Time cron "0 0 21 * * ?" then logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.") if (beregnung.state != ON) { logInfo("watering","Aber Beregnungsautomatik abgeschaltet.") return; } if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){ logInfo("watering","Aber zu kalt.") return; } if (rainYesterday.state > 10 | mm){ logInfo("watering","Aber es hat ausreichend geregnet.") return; } channel1.sendCommand(ON) channel2.sendCommand(ON) channel3.sendCommand(ON) channel5.sendCommand(OFF) teich.sendCommand(OFF) tEins?.cancel tEins = createTimer(now.plusMinutes(1), [| channel1.sendCommand(OFF) channel3.sendCommand(OFF) tEins = null ]) tZwei?.cancel tZwei = createTimer(now.plusMinutes(1), [| channel2.sendCommand(OFF) tZwei = null ]) end
Natürlich kannst Du alle Bedingungen in ein if-Statement schreiben, aber Du sieht hoffentlich den Vorteil des Codes, nämlich, dass es immer genau definierte Umstände gibt, warum die Rule etwas tut (oder nicht). Ob Du die logMeldungen ausgeben lässt, ist natürlich ebenso Geschmacksache. Durch den Abbruch mittels return; bleibst Du im Code aber in der ersten Ebene, was einfach übersichtlicher ist.
Die Schreibweise des Timers, so wie hier gezeigt, verdeutlicht, dass das Lambda (der Teil zwischen [ und ]) Teil der Funktion ist. Die andere Schreibweise funktioniert ohne Frage auch, aber der Zusammenhang kann verloren gehen.
Die Zuweisung des Timers zu einer Variablen hat nun den Vorteil, dass Du den Timer abbrechen kannst (habe ich hier jeweils vor dem Timer-Aufruf implementiert; falls der Timer existiert, wird er gecancelt)
Das Canceln kannst Du auch aus beliebigen anderen Rules heraus erledigen, vorausgesetzt, sie sind in der gleichen Datei gespeichert (wegen der globalen Definition der Variablen)
Genauso kannst Du einen Timer, der so definiert ist, auch erneut zur Ausführung bringen, um z.B. im ersten Durchlauf zwei Regner abzuschalten und den dritten Regner erst im zweiten Durchlauf. dazu braucht es dann aber einen Zählerzum Abfragen.
Es tut mir leid dass ich nicht alles auf Anhieb verstehe versuche mich aber so gut es geht rein zu denken.
Ich bin von Beruf Schlosser und habe keinerlei Vorerfahrungen.
Das die beiden Timer dieselbe Dauer laufen war nur für Testzwecke ob die Regel "anspringt".
Code: Alles auswählen
var Timer tEins = null
var Timer tZwei = null
rule "Beregnung"
when
Time cron "0 0 21 * * ?"
then
logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.")
if (beregnung.state != ON) {
logInfo("watering","Aber Beregnungsautomatik abgeschaltet.")
return;
}
if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){
logInfo("watering","Aber zu kalt.")
return;
}
if (rainYesterday.state > 10 | mm){
logInfo("watering","Aber es hat ausreichend geregnet.")
return;
}
channel1.sendCommand(ON)
channel2.sendCommand(ON)
channel3.sendCommand(ON)
channel5.sendCommand(OFF)
teich.sendCommand(OFF)
tEins?.cancel
tEins = createTimer(now.plusMinutes(60), [|
channel1.sendCommand(OFF)
channel3.sendCommand(OFF)
tEins = null
])
tZwei?.cancel
tZwei = createTimer(now.plusMinutes(45), [|
channel2.sendCommand(OFF)
tZwei = null
])
end
Wenn ich also die Teichbefüllung um 20:55 starte schaltet die Regel die Pumpe um 21:05 aus, heißt der Rasen wird nicht mehr bewässert.
Code: Alles auswählen
rule "Teichbefülung"
when item teich received update
then if (teich.state == ON){
channel3.sendCommand(OFF)
channel5.sendCommand(OFF)
logInfo("FILE", "Teichbefüülung für 10 Minuten gestartet")
createTimer(now.plusMinutes(10)) [|
channel3.sendCommand(OFF);
channel5.sendCommand(OFF)]
}
end
TeichUndRasen.rules
Code: Alles auswählen
var Timer tDrei = null
rule "Teichbefülung"
when item teich received update
then if (teich.state == ON){
channel3.sendCommand(OFF)
channel5.sendCommand(OFF)
logInfo("FILE", "Teichbefüllung für 10 Minuten gestartet")
tDrei?.cancel
tDrei = createTimer(now.plusMinutes(10), [|
channel3.sendCommand(OFF);
channel5.sendCommand(OFF)]
logInfo("FILE", "Teichbefüllung erfolgreich abgeschlossen")
}
end
var Timer tEins = null
var Timer tZwei = null
rule "Beregnung"
when
Time cron "0 0 21 * * ?"
then
logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.")
if (beregnung.state != ON) {
logInfo("watering","Aber Beregnungsautomatik abgeschaltet.")
return;
}
if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){
logInfo("watering","Aber zu kalt.")
return;
}
if (rainYesterday.state > 10 | mm){
logInfo("watering","Aber es hat ausreichend geregnet.")
return;
}
tDrei?.cancel
channel1.sendCommand(ON)
channel2.sendCommand(ON)
channel3.sendCommand(ON)
channel5.sendCommand(OFF)
teich.sendCommand(OFF)
tEins?.cancel
tEins = createTimer(now.plusMinutes(60), [|
channel1.sendCommand(OFF)
channel3.sendCommand(OFF)
tEins = null
])
tZwei?.cancel
tZwei = createTimer(now.plusMinutes(45), [|
channel2.sendCommand(OFF)
tZwei = null
])
end