Code Schnipsel – Homematic Skript – Systemvariablen anlegen und löschen
Unter der Rubrik Code Schnipsel möchten wir hier zukünftig eigene, sowie nützliche Skripte anderer Autoren vorstellen und beschreiben. Dies soll allen HomeMatic Anwendern helfen bestimmte Funktionen oder Lösungen, welche über WebUI Konsolen Programme nicht möglich sind, mit Scripten umzusetzen. Das Ganze soll keine Unterweisung in der HomeMatic Skript Sprache darstellen, sondern vielmehr euch anhand von Fallbeispielen, Lösungen an die Hand zu geben und diese detailiert zu beschreiben. Natürlich werde ich in den Artikeln die Autoren nennen und auf die entsprechenden Seiten verlinken. Damit ist dann sichergestellt, das jeweils die aktuellste Version geladen werden kann. Außerdem wollen wir uns hier nicht mit fremden Federn schmücken. Ehre wem Ehre gebührt. Wenn ihr selbst Projekte über Skripte realisiert habt, welche ihr gerne anderen Usern zur Verfügung stellen möchtet, schreibt mich an und wir werden nach entsprechender Abstimmung gerne darüber berichten.
Use Cases
In diesem ersten Artikel möchte ich euch ein Skript vorstellen, mit dem ihr Systemvariablen anlegen könnt und wenn erforderlich, auch wieder über Skript löschen könnt. Dieses Skript habe ich in Teilen an diversen Stellen im Netz gefunden. Daher ist kein eindeutiger Urheber feststellbar und wir informieren euch ohne diese Angabe über das Skript. Es kann ich vielen Fällen sehr hilfreich sein, die in einem Skript benötigten Systemvariablen auch über Skript zu definieren und wenn sie nicht mehr benötigt werden, auch wieder über ein Skript zu löschen. Im Artikel zeige ich euch, wie ihr Systemvariablen mit unterschiedlichen Variablentypen via Skript erstellen könnt und mit einem initialen Wert füllen könnt. In Summe sind es dann doch fünf Skripte geworden. Vier zum Anlegen von Systemvariablen verschiedener Typen und eines zum Löschen von Systemvariablen.
Allgemeines zu Systemvariablen
Systemvariablen sind die Zustandsspeicher (Merker) des Homematic Systems, die z. B. für die Unterscheidung von Zuständen (z. B. Automatik/Manuell) benötigt werden. Es gibt unterschiedliche Variablentypen, die folgendermaßen verwendet werden können:
- Logikwert: Dieser Variablentyp kann 2 Werte annehmen (true/false), wobei der Text frei vergeben werden kann (z. B. Automatik/Manuell).
- Werteliste: Dieser Variablentyp kann eine Liste von Werten annehmen, die durch ein Semikolon getrennt werden. Die Variable kann dann auf einen der Werte in dieser Liste gesetzt werden (z. B. Frühling; Sommer; Herbst; Winter).
- Zahl: Dieser Variablentyp kann positive und negative Zahlenwerte annehmen (z. B. Temperaturwerte werden in diesen Variablentyp geschrieben).
- Zeichenkette: Dieser Variablentyp kann einen beliebigen Text (String) annehmen.
- Alarm: Dieser Variablentyp kann 2 Werte annehmen (true/false), wobei der Text frei vergeben werden kann (z. B. ausgelöst/nicht ausgelöst). Wenn der Wert auf true (ausgelöst) gesetzt wird, erfolgt in der Kopfzeile der WebUI unter Alarmmeldungen eine Anzeige.
-
Variable mit/ohne Kanalzuordnung
Wird eine Systemvariable einem Kanal zugeordnet, taucht sie nicht mehr unter den allgemeinen Systemvariablen auf, sondern wird nur in Verbindung mit dem Kanal angezeigt und kann auch nur dort abgefragt und gesetzt werden. D. h., um diese Systemvariable abzufragen, muss innerhalb eines Programms unter „Bedingung“ der Kanal gewählt werden. Die Variable taucht dann in der nachfolgenden Optionsliste als Option auf. Entsprechendes gilt beim Setzen dieser Variablen unter Aktivität. Wählt man unter „Status und Bedienung“ ein Gerät aus, bei dem eine Systemvariable einem Kanal zugeordnet ist, wird die Variable dann auch beim entsprechenden Kanal mit angezeigt. Ein Anwendungsbeispiel hierzu wäre, den Temperaturwert eines Homematic Heizkörperthermostaten in eine Variable zu schreiben, um die Ist-Temperatur einzusehen, da eine Anzeige der Ist-Temperatur sonst nur über den Homematic Funk-Wandthermostaten möglich ist.
Beschreibung der Skripte
Skript zum Anlegen einer Systemvariable vom Typ Logikwert
! Systemvariable vom Typ Logikwert (Boolean) wird definiert und mit einem Startwert gefüllt
string svName = "SYSVAR Test Logikwert";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.DPInfo("SYSVAR Test Variablentyp Logikwert");
svObj.ValueName0("nicht aktiv");
svObj.ValueName1("aktiv");
svObj.ValueUnit("");
svObj.DPArchive(true);
svObj.State(true);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
Mit dem obigen Skript wird eine Systemvariable vom Typ Logikwert angelegt und auf den Wert „true“ gesetzt. Die Variable erhält den Namen „SYSVAR Test Logikwert“ und im Dokumentationsfeld den Eintrag „SYSVAR Test Variablentyp Logikwert“. Die Variable wir nach der Definition auf „true“, also „aktiv“ gesetzt. Durch den Parameter „DPArchive(true)“ werden alle Veränderungen der Systemvariable ins Systemprotokoll geschrieben. Wenn ihr das nicht möchtet, einfach von „true“ auf „false“ ändern.
Skript zum Anlegen einer Systemvariable vom Typ Werteliste
! Systemvariable vom Typ Werteliste wird definiert und mit Startwert gefüllt
string svName = "SYSVAR Test Werteliste";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtInteger);
svObj.ValueSubType(istEnum);
svObj.DPInfo("SYSVAR Test Variablentyp Werteliste");
svObj.ValueList("Wert1;Wert2;Wert3");
svObj.DPArchive(true);
svObj.State(0);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
Mit dem obigen Skript wird eine Systemvariable vom Typ Werteliste angelegt und auf den Wert „0“ gesetzt. Die Variable erhält den Namen „SYSVAR Test Werteliste“ und im Dokumentationsfeld den Eintrag „SYSVAR Test Variablentyp Werteliste“. Die Variable wir nach der Definition auf „0“, also „Wert1“ gesetzt. Die möglichen Werte werden unter „Valuelist“ angegeben. Durch den Parameter „DPArchive(true)“ werden alle Veränderungen der Systemvariable ins Systemprotokoll geschrieben. Wenn ihr das nicht möchtet, einfach von „true“ auf „false“ ändern.
Skript zum Anlegen einer Systemvariable vom Typ Zahl
! Systemvariable vom Typ Zahl wird definiert und mit Startwert gefüllt
string svName = "SYSVAR Test Zahl";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.DPInfo("SYSVAR Test Variablentyp Zahl");
svObj.ValueUnit("°C");
svObj.ValueMin(-100);
svObj.ValueMax(100);
svObj.DPArchive(false);
svObj.State(15);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
Mit dem obigen Skript wird eine Systemvariable vom Typ Zahl angelegt und auf den Wert „15“ gesetzt. Die Variable erhält den Namen „SYSVAR Test Zahl“ und im Dokumentationsfeld den Eintrag „SYSVAR Test Variablentyp Zahl“. Die Variable wir nach der Definition auf „15“ gesetzt. Im Feld „ValueUnit“ kann ebenfalls ein Wert, beispielsweise wie hier „°C“angegeben werden. In den Feldern „ValueMin“ bzw. „ValueMax“ kann die Spanne der Zahlen von/bis angegeben werden. Durch den Parameter „DPArchive(false)“ werden Veränderungen der Systemvariable nicht ins Systemprotokoll geschrieben. Wenn ihr das ändern möchtet, einfach von „false“ auf „true“ ändern.
Skript zum Anlegen einer Systemvariable vom Typ Zeichenkette
! Systemvariable vom Typ Zeichenkette wird definiert und mit Startwert gefüllt
string svName = "SYSVAR Test Zeichenkette";
object svObj = dom.GetObject(svName);
if (!svObj){
object svObjects = dom.GetObject(ID_SYSTEM_VARIABLES);
svObj = dom.CreateObject(OT_VARDP);
svObjects.Add(svObj.ID());
svObj.Name(svName);
svObj.ValueType(ivtString);
svObj.ValueSubType(istChar8859);
svObj.DPInfo("SYSVAR Test Variablentyp Zeichenkette");
svObj.ValueUnit("");
svObj.DPArchive(true);
svObj.State("Systemvariable neu erstellt - 1. Eintrag");
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
Mit dem obigen Skript wird eine Systemvariable vom Typ Zeichenkette angelegt und es wird ein Text eingetragen. Die Variable erhält den Namen „SYSVAR Test Zeichenkette“ und im Dokumentationsfeld den Eintrag „SYSVAR Test Variablentyp Zeichenkette“. Die Variable erhält nach der Definition über „State“ den Eintrag „Systemvariable neu erstellt – 1. Eintrag „. Durch den Parameter „DPArchive(true)“ werden alle Veränderungen der Systemvariable ins Systemprotokoll geschrieben. Wenn ihr das nicht möchtet, einfach von „true“ auf „false“ ändern.
Systemvariablen löschen
! Löschen von Systemvariablen via Skript
string svName = "SYSVAR Test Logikwert";
object svObj = dom.GetObject(svName);
dom.DeleteObject(svObj.ID());
string svName = "SYSVAR Test Werteliste";
object svObj = dom.GetObject(svName);
dom.DeleteObject(svObj.ID());
string svName = "SYSVAR Test Zahl";
object svObj = dom.GetObject(svName);
dom.DeleteObject(svObj.ID());
string svName = "SYSVAR Test Zeichenkette";
object svObj = dom.GetObject(svName);
dom.DeleteObject(svObj.ID());
Mit Hilfe des obigen Skiptes werden die zuvor angelegten Systemvariablen wieder gelöscht. Wenn ihr nur eine Löschen wollt, ist natürlich nur ein Block des Skriptes zu verwenden.
Screenshots zu den Systemvariablen
Ich habe zum Testen die oben beschriebenen Skripte unter Startseite>Programme und Verknüpfungen>Programme ausgeführt. Dort auf den Button „Skipt testen“ klicken und es öffnen sich ein Editor, in den ihr den Code reinkopieren und bearbeiten könnt. Ich habe den Code in das obere Fenster kopiert und dann auf „Ausführen“ geklickt habe. Danach sollte die entsprechende Variable definiert sein. Das Ganze habe ich mit allen vier Skripten durchgeführt, um Systemvariablen mit verschiedenen Typen anzulegen.
Wenn ihr euch dann nach der Durchführung der Skripte unter Startseite>Einstellungen>Systemvariable die erstellten Systemvariablen anschaut, erhaltet ihr die folgende Anzeige:
Abschließend
Wie schon beschrieben habe ich die Skripte zum Anlegen der Systemvariablen über die WebUI Funktion „Skript testen“ ausgeführt. Genauso ist es natürlich möglich die Skripte über ein WebUI Programm ausführen zu lassen, wenn die Bedingungen dafür erfüllt sind, beispielsweise eine bestimmte Uhrzeit. Dieser Code zum Anlagen ist in zukünftigen Skripten, in denen Systemvariablen benötigt werden Bestandteil dieser Skripte. Als reines Skript zum Erstellen von Systemvariablen ist aus meiner Sicht ein Einbinden in eine WebUI Programm nicht erforderlich. Es sei denn ihr wollte dies bewusst von dem eigentlichen Skript zum Füllen der Systemvariablen trennen. Im nächsten Artikel zum Thema Code Schnipsel zeige ich euch, wie ihr in einem Skript Prüfen könnt, ob eine Systemvariable bereits existiert. Abhängig vom Ergebnis dieser Prüfung wird dann die Systemvariable entweder definiert und gefüllt, oder aber nur mit Werten gefüllt, wenn sie bereits existiert. Hört sich jetzt komplizierter an als es ist. Lasst euch überraschen und lest den nächsten Artikel.
Viel Spass beim Ausprobieren und wie gesagt, wenn ihr eigene Projekte habt, die ihr über Skripte realisiert habt, schreibt mir einfach eine Mail.
Hi
Super Tip,
habe ich bereits in einigen Scripten so verwendet. Danke.
Kurze Frage dazu:
Jetzt möchte ich die Systemvariable noch mit einem Kanal verknüpfen, wie das beim händischen Anlegen auch möglich ist.
Was ist dafür noch zu tun?
mabel