NEWS
Script holt falschen Wert vom Objekt
-
Ich habe Scripte laufen, die mich auf kritische Störungen aufmerksam machen. Dazu gehört selbstverständlich auch, dass der Homematic-Rega und der -RPC Adapter verbunden sind.
Ich frage dazu den Wert "hm-rega.1.info.connection" bzw. "hm-rpc.n.info.connection" ab und reagiere entsprechend.
Nach einen Neustart von ioBroker (Reboot nach nächtlichen Wartungsarbeiten) passiert es regelmäßig (häufig aber nicht immer), dass der Wert in den Objekten eindeutig auf "true" steht, das Script jedoch ein "false" verarbeitet.
Gerade eben steht wieder so ein Fall an. Vorbereitend hatte ich im Laufe der Woche bereits je relevantem Datenpunkt ein einfaches Script und einen neuen Zieldatenpunkt angelegt:
var schedule; schedule = schedule('* * * * *', function () { setState("javascript.0.Stoerung_Summe.REGA_Realwert"/*REGA_Realwert*/, getState("hm-rega.1.info.connection").val); });
Das Script läuft definitiv jede Minute. Ich sehe auch in der Adminoberfläche am Objekt "javascript.0.Stoerung_Summe.REGA_Realwert", dass es beschieben wird. Es wird kurz grün und der Zeitstempel aktualisiert.
Dennoch, der Wert im Adapter:
...und das Script schreibt:
Das Problem ist (mindestens bis zum nächsten reboot) weg, sobald ich eine der beteiligten Instanzen (als Javascript oder HM-...) neu starte.
Ich hatte dazu vor ca. 1,5 Jahren einen Issue auf GitHub dazu eröffnet. Ich war mit Unterstützung des Entwicklers nicht in der Lage, dem Problem auf die Spur zu kommen.
Nach einer Neuinstallation wegen Umstieg auf eine VM (NUC mit Proxmox) war das Problem weg, ist aber inzwischen schleichend wieder aufgetaucht.
Wie könnte ich der Ursache auf die Spur kommen?
Versionen:
JS-Controller 2.1.0
Script Engine 4.3.3
HM Rega 2.4.12
HM RPC 1.11.0
Node 10.16.0
NPM 6.9.0 -
@hmanfred
Darf ich fragen, weshalb Du jede Minute nachschaust und weshalb Du nicht als Trigger das Ändern des Datenpunktes "connection" nimmst? -
@BBTown
Das gepostete Script ist nur zum Testen eingerichtet.Im richtigen Leben werden von einem Script viele Datenpunkte abgefragt. Da es verschiedene Typen sind (Boolsch, Wertelisten, Zahl) kann man sie (zumindest in Blockly) nicht so einfach als Trigger verodern.
Deshalb läuft dieses Script im 5-Minuten-Rhythmus und arbeitet alle Datenpunkte ab.Aber auch wenn ich nur diesen einen Datenpunkt als Trigger nehmen würde: wenn JS in meinem Beispiel den DP als false erkennt, obwohl er true ist - wie soll dann getriggert werden wenn er von (eigenlich nicht)false auf (wirklich(false) "wechselt"?
Und zuletzt: das (nachgewiesene) Problem, dass JS einen falschen Wert verarbeitet bleibt und erschüttert ziemlich heftig mein Vertrauen in die Zuverlässigkeit solcher Abfragen.
-
@hmanfred sagte in Script holt falschen Wert vom Objekt:
kann man sie (zumindest in Blockly) nicht so einfach als Trigger verodern.
Hast Du dazu ein Beispiel?
Ich hatte bisher keinen Datenpunkt der nicht als Trigger hätte herangezogen werden können.Wenn Du alle x-Minuten einfach ins blaue hinein Abfragen losschießt, und das ggf. auch noch zig mal, dann erzeugst Du einen Overhead, den Du durch gezieltes Triggern vermeidest.
Die Frage ist nun, ob Du ersatzweise den Trigger "connection" anstelle eines minütlichen Pollings ausprobierst - und wenn es funktioniert, Du den Fehler anderweitig suchst, - oder ob Du den Tipp ignorierst und im "heftigen Misstrauen" verbleibst?!
-
@BBTown sagte in Script holt falschen Wert vom Objekt:
Ich hatte bisher keinen Datenpunkt der nicht als Trigger hätte herangezogen werden können.
Aber bei 50 DPs wird es in Blockly schon zur Fingerakrobatik
-
Letzte Änderung und Zeitstempel haben unterschiedliche Zeiten.
Was ist um 1:34 und um 11:10 passiert?
Mag vielleicht nichts miteinander zu tun haben, aber ist mir halt aufgefallen -
@haselchen
1:34 war die Wartung fertig und der Rechner wurde neu gestartet. Da das Test-Script ja ein Dauerläufer ist und der falsche Wert abgeholt wird, wechselte der Testdatenpunkt von true (so stand er ja vor dem Reboot) auf false.11:10 war der letze Lauf des Scripts vor dem Screenshot.
-
@Homoran sagte in Script holt falschen Wert vom Objekt:
@BBTown sagte in Script holt falschen Wert vom Objekt:
Ich hatte bisher keinen Datenpunkt der nicht als Trigger hätte herangezogen werden können.
Aber bei 50 DPs wird es in Blockly schon zur Fingerakrobatik
Richtig. Ich könnte sie zwar alle auf Aktualisierung oder Änderung verodern - ich frage sie ja im "Dann" explizit nochmal ab. Mit Cron alle 5 Minuten ist's halt einfacher zusammenzuklicken.
Aber nochmal: das ist ja nicht das Problem.
-
@hmanfred sagte in Script holt falschen Wert vom Objekt:
das ist ja nicht das Problem.
Ist das so?
Wenn der Raspi vollkommen überlastet ist, kommen schon mal seltsame Dinge dabei raus
-
@Homoran sagte in Script holt falschen Wert vom Objekt:
@hmanfred sagte in Script holt falschen Wert vom Objekt:
das ist ja nicht das Problem.
Ist das so?
Wenn der Raspi vollkommen überlastet ist, kommen schon mal seltsame Dinge dabei raus
@hmanfred sagte in Script holt falschen Wert vom Objekt:
Nach einer Neuinstallation wegen Umstieg auf eine VM (NUC mit Proxmox) war das Problem weg, ist aber inzwischen schleichend wieder aufgetaucht.
Aber auch ein überlasteter Raspi darf mal verschnaufen - und spätestens dann sollte der richtige Wert abgeholt werden. Das passiert aber erst wieder, wenn einer der beteiligten Adapter neu gestartet wird.
-
Ich muss diesen Thread noch mal hochziehen. Das Problem ist nicht gelöst.
Jetzt möchte ich mal meine Vermutung testen, dass es an der Startreihenfolge der Adapter liegt. Lässt sich die - und möglichst auch ein Delay zwischen den Starts - irgendwo einstellen?