Von der Homematic Programmiersprache “TCL” habe ich keine Ahnung. Daher dachte ich mir, dass man fast alles lernen kann, und wir die Grundzüge der Homematic Scriptsprache zusammen lernen können. In den folgenden Abschnitten möchte ich euch erklären, wir es möglich ist, mit einzelne Aktoren zu rechnen.

In meinem Beispiel war es so, dass ich einige Stromverbraucher addieren wollte. Wie immer, hat mir auch hier wieder Jerome Pech  geholfen.

Um ein Script zu erstellen empfehle ich, den Button “Script testen” zu nehmen. Der befindet sich im Reiter “Programme und Zentralenverknüpfungen”.

Ganz unten der vierte Button.

Das nun offene Fenster wird unsere “Spielwiese”. Es kann gerne mal sofort auf “Ausführen” geklickt werden. Es werden immer die Werte ausgegeben, die in den Klammern von “WriteLine” stehen.

Los geht´s…

Wir fangen mit einer simplen Addition an. Hierfür müssen wir Variablen nutzen.  (Diese müssen NICHT in der CCU angelegt werden). Jetzt gibst du einfach die unteren Zeilen in das Fenster ein. (Ich empfehle das wirklich abzuschreiben und nicht zu kopieren, da man es sich so leichter merken kann).

1 Zeile:
Wir erstellen (virtuell) eine Variable “a” und sagen, dass die Variable “a” den Wert von “1” hat.

2 Zeile:
Hier das selbe, nur dass die Variable “b” einen Wert von “5” hat.

3 Zeile:
Hier erstellen wir die Berechnung, mit Hilfe der Variablen “c” und sagen. Variable “c” ist gleich Variable “a” + “b”.

var a = 1
var b = 5
var c = a+b

Wer jetzt schon auf “Ausführen” gedrückt hat, wird feststellen, dass das noch nicht funktioniert. Wir müssen nämlich noch die “Regeln der Scriptsprache” beachten. Daher muss nämlich nach jeder Zeile ein “;” gemacht werden. Fertig sieht das dann so aus:

var a = 1;
var b = 5;
var c = a+b;

Das Script würde jetzt schon funktionieren. Aber um eine visuelle Ausgabe des Codes zu erhalten, muss noch eine Zeile dazu, die das Ergebnis ausgibt. (Diese Zeile sollte wieder gelöscht werden, wenn das Script in ein Programm eingebunden wird) Das ist erstmal wirklich nur zum “spielen”.

WriteLine();

Das Wort “WriteLine” (Groß- und Kleinschreibung beachten), gibt den Wert innerhalb der Klammer optisch aus. Wir wollen die Variable “c” ausgegeben haben, also schreiben wir “c” in die Klammern.

WriteLine(c);

Fertig sieht das Ganze dann so aus:

var a = 1;
var b = 5;
var c = a+b;
WriteLine(c);

Jetzt kann das Script getestet werden. Mit dem Button “Ausführen” erhalten wir das Ergebnis unten angezeigt, nämlich “6”. Die Zahlen in den Variablen “a” und “b” können beliebig geändert werden.

Da wir aber damit nicht wirklich viel anfangen können, kommen wir jetzt zu den Kanälen.

Rechnen mit Kanälen

Möchten wir beispielsweise zwei Kanäle miteinander addieren, funktioniert das genauso. Wir geben den Variablenwert mit “1” oder “5” jedoch nicht vor, sondern wollen, dass der Wert vom Gerät genommen wird. Wir ersetzen also die “1” durch die Adresse des Gerätes.

Das “Segement” eines Gerätes besteht aus mehreren Teilen, die ich im folgenden erkläre.

dom.GetObject("

Der obige Teil ist immer FIX. Jetzt kommt das Interface (6 Spalte [“HmIP-RF”oder “BidCos-RF”]) und die Seriennummer des Gerätes. Diese ist unter “Einstellungen” –> “Geräte”, in der 5 Spalte zu finden. Die beiden Teile werden durch einen “.” getrennt.

Nehmen wir beispielsweise mal die Helligkeit des Bewegungsmelders in der Einfahrt.

dom.GetObject("BidCos-RF.NEQ1297666

Soweit so gut. Als nächstes müssen wir dem Script sagen, welchen Kanal er nehmen soll. Bei Schalt- und Messsteckdosen sind das 5 bzw. 6 Kanäle. Den Kanal geben wir mit einem Doppelpunkt hinter der Seriennummer an. In diesem Fall hat der Bewegungsmelder Kanal 0 und Kanal 1. Die Kanäle und die Bezeichnung dazu findet man entweder in ioBroker, oder über das Addon XML-API. (hier zum Download) Nach der Installation findet man unter “http://IPderCCU/addons/xmlapi/statelist.cgi” alle Geräte und die dazugehörigen Kanäle. Wir suchen das Gerät “Bewegungsmelder Einfahrt” und den Kanal “BRIGHTNESS”. Dieser hat die Kanalnummer “1”, die wir im Script ergänzen.

dom.GetObject("BidCos-RF.NEQ1297666:1.BRIGHTNESS

Nach dem Kanal muss dieser noch definiert werden, da es pro Kanal mehrere Kanalnamen gibt (Bei diesem Beispiel “BRIGHTNESS” und “MOTION”). Wir nehmen mal “BRIGHTNESS”. Der Kanal ist ausgesucht und wir schließen die Geräteauswahl mit einem Anführungszeichen und einer geschlossenen Klammer.

dom.GetObject("BidCos-RF.NEQ1297666:1.BRIGHTNESS")

Das Einzige was jetzt noch fehlt, ist die Entscheidung, ob der Wert AKTIV eingeholt “State()” oder zuletzt bekannte Wert “Value()” genommen werden soll. Hierbei ist zu beachten, dass sich der Duty Cyle massiv erhöhen könnte, wenn mehrfach “State()” verwendet wird. (Das war bei mir beim Stromscript der Fall.

Mir genügen die letzten bekannte Werte, die bei jeder Aktualisierung an die CCU gesendet werden und nehme daher “Value()”. Das Ganze wird ebenfalls durch einen “.” getrennt, dann sieht das Ergebnis, inkl. dem abschließenden Strichpunkt so aus.

dom.GetObject("BidCos-RF.NEQ1297666:1.BRIGHTNESS").Value();

Und fertig ist unser Wert. Wir prüfen direkt mal ob hier ein Wert ausgegeben wird.

Ok, die aktuelle Helligkeit beträgt also 227. Super, dann wollen wir einen zweiten Kanal hinzufügen und diesen damit addieren. Das Verfahren ist das selbe, wie bei der Erstellung des ersten Kanals. Bei mir ist Variable “b” ein anderer Helligkeitssensor. Das Ergebnis beider Werte ergibt also 312.

Einbindung in die CCU

Bisher können wir mit den errechneten Werten jedoch nichts in der CCU anfangen. Dieser Schritt kommt jetzt. Nun MUSS eine Systemvariable erstellt werden.  Der Typ (Logik, Zahl, Werteliste etc.) richtet sich nach dem Ergebnis dieser Berechnung. Bei den normalen Grundrechenarten gehen wir mal davon aus, dass auch Zahlen als Ergebnis herauskommen. Daher legen wir eine Systemvariable vom Typ “Zahl” an. Der Name ist egal, sollte nur keine Sonderzeichen enthalten, z.B. “Helligkeitsmessung”.

Mit der folgenden Teil des Scriptes wird in das Objekt (in diesem Fall die Systemvariable “Helligkeitsmessung”) ein Wert eingetragen; Und zwar der Wert aus der Varablen “c”.

dom.GetObject("Helligkeitsmessung").State(c);

Wenn alles richtig eingetragen wurde, wird mit dem Button “Ausführen” immer noch der richtige Wert ausgegeben und die Systemvariable das erste Mal befüllt.
Das kann unter “Status und Bedienung” –> “Systemvariable” nachgesehen werden.

Ergebnis erreicht. Wir haben zwei Kanäle miteinander addiert.

EDIT 04.02.2018
Falls die Variable nicht befüllt wird, kann das an dem Namen der Variablen liegen. Bitte diese testweise in der CCU und im Script umbenennen und dann nochmal versuchen.


Das Ganze geht natürlich auch mit anderen Rechenoperationen. Diese sind in der Scriptanleitung von Homematic “Sprachbeschreibung” auf Seite 7 beschrieben.

Viel Spaß beim Probieren!

Print Friendly, PDF & Email

Kommentar schreiben