Scripting mit p44Script
Diese Seite gibt eine Übersicht über die Programmiersprache p44script, die in den P44-Produkten zur Konfiguration und Erweiterung der Funktionalität zum Einsatz kommt. Es geht dabei vor allem die Konzepte in und um p44script herum.
Für eine detaillierte Beschreibung der Syntax und der Funktionen, die in p44script zur Verfügung stehen, dient gibt es die p44script-Kurzreferenz, welche übrigens auch offline in jedem P44-Gerät verfügbar ist (s. Link rechts unten bei Script-Eingabefeldern).
Wo können p44script-Skripte eingesetzt werden?
Die Programmiersprache p44script ist eine sogenannt "embedded" (eingebettete) Scriptsprache, die an verschiedensten Orten der Umgebung, in der sie eingebettet ist, über Scripts Funktionalität hinzufügen kann. Grundsätzlich ist p44script in beliebige C++-Projekte einbaubar, wenn die p44utils-Bibliothek verwendet wird.
In diesem Abschnitt sollen aber die verschiedenen Orte für die Anwendung von p44script innerhalb eines P44-DSB oder P44-LC-Geräts aufgezeigt werden.
Scriptkontexte
Weil die Scripte an verschiedenen Orten im System laufen können, gibt es auch verschiedene sogenannte Scriptkontexte. Ein Scriptkontext umfasst:
- gemeinsame Variablen (Kontext-Variablen), die mit
var
erzeugt werden und aus allen Scripts, die in diesem Scriptcontext laufen, sichtbar sind, sowie lokale Funktionen (mitlocal function
definiert). Aus anderen Scriptkontexten sind diese Variablen und Funktionen nicht sichtbar. Nur globale Variablen, die mitglob
erzeugt werden, sind aus allen Kontexten sichtbar und auch veränderbar. - ein oder mehrere Scripts, die in diesem Kontext laufen können, u.U. sogar zur selben Zeit. Ein in einem Scriptkontext laufendes Script erzeugt mindestens einen sogenannten Thread (etwa: Ausführungsstrang), und kann mit dem
concurrent
-Konstrukt auch weitere Thraeds starten. - die Möglichkeit, alle in diesem Kontext laufenden Threads zu beenden. Zum Beispiel werden beim Aufruf einer Szene alle laufenden Scripte/Threads im Scriptkontext des betroffenen Ausgangs (devices) beendet, z.B. Szenenscripte (s. unten). Auch die
abort()
-Funktion erlaubt das Beenden aller Skripte im gleichen Scriptkontext. - möglicherweise kontext-spezifische Funktionen, um direkt mit dem Kontext (z.B. eines Geräts/devices) zu interagieren. Im Devicekontext zum Beispiel gibt es die Funktionen
output()
,sensor()
,input()
,button()
um auf Ein- und Ausgänge des jeweiligen Geräts zuzugreifen.
Neben diesen verschiedenen Kontexten gibt es auch noch den globalen Kontext. Dieser beinhaltet alle mit glob
definierten globalen Variablen aus allen anderen Kontexten, ebenso alle mit function
oder global function
definierten Funktionen.
Der Maincontext - das "Hauptprogramm"
Es nur einen einzigen Maincontext pro Anwendung (P44-DSB- oder P44-LC-Gerät).
Im Maincontext laufen die folgenden Scripte:
- Das mainscript
- Das mainscript wird beim Aufstarten/Neustarten des P44-xx-Geräts (oder nach
restartapp()
) gestartet, und läuft ab dann parallel mit der sonstigen Funktion des Geräts. Es kann deshalb sowohl dazu verwendet werden, nur kurz beim Start einige Aktionen auszuführen, kann aber auch ein dauernd laufendes "Hauptprogramm" beinhalten. - Auf P44-Geräten ist er in der Weboberfläche unter
p44script.html
zu finden - d.h. wenn die normale Weboberfläche beispielsweisehttp://192.168.42.73
lautet, lässt sich das Mainscript unterhttp://192.168.42.73/p44script.html
aufrufen. - Der REPL
- der REPL (Read-Execute-Print-Loop) dient zum zeilenweisen Eingeben und Ausprobieren von p44script-Befehlen.
- Auf P44-Geräten ist er in der Weboberfläche unter
repl.html
zu finden - Mehr Informationen dazu siehe hier.
Der Evaluatorcontext - Evaluatoren
Evaluatoren sind Benutzerdefinierte Geräte, die einen oder mehrere Sensor- oder Digitaleingänge überwachen und auswerten ("evaluieren"), und daraus ein Resultat berechnen, welches im Fall von P44-DSB an den digitalSTROM-Server (dSS) weitergeleitet wird. Damit sind Sensor-Auswertungen möglich, welche mit der App "Benutzerdefinierte Zustände" im dSS u.U. nicht oder nur schwierig umzusetzen sind. Ebenso können abgeleitete Sensorwerte mit einem Evaluator gebildet werden - z.B. die Gesamtleistung einer 3-Phasen Strommessung oder der Durchschnitt mehrerer Temperatursensoren.
Im Evaluatorcontext laufen die folgenden Scripte/Auswertungen:
- Die Conditions
- Das sind die Ausdrücke, die einen Evaluator auslösen (triggern).
- Bei Evaluatoren mit Ja/Nein-Ausgangssignal oder bei Action-Evaluatoren gibt es je eine Bedingung fürs Einschalten und fürs Ausschalten. Beide werden im Evaluatorcontext ausgewertet. Es sind aber keine vollständigen Scripte, sondern nur Ausdrücke deren Resultat als
true
(!=0) oderfalse
(==0) ausgewertet werden. Sie können keine Funktionen enthalten, deren Ausführung u.U. längere Zeit dauert wiedelay()
oderhttprequest()
. - Bei Sensor-Evaluatoren, deren Ausgang ein Sensorwert ist, gibt es nur einen Ausdruck, dessen Resultat als Ausgangswerts des Sensors verwendet wird.
- Die Action
- Bei Action-Evaluatoren wird nicht ein Signal- oder Sensorwert beeinflusst, sondern das Actionscript ausgeführt. Dieses läuft auch im Evaluatorkontext, wie die Auslösebedigungen. Es ist deshalb möglich, in einer Auslösebedingung auf eine Variable Bezug zu nehmen, die im Actionscript verändert wird (damit das funktioniert, werden die Auslösebedingungen immer nach dem Ausführen des Actionscript nochmals ausgewertet, damit so eine "Rückkopplung" auch tatsächlich erkannt wird).
Rückkopplungen sind heikel
Obwohl es bei manchen Aufgabenstellungen nützlich sein kann, sind Rückkoppelungen (Actionscript verändert Werte die in der Auslösebedingung vorkommen) heikel - bei (Denk-)fehlern kann es schnell dazu kommen, dass ein Evaluator sich quasi dauernd selber auslöst und so die Performance des Geräts beeinträchtigt.
Der Devicecontext - Scripting in einzelnen Devices
Jedes in einer P44-DSB oder P44-LC in der Geräteliste sichtbare Gerät (=Device) hat einen eigenen Devicecontext. Hier laufen Scripte, die im Wesentlichen dieses eine Gerät und seine Ein- und Ausgänge betreffen, und deshalb auch direkten Zugriff auf diese haben (s. output
, sensor()
, input()
Scriptfunktionen).
Im Devicecontext laufen die folgenden Scripte:
- Die Szenenscripte
- Szenenscripte sind einer bestimmten Szene in einem bestimmten Device mit Ausgang zugeordnet, und werden immer dann ausgeführt, wenn die entsprechende Szene aufgerufen wird. Szenenskripte ermöglichen Übergangs- und auch dauerhafte Effekte (z.B. ein langsamer fortlaufender Farbwechsel).
- Ein Szenenscript läuft im Devicecontext, aber immer nur eines. Wenn ein Szenenscript noch läuft, während schon wieder eine andere Szene aufgerufen wird, wird es abgebrochen - und, wenn vorhanden, das Szenenskript der neu aufgerufenen Szene gestartet.
- Szenenscripte können in den Speziellen Szeneneinstellungen via P44-DSB oder P44-LC Webinterface erstellt werden.
Der Implementationskontext eines Scripted Device
Separat vom Devicecontext
Der Implementationskontext eines scripted device ist komplett getrennt vom normalen Devicecontext. Nur Scripted Devices, also kundenspezifische, in p44script programmierte Geräte, haben einen Implementationskontext, und stellt die Ebene dar, die bei anderen Geräten (DALI, EnOcean, hue etc.) bereits fest in der Firmware vorhanden ist. Auf der Ebene darüber, dem Devicecontext, ist es völlig unerheblich, ob das Gerät eine fest eingebaute Implementation oder eine in p44script hat, weshalb die zwei Kontexte auch getrennt bleiben müssen.
Im Implementationskontext laufen die folgenden Scripte:
- Das Implementationsscript
- Jedes scripted device hat sein eigenes Implementationsscript, das über den Bleistift-Button oder den "Edit Implementation script..."-Button im Info-Dialog des Geräts erreichbar ist.
Der Scriptcontext eines Triggers (nur bei P44-LC-xx)
Im Standalone-Controller P44-LC, also der Version des Produkts das ohne digitalSTROM-Anbindung selbstständig funktioniert, gibt es zusätzlich zu den Devices die Triggers. Diese beinhalten eine Auslösebedingung und ein Aktionsscript, das beim Eintreffen der Bedingung ausgeführt (getriggert) wird. Die Auslösebedingung und das Aktionsscript laufen in einem eigenen, privaten Kontext des Triggers, dem Triggerkontext.
Text in Bearbeitung
Dieser Text ist noch in Arbeit, mehr Informationen folgen demnächst.