Tageszeit setzen

Mit diesem kleinen Programm bekommt die CCU eine erweiterte Astro-Funktion, um nach Tageszeit Aktionen auszulösen

Die Astro-Funktion der CCU kann Aktionen „tagsüber“ oder „abends“ auslösen, wobei sie anhand des Datums und der geografischen Position die Zeitpunkte für Sonnenauf- und untergang verwendet. Sehr praktisch, aber etwas unflexibel: Es gibt nur „Tag“ oder „Nacht“. Auch die Programmierung über das Zeitmodul finde ich etwas unhandlich.

Mit dieser Anleitung wird eine neue Systemvariable Tageszeit gesetzt, die verschiedene Zustände für verschiedene Tageszeiten annehmen kann. Das zugehörige Programm setzt die Werte anhand der Astro-Funktion: Tagesbeginn und -ende werden weiterhin täglich individuell gesetzt, aber die Funktion kann jetzt noch mehr.

Neue Script-Funktionen

Mit Firmware 2.29.22 wurden neue Funktionen in der Scriptsprache der CCU eingeführt, die auf dieser Seite genutzt werden. Achten Sie darauf, als Logikschicht-Version in den Systemeinstellungen der CCU nicht „Legacy“ zu wählen.

Wenn Sie eine ältere Firmware verwenden oder als Logikschicht-Version „Legacy“ ausgewählt haben, werden Sie Script-Fehler angezeigt bekommen, wenn Sie diese Anleitung umsetzen. Die Programme werden nicht funktionieren.

Aktualisieren Sie die Firmware Ihrer CCU! Wählen Sie „Standard“ als Logikschicht-Version aus!

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Benennung von Systemvariablen

Prinzipiell kann man Systemvariablen – so wie allen Objekten in der CCU – beliebige Namen geben, also z. B. auch Umlaute und Sonderzeichen verwenden. Ich empfehle jedoch, sich auf reguläre Buchstaben (a-z, A-Z) zu beschränken: Bei Umlauten und Sonderzeichen besteht die Gefahr, dass Systemvariablen in Scripten nicht überall gefunden werden.

Geschichte, Mea culpa und Danksagung

Dieses Script ist eines der ersten, die ich für die CCU geschrieben und veröffentlicht habe. Das ist jetzt locker ein Jahrzehnt her.

Umso peinlicher, dass mehr als ein Jahrzehnt lang ein Fehler darin schlummerte, der die Mittagszeit falsch berechnete. Das ist erst im Februar 2021 einem aufmerksamen Leser aufgefallen. Danke dafür.

Diese Seite enthält nun also das neue, verbesserte Tageszeiten-Script. Die nächste Fehlerkorrektur dann gegen 2035.

Systemvariable anlegen

Zunächst muss eine Systemvariable angelegt werden (unter Einstellungen / Systemvariable). Die Variable wird später von unserem Programm gesetzt und kann dann von anderen Programmen als Auslöser oder Bedingung genutzt werden.

Der Name lautet Tageszeit, der Variablentyp ist Werteliste. Als Wertebezeichnung kann die folgende Liste kopiert werden:

Nacht; frühmorgens; Morgengauen; Vormittag; Mittag; Nachmittag; Dämmerung; Abend;

Mit OK wird die neue Systemvariable gespeichert.

Einfaches WebUI-Programm

Unter Programme und Verknüpfungen / Programme & Zentraleverknüpfungen wird nun ein neues WebUI-Programm angelegt.

Name und Beschreibung können frei vergeben werden. Als Bedingung wird Zeitsteuerung ausgewählt, anschließend kann rechts daneben das Zeitmodul aufgerufen werden.

Das Programm soll ganztägig laufen (oben im Fenster).

Als Serienmuster wird ein Zeitintervall von 5 Minuten ausgewählt. Es wären auch kürzere oder längere Zeitintervalle möglich – je kürzer, desto genauer wird die Astro-Funktion getroffen. Mir kommt es beim Sonnenaufgang nicht auf fünf Minuten an, also: 5 Minuten.

Die Gültigkeitsdauer ist „von jetzt bis in alle Ewigkeit“.

Mit OK geht es zurück zum WebUI-Programm. Dort wird unter „Dann … “ als Aktivität Script ausgewählt. Anschließend kann über den Button Script das folgende Script vollständig hineinkopiert werden:

! HomeMatic-Script
! TAGESZEIT SETZEN
! http://www.christian-luetgens.de/homematic/programmierung/allgemein/tageszeit/Tageszeit.htm

! Tageszeiten
!                        Tagesbeginn - 2 <04.00 Nacht
! Tagesbeginn - 2 <04.00 Tagesbeginn - 1        frühmorgens
! Tagesbeginn - 1        Tagesbeginn            Morgengrauen
! Tagesbeginn            Mittag - 1             Vormittag
! Mittag - 1             Mittag + 1             Mittag
! Mittag + 1             Tagesende              Nachmittag
! Tagesende              Tagesende + 1          Dämmerung
! Tagesende + 1          Tagesende + 2 >2200    Abend
! Tagesende + 2 >2200                           Nacht

real now = 
  (system.Date("%M").ToFloat() / 60) + system.Date("%H").ToFloat();
real c_tagesbeginn = 
  (system.SunriseTime("%M").ToFloat() / 60) + system.SunriseTime("%H").ToFloat();
real c_tagesende =  
  (system.SunsetTime("%M").ToFloat() / 60) + system.SunsetTime("%H").ToFloat();
real c_mittag = 0.5 * (c_tagesbeginn + c_tagesende);

integer i = 0; ! Nacht

if (now < (c_tagesende + 2.0).Max (22.0)) {
  i = 7; ! Abend
}

if (now < c_tagesende + 1.0) {
  i = 6; ! Abenddaemmerung
}

if (now < c_tagesende) {
  i = 5; ! Nachmittag
}

if (now < c_mittag + 1.0) {
  i = 4; ! Mittag
}

if (now < c_mittag - 1.0) {
  i = 3; ! Vormittag
}

if (now < c_tagesbeginn) {
  i = 2; ! Morgengrauen
}

if (now < c_tagesbeginn - 1.0) {
  i = 1; ! fruemorgens;
}

if (now < (c_tagesbeginn - 2.0).Min (4.0)) {
  i = 0; ! Nacht
}

object s_tageszeit = dom.GetObject("Tageszeit");
if (s_tageszeit.Value() != i) {
  s_tageszeit.State(i);
}

!  Ende des Scripts

Die Tabelle am Anfang des Scripts gibt eine Übersicht, wie die Bezeichnungen der Systemvariable Tageszeit der Uhrzeit zugeordnet werden. „Tagesbeginn“ und „Tagesende“ entsprechen der Astro-Funktion.

Als Beispiel: Der Wert Morgengrauen wird eine Stunde vor dem „tagsüber“ der Astrofunktion gesetzt. Wenn dann das „tagsüber“ der Astro-Funktion beginnt, wird der Wert Vormittag gesetzt.

Nach dem Speichern des Programms läuft die Funktion los und setzt ab jetzt die Systemvariable. Diese kann nun in eigenen Programmen verwendet werden. Zur Überprüfung kann man wieder unter Einstellungen / Systemvariable den Wert ablesen oder die Systemvariable unter Einstellungen / Benutzerverwaltung / Bearbeiten zur Startseite hinzufügen.

Beispiel

Zum Schluss noch ein Beispiel für ein Programm, das die neue Systemvariable Tageszeit verwendet.

Ich lasse tagsüber die Gartenbeleuchtung ausschalten. Was auch immer passiert, wer auch immer sie einschaltet: Die CCU schaltet sie tagsüber regelmäßig wieder aus, wenn Tageszeit ihren Zustand ändert.

Die Gartenbeleuchtung ist auch mein Anwendungsbeispiel für die Behebung von Funkstörungen.

Navigation