NEWS
VU Meter / Treshold / Peak
-
@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.
-
@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
-
@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); } });
-
@paul53 vielen Dank!
Ich komme da leider erst nach dem langen Wochenende zu.
Werde dann ein Feedback geben! -
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? -
@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?
-
@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.
-
@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); } });
-
@bavarian
Beim Update des Javascript-Adapters musst Du daran denken, die Zahl der setState() pro Minute in der Konfiguration hoch zu setzen. -
@paul53
Hut ab, das klappt echt richtig gut!
Keinerlei Probleme mit der Performance...Danke auch für den Hinweis mit dem setState().