Alle Heizkörper hier im Haus sind mit Homematic IP Heizkörperthermostaten ausgestattet welche über die CCU3 Zentrale gesteuert wurden. Nachdem die gesamte Steuerung hier über openHab durchgeführt wird war es im Winter 2023 an der Zeit die Systeme zu vereinen. Hier seht Ihr wie ich die Heizungssteuerung mit openHab auf Basis des Google Kalenders umgesetzt habe.
openHab Zeitsteuerung über den Google Kalender?
OpenHab ist aus meiner Sicht ein echt einfaches System zur Heimautomatisierung. Wenn es allerdings um das Thema Zeitsteuerung geht ist hier wirklich Nachholbedarf. Es existiert keine einfache Möglichkeit um flexibel Geräte zu unterschiedlichen Zeiten mit eigenen Befehlen zu versorgen.
Durch den Einsatz des iCalendar Bindings und ein paar Zeilen Code ist es mir gelungen die Steuerung der Heizung über den Kalender umzusetzen.
Das Screenshot hier zeigt, wie der aktuelle Wochenplan aussieht. Im Gegensatz zu so manch andere Lösung die man im Internet so findet habe ich mich dafür entschieden nur Statusänderungen im Kalender zu hinterlegen und auf diese Events per Script zu reagieren.
Jeder Kalendereintrag steht also für eine gewünschte Änderung der Temperatur am Thermostat. Somit können flexibel alle Räume zu unterschiedlichen Zeiten nach meinen Wünschen gesteuert werden.
eigenen Kalender anlegen
Im ersten Schritt habe ich in meinem bestehenden Kalender einen neuen Kalender nur für die Steuerung meiner Heizung angelegt. Immerhin möchte ich die Einträge zur Steuerung nicht in meinem normalen Kalender sehen und getrennt verwalten. Dies funktioniert recht einfach über diesen Link.
Wir geben dem Kalender einen Namen, die gewünschte Zeitzone und speichern diesen. Für die Einbindung in das Binding benötigen wird nur die iCal Adresse. Hierfür gibt es im unteren Bereich eine “Privatadresse im iCal-Format” welche über das entsprechende Kopieren-Icon in die Zwischenablage kopiert werden kann.
iCalendar Binding installieren und Kalender verbinden
Nachdem wir das iCalendar Binding in openHab installiert haben legen wir ein neues Item vom Typ “Kalender” an. Dieses Binding dient den späteren Filtern als Gateway und stellt die Verbindung zwischen openHab und dem Kalender her.
Ins Feld ‘URL’ tragen wir die URL ein, welche wir uns im vorherigen Schritt kopiert haben. Der Aktualisierungsintervall kann ruhig etwas länger sein, in meinem Fall sind es 30 Minuten. Dies bedeutet so viel wie dass das Plugin alle 30 Minuten nach neuen Terminen im Kalender schaut und diese herunterlädt.
Nach dem Speichern ist das Plugin auch schon fertig konfiguriert und die Kalendereinträge werden heruntergeladen.
Schön, doch was nun? Wir haben nun einen Google Kalender in welchen wir Termine einstellen können. Dazu ein Binding welches dafür sorgt, dass diese Termine nach openHab geladen werden. Damit nun die einzelnen Räume gesteuert werden müssen benötigen wir noch ein wenig Konfiguration für jeden einzelnen Raum …
openHab iCalendar Filter verwenden um Räume zu steuern
Um die Heizungssteuerung mit openHab umzusetzen habe ich mir im ersten Schritt Überlegt, wie ich meine Kalendereinträge gestalten möchte. Um es möglichst einfach zu halten habe ich mich dazu entschieden, je Verändungsevent einen Kalendereintrag zu erstellen. Wenn ich also z.B. im Büro die Heizung morgens um 6:30 Uhr auf 21 Grad stellen möchte und am Nachmittag um 17 Uhr wieder auf 17 Grad dann benötige ich hierfür 2 Kalendereinträge. Ich nutze hierbei den Titel des Kalendereintrages und hinterlege hier den Raum sowie die gewünschte Temperatur. Ein Eintrag mit dem Titel ‘Büro: 21’ sorgt dafür, dass das Thermostat im Büro auf 21 Grad, ein Titel ‘Büro: 17’ dass das Büro auf 17 Grad geändert wird.
Um die Kalendereinträge des eines Raumes in openHab verfügbar zu haben, habe ich mir je Raum ein Item vom Typ icalendar:eventfilter angelegt.
Der Filter selbst nutzt als Bridge das zuvor angelegte Item vom Typ “Kalender”. Die Anzahl Kalendereinträge habe ich mit 1 und den Aktualisierungsinterval mit 15 Minuten definiert. Der Filter selbst wurde als Textbasierter Filter auf Basis des Betreff / Title angelegt. Der Suchausdruck entspricht in meinem Fall dem Raumname, hier also ‘Büro’ als Text.
Diese Konfiguration sorgt dafür, dass im neu angelegten Item 3 Channels angelegt werden. Diese Channels beinhalten die Daten des nächsten Kalendereintrages mit den Werte Startzeit, Endezeit und Titel.
Diese Channels lege ich mir als Points in meinem Model in den jeweiligen Raum. Das ist zwar nicht zwingend notwendig, erleichtert mir aber die Übersicht und die mögliche Fehlersuche.
Wichtig: An dieser Stelle unbedingt auf die Namensnotation achten. Das Script erwartet den Prefix ‘Calendar_Events__’ gefolgt vom Raumname mit dem Suffix ‘_Titel’ und ‘_Start’.
Dieses Vorgehen muss nun für jeden Raum den ich steuern möchte dupliziert werden. Sprich für jeden Raum benötige ich einen eventfilter und die entsprechenden Points im Model damit das nachfolgende Script funktioniert.
Heizungssteuerung mit openHab – das Script
Nachdem die Vorarbeiten nun erledigt sind benötigt es noch ein kleines Script (Rule) welches die Werte der jeweiligen Räume abruft und die Änderungen an den Thermostaten durchführt. Ich habe mich hierbei für einen cronjob entschieden welcher jede Minute läuft und die Werte überprüft:
import java.time.format.DateTimeFormatter
import org.openhab.core.model.script.ScriptServiceUtil
rule "Heizungssteuerung - cron"
when
Time cron "5 * * * * ?"
then
val roomList = newArrayList('Buro', 'Wohnzimmer', 'Bad_EG', 'Kinderzimmer', 'Schlafzimmer', 'Kueche')
roomList.forEach[ itemName |
if (itemName != "") {
var itemToManage = "Heizung__" + itemName + "_Set_Temperature"
var calValue = "Calendar_Events__" + itemName + "_Titel"
var calStart = "Calendar_Events__" + itemName + "_Start"
var newValue = ScriptServiceUtil.getItemRegistry.getItem(calValue).getState.toString
if (newValue != "UNDEF") {
newValue = newValue.substring(newValue.indexOf(" ")).trim
var currentValue = ScriptServiceUtil.getItemRegistry.getItem(itemToManage).getState.toString
currentValue = currentValue.substring(0, currentValue.indexOf(" "))
var currentStart = ScriptServiceUtil.getItemRegistry.getItem(calStart).getStateAs(DateTimeType).zonedDateTime.withZoneSameInstant((new DateTimeType).zonedDateTime.getZone).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"))
if (currentStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm")) == now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm"))) {
logInfo("Heizungssteuerung", "neue Temperatur " + itemToManage + "= " + newValue)
sendCommand(itemToManage, newValue)
}
}
}
]
end
Das Script läuft alle 5 Minuten. Hierbei durchläuft es in einer Schleife alle definierten Räume und prüft, ob eine neue Temperatur eingestellt werden soll. Wichtig ist hierbei die bereits erwähnte Namensnotation der Items. Im ersten Schritt wird geprüft, ob ein neuer Wert eingestellt werden soll. Falls dies der Fall ist prüfen wir ob die aktuelle Uhrzeit der gewünschten Uhrzeit entspricht. Falls auch dieses Kriterium zutrifft setzen wir den entsprechenden Wert am Heizkörperthermostat über den sendCommand Befehl.
Zeisteuerung in openHab mit dem Google Calendar – Fazit
Anfangs dreht ich mich ein wenig im Kreis bis ich die Funktionen der einzelnen Bindings im Detail verstanden hatte und mich langsam dem gewünschten Ziel näherte. Inzwischen läuft die Heizungssteuerung mit openHab über die Homematic IP Komponenten sehr verlässlich. Durch die Planung über meinen Kalender kann ich quasi nebenbei die Zeitpläne von überall aus bearbeiten und bin sehr flexibel geworden.