Elegantere Methoden:
- ein Online Kalender. Immer wieder...
Du legst z.B. bei Google Calendar eine Kalender an, den gibst Du an jeden frei, der die Zeiten anpassen können soll. Der Kalender wird z.B. direkt mit dem Smartphone Kalender verknüpft, so dass die Termine jeweils im eigenen Kalender mit auftauchen. Die Termine werden als Wiederholevents angelegt, so dass niemand groß raten muss, was exakt einzutragen ist - zusätzliche Zeiten werden einfach als Kopie eines vorhandenen Termins erstellt.
In openHAB bindest Du den Kalender über das passende Binding ein. Natürlich kannst Du auch andere Kalender verwenden, z.B. den vom iPhone, wichtig ist nur, dass er über das iCal Format online erreichbar ist.
- Zeitauswahl nicht über Stunde und Minute, oder zumindest nicht in der Form
Die Liste erhebt keinen Anspruch auf Vollständigkeit
Da ich meine Scripte alle ausschließlich per DSL erstelle kann ich Dir nicht mit konkretem JavaScript Code helfen. JavaScript sollte man verwenden, wenn man sich mit JavaScript auskennt. Man sollte nicht zu JavaScript greifen, weil die DSL "so komisch" ist.
Für Menschen, die visuell veranlagt sind, ist Blockly eine attraktive Alternative. Blockly generiert ebenfalls JavaScript. Der Vorteil ist aber, dass man im Editor jederzeit sehen kann, welche Befehle und Funktionen man überhaupt nutzen kann - das ist für Laien sicherlich ein wichtiges Argument.
Ansonsten als reiner DSL Code:
Code: Alles auswählen
rule "Zeitschaltuhr - dumm"
when
Time cron "0 * * * * ?" // minütlich
then
var Integer iSoll = 0
if(ZZBewaesserung_Links_Zeitschaltuhr_Minuten.state instanceof Number)
iSoll = (ZZBewaesserung_Links_Zeitschaltuhr_Minuten.state as Number).intValue
if(ZZBewaesserung_Links_Zeitschaltuhr_Stunden.state instanceof Number)
iSoll = iSoll + 60 * (ZZBewaesserung_Links_Zeitschaltuhr_Stunden^.state as Number).intValue
if(now.get(ChronoField.MINUTE_OF_DAY) == iSoll)
test.sendCommand(ON)
end
Die Rule schaut jede Minute nach, ob die eingestellte Zeit der aktuellen Zeit entspricht. Dabei verwendet sie allerdings die Minute des Tages, statt Stunde und Minute getrennt zu betrachten.
Leider steht .getMinuteOfDay in JavaTime nicht zur Verfügung, aber mit .get(ChronoField.MINUTE_OF_DAY) bekommt man das gleiche Ergebnis (und ChronoField bietet noch massig andere "speziellere" Formate an, ist also wesentlich potenter)
Aber auch das ist nicht wirklich elegant, es wird 60 * 24 pro Tag geprüft, ob eine bestimmte Zeit erreicht ist. Besser:
Code: Alles auswählen
// globale Variablen müssen vor der ersten Rule in der Datei definiert werden!
var Timer tWaterLeft = null
rule "Zeitschaltuhr - besser"
when
Item ZZBewaesserung_Links_Zeitschaltuhr_Minuten changed or // Minute geändert
Item ZZBewaesserung_Links_Zeitschaltuhr_Stunden changed or // Stunde geändert
Time is midnight // Mitternacht
then
var Integer iSoll = 0
if(ZZBewaesserung_Links_Zeitschaltuhr_Minuten.state instanceof Number)
iSoll = (ZZBewaesserung_Links_Zeitschaltuhr_Minuten.state as Number).intValue
if(ZZBewaesserung_Links_Zeitschaltuhr_Stunden.state instanceof Number)
iSoll = iSoll + 60 * (ZZBewaesserung_Links_Zeitschaltuhr_Stunden^.state as Number).intValue
if(test.state != ON) {
tWaterLeft?.cancel
tWaterLeft = createTimer(now.with(LocalTime.MIDNIGHT).plusMinutes(iSoll),[|
test.sendCommand(ON)
])
}
end
Die Rule triggert einmal täglich um Mitternacht, sowie falls jemand über die UI Änderungen an Minute und/oder Stunde vornimmt.
Die Rule liest wie gehabt die Werte als Minute des Tages aus und erstellt einen passenden Timer für den Tag, unter der Voraussetzung, dass gerade keine Bewässerung stattfindet. Im Schnitt wird die Rule also wesentlich seltener ausgeführt - dennoch wird die Bewässerung damit genauso zuverlässig funktionieren.
Weiterhin kann man sich überlegen, ob die Eingabe der Zeit über zwei Items noch zeitgemäß ist. Man kann sich da auch gut an mechanischen Zeitschaltuhren orientieren - auch dort kann meist nicht minutengenau ausgewählt werden, wann die Uhr schalten soll, je nach Modell gibt es vielleicht alle 15 Minuten eine Schaltmöglichkeit, es gibt sogar Wochenschaltuhren nach dem gleichen Prinzip, die dann nur alle zwei Stunden eine Schaltmöglichkeit bieten - entsprechend 84 Schaltreitern in einem Kreis angeordnet.
Im Grunde ist aber Bewässerung eine Funktion, die sich viel besser automatisieren lässt, als über Schaltuhren, die dann womöglich täglich manuell angepasst werden. Als Eckpunkte werden dabei dann Wetterdaten (Vorhersage, aktuelle Temperatur und Sonneneinstrahlung) sowie Bodenfeuchtesensoren herangezogen, meinetwegen auch das Datum und der Ferienkalender. Und vielleicht möchte man noch eine Option vorsehen, die Automatik zu deaktivieren, so dass der Beregner nicht die Gartenparty sprengt

Es gibt hier im Forum auch einige Beispiele, von simpel bis totally overengineered

Mit einer solchen Automation reduziert sich die Eingabe aber auf einen Schalter, eben Automatik An oder Aus.
Und je nach Menge der Regner kann sogar eine autarke Steuerung sinnvoll sein, z.B. mit openSprinkler, welches sich dann wieder in openHAB einbinden lässt (vor allem, um die Automatik zu deaktivieren...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet