Automatische Rolladensteuerung mit openHAB, Zeitplan und Sonnensensor

4 Jahre lang war meine Heimautomatisierung auf FHEM aufgebaut und funktionierte recht gut. Einzig allein die Datenpflege und die UI war ein wenig “nervig” so dass ich mich Anfang 2022 dazu entschied auf openHAB zu migrieren. Ein der Kernfunktionen bei meiner Heimautomatisierung ist die automatische Rolladensteuerung mit openHAB. Diese arbeitet je nach Wohnbereich über einen Zeitplan, einen Sonnensensor oder eine Kombination der selbigen. Wie ich das ganze umgesetzt habe erfahrt Ihr hier.

Die technische Ausstattung

Unser Zuhause ist mit diversen Sensoren und Aktoren von den unterschiedlichsten Herstellern ausgestattet. Sowohl der hier notwendige Sonnensensor als auch die Steuerung der Rolläden wurde über Homematic-Komponenten umgesetzt. Der Bewegungsmelder HM-Sen-MDIR-O-2* ist für außen geeignet, läuft über Batterie und verfügt über einen Sonnensor. Dazu kommen noch die Schaltaktoren für die Steuerung der Rolläden* und das war es auch schon mit den Komponenten.

Die einzelnen Homematic-Komponenten sind über Homegear angebunden. Für die Verbindung zwischen dem Raspberry PI und den Komponenten setze ich auf das HM-MOD-RPI-PCB Modul*.

Grundkonfiguration in openHAB

Die nachfolgenden Scripte gehen davon aus, dass eine gewisse Grundkonfiguration vorliegt. Zum einen benötigten wir eine Gruppe in welcher alle zu steuernden Rolläden zusammengefasst sind. In meinem Fall trägt diese Gruppe den Namen ‘group_rolladen_wohnen‘. Dazu benötigen wir ein thing welches die die aktuelle Helligkeit des Sonnensensors verfügbar macht. In meinem Fall trägt dieses den Namen ‘HomematicBewegungsmelderEingangsbereich_Brightness‘.

automatische Rolladensteuerung mit openHAB – Konfigurationsoberfläche

Ich möchte mich im täglichen Gebrauch nicht in Scripten finden um Werte anzupassen sondern möchte selbige über eine brauchbare UI haben. Aus diesem Grund habe ich mir eine kleine UI gebaut welche die für mich notwendigen Parameter beinhaltet:

automatische Rolladensteuerung mit openHAB

Zum einen kann ich die Steuerung über einen globalen Switch aktivieren / deaktivieren. Als nächstes möchte ich gerne, dass die Rolläden unter der Woche zu anderen Zeiten und anderen Helligkeitswerten geschaltet werden können als am Wochenende. Auch möchte ich gerne eine Option haben den Helligkeitssensor zu deaktivieren und die Schaltung nur per Zeitplan zu steuern. Hierfür habe ich mir die folgenden items über die Datei ‘rolladensteuerung.items’ angelegt:

Switch		rolladenWohnEnabled				"Rolladensteuerung aktiv"			<switch>	(gRestoreOnStartup)

Switch		rolladenWohnSunEnabledWeek		"Helligkeitssteuerung aktiv"		<switch>	(gRestoreOnStartup)
DateTime	rolladenWohnWeekDown			"Zeit runter [%1$tH:%1$tM]"			<time>		(gRestoreOnStartup)
DateTime	rolladenWohnWeekUp				"Zeit hoch [%1$tH:%1$tM]"			<time>		(gRestoreOnStartup)
Number 		rolladenWohnSunThreshWeek 		"Helligkeitsgrenze [%d]"			<sun>		(gRestoreOnStartup)

Switch		rolladenWohnSunEnabledWeekend	"Helligkeitssteuerung aktiv"		<switch>	(gRestoreOnStartup)
DateTime	rolladenWohnWeekendDown			"Zeit runter [%1$tH:%1$tM]"			<time>		(gRestoreOnStartup)
DateTime	rolladenWohnWeekendUp			"Zeit hoch [%1$tH:%1$tM]"			<time>		(gRestoreOnStartup)
Number 		rolladenWohnSunThreshWeekend	"Helligkeitsgrenze [%d]"			<sun>		(gRestoreOnStartup)

String		rolladenWohnCurrentState		"Status"										(gRestoreOnStartup)

Alle Elemente aus der Konfiguration wurden der Gruppe ‘gRestoreOnStartup’ zugeordnet. Diese Gruppe ist bereits im Artikel openHAB Werte speichern und laden – Persistenz einführen erklärt und sorgt dafür, dass die konfigurierten Werte auch nach einem Systemneustart noch vorliegen. Die eigentliche Settings-Page habe ich mir über die Paper-UI über die Oberfläche “zusammengeklickt”. Die entsprechende yaml-Definition sieht wie folgt aus:

config:
  label: Steuerung Wohnbereich
  sidebar: false
blocks:
  - component: oh-block
    config: {}
    slots:
      default:
        - component: oh-grid-row
          config: {}
          slots:
            default:
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-toggle-card
                      config:
                        item: rolladenWohnEnabled
                        title: Rolladensteuerung aktiv
  - component: oh-block
    config:
      title: Konfiguration für Wochentage (Montag bis Freitag)
    slots:
      default:
        - component: oh-grid-row
          config: {}
          slots:
            default:
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-toggle-card
                      config:
                        item: rolladenWohnSunEnabledWeek
                        title: Helligkeitssteuerung
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        inputmode: text
                        item: rolladenWohnSunThreshWeek
                        outline: true
                        sendButton: true
                        title: Helligkeitsgrenze
                        type: number
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        footer: =items.rolladenWohnWeekUp.displayState
                        inputmode: text
                        item: rolladenWohnWeekUp
                        outline: true
                        placeholder: hh:mm:ss
                        sendButton: true
                        title: Rolladen hoch
                        type: time
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        footer: =items.rolladenWohnWeekDown.displayState
                        inputmode: text
                        item: rolladenWohnWeekDown
                        outline: true
                        placeholder: hh:mm:ss
                        sendButton: true
                        title: Rolladen runter
                        type: time
  - component: oh-block
    config:
      title: Konfiguration für Wochenende (Samstag + Sonntag)
    slots:
      default:
        - component: oh-grid-row
          config: {}
          slots:
            default:
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-toggle-card
                      config:
                        item: rolladenWohnSunEnabledWeekend
                        title: Helligkeitssteuerung
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        inputmode: text
                        item: rolladenWohnSunThreshWeekend
                        outline: true
                        sendButton: true
                        title: Helligkeitsgrenze
                        type: number
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        footer: =items.rolladenWohnWeekendUp.displayState
                        inputmode: text
                        item: rolladenWohnWeekendUp
                        outline: true
                        placeholder: hh:mm:ss
                        sendButton: true
                        title: Rolladen hoch
                        type: time
              - component: oh-grid-col
                config: {}
                slots:
                  default:
                    - component: oh-input-card
                      config:
                        clearButton: true
                        footer: =items.rolladenWohnWeekendDown.displayState
                        inputmode: text
                        item: rolladenWohnWeekendDown
                        outline: true
                        placeholder: hh:mm:ss
                        sendButton: true
                        title: Rolladen runter
                        type: time
masonry: null
grid: []
canvas: []

Rule zur automatischen Rolladensteuerung

Nachdem nun die Konfiguration über die UI verwaltet werden kann fehlt noch die Regel welche die eigentliche Steuerung durchführt. Natürlich könnte man nun auf die unterschiedlichsten Events hören und die Regel loslaufen lassen. Ich habe mich allerdings dazu entschieden dass es völlig genügt, wenn die Regel alle 5 Minuten prüft, ob sich etwas geändert hat. Somit basiert meine Regel auf einem Trigger per cron.

Anbei erstmal die Regel welche in der Datei ‘rolladensteuerung.rules’ abgelegt ist:

rule "Rolladensteuerung Wohnbereich"
when
	Time cron "0 */5 * * * *" // Prüfe alle 5 Minuten
then
	var usedGroup = group_rolladen_wohnen
	
	if (rolladenWohnEnabled.state == ON && !usedGroup.allMembers.isEmpty) {
		var isWeekend = (now.dayOfWeek.getValue() == 6) || (now.dayOfWeek.getValue() == 7)
		
		// get configuration values for current weekday
		var Boolean cfgUseSunLevel = false
		var Number cfgSunLevel = -1
		var cfgTimeUp = now
		var cfgTimeDown = now
		if (isWeekend) {
			cfgUseSunLevel = rolladenWohnSunEnabledWeekend.state == ON
			cfgSunLevel = rolladenWohnSunThreshWeekend.state
			cfgTimeUp = (rolladenWohnWeekendUp.state as DateTimeType).getZonedDateTime()
			cfgTimeDown = (rolladenWohnWeekendDown.state as DateTimeType).getZonedDateTime()
		} else  {
			cfgUseSunLevel = rolladenWohnSunEnabledWeek.state == ON
			cfgSunLevel = rolladenWohnSunThreshWeek.state
			cfgTimeUp = (rolladenWohnWeekUp.state as DateTimeType).getZonedDateTime()
			cfgTimeDown = (rolladenWohnWeekDown.state as DateTimeType).getZonedDateTime()
		}
		
		// check if should go down
		var Number aktuelleHelligkeit = HomematicBewegungsmelderEingangsbereich_Brightness.state
		if (cfgUseSunLevel && cfgSunLevel > -1 && aktuelleHelligkeit <= cfgSunLevel) {
			if (rolladenWohnCurrentState.state === null || rolladenWohnCurrentState.state != "DOWN") {
				rolladenWohnCurrentState.postUpdate("DOWN")
				logInfo("rules.automatic.rolladen", "Rolladensteuerung - Wohnbereich - runter - Helligkeitssensor")
				usedGroup.allMembers.filter( m | m.state != 100).forEach[ i | i.sendCommand(100) ]
			}
		} else if ((now.getHour == cfgTimeDown.getHour && now.getMinute >= cfgTimeDown.getMinute) || (now.getHour > cfgTimeDown.getHour)) {
			if (rolladenWohnCurrentState.state === null || rolladenWohnCurrentState.state != "DOWN") {
				rolladenWohnCurrentState.postUpdate("DOWN")
				logInfo("rules.automatic.rolladen", "Rolladensteuerung - Wohnbereich - runter")
				usedGroup.allMembers.filter( m | m.state != 100).forEach[ i | i.sendCommand(100) ]
			}
		} else if ((now.getHour == cfgTimeUp.getHour && now.getMinute >= cfgTimeUp.getMinute) || (now.getHour > cfgTimeUp.getHour && now.getHour <= cfgTimeDown.getHour)) {
			if (rolladenWohnCurrentState.state === null || rolladenWohnCurrentState.state != "UP") {
				rolladenWohnCurrentState.postUpdate("UP")
				logInfo("rules.automatic.rolladen", "Rolladensteuerung - Wohnbereich - hoch")
				usedGroup.allMembers.filter( m | m.state != 0).forEach[ i | i.sendCommand(0) ]
			}
		} 
	}
end

Die Regel scheint auf den ersten Blick vielleicht ein wenig abstrakt, hat sich aber in der Praxis bisher bewährt und funktioniert recht gut. Die hier vorgestellte Regel ist hier bei mir für 2 unterschiedliche Schaltzonen (Wohnen und Schlafen ) aktiv und arbeitet zuverlässig.

automatische Rolladensteuerung mit openHAB – Zusammenfassung

Prinzipiell ist die Anforderung der automatischen Steuerung der Rolläden mit openHAB recht einfach umzusetzen. Wie immer steckt der Teufel allerdings dann doch im Detail. Anfangs hatte ich z.B. auf den Status verzichtet was sich dann schnell rächte. Als meine Frau tagsüber den Rolladen herunterfuhr um auf dem TV etwas zu erkennen fuhr dieser 5 Minuten später wieder hoch. Fühlt sich erstmal komisch an, ist aber total logisch wenn man sich die Regel mal ohne die Speicherung des aktuellen Status vorstellt.

Inzwischen funktioniert die Steuerung wunderbar. Vielleicht hilft meine Dokumentation an dieser Stelle ja dem ein oder anderen Leser 🙂

Artikel teilen

This article was written by Thomas Schiffler

Alles was mit IT zu tun hat steht bei mir hoch im Kurs. Hierbei dreht sich vieles um Java, Python oder auch mal PHP. Unser Zuhause ist mit diversen Raspberry PIs ausgestattet mit welchen ich versuche unser Leben durch etwas Automatisierung ein wenig smarter zu gestalten. Hierbei möchte ich die Technik und die dahinter eingesetzten Tools / Frameworks verstehen und nicht einfach nur Anwenden. Ich selbst bezeichne mich als ITler aus Leidenschaft :) Seit 2020 ist das Thema Chatbot / Voicebot / Conversational.ai in meinen Focus gerückt. In diesem Bereich investiere ich gerade viel Zeit.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.