Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Javascript Funktion triggert ungewollt, wie verhindern?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.6k

Javascript Funktion triggert ungewollt, wie verhindern?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
11 Beiträge 4 Kommentatoren 819 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    spaceduck
    schrieb am zuletzt editiert von
    #1

    evtl. kann mir jemand einen Tipp geben. Ich rufe von meiner Heizung Werte via RS232 ab, das Schema lautet: Anfrage senden, Antwort empfangen, Pause, Nächster Anfrage...

    Für jede Abfrage habe ich eine eigene Funktion geschrieben, welche einzeln aufgerufen, auch funktionieren. Das Problem ist: Wenn ich die Funktionen hintereinander aufrufe (1000ms Pause dazwischen), dann wird bei der vorher aufgerufenen Funktion der Empfang auch immer mit getriggert. Also ich sende Data2, Data1 empfängt aber auch was... Im Log sieht das dann so aus:

    22:23:01.009 info javascript.0 (37498) script.js.common.Test-1: Data1 send: ce3c0000f2
    22:23:01.165 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 02ce0325ea
    22:23:02.009 info javascript.0 (37498) script.js.common.Test-1: Data2 send: 1101000010
    22:23:02.153 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 0211000112
    22:23:02.154 info javascript.0 (37498) script.js.common.Test-1: Data2 received: 0211000112

    Wieso ist die Funktion denn noch "scharf"? Die sollte doch garnicht anspringen. Ich kapier's nicht...

    function FetchTemperatureExternal() {
        port.write(buffer1, function(err) {
        if (err) {
        return log('Error on write: ', err.message);
            }
            log('Data1 send: ' + buffer1.toString('hex'));
        });
        const parser1 = port.pipe(new ByteLength({ length: 5 }));
        parser1.on('data', function (data1) {
        console.log('Data1 received: ' + data1.toString('hex'));
        });
    }
    
    function FetchControllerMode1() {
        port.write(buffer2, function(err) {
        if (err) {
        return log('Error on write: ', err.message);
            }
            log('Data2 send: ' + buffer2.toString('hex'));
        });
        const parser2 = port.pipe(new ByteLength({ length: 5 }));
        parser2.on('data', function (data2) {
        console.log('Data2 received: ' + data2.toString('hex'));
       });
    }
    

    HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

    M UncleSamU AlCalzoneA 3 Antworten Letzte Antwort
    0
    • S spaceduck

      evtl. kann mir jemand einen Tipp geben. Ich rufe von meiner Heizung Werte via RS232 ab, das Schema lautet: Anfrage senden, Antwort empfangen, Pause, Nächster Anfrage...

      Für jede Abfrage habe ich eine eigene Funktion geschrieben, welche einzeln aufgerufen, auch funktionieren. Das Problem ist: Wenn ich die Funktionen hintereinander aufrufe (1000ms Pause dazwischen), dann wird bei der vorher aufgerufenen Funktion der Empfang auch immer mit getriggert. Also ich sende Data2, Data1 empfängt aber auch was... Im Log sieht das dann so aus:

      22:23:01.009 info javascript.0 (37498) script.js.common.Test-1: Data1 send: ce3c0000f2
      22:23:01.165 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 02ce0325ea
      22:23:02.009 info javascript.0 (37498) script.js.common.Test-1: Data2 send: 1101000010
      22:23:02.153 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 0211000112
      22:23:02.154 info javascript.0 (37498) script.js.common.Test-1: Data2 received: 0211000112

      Wieso ist die Funktion denn noch "scharf"? Die sollte doch garnicht anspringen. Ich kapier's nicht...

      function FetchTemperatureExternal() {
          port.write(buffer1, function(err) {
          if (err) {
          return log('Error on write: ', err.message);
              }
              log('Data1 send: ' + buffer1.toString('hex'));
          });
          const parser1 = port.pipe(new ByteLength({ length: 5 }));
          parser1.on('data', function (data1) {
          console.log('Data1 received: ' + data1.toString('hex'));
          });
      }
      
      function FetchControllerMode1() {
          port.write(buffer2, function(err) {
          if (err) {
          return log('Error on write: ', err.message);
              }
              log('Data2 send: ' + buffer2.toString('hex'));
          });
          const parser2 = port.pipe(new ByteLength({ length: 5 }));
          parser2.on('data', function (data2) {
          console.log('Data2 received: ' + data2.toString('hex'));
         });
      }
      
      M Online
      M Online
      MCU
      schrieb am zuletzt editiert von MCU
      #2

      @spaceduck Gibt es Befehle wie port.close, port.open?

      https://serialport.io/docs/api-stream

      NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
      Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

      1 Antwort Letzte Antwort
      0
      • S spaceduck

        evtl. kann mir jemand einen Tipp geben. Ich rufe von meiner Heizung Werte via RS232 ab, das Schema lautet: Anfrage senden, Antwort empfangen, Pause, Nächster Anfrage...

        Für jede Abfrage habe ich eine eigene Funktion geschrieben, welche einzeln aufgerufen, auch funktionieren. Das Problem ist: Wenn ich die Funktionen hintereinander aufrufe (1000ms Pause dazwischen), dann wird bei der vorher aufgerufenen Funktion der Empfang auch immer mit getriggert. Also ich sende Data2, Data1 empfängt aber auch was... Im Log sieht das dann so aus:

        22:23:01.009 info javascript.0 (37498) script.js.common.Test-1: Data1 send: ce3c0000f2
        22:23:01.165 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 02ce0325ea
        22:23:02.009 info javascript.0 (37498) script.js.common.Test-1: Data2 send: 1101000010
        22:23:02.153 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 0211000112
        22:23:02.154 info javascript.0 (37498) script.js.common.Test-1: Data2 received: 0211000112

        Wieso ist die Funktion denn noch "scharf"? Die sollte doch garnicht anspringen. Ich kapier's nicht...

        function FetchTemperatureExternal() {
            port.write(buffer1, function(err) {
            if (err) {
            return log('Error on write: ', err.message);
                }
                log('Data1 send: ' + buffer1.toString('hex'));
            });
            const parser1 = port.pipe(new ByteLength({ length: 5 }));
            parser1.on('data', function (data1) {
            console.log('Data1 received: ' + data1.toString('hex'));
            });
        }
        
        function FetchControllerMode1() {
            port.write(buffer2, function(err) {
            if (err) {
            return log('Error on write: ', err.message);
                }
                log('Data2 send: ' + buffer2.toString('hex'));
            });
            const parser2 = port.pipe(new ByteLength({ length: 5 }));
            parser2.on('data', function (data2) {
            console.log('Data2 received: ' + data2.toString('hex'));
           });
        }
        
        UncleSamU Offline
        UncleSamU Offline
        UncleSam
        Developer
        schrieb am zuletzt editiert von
        #3

        @spaceduck versuche mal statt on() die Funktion once() zu verwenden - falls es die gibt.

        Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
        ♡-lichen Dank an meine Sponsoren

        S 1 Antwort Letzte Antwort
        1
        • S spaceduck

          evtl. kann mir jemand einen Tipp geben. Ich rufe von meiner Heizung Werte via RS232 ab, das Schema lautet: Anfrage senden, Antwort empfangen, Pause, Nächster Anfrage...

          Für jede Abfrage habe ich eine eigene Funktion geschrieben, welche einzeln aufgerufen, auch funktionieren. Das Problem ist: Wenn ich die Funktionen hintereinander aufrufe (1000ms Pause dazwischen), dann wird bei der vorher aufgerufenen Funktion der Empfang auch immer mit getriggert. Also ich sende Data2, Data1 empfängt aber auch was... Im Log sieht das dann so aus:

          22:23:01.009 info javascript.0 (37498) script.js.common.Test-1: Data1 send: ce3c0000f2
          22:23:01.165 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 02ce0325ea
          22:23:02.009 info javascript.0 (37498) script.js.common.Test-1: Data2 send: 1101000010
          22:23:02.153 info javascript.0 (37498) script.js.common.Test-1: Data1 received: 0211000112
          22:23:02.154 info javascript.0 (37498) script.js.common.Test-1: Data2 received: 0211000112

          Wieso ist die Funktion denn noch "scharf"? Die sollte doch garnicht anspringen. Ich kapier's nicht...

          function FetchTemperatureExternal() {
              port.write(buffer1, function(err) {
              if (err) {
              return log('Error on write: ', err.message);
                  }
                  log('Data1 send: ' + buffer1.toString('hex'));
              });
              const parser1 = port.pipe(new ByteLength({ length: 5 }));
              parser1.on('data', function (data1) {
              console.log('Data1 received: ' + data1.toString('hex'));
              });
          }
          
          function FetchControllerMode1() {
              port.write(buffer2, function(err) {
              if (err) {
              return log('Error on write: ', err.message);
                  }
                  log('Data2 send: ' + buffer2.toString('hex'));
              });
              const parser2 = port.pipe(new ByteLength({ length: 5 }));
              parser2.on('data', function (data2) {
              console.log('Data2 received: ' + data2.toString('hex'));
             });
          }
          
          AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von AlCalzone
          #4

          @spaceduck

           parser1.on('data',
          

          fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
          Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

          Korrekt wäre, beim Initialisieren einmal die Handler zu definieren und dann nicht pollen (jede Sekunde aufrufen), sondern auf eingehende Daten zu reagieren.

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          S 1 Antwort Letzte Antwort
          0
          • AlCalzoneA AlCalzone

            @spaceduck

             parser1.on('data',
            

            fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
            Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

            Korrekt wäre, beim Initialisieren einmal die Handler zu definieren und dann nicht pollen (jede Sekunde aufrufen), sondern auf eingehende Daten zu reagieren.

            S Offline
            S Offline
            spaceduck
            schrieb am zuletzt editiert von spaceduck
            #5

            @AlCalzone said in Javascript Funktion triggert ungewollt, wie verhindern?:

            fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
            Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

            Danke für die Erklärung, macht Sinn!
            Der Controller sendet nur auf Anfrage, d.h. ich schicke einen Befehl, bekomme die Antwort fertig.
            Es werden keine zyklischen Werte gesendet worauf ich reagieren kann, daher muss ich das so lösen - es sei denn ich übersehe was (bin Javascript Anfänger).

            HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

            AlCalzoneA 1 Antwort Letzte Antwort
            0
            • UncleSamU UncleSam

              @spaceduck versuche mal statt on() die Funktion once() zu verwenden - falls es die gibt.

              S Offline
              S Offline
              spaceduck
              schrieb am zuletzt editiert von
              #6

              @UncleSam said in Javascript Funktion triggert ungewollt, wie verhindern?:

              @spaceduck versuche mal statt on() die Funktion once() zu verwenden - falls es die gibt.

              Jo, super das klappt tatsächlich! Ich danke Dir!

              17:24:01.007	info	javascript.0 (24840) script.js.common.Test-1: Data1 send: ce3c0000f2
              17:24:01.172	info	javascript.0 (24840) script.js.common.Test-1: Data1 received: 02ce024886
              17:24:03.007	info	javascript.0 (24840) script.js.common.Test-1: Data2 send: 1101000010
              17:24:03.179	info	javascript.0 (24840) script.js.common.Test-1: Data2 received: 0211000112
              

              HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

              1 Antwort Letzte Antwort
              0
              • S spaceduck

                @AlCalzone said in Javascript Funktion triggert ungewollt, wie verhindern?:

                fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
                Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

                Danke für die Erklärung, macht Sinn!
                Der Controller sendet nur auf Anfrage, d.h. ich schicke einen Befehl, bekomme die Antwort fertig.
                Es werden keine zyklischen Werte gesendet worauf ich reagieren kann, daher muss ich das so lösen - es sei denn ich übersehe was (bin Javascript Anfänger).

                AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                schrieb am zuletzt editiert von
                #7

                @spaceduck sagte in Javascript Funktion triggert ungewollt, wie verhindern?:

                daher muss ich das so lösen

                Das kann man schon so strukturieren, dass du nicht für jeden Befehl einen neuen Handler registrieren musst.
                Mit once ist es vermutlich einfacher.

                Dennoch empfehle ich dir dringend, folgende Zeilen aus den Funktionen auszulagern und insgesamt nur 1x auszuführen:

                const parser1 = port.pipe(new ByteLength({ length: 5 }))
                

                Zwei verschiedene Parser, die gleich aufgebaut sind, brauchst du auch nicht (parser1, parser2).

                So wie du es derzeit machst, hast du nach jedem Aufruf einen zusätzlichen Parser, der mit Daten gefüttert wird. Nur sind alle bis auf den letzten unnötig, da du sie nicht auswertest.

                Nach 10 Aufrufen hast du dann 9 Stück, die Daten verarbeiten aber nicht genutzt werden. Nach 1000 Aufrufen sinds 999...

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                S 1 Antwort Letzte Antwort
                1
                • AlCalzoneA AlCalzone

                  @spaceduck sagte in Javascript Funktion triggert ungewollt, wie verhindern?:

                  daher muss ich das so lösen

                  Das kann man schon so strukturieren, dass du nicht für jeden Befehl einen neuen Handler registrieren musst.
                  Mit once ist es vermutlich einfacher.

                  Dennoch empfehle ich dir dringend, folgende Zeilen aus den Funktionen auszulagern und insgesamt nur 1x auszuführen:

                  const parser1 = port.pipe(new ByteLength({ length: 5 }))
                  

                  Zwei verschiedene Parser, die gleich aufgebaut sind, brauchst du auch nicht (parser1, parser2).

                  So wie du es derzeit machst, hast du nach jedem Aufruf einen zusätzlichen Parser, der mit Daten gefüttert wird. Nur sind alle bis auf den letzten unnötig, da du sie nicht auswertest.

                  Nach 10 Aufrufen hast du dann 9 Stück, die Daten verarbeiten aber nicht genutzt werden. Nach 1000 Aufrufen sinds 999...

                  S Offline
                  S Offline
                  spaceduck
                  schrieb am zuletzt editiert von
                  #8

                  @AlCalzone
                  Danke erstmal, die Lernkurve ist steil...
                  Ich habe jetzt in beiden Funktionen nur noch "const parser = port..." -> Wäre das auch OK oder starte ich damit auch mit jedem Aufruf einen neuen Parser?

                  HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

                  AlCalzoneA 1 Antwort Letzte Antwort
                  0
                  • S spaceduck

                    @AlCalzone
                    Danke erstmal, die Lernkurve ist steil...
                    Ich habe jetzt in beiden Funktionen nur noch "const parser = port..." -> Wäre das auch OK oder starte ich damit auch mit jedem Aufruf einen neuen Parser?

                    AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    schrieb am zuletzt editiert von
                    #9

                    Auch damit startest du mit jedem Aufruf einen neuen Parser. Mein Vorschlag: Ziehe die Erstellung des Parsers raus, dorthin wo du den Port erstellst.
                    In den Funktionen kannst du dann jeweils einen einmal-Handler mit once anhängen und nutzen.

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    S 1 Antwort Letzte Antwort
                    1
                    • AlCalzoneA AlCalzone

                      Auch damit startest du mit jedem Aufruf einen neuen Parser. Mein Vorschlag: Ziehe die Erstellung des Parsers raus, dorthin wo du den Port erstellst.
                      In den Funktionen kannst du dann jeweils einen einmal-Handler mit once anhängen und nutzen.

                      S Offline
                      S Offline
                      spaceduck
                      schrieb am zuletzt editiert von spaceduck
                      #10

                      @AlCalzone
                      Danke Dir, hab es jetzt so umgesetzt und es klappt.

                      HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

                      M 1 Antwort Letzte Antwort
                      0
                      • S spaceduck

                        @AlCalzone
                        Danke Dir, hab es jetzt so umgesetzt und es klappt.

                        M Online
                        M Online
                        MCU
                        schrieb am zuletzt editiert von
                        #11

                        @spaceduck Kannst du dann bitte Deine Lösung hier dokumentieren. Danke.

                        NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                        Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                        1 Antwort Letzte Antwort
                        0
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        614

                        Online

                        32.7k

                        Benutzer

                        82.4k

                        Themen

                        1.3m

                        Beiträge
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                        ioBroker Community 2014-2025
                        logo
                        • Anmelden

                        • Du hast noch kein Konto? Registrieren

                        • Anmelden oder registrieren, um zu suchen
                        • Erster Beitrag
                          Letzter Beitrag
                        0
                        • Home
                        • Aktuell
                        • Tags
                        • Ungelesen 0
                        • Kategorien
                        • Unreplied
                        • Beliebt
                        • GitHub
                        • Docu
                        • Hilfe