Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Frage an die Javascript Profis

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Frage an die Javascript Profis

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

      Hallo Profis,

      ich habe da mal ne Frage. :roll:

      Folgender Sachverhalt:

      Bei meinem EIBD Adapter, der an sich gut funktioniert existiert ein Kunstgriff, der mir so nicht passt.

      Das muss eleganter gehen…

      Um mit dem eibd zu kommunizieren nutze ich dies: https://github.com/andreek/node-eibd library.

      Die ist auch schön asynchron, was ja eigentlich auch gut so ist.

      Es wird also ein callback ausgeführt, wenn einen Request den ich angefordert habe ausgeführt worden ist. Soweit so gut. Die Schwierigkeit ist allerdings die Definition "ausgeführt". So wie ich das deute wird der callback geworfen, wenn eibd den Befehl entgegengenommen hat. Nicht wenn eibd den Befehl tatsächlich auf dem Bus abgesetzt hat. Ist der Bus busy, so queued eibd den Befehl und führt ihn aus wenn wieder idle.

      Für die o.g. eibd library ist das nicht einsehbar. Sobald die lib einen Request/Befehl an eibd abgegeben hat ist für sie die Sache erledigt. Der Callback wird geworfen.

      Das bedeutet, ich kann mit der lib schneller Daten an eibd senden, als dieser es auf den bus absetzen kann.

      Ich habe mal ausprobiert, was passiert wenn ich es so richtig qualmen lasse. ca. 40 Request pro Sekunde.

      Das Ergebnis war wie erwartet. Eibd queued die Befehle, und rotzt sie dann so schnell wie möglich auf den Bus.

      Was dann uncool ist, da dann sonst nicht mehr viel auf dem Bus geht. / Es steht also fast alles...

      Meine Lösung, die imho nicht so elegant ist, ist folgende:

      Ich schreibe alle angefragten Befehle / Requests in einen eigenen Buffer und arbeite diesen dann über einen setinterval loop ab den ich auf 250ms gestellt habe. So ist gewährleistet, dass der Bus nicht überfahren wird.

      Dieser Loop läuft natürlich die ganze Zeit weiter, auch wen der Buffer leer ist. Das kann nicht optimal sein.

      Wie würde ein Profi das lösen?

      Gruß

      Martin

      1 Reply Last reply Reply Quote 0
      • K
        kleinerDrache last edited by

        Bin zwar kein Profi aber kannst Du den Puffer nicht mit einer abfrage auf "0" versehen ?

        Puffer == "0" schleife aus

        Puffer <> "0" schleife startet wieder

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

          @kleinerDrache:

          aber kannst Du den Puffer nicht mit einer abfrage auf "0" versehen ? `
          Dazu müsste er (bzw. die Software) vorausschauende Fähigkeiten haben 😮

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

            @ruhigundrelaxed:

            Hallo Profis,

            ich habe da mal ne Frage. :roll:

            Folgender Sachverhalt:

            Bei meinem EIBD Adapter, der an sich gut funktioniert existiert ein Kunstgriff, der mir so nicht passt.

            Das muss eleganter gehen…

            Um mit dem eibd zu kommunizieren nutze ich dies: https://github.com/andreek/node-eibd library.

            Die ist auch schön asynchron, was ja eigentlich auch gut so ist.

            Es wird also ein callback ausgeführt, wenn einen Request den ich angefordert habe ausgeführt worden ist. Soweit so gut. Die Schwierigkeit ist allerdings die Definition "ausgeführt". So wie ich das deute wird der callback geworfen, wenn eibd den Befehl entgegengenommen hat. Nicht wenn eibd den Befehl tatsächlich auf dem Bus abgesetzt hat. Ist der Bus busy, so queued eibd den Befehl und führt ihn aus wenn wieder idle.

            Für die o.g. eibd library ist das nicht einsehbar. Sobald die lib einen Request/Befehl an eibd abgegeben hat ist für sie die Sache erledigt. Der Callback wird geworfen.

            Das bedeutet, ich kann mit der lib schneller Daten an eibd senden, als dieser es auf den bus absetzen kann.

            Ich habe mal ausprobiert, was passiert wenn ich es so richtig qualmen lasse. ca. 40 Request pro Sekunde.

            Das Ergebnis war wie erwartet. Eibd queued die Befehle, und rotzt sie dann so schnell wie möglich auf den Bus.

            Was dann uncool ist, da dann sonst nicht mehr viel auf dem Bus geht. / Es steht also fast alles...

            Meine Lösung, die imho nicht so elegant ist, ist folgende:

            Ich schreibe alle angefragten Befehle / Requests in einen eigenen Buffer und arbeite diesen dann über einen setinterval loop ab den ich auf 250ms gestellt habe. So ist gewährleistet, dass der Bus nicht überfahren wird.

            Dieser Loop läuft natürlich die ganze Zeit weiter, auch wen der Buffer leer ist. Das kann nicht optimal sein.

            Wie würde ein Profi das lösen?

            Gruß

            Martin `
            Hast du Fremdlib modifiziert oder dein Adapter?

            Wenn das irgendwo eingecheckt ist, dann kann ich auf dem git schauen.

            Ich wurde Tick anders machen.

            Merken wann letztes Kommando abgesetzt war und falls unter 250 ms, dann mit setTimeout warten bis 250 Intervall erreicht wird. Danach senden und im callback vom Write wieder Queue abarbeiten bis die Länge vom Queue Null ist.

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

              Nö, die lib ist unverändert.

              Der code liegt hier:

              https://github.com/ruhigundrelaxed/ioBroker.eibd

              In eibd.js gibt es die auskommentierte function:

              recurseQueue

              Da hab ich versucht die queue rekursiv, ohne setInterval abzuarbeiten.

              Hat leider nicht funktioniert.. weil halt "zu" asynchron…(galube ich zumindest) :roll:

              ..ist nur noch nicht aufgeräumt.

              > …250 ms, dann mit setTimeout warten bis 250 Intervall erreicht wird.

              wird mir nicht ganz klar. Aber es geht in die Richtung: setInterval pausieren zu lassen wen buffer leer, und resumen wenn buffer nicht leer?

              du bildest seInterval mit setTimeout nach?!?

              Ok. Das könnt ich probieren….

              Danke.

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

              Support us

              ioBroker
              Community Adapters
              Donate

              735
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              4
              5
              1433
              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