NEWS
[gelöst] Skript stoppt bei Zustandsänderung mit Fehler
-
Ich möchte dieses Skript zur Überwachung der Beleuchtung einsetzen. Auf meinem Testsystem lief es nach ein paar kleineren Anlaufschwierigkeiten einwandfrei.
Nun habe ich es auf mein Produktivsystem übertragen, dort stoppt es, sobald ich ein Gerät schalte, mit folgendem Fehler:12:27:03.040 info javascript.0 (2484356) script.js.common.Testbereich.Statistikprojekte.licht_zaehlen: Trigger= 1 Wert= false Alter Wert= true 12:27:03.049 error javascript.0 (2484356) at Object.<anonymous> (script.js.common.Testbereich.Statistikprojekte.licht_zaehlen:334:30)
Hier der Auszug aus dem Skript (Zeile 329 - 344):
function CreateTrigger() { //Trigger für Sensoren erzeugen for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen on(Sensor[x], function (dp) { //Trigger in Schleife erstellen if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val); if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln SimplyfyLightStates(x); CheckLight(x); } else { log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error"); }; }); };
Ich habe schon alle andere Skripte ausgeschaltet, aber der Fehler bleibt. Das Skript läuft wie gesagt auf dem Testsystem (abgespeckte Version des Produktivsystems) fehlerfrei. Was übersehe ich?
-
@maloross
Die Variablepraefix
ist global deklariert und initialisiert?
Im Tab "Protokolle" finden sich keine zusätzlichen Informationen zum Fehler? -
javascript.0 2023-12-30 13:11:54.584 error at processImmediate (node:internal/timers:476:21) javascript.0 2023-12-30 13:11:54.584 error at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/db-states-redis/src/lib/states/statesInRedisClient.ts:381:37) javascript.0 2023-12-30 13:11:54.583 error at change (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.ts:11183:36) javascript.0 2023-12-30 13:11:54.583 error at Array.forEach (<anonymous>) javascript.0 2023-12-30 13:11:54.583 error at /opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.ts:11201:47 javascript.0 2023-12-30 13:11:54.583 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:645:29) javascript.0 2023-12-30 13:11:54.582 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1266:38) javascript.0 2023-12-30 13:11:54.582 error at Object.<anonymous> (script.js.common.Testbereich.Statistikprojekte.licht_zaehlen:334:30) javascript.0 2023-12-30 13:11:54.582 error Error in callback: TypeError: Cannot read properties of null (reading 'search')
Deine erste Frage kann ich nicht beantworten, da ich mich (noch) nicht wirklich auskenne (daher auch Probeläufe auf einem Testsystem).
-
@maloross sagte: TypeError: Cannot read properties of null (reading 'search')
Vermutung: Zum Trigger-Datenpunkt existiert kein Parent-Objekt, folglich auch keine "channelId"?
-
@paul53 sagte in [Fehler] Skript stoppt bei Zustandsänderung mit Fehler:
Vermutung: Zum Trigger-Datenpunkt existiert kein Parent-Objekt, folglich auch keine "channelId"?
Da bin ich überfragt, da ich den Datenpunkten nur Raum und Funktion zugeteilt habe (was auf dem Testsystem einwandfrei funktionierte).
Ich bin noch in der Phase "ich kopier das mal und schaue, was passiert" - ergo mit dem Erfahrungsschatz eines DAUs
-
-
@ticaki sagte in [Fehler] Skript stoppt bei Zustandsänderung mit Fehler:
dp.startWith(praefix)
heißt dass, das sich "praefix" auf den Channel bezieht, unter dem der Datenpunkt abgespeichert ist?
-
@maloross sagte: Da bin ich überfragt
Dann zeige bitte die komplette ID-Struktur zum 2. Datenpunkt (Index 1) der Sensorliste als Screenshot des Tab "Objekte".
-
Das bedeutet das
'0_userdata.0.meinOrdner.meinDatenpunkte'.startWith('0_userdata.0.meinOrdner') == true // das ist hier wahr, weil der erste String mit dem 2. startet.
-
@maloross sagte: "praefix" auf den Channel bezieht, unter dem der Datenpunkt abgespeichert ist?
Ja, genauer auf das übergeordnete Objekt. Wenn der übergeordnete Ordner kein Objekt hat, dann wird auch keine Kanal-ID geliefert.
-
@ticaki sagte: dann mit `dp.startWith(praefix)'.
if(!dp.id.startsWith(praefix)) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
-
@paul53
Jap zu wenig Kaffee - Danke Paul -
@paul53
Bei mir ist es folgendermaßen aufgebaut:
Ich nutze Aliase
Hier der Ursprungsort
Von euren Angaben ausgehend: irgend ein Datenpunkt hat sowohl im Ursprung als auch im Alias eine doppelte Zuordnung Raum und/oder Funktion?
-
@maloross
Der Ordner "schrankbeleuchtung" hat kein Objekt: Deshalb der Fehler. -
@paul53 Unter Alias gibt es den Ordner "schrankbeleuchtung" mit dem Datenpunkt "switch" - ich dachte, das ist ein Objekt.
-
@maloross sagte: ich dachte, das ist ein Objekt.
Nein, das ist nur ein Ordner ohne Objekt, der durch Punkte in der Datenpunkt-ID erzeugt wird.
Das Objekt kann man von einem übergeordneten Ordner (mit Objekt) aus nachträglich erstellen, indem man den identischen Namen "schrankbeleuchtung" für das Objekt (Kanal) verwendet. Zeige bitte auch die übergeordnete Struktur von "schrankbeleuchtung.switch". -
@paul53
ich habe jetzt alle Funktionen entfernt, nur noch im Ursprungsordner das Schranklicht mit Raum und Funktion versehen - Fehler bleibt, Protokoll schreibtjavascript.0 2023-12-30 14:00:36.526 error script.js.common.Testbereich.Statistikprojekte.licht_zaehlen: Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert
Was mich irrtiert ist der Hinweis auf das Scriptverzeichnis, das in meinem Fall "javascript.0 ". Ich versuche es mal auf das Userverzeichnis umzuleiten.
Ich hoffe, das Bild der Struktur ist ausreichend
-
@maloross sagte: Ich hoffe, das Bild der Struktur ist ausreichend
Ja. Selektiere "homematic" und ändere in den Eigenschaften (Bleistift rechts) den Objekttyp von "Kanal" in "Gerät" oder "Verzeichnis". Dann erstelle unter "homematic" ein Objekt vom Typ "Kanal" mit dem Namen "schrankbeleuchtung" (genau so geschrieben).
-
@paul53 danke für deine Unterstützung
erster Testlauf positiv, Skript läuft ohne Fehler durch.
also sollte die Struktur auch im Alias-Verzeichnis "Gerät-Kanal-Datenpunkt" sein.EDIT: Es gibt Skripte, die auf ChannelID basieren - das würde dann ja super auch im Alias-Verzeichnis funktionieren.
-
@maloross sagte: sollte die Struktur auch im Alias-Verzeichnis "Gerät-Kanal-Datenpunkt" sein
Ja, wenn man "channelId" und / oder "deviceId" verwenden will. Außerdem lassen sich weitere Datenpunkte unter dem Kanal leichter manuell erstellen.