FHEM Forum

Verschiedenes => Projekte => Thema gestartet von: sumsum am 26 Juni 2021, 18:40:14

Titel: WLED Lampe mit Temperaturanzeige
Beitrag von: sumsum am 26 Juni 2021, 18:40:14
Hallo,

ich möchte hier eine WLED Lampe, mit Integration in FHEM, vorstellen.

Zielstellung:

Material:

Software:

Arbeitsschritte:
defmod rudi HTTPMOD http://192.168.200.101/json 60
attr rudi event-on-change-reading .*
attr rudi extractAllJSON 1
attr rudi icon light_led_stripe_rgb
attr rudi room Licht
attr rudi set01Name on
attr rudi set01NoArg 1
attr rudi set01URL http://192.168.200.101/win&A=128&FX=0&T=1
attr rudi set02Name off
attr rudi set02NoArg 1
attr rudi set02URL http://192.168.200.101/win&A=128&FX=0&T=0
attr rudi set03Data $val
attr rudi set03Header1 Content-Type: application/json
attr rudi set03Name temp
attr rudi set03NoArg 0
attr rudi set03TextArg 1
attr rudi set03URL http://192.168.200.101/json
attr rudi set04Name fire
attr rudi set04NoArg 1
attr rudi set04URL http://192.168.200.101/win&A=128&FX=66&T=1&FP=35
attr rudi stateFormat {(ReadingsVal($name,"state_on","off")?"on":"off")}
Programmierung:
Die Temperaturen werden von
0 - 9º - blau,
10 - 19º grün,
20 - 29º gelb,
30 - 40º rot dargestellt.
Das ergibt je Grad 1,875 LEDs. 
In der 99_myUtils.pm wird diese Funktion eingefügt.
sub rudi_temp{
my $str;
$str = '{"on":true,"bri":255,"seg":[';

my $temp_hi = ReadingsVal("DarkSkyWeather","fc1_high_c",40);
my $temp_lo = ReadingsVal("DarkSkyWeather","fc1_low_c",0);

my $led_hi = int( 75 / 40 * $temp_hi );
my $led_lo = int( 75 / 40 * $temp_lo );

my $brightness;

foreach my $seg (0..1){
$str .= '{"id":'.$seg.',"i":[';

foreach my $led (0..74){

if ( $led < $led_lo or $led > $led_hi ){
# dunkler, leds ausserhalb der Tagestemperatur
$brightness=10;
}
else{
# heller
$brightness=255;
}

# 0-9 ºC
if ($led < 18){
$str .= $led.",[0,0,$brightness]";
}
elsif ($led < 37){ # 10-19 ºC
$str .= $led.",[0,$brightness,0]";
}
elsif ($led < 56){ # 20-29 ºC
$str .= $led.",[$brightness,$brightness,0]";
}
else{ # 30-40 ºC
$str .= $led.",[$brightness,0,0]";
}

if ($led < 74){
$str .= ',';
}
}
$str .= ']}';
if ($seg < 1){
$str .= ',';
}
}
$str .= ']}';
fhem("set rudi temp ".$str.";set rudi temp ".$str);
}
Aus irgendeinem Grund müssen wir en JSON String 2x senden, um sicher die Temperatur anzuzeigen. Die Funktion {rudi_temp()} wird aus der Weckerfunktion aufgerufen.

Für den normalen Betrieb haben wir einen Homematic Taster benutzt. Darüber können wir on/off (kurz) bzw. ein Modus und die Temperaturanzeige (lang) schalten.

Es gibt sicher viele Verbesserungmöglichkeiten. Wir hatten jedenfalls viel Spass am Basteln.

Ulf