Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Synchronisation mit langsamer Hardware

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Synchronisation mit langsamer Hardware

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

      Mich hat jetzt auch das "iobroker-Fieber" gepackt.

      Ich habe begonnen, den noch in der Pipeline stehenden "irtrans"-Adapter (iRTrans: http://www.irtrans.de/de/index.php) zu entwickeln. Mit dem Beispiel-Adapter und ein wenig rumspielen hat das auch geklappt.

      Mit VIS konnte ich dann meine erste "Remotecontrol-Oberfläche" erstellen und die Infrarot-Fernbedienungs-Codes an die verschiedenen Geräte schicken.

      Das war ja alles sehr "zeitunkritisch".

      Dann hatte ich begonnen, über den Javascript-Adapter ein Javascript zu erstellen, das eine Folge von Infrarot-Befehlen für gewisse Voreinstellungen "rauspusten" soll. Das war natürlich viel zu schnell. iRTrans braucht zwischen 50 und 80 ms bis es eine Antwort zurückschickt, d.h. bei einem normalen Adapter-Aufbau:

      "subscribe" auf eine Variable z.B. "command"

      adapter.subscribeStates('command');
      
      ````und dem Warten auf ein "stateChange"-Event
      

      adapter.on('stateChange', function (id, state) { ...});

      
      :?: Meine Fragen (wahrscheinlich auch, weil ich das Gesamtkonzept noch nicht ganz verstanden habe):
      
      1) Wie synchronisiert man langsame Hardware, insb. wenn man eine Rückantwort abwarten muss?
      
      2) Was soll ein Adapter machen, wenn er weitere Aufträge ausführen soll, aber noch auf eine Antwort wartet?
      
      cachen? (aufwendig) / wegschmeissen?
      
      3) Müssen "übergeordnete" Skripte (vom Javascript-Adapter) das Verhalten von langsamer Hardware berücksichtigen?
      
      Gruß
      
      KH
      1 Reply Last reply Reply Quote 0
      • V
        vegetto last edited by

        @khst:

        1. Wie synchronisiert man langsame Hardware, insb. wenn man eine Rückantwort abwarten muss?

        2. Was soll ein Adapter machen, wenn er weitere Aufträge ausführen soll, aber noch auf eine Antwort wartet?

        cachen? (aufwendig) / wegschmeissen?

        1. Müssen "übergeordnete" Skripte (vom Javascript-Adapter) das Verhalten von langsamer Hardware berücksichtigen? `

        Hallo,

        ich habe nur ein Adapter geschrieben so ich bin kein Expert aber ich würde:

        1. Das ist abhängig von HW: wenn das HW eine Rückmeldung sendet ist am besten. Wenn nicht, muss man probieren, um Pausenzeiten zu definieren.

        2. Du kannst mit dem ACK melden, ob dein Adapter das Request prozesiert hat. Wenn Du das Adapter noch ein Request bekommt, bevor die alte prozesiert ist, hast Du zwei Optionen:

        a) cachen in Adapter

        b) droppen

        1. Ich denke schon: ein Script sollte das ACK beruchsichtigen, bevor die Annahme macht, dass ein Kommando angenommen würde.
        1 Reply Last reply Reply Quote 0
        • K
          khst last edited by

          Danke für die Rückmeldung.

          So ähnlich hatte ich mir das auch gedacht. Rückmeldung gibt es natürlich über 'ack'. Zunächst werde ich neue Befehle, die zu schnell kommen, also bevor 'ack=true' zurückgemeldet wurde, droppen.

          Mir lag es eben an einem Feedback, ob ich richtig liege.

          Gruß

          KH

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

            @khst:

            Mich hat jetzt auch das "iobroker-Fieber" gepackt.

            Ich habe begonnen, den noch in der Pipeline stehenden "irtrans"-Adapter (iRTrans: http://www.irtrans.de/de/index.php) zu entwickeln. Mit dem Beispiel-Adapter und ein wenig rumspielen hat das auch geklappt.

            Mit VIS konnte ich dann meine erste "Remotecontrol-Oberfläche" erstellen und die Infrarot-Fernbedienungs-Codes an die verschiedenen Geräte schicken.

            Das war ja alles sehr "zeitunkritisch".

            Dann hatte ich begonnen, über den Javascript-Adapter ein Javascript zu erstellen, das eine Folge von Infrarot-Befehlen für gewisse Voreinstellungen "rauspusten" soll. Das war natürlich viel zu schnell. iRTrans braucht zwischen 50 und 80 ms bis es eine Antwort zurückschickt, d.h. bei einem normalen Adapter-Aufbau:

            "subscribe" auf eine Variable z.B. "command"

            adapter.subscribeStates('command');
            
            ````und dem Warten auf ein "stateChange"-Event
            

            adapter.on('stateChange', function (id, state) { ...});

            
            :?: Meine Fragen (wahrscheinlich auch, weil ich das Gesamtkonzept noch nicht ganz verstanden habe):
            
            1) Wie synchronisiert man langsame Hardware, insb. wenn man eine Rückantwort abwarten muss? `  
            

            Z.B. im Sayit Adapter werde die Texte in der Queue gesetzt und dann nach und nach abgearbeitet.

            @khst:

            1. Was soll ein Adapter machen, wenn er weitere Aufträge ausführen soll, aber noch auf eine Antwort wartet?

            cachen? (aufwendig) / wegschmeissen? ` Merken und als Queue abarbeiten.@khst:

            1. Müssen "übergeordnete" Skripte (vom Javascript-Adapter) das Verhalten von langsamer Hardware berücksichtigen? `
              Ich denke nicht, aber man muss trotzdem eine Grenze setzten, z.B. nicht mehr als 10 Requests stapeln.

            P.S. es gibt noch jemand, wer an RTrans arbeitet: http://forum.iobroker.net/viewtopic.php … 964#p16867

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

              Vielen Dank für die Hinweise.

              Ich werde in den nächsten Tagen das "Stapeln" einbauen. Ich denke auch, dass man das auf eine vernünftige Größe begrenzen sollte.

              Leider habe ich nicht jeden Tag Zeit, daran zu arbeiten.

              Gruß

              KH

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

                @khst:

                Vielen Dank für die Hinweise.

                Ich werde in den nächsten Tagen das "Stapeln" einbauen. Ich denke auch, dass man das auf eine vernünftige Größe begrenzen sollte.

                Leider habe ich nicht jeden Tag Zeit, daran zu arbeiten.

                Gruß

                KH `
                Z.B:

                var values     = [];
                var processing = false;
                
                // add new request to queue and start processing if not
                function insertValue(val) {
                    if (values.length > 20) {
                        console.warn('To many requests. Request ' + val + ' dropped');
                        return;
                    } else {
                        console.log('Value ' + val + ' queued.');
                    }
                    values.push(val);
                    processNext();
                }
                
                // process next request if not processing
                function processNext() {
                    if (processing) return;
                
                    if (values.length) {
                        processing = true;
                        processOne(values.shift(), function () {
                            processing = false;
                            processNext();
                        });
                    }
                }
                
                // process one request
                function processOne(val, cbFinished) {
                    // do something, e.g.
                    // simulation
                    setTimeout(function () {
                        console.log('Value ' + val + ' processed');
                
                        if (cbFinished) {
                            // do not call in same thread
                            setTimeout(function () {
                                cbFinished();
                            }, 0);
                        }
                    }, 3000);
                }
                
                // ------------------ Test
                var i = 0;
                setInterval(function () {
                    insertValue(i++);
                }, 1000);
                

                9151_2018-12-16_13_07_05-iobroker.admin.png

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

                  Danke für den Vorschlag. So ähnlich hatte ich mir das auch gedacht.

                  Gruß

                  KH

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate
                  FAQ Cloud / IOT
                  HowTo: Node.js-Update
                  HowTo: Backup/Restore
                  Downloads
                  BLOG

                  922
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  1683
                  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