Zeitgesteuerte oder ereignisbasierte Aktionen auszuführen ist eine Grundfunktionalität von openHAB. Hierzu wird einfach eine Regel mit einem entsprechenden zeit- oder ereignisbasierenden Trigger angelegt und schon steht die gewünschte Automatik bereit und verrichtet ihre Aufgaben. Im Privathaushalt macht es z. B. durchaus Sinn, die Warmwasserzirkulation nur dann einzuschalten, wenn tatsächlich Warmwasser benötigt wird - in der Regel morgens nach dem Aufstehen bzw. abends vor dem Schlafengehen. Was aber, wenn die Automatik selbst aktiviert bzw. deaktiviert werden soll, weil man ein paar Tage verreisen möchte und sie erst wieder nach der Rückkehr benötigt wird?
In diesem Fall benötigen wir zum eigentlichen Item, welches das zu schaltende Gerät abbildet, nur ein weiteres Hilfsitem mit dem sich die Automatik aktivieren bzw. deaktivieren lässt. Wir definieren also in unserem items-File das entsprechende Geräte-Item, hier "Zirkulationspumpe" sowie das Hilfsitem für die Automatik, hier das Item "Zirkulationsautomatik" (das Hilfsitem muss nicht zwingend mit einem Binding verknüpft sein, allerdings hat das den Vorteil, dass sich nicht nur das eigentliche Gerät, sondern auch die Automatik über das angegebene Binding steuern lässt).
Switch Zirkulationsautomatik "Automatik" <clock> (Zirkulation) { knx="5/0/21" }
Switch Zirkulationspumpe "Pumpe" <heating> (KG_Werkstatt, Zirkulation) { knx="<5/1/0" }
Danach definieren wir die benötigten Regeln.
Zuerst legen wir fest, dass unsere Zirkulationsautomatik automatisch aktiviert werden soll, sobald openHAB gestartet wird:
rule "Zirkulationsautomatik einschalten"
when
System started
then
Zirkulationsautomatik.sendCommand(ON)
end
Dann definieren wir die Regeln, die zu den gewünschten Zeiten die Zirkulation einschalten bzw. ausschalten - allerdings nur dann, wenn tatsächlich auch die Automatik aktiviert ist:
rule "Zirkulation automatisch einschalten"
when
Time cron "0 0 6 ? * MON-FRI" or
Time cron "0 15 20 ? * MON-FRI" or
Time cron "0 0 7 ? * SAT-SUN" or
Time cron "0 0 18 ? * SAT-SUN"
then
if (Zirkulationsautomatik.state == ON) {
Zirkulationspumpe.sendCommand(ON)
}
end
rule "Zirkulation automatisch ausschalten"
when
Time cron "0 0 8 ? * MON-FRI" or
Time cron "0 0 22 ? * MON-FRI" or
Time cron "0 0 9 ? * SAT-SUN" or
Time cron "0 0 22 ? * SAT-SUN"
then
if (Zirkulationsautomatik.state == ON) {
Zirkulationspumpe.sendCommand(OFF)
}
end
Zu guter Letzt bietet es sich noch an, bei Deaktivierung der Automatik auch gleichzeitig eine eventuell laufende Zirkulationspumpe mit abzuschalten:
rule "Zirkulationsautomatik ausschalten"
when
Item Zirkulationsautomatik changed to OFF
then
Zirkulationspumpe.sendCommand(OFF)
end
Übrigens hat diese Methotik noch einen weiteren Vorteil: Egal, ob die Automatik aktiviert oder deaktiviert ist, manuell lässt sich die Zirkualtionspumpe immer ein- und ausschalten!
Der Vollständigkeit halber hier noch das komplette Rules-File.
zirkulationsautomatik.rules:
rule "Zirkulationsautomatik einschalten"
when
System started
then
Zirkulationsautomatik.sendCommand(ON)
end
rule "Zirkulation automatisch einschalten"
when
Time cron "0 0 6 ? * MON-FRI" or
Time cron "0 15 20 ? * MON-FRI" or
Time cron "0 0 7 ? * SAT-SUN" or
Time cron "0 0 18 ? * SAT-SUN"
then
if (Zirkulationsautomatik.state == ON) {
Zirkulationspumpe.sendCommand(ON)
}
end
rule "Zirkulation automatisch ausschalten"
when
Time cron "0 0 8 ? * MON-FRI" or
Time cron "0 0 22 ? * MON-FRI" or
Time cron "0 0 9 ? * SAT-SUN" or
Time cron "0 0 22 ? * SAT-SUN"
then
if (Zirkulationsautomatik.state == ON) {
Zirkulationspumpe.sendCommand(OFF)
}
end
rule "Zirkulationsautomatik ausschalten"
when
Item Zirkulationsautomatik changed to OFF
then
Zirkulationspumpe.sendCommand(OFF)
end