, , , , , , ,

Code Schnipsel – Homematic Skript – Aktor Datenpunkte ermitteln, auslesen und in Systemvariablen schreiben

Alle HomeMatic oder HomeMatic IP Aktoren haben Datenpunkte, in denen die jeweiligen aktuellen Informationen gespeichert sind. Nicht alle diese Datenpunkte können mit WebUI Mitteln abgefragt werden. Anders sieht das mit der HomeMatic Skript Sprache aus. Damit können alle vorhandenen Datenpunkte bzw. deren Inhalt ausgelesen und wenn gewünscht sogar geändert werden. In diesem Artikel möchte ich euch erklären, wie ihr die jeweiligen Datenpunkte eines Aktors ermitteln könnt. Diese Information benötigt ihr, um diese Information anschließend via Skript auszulesen und beispielsweise in eine Systemvariable zu schreiben. Über diese Systemvariable könnt ihr dann Aktionen in HomeMatic auslösen.

Allgemeines

Da ich aktuell wieder einige Skripte verwendet habe, um geforderte Aktionen innerhalb von HomeMatic ausführen zu können, möchte ich die Serie Code Schnipsel hier heute mal wieder fortsetzen. Bisher gibt es aus dieser Serie bereits die folgenden Beiträge:

Ermittlung der vorhandenen Datenpunkte

Um zu ermitteln welche Datenpunkte für den gewünschten Aktor zur Verfügung stehen, muss als erstes die Seriennummer des Aktors ermittelt werden. Dies geschieht am einfachsten in der WebUI über den Menuepunkt „Einstellungen > Geräte“. Man findet dort die folgende Anzeige:

Skript zur Ermittlung der vorhandenen Datenpunkte

Nachfolgend ist ein Skript zu sehen, mit dessen Hilfe die Datenpunkte einer bestimmten Seriennummer ermittelt werden kann. Dazu muss im Skript die Seriennummer eingetragen werden. Anschließend kann dieses Skript über „Startseite > Programme und Verknüpfungen > Programme“ der Button „Skript testen“ der Editor geöffnet werden. Dann das Skript kopieren und im oberen Fenster des Editors einfügen. Um das Skript auszuführen unten links den Button „Ausführen“ klicken.

! Information welche Datenpunkte für ein HomeMatic Gerät existieren
! © Werner Weber 07.2019 Version 4.0
! Seriennummer eintragen
string aktor = "KEQ1041684";
! =============================================================================
string index;
string datenpunkte = dom.GetObject(ID_DATAPOINTS).EnumUsedNames();
foreach (index, datenpunkte) 
{
var sserial = (index.StrValueByIndex(":",0).StrValueByIndex(".",1));
if (sserial == aktor) 
{
Write(index #"\n");
}
}

Ergebnis / Ausgabe des Skriptes

Nachfolgend ist das Ergebnis der Skript-Ausführung zu sehen (Erscheint im unteren Fenster des Editors und kann kopiert und beispielsweise in einem Word-Dokument gespeichert werden). Ich habe das so gemacht, um die ausgewerteten Datenpunkte farblich „rot“ zu markieren.

Skript zum Auslesen des Ventil Öffnungsgrades und schreiben in Systemvariable und Systemprotokoll

Nachfolgend ist das Skript zu sehen, mit dessen Hilfe ein bestimmter Datenpunkt ausgelesen wird. Zusätzlich werden die notwendige Systemvariable automatisch angelegt, wenn noch nicht vorhanden und mit dem aktuellen Wert beschrieben.  Beim Anlegen der Systemvariable vom Typ ZAHL wird auch das „Protokollieren“ eingeschaltet. Dadurch wird jede Änderung der Systemvariablen auch im Systemprotokoll festgehalten. Detailliert habe ich das im Artikel Code Schnipsel – HomeMatic Skript – Systemvariablen anlegen und löschen beschrieben.

Erstmalig kann/sollte wie oben bereits beschrieben über „Startseite > Programme und Verknüpfungen > Programme“ der Button „Skript testen“ der Editor geöffnet werden. Dann das Skript kopieren und im oberen Fenster des Editors einfügen. Um das Skript auszuführen unten links den Button „Ausführen“ klicken. Beim ersten Durchlauf des Skriptes wird die Variable angelegt und mit dem Wert „100“ gefüllt.

! Auslesen des Ventilöffnungsgrades und in Systemvariable sowie in Systemprotokoll schreiben
! (c) W. Weber 07.2019, Version 4.0
! Kontrolle ob die Systemvariable bereits existiert
object oVariable = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Ventil Küche Öffnungsgrad");
if (oVariable) 
{
! Die Systemvariable existiert und wird mit aktuellen Werten gefüllt
string ventilkueche = "";
var VALVE_STATE = dom.GetObject("BidCos-RF.KEQ1041684:4.VALVE_STATE").Value();
ventilkueche = ("" # VALVE_STATE);
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Ventil Küche Öffnungsgrad").State(ventilkueche);
} 
else 
{
! Die Systemvariable existiert nicht, wird definiert und mit Startwert 100 gefüllt
! Dieser Teil des Skriptes läuft nur einmalig
string  svName = "Ventil Küche Öffnungsgrad";
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("Ventil Küche Variablentyp Zahl");
svObj.ValueUnit("");
svObj.ValueMin(0);
svObj.ValueMax(100);
svObj.DPArchive(true);
svObj.State(100);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
}

Skript zum Auslesen der aktuelle Temperatur und schreiben in Systemvariable und Systemprotokoll

Nachfolgend ist das Skript zu sehen, mit dessen Hilfe ein bestimmter Datenpunkt ausgelesen wird. Zusätzlich werden die notwendige Systemvariable automatisch angelegt, wenn noch nicht vorhanden und mit dem aktuellen Wert beschrieben.  Beim Anlegen der Systemvariable vom Typ ZAHL wird auch das „Protokollieren“ eingeschaltet. Dadurch wird jede Änderung der Systemvariablen auch im Systemprotokoll festgehalten. Detailliert habe ich das im Artikel Code Schnipsel – Homematic Skript – Systemvariablen anlegen und löschen beschrieben.

Erstmalig kann/sollte wie oben bereits beschrieben über „Startseite > Programme und Verknüpfungen > Programme“ der Button „Skript testen“ der Editor geöffnet werden. Dann das Skript kopieren und im oberen Fenster des Editors einfügen. Um das Skript auszuführen unten links den Button „Ausführen“ klicken. Beim ersten Durchlauf des Skriptes wird die Variable angelegt und mit dem Wert „100“ gefüllt.

! Auslesen der aktuellen Temperatur und in Systemvariable sowie in Systemprotokoll schreiben
! (c) W. Weber 07.2019, Version 4.0
! Kontrolle ob die Systemvariable bereits existiert
object oVariable = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Ventil Küche Aktuelle Temperatur");
if (oVariable) 
{
! Die Systemvariable existiert und wird mit aktuellen Werten gefüllt
string ventilkueche = "";
var ACTUAL_TEMPERATURE = dom.GetObject("BidCos-RF.KEQ1041684:4.ACTUAL_TEMPERATURE").Value();
ventilkueche = ("" # ACTUAL_TEMPERATURE);
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Ventil Küche Aktuelle Temperatur").State(ventilkueche);
} 
else 
{
! Die Systemvariable existiert nicht, wird definiert und mit Startwert 100 gefüllt
! Dieser Teil des Skriptes läuft nur einmalig
string  svName = "Ventil Küche Aktuelle Temperatur";
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("Ventil Küche Variablentyp Zahl");
svObj.ValueUnit("");
svObj.ValueMin(-30);
svObj.ValueMax(100);
svObj.DPArchive(true);
svObj.State(100);
svObj.Internal(false);
svObj.Visible(true);
dom.RTUpdate(false);
}
}

Screenshots der Systemvariablen und des Systemprotokolls

In diesem Abschnitt schauen wir uns die Informationen über die Systemvariablen und das Systemprotokoll an:

Hier sehen wir wie die Systemvariablen vom Skript definiert wurden.
Hier ist zu sehen, wann die Systemvariablen mit welchen Wert gefüllt wurden.
Hier die Informationen im Systemprotokoll.

Zyklisches Ausführen des Skriptes über ein WebUI Programm

Im ersten Durchlauf des Skriptes wird die Systemvariable erstellt und mit einem Startwert beschrieben. Zu diesem Zweck reicht es, wie beschrieben das Skript über die „Skript testen“ Funktion zu starten.

Wenn wir aber den aktuellen Wert eines Datenpunktes zyklisch auslesen wollen, müssen wir ein entsprechendes WebUI Programm erstellen.

In dem folgenden Screenshot ist ein solches Programm zu sehen. Es wird im Zyklus von 15 Minuten der Datenpunkt ausgelesen und über Skript in die Systemvariable geschrieben.

Wenn euch der Ausdruck des WebUI Programmes gefällt, Informationen dazu findet ihr hier.

WebUI Programm starten aufgrund von Systemvariable (Schnittstelle)

Nachdem die gewünschten Werte in bestimmten Zyklen in Systemvariablen geschrieben werden, ist damit die eigentliche Schnittstelle zwischen Skript und WebUI realisiert. Es kann nun bei Veränderungen des Inhalts der Systemvariable über ein WebUI Programm die gewünschte Aktion ausgeführt werden.

In dem nachfolgenden Testprogramm wird eine Schaltsteckdose eingeschaltet und zusätzlich ein bestimmter Rollladen auf 50% geschlossen.

WICHTIG

In dem oben beschriebenen Beispiel wird ein HomeMatic Aktor ausgewertet. Wenn HomeMatic IP oder HomeMatic wired Aktor ausgewertet werden soll, müssen die Aktoren anders angesprochen werden:

HomeMatic Funk Aktor:

BidCos-RF.KEQ1041684:0……….

HomeMatic IP Funk Aktor:

HmIP-RF.000AD709A594AE:0………

HomeMatic wired:

BidCos-Wired.OEQ0861981:0……….

HomeMatic IP wired:

HmIP-RF.001658A98F5F22:0……….

Der Grund dafür ist die unterschiedliche Schnittstelle. Beim Auslesen welche Datenpunkte existieren, reicht die Seriennummer. Bei Auslesen bestimmter Datenpunkte muss immer wie oben beschrieben abgefragt werden.

Fazit

Da alle Aktoren auf die gleiche Art und Weise ausgewertet werden können wie in dieser Dokumentation beschrieben, ist es möglich die Skripte einfach anzupassen und weitere eigene Vorstellungen zu realisieren.

Viel Spaß beim Ausprobieren.

2 Kommentare
  1. Roland
    Roland sagte:

    In HmIP_Device_Documentation.pdf sind wohl alle Datenpunkte aufgeführt. Es sind jedoch nicht alle erreichbar. Die „Channel configuration parameters“ können mit den oben dargestellten Objekten nicht erreicht werden. Es muss da noch mehr geben.

    Auch sind die Datenpunkte nur aufgeführt aber nicht in ihrer Dunktion und Bdeutung beschrieben. Leider!!

    Antworten
  2. Harry
    Harry sagte:

    Danke, ich lese die Datenpunkte über IOBroker aus.
    Das größte Problem bei EQ3 ist jedoch die mangelnde Doku.
    So gibt es jetzt zum Beispiel beim IP Wired Jalousienaktor z.B. auf Kanal 1 ein „LEVEL“ und ein „LEVEL_2“, außerdem „SECTION“, dann noch jeweils einen STATUS dazu.
    Und nirgendwo ist beschrieben, was diese Datenpunkte bewirken.

    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