Viele Homematic Scripte greifen auf Systemvariablen zu, um einen Status auzulesen, Werte abzufragen oder zu hinterlegen. Um diese nicht manuell anlegen zu müssen, besteht die Möglichkeit im Script zu prüfen, ob eine Variable existiert. Falls nicht, kann diese dann direkt automatisch angelegt werden.
Leider ist auch hierzu die API Dokumentation nicht vollständig. Daher habe ich die möglichen Werte und Methoden (soweit möglich) mit aufgelistet.
Typen und Werte
ValueType
- ivtBinary (2)
- ivtFloat (4)
- ivtInteger (16)
- ivtString (20)
ValueSubType
- istPresent (23) – Anwesenheit
- istAlarm (6) – Alarm
- istGeneric (0) – Zahl
- istBool (2) – Logikwert
- istEnum (29) – Werteliste
- istChar8859 (11) – Zeichenkette
Beispiele – Systemvariable erstellen
Zeichenkette
string svName = "testVarPresent"; 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("Variable string for test"); svObj.ValueUnit(""); svObj.State("some text"); svObj.Internal(false); svObj.Visible(true); dom.RTUpdate(false); } WriteLine(svObj.Value().ToString());
Zahl
string svName = "testVarNumber"; 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("Variable number for test"); svObj.ValueUnit("°C"); svObj.ValueMin(-100); svObj.ValueMax(100); svObj.State(15); svObj.Internal(false); svObj.Visible(true); dom.RTUpdate(false); } WriteLine(svObj.Value().ToString());
Alarm
string svName = "testVarAlarm"; 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(istAlarm); svObj.ValueName0("nicht ausgelöst"); svObj.ValueName1("ausgelöst"); !svObj.AlType(atSystem); !svObj.AlArm(true); svObj.ValueUnit(""); dom.RTUpdate(false); } WriteLine(svObj.State().ToString()); WriteLine(svObj.ValueName()); ! Alarm auslösen svObj.State(true); svObj.DPInfo("Alarm - aktiv"); WriteLine(svObj.State().ToString()); WriteLine(svObj.ValueName());
Logikwert
string svName = "testVarBool"; 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.ValueName0("nicht anwesend"); svObj.ValueName1("anwesend"); svObj.State(true); svObj.DPInfo("Logikwert test"); svObj.ValueUnit(""); dom.RTUpdate(false); } WriteLine(svObj.State().ToString()); WriteLine(svObj.ValueName());
Werteliste
string svName = "testVarEnum"; 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.ValueList("val1;val2;val3"); svObj.State(1); svObj.DPInfo("Werteliste test"); dom.RTUpdate(false); } var valList = svObj.ValueList(); var val = valList .StrValueByIndex(";",svObj.Value()); WriteLine(val);
Systemvariable löschen
Muss aus irgendeinem Grund eine Systemvariable gelöscht werden, kann dies auch direkt über Homematic-Script erledigt werden.
string svName = "testVarAlarm"; object svObj = dom.GetObject(svName); WriteLine(svObj); dom.DeleteObject(svObj.ID()); WriteLine(svObj);
Code-Snippet: Homematic Systemvariablen über ein Script automatisch erzeugen
Hallo, ich habe versucht eine Werteliste über ein Script automatisch zu erzeugen. Dafür habe ich den obigen Code-Snippet verwendet. Leider wird nach dem erzeugen der Werteliste in der WebUI unter „Startseite > Status und Bedienung > Systemvariable“ kein Wert angezeigt. Danke
Hallo Nico,
ja das ist mir auch schon aufgefallen. Interessanterweise wird mir ein Wert angezeigt, sobald ich die Variable händisch einmal kurz über die Oberfläche abspeichere (ohne Änderungen vorzunehmen). Man sollte aber auch ohne diesen Weg mit der Variable bzw. Liste in Scripten arbeiten können.
Leider habe ich bisher nur wenig bis keine genaue Dokumentation von Homematic dazu gefunden.
Hallo,
um die Werteliste per Script zu erzeugen, muss „svObj.ValueType(ivtBinary)“ in „svObj.ValueType(ivtInteger)“ geändert werden.
Hallo,
vielen Dank für die Rückmeldung! Mit dieser Änderung konnte ich die Liste erfolgreich anlegen.
Gruß
Esche
Danke!
Endlich kenne ich die richtigen Bezeichnungen der Properties 🙂
Besten Dank
Super Sache.
Wie kann ich die Systemvariable „Anwesenheit“ neu anlegen?
(nicht löschbar, während reboot „wahr“)
Bei mir ist diese verschwunden.
Alle Variabeln sind löschbar und keine von anfang an „wahr“, während reboot.
Mein System spielt verrückt.
Rebootet jede Nacht und durchläuft Programme (Rolladen hoch, Alarm-Meldungen, etc.)
Bin froh, um jede Hilfe
Danke
Peter
Hast Du das Anlegen einer Alarm-SV selber schon mal getestet?
svObj = dom.CreateObject(OT_VARDP);
ist dort falsch! Die Alarmvariable funktioniert nie
Natürlich! Zur Sicherheit habe ich das Script erneut geprüft. Weiterhin wird eine Variable vom Typ „Alarm“ bei mir angelegt. Was genau ist mit „ist dort falsch“ und „die Alarmvariable funktioniert nie“ genau gemeint? Ein paar genauere techn. Informationen wären wohl für viele interessant. Danke