WS2812 - Fortschrittsanzeige

Begonnen von bartman121, 26 Februar 2022, 08:48:18

Vorheriges Thema - Nächstes Thema

bartman121

Guten Morgen,

vielleicht braucht es ja mal Jemand. Mein Geschirrspüler ist per HomeConnect an Fhem angebunden und übermittelt verschiedene Werte. Unter anderem auch den aktuellen Programmfortschritt.

Ich fand es einfach lustig, meine vorhandene Arbeitsplattenbeleuchtung (WS2812) zu verwenden um den aktuellen Programmfortschritt darzustellen. Ist zwar unnütz, aber "ES GEHT HALT" ....

Das ganze hab ich halbwegs allgemein gemacht, dazu benötigt man einen schippsel ins der myUtils.

Als Übergabe-Werte muss man folgendes reingeben:


DEVICENAME #fhem-Name des Zielgerätes
main_color #Farbe in der der Streifen eigentlich leuchten soll
second_color # Farbe die als "inform" benutzt wird
max_led #Anzahl der LEDs, die dieser Streifen hat
percentage #der Prozentwert, der angezeigt werden soll



#############################################################
#WLED-Magic
sub control_led_by_percentage($$$$;$) {
my ($device, $main_color, $second_color, $max_led, $percentage) = @_;
my ($main_r,$main_g,$main_b)=Color::hex2rgb($main_color);;
my ($second_r,$second_g,$second_b)=Color::hex2rgb($second_color);;


my $current_led=round($max_led*$percentage/100,0);
#return $current_led;

my $current_led_end = $current_led + 7;;
if ($current_led_end > $max_led) {
$current_led_end=$max_led;;
}


fhem("set $device seg 0,$max_led $main_r,$main_g,$main_b");;
if ($percentage<100) {
if ($current_led < $current_led_end) {
fhem("set $device seg $current_led,$current_led_end $second_r,second_g,$second_b");;
}
else {
fhem("set $device seg $current_led $second_r,second_g,$second_b");;
}
}
}


Dabei ist es so, dass immer mehrere LEDs eingeschaltet werden, weil man eine einzelne LED, die rot leuchtet einfach schlecht erkennen kann. Der Prozentwert wird aber auf die erste LED bezogen.

Das zugehörige notify sieht dann so aus:

SMV4HCX48E:BSH.Common.Option.ProgramProgress:.* {

if (ReadingsVal("SMV4HCX48E","BSH.Common.Status.OperationState","BSH.Common.EnumType.OperationState.Inactive") ne "BSH.Common.EnumType.OperationState.Inactive") {


if (ReadingsVal("WLED_KUECHE","state","off") eq "on") {

my $percentage=ReadingsNum("SMV4HCX48E","BSH.Common.Option.ProgramProgress",0);;

my $target_color=ReadingsVal("WLED_KUECHE","current_color","FFFFFF");;
my $inform_color='FF0000';;
control_led_by_percentage('WLED_ZUSATZ',$target_color,$inform_color,84,$percentage);;
control_led_by_percentage('WLED_SPUELE',$target_color,$inform_color,59,$percentage);;
control_led_by_percentage('WLED_TELLER',$target_color,$inform_color,59,$percentage);;
}
}
}


Vielleicht kann es ja Jemand mal gebrauchen, ich finde es witzig.

Viele Grüße

Andreas