Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. VU Meter / Treshold / Peak

    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

    VU Meter / Treshold / Peak

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

      Servus,

      in einem Projekt messe ich eine sich ändernde Spannung wie bei einem Mikrofonpegel und schreibe diesen Wert alle 200ms in einen DP.
      Das klappt soweit sehr gut und auch die Systemlast mit dem RPI4 is sehr gering.
      Eine Balkenanzeige / Gauge funktioniert auch aber da fehlt mir eine Art Threshold Funktion.
      Wenn die Werte zB. 50 180 2 200 160 30 etc ankommen ist das ganze sehr unruhig anzusehen.

      Es soll so werden wie bei einer VU Anzeigen am Verstärker, kommt ein hoher Wert wie 200 und der nächste
      Wert ist kleiner zb. 150, wird der höhere Wert langsam Richtung kleinerem Wert abgebaut. Ist der Wert
      höher dann wird dieser ohne Verzögerung erhöht.
      Es fehlt also die "Trägheit" der Anzeige von Großen auf kleinen Werte.

      Grob gesagt:
      If aktueller Pegel < dem letzten Pegel dann innerhalb von 200 ms auf den kleineren Pegel runter rechnen.
      Bsp: 150 / 250
      Sollte dann innerhalb von 200ms absinken auf 180.
      Dazu braucht es dann errechnete Daten die runter laufen...
      250 240 230 220 ... 150 und das für zB 200ms
      If aktueller Pegel > dem letzten Pegel dann sofort den aktuellen Pegel anzeigen ohne eine Verzögerung.

      Hat jemand sowas schon mal umgesetzt?

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

        @bavarian sagte: 250 240 230 220 ... 150 und das für zB 200ms

        Alle 20 ms einen neuen Wert zu berechnen und in einen Datenpunkt zu schreiben, ist schon recht sportlich und könnte die CPU hoch auslasten.

        B 1 Reply Last reply Reply Quote 0
        • B
          Bavarian @paul53 last edited by

          @paul53
          Werde ich erst wissen, wenn ich es probiert habe.
          Über Node-Red verarbeite ich Daten einer Seriellenschnittstelle und speicher auch in DP und die Auslastung wird kaum erhöht.
          Die Performance des RPI4 ist dafür hoch genug.

          Müsste man wie gesagt mal testen, nur dazu fehlt mir das Programmierwissen in JS

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

            @bavarian sagte: Müsste man wie gesagt mal testen

            Dann teste mal:

            const idVolume = 'abc'; 
            const idZeiger = '0_userdata.0.xyz'; 
            
            var volume = getState(idVolume).val;
            var zeiger = volume;
            var intervall = null;
            
            on(idVolume, function(dp) {
                volume = dp.state.val;
                if(volume >= zeiger) {
                    if(intervall) {
                        clearInterval(intervall);
                        intervall = null;
                    }    
                    zeiger = volume;
                    setState(idZeiger, zeiger, true);
                } else if(!intervall) {
                    intervall = setInterval(function() {
                        zeiger -= 10;
                        if(zeiger < volume) zeiger = volume;
                        setState(idZeiger, zeiger, true);
                    }, 20);
                }
            });
            
            B 2 Replies Last reply Reply Quote 0
            • B
              Bavarian @paul53 last edited by

              @paul53 vielen Dank!
              Ich komme da leider erst nach dem langen Wochenende zu.
              Werde dann ein Feedback geben!

              1 Reply Last reply Reply Quote 0
              • B
                Bavarian @paul53 last edited by

                @paul53

                Servus Paul, das funktioniert prima!
                Absolut keine Performance Probleme, der RPI4 hat eine CPU Auslastung von ca 35%.
                Gibt es noch die Möglichkeit einen kleinen Peakhold einzubauen?
                Also den letzten Spitzenwert für ein paar ms stehen lassen und dann weiter erst runter rechnen?

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

                  @bavarian sagte: Spitzenwert für ein paar ms stehen lassen und dann weiter erst runter rechnen?

                  Das Intervall verzögert um 20 ms. Ist das zu kurz?

                  B 1 Reply Last reply Reply Quote 0
                  • B
                    Bavarian @paul53 last edited by

                    @paul53
                    Ja der Intervall ist ja linear.
                    Peakhold wäre Spitzenwert etwas länger stehen lassen und danach runter rechnen.

                    zB. Peak erkannt, bleibt 80ms danach wie jetzt in 20ms Schritten runter-rechnen auf Null oder auf den nächsten Peak.

                    paul53 2 Replies Last reply Reply Quote 0
                    • paul53
                      paul53 @Bavarian last edited by paul53

                      @bavarian sagte: bleibt 80ms danach wie jetzt in 20ms Schritten runter-rechnen

                      const idVolume = 'abc'; 
                      const idZeiger = '0_userdata.0.xyz'; 
                       
                      var volume = getState(idVolume).val;
                      var zeiger = volume;
                      var intervall = null;
                      var hold = null;
                       
                      on(idVolume, function(dp) {
                          volume = dp.state.val;
                          if(volume >= zeiger) {
                              if(hold) {
                                  clearTimeout(hold);
                                  clearInterval(intervall);
                                  hold = null;
                              }    
                              zeiger = volume;
                              setState(idZeiger, zeiger, true);
                          } else if(!hold) {
                              hold = setTimeout(function() {
                                  intervall = setInterval(function() {
                                      zeiger -= 10;
                                      if(zeiger < volume) zeiger = volume;
                                      setState(idZeiger, zeiger, true);
                                  }, 20);
                              }, 60);
                          }
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @Bavarian last edited by paul53

                        @bavarian
                        Beim Update des Javascript-Adapters musst Du daran denken, die Zahl der setState() pro Minute in der Konfiguration hoch zu setzen.

                        B 1 Reply Last reply Reply Quote 0
                        • B
                          Bavarian @paul53 last edited by

                          @paul53
                          Hut ab, das klappt echt richtig gut!
                          Keinerlei Probleme mit der Performance...

                          Danke auch für den Hinweis mit dem setState().

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          535
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          2
                          11
                          496
                          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