WLED, MQTT --> wo ist der Flaschenhals? (viele Befehle schnell nacheinander)

Begonnen von bartman121, 09 Februar 2022, 20:55:41

Vorheriges Thema - Nächstes Thema

bartman121

Moin,

ich versuche gerade eine Art Fade-In zu bauen, dabei sollen die LEDs nacheinander in einer Zielfarbe eingeschaltet werden und leuchten bleiben.

Ich habe jetzt ein bisschen rumprobiert, aber ich befürchte irgendwo gibt es einen Flachenhals, vielleicht kann sowas ja mal Jemand testen.

ich habe das ganze erst in fhem probiert: (der Code ist aus einem Notify, daher $NAME)

my $max_led = 84;;
my $i = 0;
my $fade_in_time = 2;

my $sleep_time_intervall = round($fade_in_time/$max_led,3);


my $target_color=ReadingsVal("WLED_KUECHE","current_color","FFFFFF");;
my ($target_r,$target_g,$target_b)=Color::hex2rgb($target_color);;
my $cmd;;

while ($i <= $max_led) {

$cmd .= "sleep $sleep_time_intervall;" if ($cmd);
if ($i < $max_led-1) {
$cmd .= "set $NAME seg $i $target_r,$target_g,$target_b;";
#$cmd .= "set WLED_ZUSATZ rgb $target_color;";
}
else {
$cmd .= "set $NAME seg $i,$max_led $target_r,$target_g,$target_b;";
}
$i +=1;;
}

fhem $cmd;

}



und jetzt auch in der Shell:

#!/bin/sh
sleep_fraction() {
  /usr/bin/perl -e "select(undef, undef, undef, $1)"
}




max_led=84
fade_in_duration=2

delay=$(echo "scale=3; $fade_in_duration / $max_led" | bc)

echo $delay

i=0

before=$(date +%s)

while [ $i -le $max_led ]; do
  sleep_fraction $delay
  mosquitto_pub --topic wled/19fb61/api -h localhost -p 1884 -m "{'seg':{'i':[$i,[255,0,0]]}}"
  i=$(($i + 1))

done

after=$(date +%s)
time_used=$((after - $before))

echo $time_used


Beide Wege führen zum gleichen Ergebnis, der Effekt wird natürlich erreicht, die LEDs werden nacheinander in der Zielfarbe eingeschaltet, das funktioniert also schon.

ABER: Die konfigurierte Zeit von 2 Sekunden wird mit 6 oder 7 Sekunden aber deutlich überschritten.

Es muss also einen Flaschenhals geben. Mir ist schon klar, dass der MQTT-Publish-Teil selbst auch 10 bis 20ms braucht, das sind bei 85-Befehlen auch gemütliche 1,6Sekunden.

Das erklärt aber aus meiner Sicht nicht den signifikanten Unterschied von 3 Sekunden mehr, oder ist der MQTT-Publish-Teil deutlich länger? Ich wüsste allerdings nicht wie ich das messen soll. Mein Shell-Script erzeugt bei einer fade_in_duration  von 2 sekunden maximal 3 Sekunden laufzeit, obwohl das publish hier blockierend ist. Demzufolge ist meine Annahme mit den 10 bis 20ms fürs Publish durchaus richtig *glaub*

Ist der Flaschenhals evtl. der WLED-Controller? (bei mir ein Wemos D1 Mini)

Kennt jemand einen Elegante Lösung alle LEDs nacheinander in einer Zielfarbe einzuschalten und das innerhalb einer konfigurierbaren Zeit?

Happy Brainstorming

Grüße

Andreas

Edit: ich verwende als Broker die fhem-umsetzung MQTT2. Ich könnte testweise auch Mal ne mosquitto testen. Aber vielleicht gibt es ja einen einfacheren Weg mein Ziel zu erreichen.