vor vielen Monden habe ich mit großer Unterstützung eine Regel zur Steuerung der Gardena Ventile in openHAB eingebaut.
Hintergrund ist das Vorhandensein einer Regenwasserpumpe und somit ein überschneiden der Ventile von 10 Skunden um ein unnötiges ab- und einschalten der Pumpe zu verhindern.
Dies funktioniert auch im Grundsatz, inkl. der Option zum manuellen starten und beenden der Bewässerung.
Daher habe ich die bei meinem Code nur die Rule und keine Items/Variablen angegeben
Code: Alles auswählen
rule GreenIrrigation
when
Time cron "0 05 06 ? * MON-SAT" or
Time cron "0 30 06 ? * SUN" or
Item Sw_ManIrrigation received command
then
val actions = getActions("pushover", "pushover:pushover-account:account")
if(receivedCommand == OFF) { // OFF-Teil
tWater?.cancel // timer beenden, falls vorhanden
tWater = null // Zeiger löschen
gVentStop.members.forEach[ v | v.sendCommand(ON)] // und alle Ventile schließen
myIrrigationSwitchVis.postUpdate(ON) // aktiviere manuellen Start Button
actions.sendMessageToDevice("J", "Bewässerung manuell um " + OffsetDateTime.now().toString + " beendet.", "Gardena")
return;
} else if((Sensor_SoilHumidity.state as Number).intValue > (Sensor_Level.state as Number)) { // exit, wenn Bodenfeuchtigkeit über definierter Grenze //OFF-Teil
logInfo("Gardena", "Bewässerung Start abgebrochen, da Bodenfeuchte mit {} ausreichend!", Sensor_SoilHumidity.state.toString)
actions.sendMessageToDevice("J", "Start der Bewässerung abgebrochen, da Bodenfeuchtigkeit mit " + Sensor_SoilHumidity.state + " ausreichend ist.", "Gardena")
return;
} else if(Sw_Bewaesserung.state == OFF && receivedCommand != ON) { // exit, wenn Automatik aus und nicht manuell bewässert
logInfo("Gardena", "Bewässerungsautomatik nicht aktiv")
actions.sendMessageToDevice("J", "Bewässerungsautomatik nicht aktiv.", "Gardena")
return;
} else if(Holiday.state == ON && receivedCommand != ON) { // exit, wenn Feiertag und nicht bewusst manuell gestartet
logInfo("Gardena", "Bewässerung Start abgebrochen, heute ist: {}", TodayIs.state)
actions.sendMessageToDevice("J", "Automatische Bewässerung aufgrund "+ TodayIs + " beendet.", "Gardena")
return;
} else {
if(receivedCommand == ON) { // manueller Start
logInfo("Gardena", "Manuelle Bewässerung - Start.")
actions.sendMessageToDevice("J", "Bewässerung manuell um " + OffsetDateTime.now().toString + " gestartet.", "Gardena")
} else if(Sw_Bewaesserung.state == ON) { // automatischer Start
logInfo("Gardena", "Automatische Bewässerung - Start.")
actions.sendMessageToDevice("J", "Bodenfeuchtigkeit bei " + Sensor_SoilHumidity.state + ", automatische Bewässerung gestartet.", "Gardena")
} else {
logInfo("Gardena", "Bewässerung Start unvorhergesehen abgebrochen!")
myIrrigationSwitchVis.postUpdate(ON) // nur zur Sicherheit, sollte eigentlich ON sein
gVentStop.members.forEach[ v | v.sendCommand(ON)] // und alle Ventile schließen
return; // der nachfolgende Code soll nicht durchlaufen werden.
}
// Beregnungsroutine starten
myIrrigationSwitchVis.postUpdate(OFF)
iWater = 0 // Zähler mit 0 initialisieren
tWater = createTimer(now, [ | // timer mit code initialisieren und ausführen
var Number nTime = 10 // Default Einschaltzeit definieren
iWater = iWater +1 // Zähler erhöhen
var gVent = gVentile.members.filter[ i | i.name.contains(iWater.toString)] // Ventil bestimmen
var gTime = gVentTimer.members.filter[ i | i.name.contains(iWater.toString)] // Zeit bestimmen
actions.sendMessageToDevice("J", "gVent Size:" + gVent.size.toString + "gVent.head:" + gVent.head.toString, "Gardena")
if(gTime.size > 0) { // Zeit existiert
if(gTime.head.state instanceof Number) // und ist eine gültige Zahl
nTime = gTime.head.state as Number // Defaultwert überschreiben
if(gVent.size > 0) { // Ventil existiert
if(gVentEnable.members.filter[ i | i.name.contains(iWater.toString)].head.state == ON) { // und soll aktiviert werden
gVent.head.sendCommand(nTime) // Gardena Timer setzen
gVentStart.members.filter[ s | s.name.contains(iWater.toString)].head.sendCommand(ON)
actions.sendMessageToDevice("J", "Starte Bewässerung von " + gVent.head.label + " für " + nTime + " Minuten.", "Gardena")
if (gVent.head.label == "Hecke" && Sw_TerrasseIrrigation.state == ON) {
if (nTime <= (WC_Valve_Cmd_Duration.state as Number).intValue) {
WC_Valve_Cmd_Duration.sendCommand(nTime.intValue)
actions.sendMessageToDevice("J", "Dauer für Terrasse an Hecke angeglichen: " + nTime + " Minuten.", "Gardena")
}
WC_Valve_Cmd_Start.sendCommand(ON)
actions.sendMessageToDevice("J", "Starte Bewässerung der Terrasse für " + WC_Valve_Cmd_Duration.state + " Minuten.", "Gardena")
} else if (gVent.head.label == "Hecke" && Sw_TerrasseIrrigation.state == OFF) {
actions.sendMessageToDevice("J", "Terrasse nicht aktiviert.", "Gardena")
}
tWater.reschedule(now.plusMinutes(nTime.intValue).minusSeconds(10)) // und 10 Sekunden vor Ablauf Gardena Timer nächster Schritt
} else {
tWater.reschedule(now.plusSeconds(5)) //falls Ventil inaktiv aber Wert gesetzt
}
} else { // kein weiterer Timer vorhanden, also
tWater = null // Zeiger löschen
gVentStop.members.forEach[ v | v.sendCommand(ON)] // und alle Ventile schließen
myIrrigationSwitchVis.postUpdate(ON)
actions.sendMessageToDevice("J", "Automatische Bewässerung beendet: " + now.toString, "Gardena")
}
}
])
}
end
Hat jemand eine Idee dazu, dies hier mit einzubauen? Evtl. mit Timer.hasTerminated oder Timer.isRunning??
Im Moment habe ich aber noch keine Idee, wo ich dies einbauen müsste :-/