Ja, da sind diverse Fehler drin, die auf grundsätzliche Missverständnisse hindeuten Aber mach Dir nichts drauß, das ist auch etwas schwierig...wighdeas hat geschrieben: ↑28. Jul 2021 20:23Meine Fragen - ist das nun richtig - habe ich irgendwelche formalen Fehler drin oder grundsätzlich nicht begriffen wie ich das machen soll?Code: Alles auswählen
when Time cron "0 0 6-7 ? 5-10 1/2 *" //von 6-7uhr, Mai bis Oktober jeden Zweiten Tag Item GardenaSensor1_Bodenfeuchtigkeit < 50 % // Seonsorschwellwert Feuchtigkeit < 50% Item GardenaSensor1_Bodentemperatur > 1 °C // Seonsorschwellwert Temperatur > 1° then Item Pumpe.sendCommand(ON) // Einschalten der Pumpe Item Gewaechshaus.sendCommand(ON) // Einschalten des Ventils für Gewächshaus createTimer(now.plusSeconds(300)) // Timer für Bewässerungsdauer Item Pumpe.sendCommand(OFF) // Ausschalten der Pumpe Item Gewaechshaus.sendCommand(OFF) // Ausschalten des Ventils für Gewächshaus end
Punkt 1 (und das ist gleich das größte Punkt): Der when-Teil einer Rule beschreibt sämtliche Trigger einer Rule. Jeder einzelne Trigger führt zur Ausführung der Rule. Deshalb müssen auch sämtliche Trigger mit or miteinander verknüpft werden. Nein, ein and gibt es nicht.
Punkt 2: Time cron beschreibt Zeitpunkte. Die Notation ist "s m h D M W Y" also Sekunde, Minute, Stunde, Tag, Monat, Wochentag, Jahr. Dabei ist Jahr optional. Außerdem muss exakt ein Fragezeichen im Term gesetzt sein, und zwar entweder beim Wochentag oder beim Tag - was ausschließt, dass man z.B. einen Trigger definiert, der nur am Freitag, dem 13. auslöst. Deine Notation würde um 6:00:00 Uhr und um 7:00:00 Uhr triggern, an jedem Tag von Mai bis Oktober, wenn da nicht 1/2 als Wochentag eingetragen wäre. Wie gesagt, zwei Zeitpunkte, kein Zeitraum (es handelt sich um Trigger)
Punkt 3: Der Trigger (!) Item GardenaSensor1_Bodenfeuchtigkeit < 50 % wird ebenfalls nicht funktionieren, genauso wie der nachfolgende Trigger, denn ein kleiner als oder größer als ist innerhalb eines Triggers nicht erlaubt.
Das, was Du möchtest, sind stattdessen Bedingungen (also Eingrenzungen), die in den then-Teil der Rule gehören. Dann jedoch brauchst Du immer noch einen Trigger.
Die Frage ist auch, wie Du Dir das nun tatsächlich vorstellst. Der Rule-Code deutet an, dass die Bewässerung nur 5 Minuten laufen soll. Andererseits soll sie aber im Zeitraum 6-7 Uhr stattfinden.
Eine mögliche Variante:
Code: Alles auswählen
rule "Gewächshaus bewässern"
when
Time cron "0 0/10 6 1/2 5-10 ?" // von 6:00:00 - 7:00:00 Uhr, alle 10 Minuten, 1. Mai bis 31. Oktober, jeden 2. Tag
then
if(GardenaSensor1_Bodenfeuchtigkeit.state instanceof Number) // enthält das Item einen gültigen Zahlenwert?
if((GardenaSensor1_Bodenfeuchtigkeit.state as Number).floatValue >= 50) // größer oder gleich 50?
return; // dann Rule abbrechen
if(GardenaSensor1_Bodentemperatur.state instanceof Number) // enthält das Item einen gültigen Zahlenwert?
if((GardenaSensor1_Bodentemperatur.state as Number).floatValue <= 1) // kleiner oder gleich 1?
return; // dann Rule abbrechen
Pumpe.sendCommand(ON) // Pumpe einschalten
Gewaechshaus.sendCommand(ON) // Ventil für Gewächshaus einschalten
createTimer(now.plusSeconds(300), [| // Timer für Bewässerungsdauer
Pumpe.sendCommand(OFF) // Pumpe ausschalten
Gewaechshaus.sendCommand(OFF) // Ventil für Gewächshaus ausschalten
])
end
Zunächst wird das Item, welches die Bodenfeuchte hält geprüft, genauer wird geprüft, ob der Status eine gültige Zahl enthält. Ist das der Fall, so wird dieser Wert mit 50 verglichen. Falls der Wert nicht darunter liegt, wird die Rule abgebrochen.
Danach wird das gleiche für das zweite Item - die Bodentemperatur - vorgenommen, hier mit dem Grenzwert 1, der nicht unterschritten werden darf.
Danach sind alle Bedingungen erfüllt und die Pumpe sowie das Ventil können aktiviert werden. Abschließend wird ein Timer angelegt, der beide Geräte nach 300 Sekunden wieder abschaltet. daraus ergäbe sich ein Zyklus von maximal 6-malig 5 Minuten Bewässerung mit jeweils 5 Minuten Pause.