p44script IDE - Integrierte Entwicklungsumgebung

Erst ab Firmware-Version 2.7.0/2.7.0.27

Die hier beschriebene IDE ist erst ab Firmware 2.7.0/2.7.0.27 (bzw. 1.7.0/1.7.0.27 bei P44-LC) und neuer enthalten. In älteren Firmwareversionen gibt es zwar einen Full-Screen-Editor (Unterseite p44script.html) für Skripte aber ohne die vielfältigen Debugging-Funktionen der IDE und den Komfort von mehreren Tabs und direkten Zugriff auf alle Scripte im System.

Was bietet die IDE

Die IDE bietet Zugriff auf alle Funktionen und Tools, die zum Erstellen von Scripten nützlich und komfortabel sind:

  • Einen Texteditor, der die Syntax, Funktionsnamen und Sprachkonstrukte von p44script kennt und entsprechend einfärben und auch beim Tippen ergänzen kann. Dank Tabs können auch mehrere Scripte gleichzeitig geöffnet sein, und ihre Kontexte für Inspektion (s. unten) aufgerufen werden.
  • Eine Konsole, in der p44script-Befehle und Ausdrücke interaktiv ausgeführt werden können, und zwar im Kontext des jeweilig angezeigten Scripts, so dass z.B. Variablen inspiziert und ggf. auch verändert werden können.
  • Ein Log-Fenster, in dem das Logfile laufend angezeigt wird, sowie Möglichkeiten den Log-Level (Detailgrad) einzustellen
  • Ein Debugger, d.h. die Möglichkeit Breakpoints (Haltepunkte) in Scripten zu setzen, an denen die Ausführung pausiert, und dann einerseits via Konsole Variablenwerte einzusehen, ggf. zu ändern, und andererseits auch die Ausführung in Einzelschritten fortzuführen um genau zu sehen, was passiert.

Nichts davon ist speziell im Vergleich zu anderen Programmierumgebungen und IDEs - ausser der Tatsache, dass die ganze IDE im P44-Gerät integriert ist, keinerlei Abhängigkeiten im Internet oder irgendwelchen Clouds hat und damit auch für Installationen geeignet ist, die jahrzehnte lang laufen und wartbar bleiben sollen.

Es braucht nichts ausser einem Web-Browser, um eine p44script-Anwendung zu schreiben und zu warten!

Übersicht

p44script IDE Elemente-Übersicht

Arbeiten in der IDE

IDE nur in einem Browserfenster/Tab!

Die IDE eines P44-xx sollte nicht mehrfach in mehreren Browser-Tabs/fenstern gleichzeitig geöffnet sein, weil dann u.U. Änderungen an Scripts im der einen IDE in der anderen überschrieben werden. Auch die laufende Loganzeige funktioniert nicht richtig, wenn mehrere IDEs offen sind. Die Links und Buttons in der Weboberfläche, welche die IDE öffnen, sind so konzipiert, dass wenn immer möglich ein schon offenes IDE-Fenster/Tab wieder in den Vordergrung geholt wird, anstatt ein neues zu öffnen. Wenn aus Versehen doch eine zweite IDE geöffnet wird, ist das kein Unglück, aber sie sollte möglichst wieder geschlossen werden, um Verwirrung zu vermeiden.

Scripte öffnen

Das Popup links oben dient dazu, Scripte zum Editieren in einem Tab zu öffnen (oder, falls sie schon geöffnet sind, das entsprechende Tab zu aktivieren). Es enthält:

  • das mainscript. Das ist das Script, das beim Start des Geräts (bzw. der vdcd-Applikation darauf, siehe auch restartapp() Funktion) gestartet wird. Oft wird es verwendet, um globale Dinge einzurichten, z.B. die Konfiguration von SmartLED-Ketten/Matrizen oder Initialisierung anderer Hardware.

  • der p44script playground. Das ist ein Script, das nicht permanent gespeichert wird, also nach einem Neustart des Geräts verloren ist (dafür aber auch kein Flash-Wear verursacht). Diese "Spielwiese" ist gedacht, um auch grössere Scripte mal schnell auszuprobieren. Mit der Eval-Taste kann das Script auch als Ausdruck ausgewertet werden und zeigt dann den Resultatwert in der Konsole (ähnlich wie direkt in der Konsole eigegebene Befehle, aber es sind mehrere Eingabezeilen möglich)

  • Implementationsscripte von Scripted Devices (falls vorhanden). Das sind die Scripte, die die Funktionalität von selbst definierten Geräten beinhalten, z.B. eine virtuelle Wetterstation oder vieles anderes mehr.

  • Actions von Action-Evaluatoren (falls vorhanden). Das sind Scripte, die in Evaluator-Devices ausgelöst werden, die als Action-Evaluator angelegt wurden, wenn die entsprechende Bedingung erfüllt ist (im Gegensatz zu den anderen Evaluator-Typen, deren Zustand einfach ans übergeordnete SmartHome-System weitergeleitet wird, also Digital Strom im Fall von P44-DSB oder matter).

  • Actions von Triggern (nur P44-LC, nur falls vorhanden). Trigger sind ähnlich wie Action Evaluatoren - damit können z.B. Schaltuhr-Funktionen, Spezielle Reaktion auf Tastendrücke oder andere Eingänge programmiert werden. Zudem können Trigger auch als Taste auf der Custom Action-Seite mit konfigurierbarem Text und Farbe erscheinen, um von Anwender:innen bequem ausgelöst zu werden.

  • Szenenscripte (falls vorhanden). Alle Geräte mit Ausgang (Leuchten, Relais, Storenmotoren etc.) haben Szenen, die Zustände des Ausgangs speichern und wieder abrufen können. Optional kann beim Aufruf einer Szene ein Szenenscript aufgerufen werden, welches z.B. eine dynamisch ändernde farbige Lichtszene implementieren kann.

Nur angelegte Scripte werden angezeigt

Das Popup zeigt nur Scripte, die im System tatsächlich existieren. Mainscript, Playground existieren immer, Implementationsscripte von Scripted Devices und Actions von Action-Evaluatoren existieren sobald das entsprechende Device angelegt wird, aber andere Scripte erscheinen erst im Menu, wenn sie in der Weboberfläche des Geräts angelegt werden. Das gilt insbesondere für Szenenscripte, s. nächster Abschnitt.

Szenenscripte anlegen

Jedes Device mit Ausgang könnte theoretisch 90 Szenenskripte haben (soviele mögliche Szenen gibt es), aber in der Praxis werden natürlich nur ganz wenige davon tatsächlich verwendet. Deshalb zeigt das Popup nicht eine Unzahl von leeren Szenenscripts zu Auswahl an, sondern nur diejenigen, die in Gebrauch sind.

Das heisst, wenn eine Szene noch kein Script hat, kann dieses in der IDE (noch) nicht geöffnet werden. Es muss zuerst in den Szeneneinstellungen der Weboberfläche aktiviert werden - von da aus kann es dann direkt via Link unten rechts am Script-Eingabefeld geöffnet werden, auch wenn das Textfeld noch leer ist. Ab dann ist das Script im Öffnen-Popup der IDE verfügbar. Alternativ dazu kann in den Szeneneinstellungen auch schon ein Scripttext eingegeben werden (eine Kommentarzeile reicht) und der Dialog normal geschlossen werden. Nun ist das Szenenscript nicht mehr leer, und ist in der IDE im Öffnen-Popup verfügbar.

Konsole/REPL

Das schwarze Panel unten links ist die Konsole, die als REPL (Read-Execute-Print Loop) funktioniert, d.h. dort können direkt p44script-Anweisungen eingegeben und mit Druck auf Return/Enter ausgeführt werden - das Resultat wird unmittelbar darunter ausgegeben.

  • Die grün markierte letzte Zeile zeigt den aktuellen Kontext an, in dem die Ausführung von Eingaben erfolgt. Das ist jeweils der Kontext des im Editor offenen Scripts, oder, wenn der hellgrüne Bereich am unteren Rand erscheint und einen pausierten Thread anzeigt, sowie im Script-Editor eine grün markierte Linie die Pausenposition markiert, ist es der Kontext dieses Threads. Alle Eingaben werden in diesem Kontext ausgeführt. So ist es möglich, auf die spezifischen Variablen, Objekte und Funktionen des jeweiligen Kontexts zuzugreifen. Mehr zu Scriptkontexten s. hier.

  • Wird etwas unterhalb der grün markierten Zeile getippt und dann Enter gedrückt, wird das Getippte ausgeführt und das Resultat angezeigt.

  • Wird irgendwo in der Konsole eine Textstelle markiert und dann Enter gedrückt, wird der markierte Text ans Ende (also unter die grün markierte Zeile) kopiert und dann gleich ausgeführt. Das ist praktisch, um etwas schon Getipptes wiederzuverwenden.

  • Wird auf einer Zeile oberhalb der grün markierten Enter/Return gedrückt, ohne dass Text angewählt ist, wird die ganze Zeile ans Ende kopiert und ausgeführt.

  • Der ganze Konsolentext ist editierbar, es können also Änderungen getippt werden, bevor eine Zeile mit Return/Enter nochmals ausgeführt wird. Um einen Zeilenwechsel einzugeben, ohne die Zeile auszuführen, kann Opt-Return/Enter verwendet werden.

  • Der Konsoleninhalt kann mit dem entsprechenden Knopf oder mit Cmd/Ctrl-K gelöscht werden. Dabei bleibt der Eingabebereich (unterhalb der grün markierten Kontextzeile), der aktuell selektierte Text, oder die Zeile auf der der Cursor steht erhalten. Es können natürlich auch Teilbereiche selektiert und mit der Löschtaste entfernt werden. Mit Undo (Cmd/Ctrl-Z) kann u.a. nach dem Ausführen eines Befehls das Resultat entfernt und wieder zur Eingabezeile zurückgekehrt werden.

  • Resultate, die Objekte oder Arrays sind, werden in JSON-Schreibweise dargestellt und können mit den kleinen grauen Dreiecken im linken Rand neben der Zeilennummer auf- und zugeklappt werden, um Übersicht zu schaffen.

Das Log-Panel

Das weisse Panel unten rechts zeigt laufend das Log an. Mit den Tasten darunter kann die Ausgabe (nicht aber das Log selber!) pausiert und wieder gestartet werden, der Panelinhalt gelöscht, und mit dem kleinen Popup-Menu kann auch der Loglevel verstellt werden. Das ist nützlich, um im Auge zu behalten, was auf dem System so vorgeht, sei es allgemein oder auf Grund von Scriptaktionen.

Scripte bearbeiten

In einem Editor-Tab geöffnete Scripte können direkt bearbeitet werden.

  • Zum Speichern gibt es eine Taste am unteren Rand, oder Cmd/Ctrl-S. Wird ein aktuell laufendes Script gespeichert, bricht dessen Ausführung ab, eine entsprechende Meldung erscheint im Log.

  • Um die Syntax zu überprüfen, gibt es die Taste mit dem Häkchen, diese speichert das Script, und wenn ein Syntax-Fehler gefunden wird, wird er im Editor rot markiert. Nicht alle Fehler können so gefunden werden, viele Fehler passieren erst zur Laufzeit, und werden erst nach dem Starten des Scripts angezeigt.

  • Um ein Script zum Debuggen (von Anfang an im Einzelschritt-Modus) zu starten, dient die Taste mit der Spraydose (diese funktioniert nicht mit Szenenscripts, da muss ein Breakpoint auf die erste Zeile gesetzt werden, s. unten).

  • Um ein Script in seinem Kontext (erneut) zu starten, dient die Taste mit dem grünen Pfeil. "Im Kontext" starten heisst hier: das Script wird nicht nur einfach gestartet, sondern die Dinge, die normalerweise darum herum zur Vorbereitung passieren, ebenfalls (im Speziellen: vorheriger Aufruf der Szene bei Szenenscripts).

  • Um ein Script auszuführen, und sein Resultat in der Konsole angezeigt zu bekommen, dient die Eval-Taste =?. Das macht mit den meisten in Geräten oder Szenen eingebundenen Scripts keinen Sinn! Die Taste ist vor allem dazu da, um Dinge im p44script playground (s. oben) auszuprobieren.

Debugging

Wenn ein Script nicht so funktioniert wie gedacht, ist schrittweise Ausführung ,und dabei die Möglichkeit, zu sehen, was die aktuellen Werte in den Variablen sind, sehr nützlich.

  • Mit einem Click in den linken Rand im Editor kann ein sogenannter Breakpoint (Haltepunkt) gesetzt werden.

    Script muss mit offenem Debugger gestartet worden sein, damit Breakpoints aktiv sind

    Scripte die schon laufen, wenn die IDE geöffnet wird, reagieren nicht auf Breakpoints. In diesem Fall muss das jeweilige Script zuerst neugestartet werden

  • Wenn die Scriptausführung einen Haltepunkt erreicht (Kommentare werden nicht ausgeführt, deshalb bewirken Haltepunkte auf Kommentarzeilen nichts), wird die Ausführung pausiert und am unteren Rand erscheint das hellgrüne Feld mit den Debug-Knöpfen.

  • Falls gleichzeitig mehrere threads (etwa: Script-Ausführungss-Stränge) einen Haltepunkt erreichen und deshalb pausiert sind, kann mit dem Popup-Menu das den Thread anzeigt (thread_68750) zwischen den pausierten Threads umgeschaltet werden.

  • Die Konsole arbeitet jeweils im Kontext des angezeigten pausierten Threads. Eingaben in der Konsole werden jetzt in der gleichen Umgebung ausgeführt, wie wenn sie an der momentanen Ausführungsposition stehen würden. Das bedeutet, dass auch alle Variablen dieses momentanen Kontextes, inklusive lokale Variablen einer gerade in Ausführung befindlichen Funktion, oder threadvars, zugänglich sind und durch eintippen des Namens angezeigt, oder auch zugewiesen werden können. In der Konsole nützlich sind auch die Introspektions-Funktionen, womit Informationen zu verfügbaren Funktionen, Feldern etc. abgerufen werden können.

  • Mit den Singlestep-Buttons (Step, Step in, Step out) bzw. den Funktionstasten F6,F7,F8 kann das Script schrittweise ausgeführt werden. Bei mehreren Anweisung auf einer Zeile bleibt der grüne Balken auf derselben Zeile, aber der Cursor zeigt die Position innerhalb der Zeile an.

  • Normale Schritte (Step, F6) führen Funktionsaufrufe in einem Schritt aus, mit Step-in (F7) hingegen geht die schrittweise Ausführung in die Funktion hinein. Mit Step out (F8) wird der Rest der Funktion aufs Mal ausgeführt, die Ausführung pausiert erst wieder nach dem Funktionsaufruf.

  • Mit der Fortfahren-Taste wird der Thread normal weiter ausgeführt, bis er entweder zuende ist, gestoppt wird oder erneut einen Breakpoint erreicht. Mit der Stop-Taste kann der Thread abgeborchen werden - das ist aber nicht dasselbe wie das ganze Script abzubrechen, wenn das Script wegen Verwendung von concurrent oder on (...) {...} mehrere parallel laufende Threads hat!

    Pausierter Code (z.B. on(...)-Handler) wird nicht erneut aufgerufen

    Ein Breakpoint in Code, der u.U. aus Handlern oder concurrent-Konstrukten, oder aus anderen Gründen aus der Anwendung heraus immer wieder aufgerufen wird, u.U. in schneller Folge, könnte zu einem schnell anwachsenden Stau von pausierten Threads und damit zu Speicherknappheit führen. Damit das nicht passiert, werden Codeteile, in denen gerade ein pausierter Thread steht, nicht erneut ausgeführt. Stattdessen erscheint eine Warnung im Log.

  • Wenn das Browser-Fenster mit der IDE geschlossen wird, oder die Netzwerkverbindung zwischen Browser und Gerät abbricht, werden nach 20 Sekunden Wartezeit alle pausierten Threads fortgesetzt und der Debugger deaktiviert.

Weitere Funktionen

  • Dokumentations-Knopf ganz rechts unten: Ruft die eingebaute p44script Kurzreferenz auf, die immer genau die auch tatsächlich im Gerät vorliegende p44script-Version beschreibt (während diese online-Doku die jeweils aktuelle Version beschreibt, die in ein paar Jahren vielleicht von der in einem zu wartenden Gerät abweicht).

  • LED-Simulator: der farbige Knopf rechts unten öffnet ein Browser-Tab mit einem Tool, mit dem Lichtinstallationen aus SmartLEDs (WS281x, SK6812) im Browser simuliert und die dazugehörige View-Hierarchie des p44lrgraphics-Subsystems inspiziert und auch konfiguriert werden kann. Das kann sehr nützlich sein, um komplexe Animation etc. zu entwickeln, oder auch per Fernwartung einen Eindruck zu bekommen, was die LEDs aktuell anzeigen, auch wenn der direkte Blick darauf nicht möglich ist. Nicht auf allen P44-xx-Geräten ist das SmartLED-Subsystem aktiv, der LED-Simulator kann dort auch aufgerufen werden, zeigt aber nichts an. Der LED-Simulator ist am nützlichsten parallel zur IDE in einem separaten Fenster. Details s. Doku zum LED-Simulator.