NEWS
Javascript - abnormales Verhalten - entgegen jeglicher logik
-
Moin,
ich hab langsam keine Lust mehr. Entweder verstehe ich die Funktion nicht oder Javascript ist mal richtig buggy.
Folgendes:
Wenn ich diese Funktion nutze
dreht das Ding irgendwann durch.
z.B.: Zuerst verhält sich alles so wie es soll: Verändert sich einer der beiden, wird der Trigger ausgelöst.
Nach einiger Zeit rastet der komplett aus. Das äußert sich daran, das ein Intervall 300mal ausgeführt wird. Oder andere Aktionen 10000mal durchgeführt werden - ohne das ich etwas an dem Script verändert hab.
Hin und wieder ist dieses verhalten auch gleich zu anfang an. Sobald die "falls bedingung" erfüllt ist, wird diese 100mal ausgeführt. Das ist aber nirgends so programmiert.
Hab ich daran etwas nicht verstanden oder spinnt das Java Modul?
Edit: Ich kann da egal welches Objekt benutzen - sobald 2 oder mehr an einem Trigger sind mögen die Spiele beginnen :oops:
-
Zeig doch mal das vollständige Blockly und ggf auch den generierten JavaScript code bitte
-
Ich möchte nur verstehen, ob ich falsch denke oder es sich falsch verhält. Bestes Beispiel das hier:
Ich erkläre einmal, wie ich es verstehe und ihr sagt, ob das richtig ist:
Sobald die Variable schlaf_links_temp1 wahr ist, wird alle 5min eine Telegramnachricht gesendet. Gleichzeitig wird alle 300ms geprüft, ob eine Nachricht mit dem Content "Ja" im Telegrambot angekommen ist. Wenn ja, dann setze die Variable schlaf_links_temp1 auf unwahr und beende sowohl den 5 min Intervall als auch die Abfrage. Dadurch, das die Variable schlaf_links_temp1 auf unwahr gesetzt wird, wird auch gleichzeitig der ganze "Check Block" nicht mehr ausgeführt.
irgendwann jedoch ignoriert ioBroker bzw. Javascript die Anweisung "stop zyklische Ausführung" und ihr könnt euch ja vorstellen, was das bei einem "Ja" bedeutet: Nachrichten im Bot im Abstand von 300ms…. Damit habe ich ein SPAM-Bot, nicht mehr oder weniger. Ich komme dann nur aus der Nummer mit stoppen des ganzen Scriptes.
Und das verstehe ich nicht. Wie kann das dumme Teil einfach irgendwann die Befehle "stop zyklische Ausführung" ignoieren? Am anfang klappt das ja wunderbar..
Hier der Javacode dazu:
var Schlaflinks, Abfrageschlafli; on({id: "javascript.0.var.temp.schlaf_links_temp1"/*schlaf_links_temp1*/, val: true}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Schlaflinks = setInterval(function () { sendTo("telegram", "send", { text: 'Schlafzimmer Fenster links ist auf. Ist das korrekt? (Stoppbar durch Anwesenheit oder Frage beantworten)' }); }, 300000); Abfrageschlafli = setInterval(function () { if (getState("telegram.0.communicate.request").val == '[nojo]Ja' || getState("telegram.0.communicate.request").val == '[nida]Ja' || getState("hm-rpc.0.MEQ0615319.1.STATE").val == false) { setState("javascript.0.var.temp.schlaf_links_temp1"/*schlaf_links_temp1*/, false, true); sendTo("telegram", "send", { text: 'Danke für die Rückmeldung oder schließung des Fensters Schafen links' }); (function () {if (Schlaflinks) {clearInterval(Schlaflinks); Schlaflinks = null;}})(); (function () {if (Abfrageschlafli) {clearInterval(Abfrageschlafli); Abfrageschlafli = null;}})(); } }, 300); });
-
Ist das richtig so?
Umso mehr ich versuche, unnötige "Extra - Stopp Aktionswürste" in dem Programmierten Teil einzubauen, damit er mich nicht zuspamt, umso mehr frag ich mich, was es an dem Befehl "stoppe" nicht zu verstehen gibt und umso mehr stelle ich die daseins-Berechtigung von Blockly in Frage…
Kann es sein, das der Trigger falsch Interpretiert wird und die Schleife 3 Mio mal aufgrufen wird oder das der Stop-Befehl dem trigger hinterherrennt?
Weil es ist unerklärlich, das ein Programm zu Anfang anständig läuft und irgendwann völlig ausrastet...
Gibt's dazu logs? Kann man da traps einbauen, um das verhalten zu entlarven?
-
Deine Logik ist schon richtig, mit den Schleifen hat sich aber schon so Mancher Probleme eingehandelt. Warum genau kann ich dir leider nicht erklären!
Versuch, eine Funktion einzufügen, die alle 5min bzw alle 300ms läuft, vielleicht geht das. ALso im Hauptteil die Funktion starten und beenden und in der Funktion mit dem Cron-Trigger die Schleifen ersetzen.
Enrico
-
Verstehe ich das richtig?
Du bekommst mit dem Script eine Nachricht "Schlafzimmer Fenster links ist auf…..."
Dann antwortest du "Ja" und der Bot schreibt einmalig "Danke für die Rückmeldung....."..
Und irgendwann (eine Stunde später oder so?) ohne das du was tust kommen plötzlich alle 300 ms Sekunden Nachrichten
"Danke für die Rückmeldung oder schließung des Fensters Schafen links" ??
Wie und durch was wird javascript.0.var.temp.schlaf_links_temp1 auf true gesetzt?
Gibt es noch mehr Blöcke die schlaf_links_temp1 auf irgendwelche Veränderungen prüfen?
Hast du z.B. Blöcke die reagieren wenn schlaf_links_temp1 auf false geht?
Eventuell sogar in einem anderen Script irgendwas vorhanden was Änderungen an javascript.0.var.temp.schlaf_links_temp1 vornimmt?
Gruß
-
Ich vermute eine https://de.wikipedia.org/wiki/Race_Condition:
Der ursprüngliche Trigger wird mehrfach ausgelöst (z.B. Fenster auf, zu und wieder auf / Wackelkontakt?). Dadurch wird das Intervall mehrfach gestartet, aber nur die letzte Referenz in der Variable gespeichert. Stoppen des Intervalls löscht dann nur das referenzierte, nicht das unreferenzierte.
Ich sehe zwei Lösungen:
1. Trigger ändern auf "wurde geändert" plus eine zusätzliche Prüfung ob der Datenpunkt wahr ist. Zu Beginn des Triggers als erstes die Intervalle stoppen.
2. Die Lösung komplett ohne das 300ms-Intervall abbilden. Dazu das Intervall durch einen weiteren Trigger (außerhalb des anderen) ersetzen, der den Telegram-DP prüft. Wenn diese Prüfung erfolgreich ist, UND Fenster offen, dann Nachricht schreiben.