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

8 Gedanken zu „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

  • 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

Schreibe einen Kommentar

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