,

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.

Homematic - Systemvaribalen

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“.

Nun können wir in jedem Programm, indem wir den Status der Fenster abfragen wollen, auf diese Variable zurück greifen. Wir fragen also nur „wie ist der Status der Variable“.

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“.

Homematic - Systemvariable anlegen

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.

Homematic - Übersicht Variablen

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.

Homematic - Programm Fenster offen

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.

Homematic - Fenster geschlossen Programm

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 ;-)

21 Kommentare
  1. Thorsten Rothe
    Thorsten Rothe sagte:

    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

    Antworten
  2. Bernhard
    Bernhard sagte:

    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.

    Antworten
    • Bernhard
      Bernhard sagte:

      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.

      Antworten
  3. Bernhard
    Bernhard sagte:

    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.

    Antworten
  4. Björn
    Björn sagte:

    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

    Antworten
  5. Dominik
    Dominik sagte:

    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.

    Antworten
  6. Mathias
    Mathias sagte:

    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.

    Antworten
    • Sebastian
      Sebastian sagte:

      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.

      Antworten
      • Mathias
        Mathias sagte:

        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

        Antworten
  7. Bartlos
    Bartlos sagte:

    Ist ja alles toll, ich bin ein totaler Neuling! Wozu braucht man das? Was macht diese Systemvariable eigentlich, bzw. wo wird die angezeigt?

    Antworten
  8. Ben
    Ben sagte:

    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?

    Antworten
  9. Heiko Bernhörster
    Heiko Bernhörster sagte:

    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

    Antworten
  10. Thorsten
    Thorsten sagte:

    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

    Antworten
      • Tobias
        Tobias sagte:

        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

        Antworten
  11. Ronny Pöthe
    Ronny Pöthe sagte:

    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.

    Antworten
    • Sebastian
      Sebastian sagte:

      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.

      Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert