How I start with Rules – Openhab und Regeln

First Steps

Eure Wahl des SmartHome ist auf Openhab gefallen? Sehr gut! Ihr könnt zumindest etwas Blockly gemacht und versteht grundsätzlich das Zusammenspiel von Bedingungen, Objekten, Variablen, Funktionen und Schleifen? Dann wird das ganze recht simple, denn je nach Tiefgang der Regeln und Scripte reicht das teilweise absolut schon aus.

Ich bin auch ganz ehrlich: Ich nutze gerne mal für den ersten Wurf, die ersten Ideen eben Blockly und baue mir dann nachher erst den Code so um, wie ich es wirklich schick finde. Denn die Regeln mögen gut laufen und auch noch sicher. Aber viel Code kann eben auch bedeuten, dass die Regel unnötig lange je Triggerung braucht. Je nachdem, wie die Trigger gesetzt und nicht vor gefiltert werden, kann das auch durchaus zu einer beachtlichen CPU-Last werden.

Openhab und Dokumentation

Aber gut: Die ersten Ideen kommen schnell und es kommt auch schon vor den ersten Versuchen etwas mal zu implementieren die Frage: Was kann geht denn da alles. Hier hilft die Doku wahnsinnig weiter. Es wird, zumindest meiner Meinung nach, sehr viele Zusammenhänge und Co beschrieben, und eben auch, was jedes Objekt kann, oder wie man Daten rein, bzw. raus bekommt.

Neben der Doku gibt’s auch massenweise Foren, in denen andere User helfen. Nicht alles steht in der Doku, manches lässt sich auch nicht immer abbilden. Und manchmal gibt es auch eben nicht den einen anderen User, der die komplette Antwort hat, aber wenigstens ein weiteres Puzzlestück.

ECMAScript vs. ECMAScript-2021

Im laufe der Programmierung in Openhab werdet ihr früher oder später auf die Unterschiede stoßen. Aktuell sind die Blockly-Blöcke alle als ECMAScript hinterlegt. Das Unterscheidet sich teils deutlich von ECMAScript-2021. Beispielsweise im Zugriff auf die Items:

//ECMAScript
var myItem = itemRegistry.getItem('Itemname');
if (myItem.state == '123') { ...; }
events.sendCommand(myItem.name, '456');

//ECMAScript-2021
var myItem = items.getItem('Itemname');
if (myItem.state == '123') { ...; }
myItem.sendCommand('456');

Daher nochmal der Tipp: Beim Blick in Foren immer auch schauen, mit welcher Version die Lösung geschrieben ist. Denn JavaScript ist beides, nur auf den Umgang mit Funktionen, Klassen und Objekten ist etwas anders.

How to start with EPLAN Scripting

Gehen wir mal davon aus: C# ist bekannt und auch Programmabläufe müssen wir hier nicht mehr reden. Für den ersten Start, sollte man die entsprechende Hilfe-Seite von EPlan kennen. Auch die Seiten von Johann Weiher ist immer unheimlich hilfreich und sein Buch kann ich sehr empfehlen (besonders für den Einstieg). Übrigens: Die API-Hilfe von EPlan ist an einigen Stellen umfangreicher und genauer.

Zum einfachen Testen einer Funktion ist die Vorlage hier gut geeignet (direkt mit ActionCallingContext, kann weg gelassen werden, wenn es keine Parameter gibt):

// Angelehnt an https://eep8a.de/v3/scripts/02_Actions_ausfuehren/#03-action-mit-parameter
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

public class test_nuttshell {
  [Start]
  public void myfuction() {
    CommandLineInterpreter cli = new CommandLineInterpreter();
    ActionCallingContext   acc = new ActionCallingContext();

    acc.AddParameter("<Parametername #1>", "<Parameterwert #1>");
    acc.AddParameter("<Parametername #2>", "<Parameterwert #2>");
    //...
    acc.AddParameter("<Parametername #n>", "<Parameterwert #n>");
    
    cli.Execute("XGedStartInteractionAction", acc);
  }
}

Das ganze einfach in einer Textdatei mit der Endung „*.cs“ speicher und testen. Es reicht nun das Script zu starten, dann wird die Funktion nach dem Triggerwort für das Event Start ausgeführt. Das ist allerdings eher für seltener gebrauchte Tools sinnvoll. Später macht es Sinn dann die Funktionen über Menüs oder Events wie OnMainStart zu triggern:

// Angelehnt an https://eep8a.de/v3/scripts/02_Actions_ausfuehren/#03-action-mit-parameter
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

public class test_nuttshell {
  [DeclareAction(ACTION_NAME)]
  public void myfuction() {
    CommandLineInterpreter cli = new CommandLineInterpreter();
    ActionCallingContext   acc = new ActionCallingContext();

    acc.AddParameter("<Parametername #1>", "<Parameterwert #1>");
    acc.AddParameter("<Parametername #2>", "<Parameterwert #2>");
    //...
    acc.AddParameter("<Parametername #n>", "<Parameterwert #n>");
    
    cli.Execute("XGedStartInteractionAction", acc);
  }
}

Alternativ können Scripte und Funktionen auch über die Befehlszeile mit den entsprechenden Parametern ausgeführt werden. Im-/Exporte aus anderen Tools lassen sich so einfach realisieren, wenn das entsprechende Eplan installiert ist:

"<Pfad zur w3u.exe>" /NoSplash /Quiet /Auto /Variant:electric /NoLoadWorkspace ....