Fehlersuche bei Skripten
Die meisten Fehler in der Logik sind keine Abstürze, sondern etwas, das schweigend nicht passiert. Diese Seite geht die häufigsten Fälle in der Reihenfolge durch, in der sie sich prüfen lassen.
Das Skript tut nichts
Läuft es überhaupt? Ein Skript wird erst ausgeführt, wenn es in der Liste
links über den Play-Knopf aktiviert wurde. Ein aktives Skript ist in der Liste
hervorgehoben. Denselben Zustand zeigt
javascript.<Instanz>.scriptEnabled.<Skriptname>.
Läuft die Instanz? Unter Instanzen muss die javascript-Instanz grün sein. Ein Skript in einer gestoppten Instanz ist aktiviert und läuft trotzdem nicht.
Stimmt die Zustands-ID? Eine ID, die es nicht gibt, ist kein Fehler - der Auslöser wartet einfach für immer. Die ID im Objektbaum suchen und von dort kopieren, nicht abtippen.
Ist der Auslöser zu eng? change: 'ne' löst nur bei einem anderen Wert
aus. Ein Taster, der jedes Mal true sendet, ändert seinen Wert nie und löst
damit nie aus. Für solche Geräte ist die Aktualisierung (any) der richtige
Auslöser.
Das Skript löst zu oft aus
Meist ist das ack-Flag die Ursache. Wenn ein Skript einen Zustand schreibt, das Gerät die Ausführung bestätigt und das Skript auch auf diese Bestätigung reagiert, läuft es zweimal - und wenn es dabei erneut schreibt, endlos.
?> Faustregel: Der Auslöser hört auf Rückmeldungen (ack: true), geschrieben
wird als Befehl (ack: false). In Blockly und in den Regeln ist das eine
Auswahl im Auslöserblock, in JavaScript der dritte Parameter von setState.
Die zweite häufige Ursache ist ein Auslöser auf Aktualisierung statt auf Änderung bei einem Sensor, der im festen Takt meldet.
Fehler im Protokoll finden
Unter dem Editor liegt ein Protokollfenster, das nur die Meldungen des gerade geöffneten Skripts zeigt. Es füllt sich ab dem Zeitpunkt, an dem das Skript gestartet wurde - wer eine Meldung sucht, die schon vorbei ist, schaut im allgemeinen Log unter Protokoll.
Bei Blockly-Skripten nennt eine Fehlermeldung die Zeile des erzeugten Codes. Über die Registerkarte über dem Arbeitsbereich lässt sich dieser Code anzeigen und die Zeile nachschlagen.
Meldungen der Stufe debug erscheinen nur, wenn das Protokollniveau der Instanz
entsprechend eingestellt ist - unter Instanzen im Expertenmodus.
Eine Testinstanz anlegen
Ein Skript mit einem schweren Fehler kann die ganze Instanz beenden. Läuft die Heizungssteuerung in derselben Instanz, steht sie mit.
Deshalb: eine zweite javascript-Instanz anlegen und neue oder größere Skripte zuerst dort laufen lassen. Die Instanz wird im Editor über dem Skript ausgewählt. Sie sieht dieselben Zustände - die Trennung betrifft nur den Prozess, nicht die Daten.
Typische Stolpersteine
Zwei Skripte teilen keine Variablen. Auch nicht in derselben Instanz, auch nicht über den Ordner global. Der Ordner global teilt Funktionen, nicht Werte. Wer Werte weitergeben will, legt einen Zustand an.
getState direkt nach setState liefert den alten Wert. Das Schreiben ist
nicht sofort abgeschlossen. Entweder mit dem Wert weiterarbeiten, den man
ohnehin schon hat, oder die Variante mit Async verwenden.
Ein Wert kann null sein. Ein Adapter, der noch keine Daten hat, liefert
keinen Zahlenwert. Eine Rechnung damit ergibt NaN und schreibt still Unsinn in
den Zustand.
Zeitpläne häufen sich an. Wird ein Skript geändert und neu gestartet, räumt der Adapter dessen eigene Zeitpläne auf. Zeitpläne, die ein Skript in einem anderen angelegt hat, nicht.
Der Wert ist eine Zeichenkette. Manche Adapter liefern "22.5" statt 22.5.
Ein Vergleich mit > arbeitet dann anders als erwartet.
Wenn nichts hilft
- Das Skript auf den kleinsten Fall zusammenstreichen, der den Fehler noch zeigt - meist findet sich die Ursache dabei von selbst.
- Eine Ausgabe direkt in den Auslöser setzen, um zu sehen, ob er überhaupt feuert.
- Im ioBroker-Forum nachfragen. Dazu gehören: das Skript, die Fehlermeldung im Wortlaut, die Adapterversion und die js-controller-Version.
Für Probleme, die nicht am Skript liegen, sondern am System, siehe Adapterfehler und ioBroker läuft nicht mehr.