NEWS
Script wertet nicht den aktuellen Wert eines Objektes aus
-
Hallo zusammen,
ich habe mit Blockly einen "Störungsindikator" programmiert. Das Script fragt regelmäßig den Status kritischer Komponenten ab und setzt dann - je nach Ergebnis - ein Objekt "Fehler_kritisch" auf wahr oder unwahr.
Dieses Objekt steht regelmäßig Sonntagmorgends (dazu gleich mehr) auf wahr, obwohl alle abgefragten Objekte laut Reiter "Objekte" in ioBroker keinen Fehler aufweisen.
Ich habe das Script dann sukzessive abgespeckt, bis ich den Übeltäter gefunden habe:
hm-rpc.2.info.connection steht auf "true", das Script wertet es aber als "false" aus:
Das habe ich mit Gegenprobe (true/false im Ergebnis getauscht) mehrfach gecheckt. Das Script tut tatsächlich so, als ob hm-rpc.2.info.connection auf false stünde. Das Objekt ist aber eindeutig auf true - es wird auf einem Technik-View in VIS einzeln dargestellt und ist dort, wie auch unter Objekte in ioBroker i.o.Nach Neustart des Javascript Adapters ist das Ergebnis des Scripts wieder in Ordnung, der Fehlerindikator wird also wieder mit false befüllt.
Es sieht so aus, als ob der Javascript Adapter nicht den aktuellen Wert des Objekts prüft, sondern einen zwischengespeicherten?
Was passiert Sonntags?:
Ich sichere, neben einem täglichen Backup, in der Nacht von Samstag auf Sonntag ein Image der SD-Kate des Raspi auf mein NAS. Dazu stoppe ich ioBroker, schreibe das Image und starte ioBroker wieder. Hier ein Auszug aus dem Script:
... # Stoppe Dienste vor Backup iobroker stop # Backup mit Hilfe von dd erstellen und im angegebenen Pfad speichern dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${FILE_NAME} bs=1MB # Starte Dienste nach Backup iobroker start ...
Im Kern stellt sich folgende Frage:
Wie kann es sein, dass alle Adapter scheinbar fehlerfrei laufen und Javascript dennoch nicht den aktuellen Wert eines Objektes auswertet?
Noch ein Hinweis zur Ermittlung der Ursache: ich meine mich zu erinnern, dass am vergangenen Sonntag das Problem nach einem Neustart des HM-RPC Adpaters beseitigt war.
Gruß
Manfred
-
Bau doch mal eine log Ausgabe vor der Bedingung ein die den Wert der ccu Connection ausgibt. Dann. Siehst du potentiell mehr.
Ein weiterer top ist das nicht über einen Zeitplan zu machen sondern Über einen Trigger der genau auf den Connection Datenpunkt reagiert und dann setzt. Das muss ja nicht minütlich laufen.
Wenn du es so machst musst du nur such beim Skripte Start das einmalig korrekt setzen.
-
Danke für die Tipps.
Ich habe nun in das Script einen Debug-Output mit dem Wert des betreffenden Objektes eingefügt.
Was das Triggern betrifft, ist es etwas komplexer: im eigentlichen Script werden 16 Datenpunkte abgefragt, die auch noch verschiedene Werte haben (z.B. Duty-Cycle ist erst kritisch > 50). Auf die alle zu triggern ist mit Javascript/Blockly etwas komplex.
Aber mit der oben beschriebenen Ergänzung erfahre ich beim nächsten Mal wenigstens, welcher Wert im Script verarbeitet wird. Wobe ich mir sicher bin, dass es ein false ist, obwohl im Objekte-Reiter true steht.
Ich bin dann erst mal ein paar Tage abwesend. Deshalb werde ich den nächsten Zeitpunkt (wenn es denn wirklich immer wie beschrieben Sonntags ist) nicht sehen können. Also nicht wundern, wenn ich in diesem Thread erst mal nicht weiter aktiv bin.
-
Wie sieht die konfig vom JavaScript Adapter aus? Screenshot bitte
-
Voilá:
Könnte es der Schalter "Nicht alle Zustände beim Start abonnieren" sein :?:
-
Der ist genau so wie er keine Probleme macht. Das war eine Vermutung die sich damit nicht bewahrheitet hat.
-
Der ist genau so wie er keine Probleme macht. Das war eine Vermutung die sich damit nicht bewahrheitet hat. `
Kannst Du bitte mal erläutern mit welchen Einstellungen er Probleme macht? -
Was das Triggern betrifft, ist es etwas komplexer: im eigentlichen Script werden 16 Datenpunkte abgefragt, die auch noch verschiedene Werte haben (z.B. Duty-Cycle ist erst kritisch > 50). Auf die alle zu triggern ist mit Javascript/Blockly etwas komplex. `
Warum? Es gibt ja den Trigger Block wo man mehrere objecten eingeben kann die das Script bei Änderung ausführen sollen?
–-----------------------
Send from mobile device
Das schöne ios hat Auto Korrektur zum k****
Wer Schreibfehler findet darf sie behalten oder auf eBay verkaufen, mindest Umsatz 10% für die community
-
Der ist genau so wie er keine Probleme macht. Das war eine Vermutung die sich damit nicht bewahrheitet hat.
Kannst Du bitte mal erläutern mit welchen Einstellungen er Probleme macht?
Man muss dann anders programmieren und nicht kompatibel mit blockly wie ich denke.https://github.com/ioBroker/ioBroker.ja ... s-on-start
Aber hier nicht relevant.
-
Warum? Es gibt ja den Trigger Block wo man mehrere objecten eingeben kann die das Script bei Änderung ausführen sollen? `
Hallo Dutchman,
wie schon geschrieben sind es ja 16 Objekte, die ich abfrage. Die haben sehr verschiedene Stati - Bool, Werteliste, Zahl etc.
Wahr, unwahr, größer, kleiner etc. fallen da also als Trigger aus. Bleibt nur "wurde geändert" (oder, schlechter, wurde aktualisiert).
Nun gibt es aber Objekte, die sich sehr oft ändern. Im Ergebnis würde möglicherweise sogar öfter getriggert, als mit dem Cron.
Okay, ich könnte mehrere Scripte daraus machen - je Art des Objektes eines.
Aber: im Kern geht es hier doch darum, dass im Script offensichtlich ein anderer Zustand verarbeitet wird, als der tatsächlich (laut Objekte-Reiter und laut aktueller Funktion des Gewerks) vorhandene. Das Problem durch Umprogrammierung zu "lösen" würde doch allenfalls die Symptome reduzieren und nicht die Ursache. Außerdem: Wenn der Trigger dann, z.B. durch Änderung des DutyCycle, ausgelöst wird, schlägt der Fehler im anderen Objekt doch wieder zu.
Gruß
Manfred
-
Bau doch mal eine log Ausgabe vor der Bedingung ein die den Wert der ccu Connection ausgibt. Dann. Siehst du potentiell mehr. `
Aus dem Urlaub zurück und erwartungsgemäß steht das Problem wieder an.
Obigen Tipp habe ich befolgt. Ergebnis:
- Logeintrag des Scriptes: hm-rpc.2.info.connection: false
In der Übersicht der Objekte im Admin: hm-rpc.2.info.connection: true
Und nun?