Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Error/Bug
    4. Javascript - abnormales Verhalten - entgegen jeglicher logik

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Javascript - abnormales Verhalten - entgegen jeglicher logik

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      sleepless last edited by

      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
      8188_bildschirmfoto_2018-08-24_um_16.26.26.png

      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:

      1 Reply Last reply Reply Quote 0
      • apollon77
        apollon77 last edited by

        Zeig doch mal das vollständige Blockly und ggf auch den generierten JavaScript code bitte

        1 Reply Last reply Reply Quote 0
        • S
          sleepless last edited by

          Ich möchte nur verstehen, ob ich falsch denke oder es sich falsch verhält. Bestes Beispiel das hier:

          8188_bildschirmfoto_2018-08-26_um_12.48.35.png

          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);
          });
          
          1 Reply Last reply Reply Quote 0
          • S
            sleepless last edited by

            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?

            1 Reply Last reply Reply Quote 0
            • R
              RappiRN Most Active last edited by

              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

              1 Reply Last reply Reply Quote 0
              • BuZZy
                BuZZy last edited by

                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ß

                1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  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.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  951
                  Online

                  31.6k
                  Users

                  79.5k
                  Topics

                  1.3m
                  Posts

                  5
                  7
                  573
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo