Homematic: Systemvariablen erstellen und nutzen
Wir haben Euch schon sehr viel über die verschiedenen Sensoren und Aktoren für Homematic berichtet, heute haben wir ein Software-Thema. Vielleicht seid Ihr schon selbst über den Menüpunkt „Systemvariable“ gestolpert. Was diese sind und wofür man die Variablen gebrauchen kann, werde ich Euch in diesem Tutorial zeigen.
Systemvariablen dienen dazu, unterschiedliche Parameter, die Ihr global in Eurer Programmierung nutzen wollt, abzubilden. Das hört sich erstmal kompliziert an, ist es aber eigentlich nicht. An einem einfachen Beispiel wird dies schnell klar. Angenommen, wir wollen in unterschiedlichen Programmen überprüfen, ob alle Fenster geschlossen sind. Dann müssten wir normalerweise in jedem Programm jeden Fenstersensor separat auf dessen Zustand überprüfen. Das ist nicht nur sehr aufwändig, sonder verbracht auch viel Rechenleistung der CCU2. Außerdem ist es bei dieser Vorgehensweise sehr aufwändig, neue Fenstersensoren hinzuzufügen, da diese dann in jedem Programm hinzugefügt werden müssen.
Besser löst man dieses Problem mit einer Systemvariable. Wir bauen nur ein Programm, das den Zustand unserer Aufgabe in einer Systemvariable ablegt.
Sollte ein Fenster offen sein, wir die Variable auf „true“ gesetzt. Sollten alle Fenster geschlossen sein, wir die Variable vom Programm auf „false“ gesetzt. Die CCU2 bietet zudem die Möglichkeit „true“ und „false“ selbst zu benennen. Also verwenden wir an dieser Stelle „Fenster offen“ und „Fenster zu“.
So können wir auch komplexe Zusammenhänge sehr einfach abbilden. In diesem Tutorial zeige ich Euch, welche Möglichkeiten Ihr noch bei Systemvariablen habt.
Um Euch den Zusammenhang praktisch zu erklären, fangen wir mit einem kleinen Programm an, das bei mir Zuhause Anwendung findet. Mich interessiert der Zustand der Fenster im oberen und auch im unteren Geschoss, daher habe ich zwei Gruppen gebildet.
Anlegen einer Variablen:
Damit wir die Variablen später in einem Programm nutzen können, müssen wir diese zuerst anlegen. Dazu navigieren wir im Menü auf „Einstellungen“ –> „Systemvariable“.
Dort klicken wir auf die Schaltfläche „Neu“. Es öffnet sich ein neues Fenster. Hier kann der Name der Variable festgelegt werden. In unserem Beispiel benutze ich den Namen „Status Fenster oben“. Bei der Beschreibung könnt Ihr Euch Notizen machen, damit Ihr später noch nachvollziehen könnt, wofür die Variable angelegt worden ist. Bei Typ verwenden wir Logikwert.
Die anderen Datentypen benötigen wir aktuell noch nicht. Wir können nun noch die beiden Zustände benennen. Ich habe dafür „offen“ bei wahr und „geschlossen“ bei falsch eingetragen.
In der Übersicht ist nun die neue Variable zu sehen. Diese kann ab jetzt in jedem Programm genutzt werden. Um die neue Variable mit leben zu füllen, wollen wir diese auch mit Werten beschreiben.
Dazu legen wir ein neues Programm an. Dazu navigieren wir zu „Programme und Verknüpfungen“ –> „Programme und Zentralenverknüpfung“. Über die Schaltfläche „Neu“ können wir ein neues Programm erzeugen.
Bei diesem Beispiel will ich alle Fenstersensoren, die sich in der oberen Etage befinden abfragen und den Status dann in die neue Variable schreiben.
Ich habe 3 Fenstersensoren, die ich in der 1. Etage überprüfen will, da ich nur wissen will, ob einer dieser Sensoren offen ist, verknüpfe ich alle Abfragen mit einem „ODER“.
Der Aufbau des Programms sieht wie folgt aus:
Wenn…
Das Badezimmerfesnter offen ist
ODER
Das Schlafzimmerfenster rechts offen ist
ODER
Das Schlafzimmerfenster links offen ist
DANN setze die Systemvariable sofort auf offen.
Es können natürlich auch andere Sensoren abgefragt werden. Wichtig ist auch der Punkt „bei Änderung auslösen“. Die CCU2 benötigt immer einen „Trigger“ also einen Auslöser um ein Programm zu starten. Daher ist es wichtig an dieser Stelle mit dem Parameter „bei Änderung auslösen“ zu arbeiten.
Wir benötigen nun ein weiteres Programm um die Variable wieder auf den Zustand „geschlossen“ zu setzen. Dieses vorgehen ist leider etwas komplizierter. Wir müssen zusätzlich abfangen, dass ja mehrere Fenster gleichzeitig geöffnet sind. Würden wir das gleiche Programm wie für den Zustand „offen“ verwenden, würde die Variabel beim Schließen eines Fenster direkt auf „geschlossen“ gesetzt werden, obwohl noch ein weiteres Fenster offen ist.
Aber auch das ist recht einfach zu erledigen. Wir überprüfen wieder wie oben jedes Fenster einzeln, zusätzlich wird aber auch noch überprüft, ob die anderen Fenster geschlossen sind. Das sehr Ihr im oberen Bild. Hier haben wir jeweils einen Trigger, dieser überprüft dann den Status der anderen Fenster.
Ein Beispiel: Wir das Badezimmerfenster geschlossen, muss natürlich noch überprüft werden, ob auch beide Schlafzimmerfenster geschlossen sind (nur prüfen). Sollte dies der Fall sein, wird die Variable auf „geschlossen“ gesetzt.
Schlägt die Überprüfung fehl, weil noch ein weiteres Fenster offen ist, bleibt die Variable auf dem Status „offen“ stehen. Diesen Trigger und die gleichzeitige Überprüfung der anderen Fenster habe ich für jeden Fall erstellt.
So könnt Ihr sicher sein, dass die Variabel nicht auf geschlossen gesetzt wird, wenn noch ein Fenster offen ist.
Falls Ihr eine elegantere Idee für diesen Fall habt, könnt Ihr mir diese sehr gerne mitteilen ;-)
Moin Sebastian,
das hat sehr gut funktioniert.
ich habe aber 2 Variablen, in die die gleichen Fenster geschlossen und offen schreiben soll, in der zweiten variable soll jedoch die Meldung offen um 3 Minuten verzögert kommen, da ich mit der Variable die Klimaanlage ausschalten will wenn jemand vergessen hat das Fenster zu schließen.
Leider bleibt in der einen Variable der Zustand immer aus offen?
Wo liegt da das Problem?
Beste Grüße
Thorsten
Hi,
jetzt habe ich doch noch eine Frage:
Ich würde gerne (in der WebUI programmiert) eine Systemvariable nutzen, um den Öffnungsgrad eines Rolladenaktor zu setzen. Die Öffnung ist in Prozent angegeben, die Zahl-Variable kann aber nur 0-100. Wahrscheinlich brauche ich aber 0.0-1.0, um die Prozente abzubilden.
Gibt es da einen Trick, wie ich das umrechnen kann.
Hi,
konnte das Problemchen lösen.
Nachdem ich das mit Hilfe Deiner Schnipsel in Scriptprogrammierung versucht habe und mir die Werte für :1.LEVEL ausgegeben liess, habe ich gesehen, dass ich da eine Zeichenketten-Variable verwenden muss.
Die kann 0.00 bis 1.00 annehmen und dann fährt der Aktor an die richtige Stelle.
Hi Sebastian,
ganz anderer Ansatz, wenn es nur darum geht, ob irgendein Fenster noch offen ist:
Beim Öffnen eines Fenster eine Zahl-Variable um +1 erhöhen, beim Schliessen 1 abziehen.
Wenn die Variable wieder den Ausgangszustand 0 hat, sind alle Fenster zu.
Hallo Sebastian,
vielen Dank für den Artikel, sehr interessant. Irgendwie stehe ich aber gerade auf dem Schlauch bei dem zweiten Programm. Könnte es nicht auf drei Bedingungen reduziert werden? Also:
WENN
Fenster oben GESCHLOSSEN bei Änderung
UND
Fenster links GESCHLOSSEN bei Änderung
UND
Fenster rechts GESCHLOSSEN bei Änderung
DANN
…
Nach meinem Verständnis braucht es ja nur genau einen Trigger, um das ganze Programm von oben nach unten zu durchlaufen. Damit würde EINER der drei Sensoren das Programm triggern, aber trotzdem ALLE Bedingungen geprüft und nur wenn ALLE Fenster zu sind wird der dann-Teil ausgeführt. Ist meine Sichtweise da falsch? Und wo ist mein Fehler?
Liebe Grüße
Björn
Hallo
das geht auch direkt im gleichen Programm. Einfach Sonst wenn, alle Sensoren geschlossen mit oder verknüpft und schon geht die Variable auf geschlossen.
gähn……. Nun muß mich mein Handy rausholen, um zu sehen, dass ein Fenster offen ist. Welches, bleibt ein Geheimnis.
dann bleibe ich doch lieber bei meinem IObroker und der Visualisierung auf meinem Wandtablet. Ein Blick reich aus, und ich sehe sogar, welches Fenster offen ist, die Temperaturen in allen Zimmern, welches Licht an ist, ob der interne Alarmkreis scharf ist usw, usw…………
ach ja, ohne Werbung betreiben zu wollen, ich kann meinen Staubsauger-Roboter, meinen Wasser- und Stromverbrauch und Sprachsteuerung mit Alexa einbinden.
Hey Mathias, hört sich alles klasse an. Bedenke aber bitte auch, dass nicht jeder so tief in das Thema einsteigen will/kann. Daher sind solche einfachen Lösungen für viele ausreichend.
Hi Sebastian,
da hast Du schon recht, aber wenn ich meinen selbstgebastelten „Einbruchmelder“ scharf schalten will, muß ich schon wissen, welches Fenster als offen angezeigt wird.
Sonst schaltet die Anlage eben nicht scharf. Das heißt, ich muß jedes Fenster oder Türe öffnen und wieder schließen, weil das Fenster in Wahrheit zu, jedoch als offen angezeigt wird.
Gruß,
Mathias
Sehe ich auch so.
Ich teste gerade ob ich das Programm nutzen kann um den Rolldane bei offenen Fenster zu sperren
Ist ja alles toll, ich bin ein totaler Neuling! Wozu braucht man das? Was macht diese Systemvariable eigentlich, bzw. wo wird die angezeigt?
Hi Sebastian,
danke für die Anleitung! Ich habe diese Anweisungen auch so umgesetzt aber dabei folgendes Problem: Obwohl der Türsensor von geschlossen auf offen and ei CCU signalisiert (Status in der Geräteliste wird auch als „offen“ von vorher „geschlossen“ angezeigt“) wird die Systemvariable nicht auf „offen“ gesetzt sondern bleibt unverändert bei „geschlossen“.
Hast du eine Idee, was der Fehler sein könnte?
uhoh, nevermind…restarts bewirken Wunder :P
…top ;-) das wäre auch mein 1. Tipp gewesen!
Meine Lösung ist bis her sehr ähnlich, da ich habe ein Fenster und eine Tür abfrage, bin ich auf der Suche nach einer Verzögerung. D.h. nur wenn die Tür mind. 5 Minuten offen ist, soll diese als geöffnet gelten. Ich steuere darüber einen Heizungsthermostat und er soll ja nicht bei jedem Betreten des Raums (Badezimmer) kurz zufahren und sofort wieder aufgehen…
Gibt es dafür auch eine Lösung?
Heiko
Hallo Sebastian,
kleiner Tipp, um die Anzahl Deiner Programme gering zu halten.
Erweitere einfach das erste Programm um folgendes:
sonst – Systemzustand – Fenster oben geschlossen.
Sollte also keine der von Dir abgefragten Bedingungen zutreffen, wird damit die Variable automatisch auf „Fenster oben geschlossen“ gesetzt.
Du ersparst Dir damit das zweite Programm.
Außerdem könntest Du das Programm zusätzlich erweitern und als nächstes „sonst wenn“ auswählen und darunter Deine Fenster unten abfragen, die entsprechende Variable setzen und dann auch mit „sonst“ wieder auf geschlossen setzen, wenn alle Fenster geschlossen sind.
Du hättest nur mehr 1, anstelle von 4 Programmen.
Ich arbeite mit all meinem Variablen so, dass ich nur bestimmte Zustände überprüfe, um eine Variable auf einen Wert zu setzen. Sobald keine der geforderten Bedingungen zutrifft, werden sie automatisch wieder auf den anderen Wert gesetzt.
Somit hab ich anstelle von rund 120 Programmen nur mehr etwa 35 und das erleichtert mir nicht nur das Management, sondern schont auch die Ressourcen meiner CCU.
Liebe Grüße,
Thorsten
Hall Thorsten, vielen Dank für den konstruktiven Hinweis! Ich werde das mal bei mir im Programm ändern. Danke!
Hallo Sebastian, wenn der Hinweis von Thorsten von dir geprüft und bei dir geändert wurde, wäre es schön, wenn du diesen Hinweis auch in den Artikel übernehmen bzw. einarbeiten würdest ;-)
Danke :)
Grüße
Kannst du das bitte noch auf deiner Webseite aktualisieren?
Vielleicht ist es dann für mich verständlicher
Sie schreiben Diesen Trigger und die gleichzeitige Überprüfung der anderen Fenster habe ich für jeden Fall erstellt. Was genau ist damit gemeint? Für jedes Fenster oder für jedes Programm? Für ihre Antwort danke ich im Voraus.
Hallo,
ich trigger in jedem Programm, wo ich den Status benötige auf eine Änderung. Wird nun ein Fenster geöffnet, überprüft das Programm, das auf den Status zugreifen will, welchen Wert die Systemvariable gerade hat.