WLED Lampe mit Temperaturanzeige

Begonnen von sumsum, 26 Juni 2021, 18:40:14

Vorheriges Thema - Nächstes Thema

sumsum

Hallo,

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

Zielstellung:

  • Projekt mit mehren unterschiedlichen Arbeitsschritten, um Kinder bzw. Jugendliche (meine 10 bzw. 14 Jahre) zu begeistern.

    • Holzgestell (sägen)
    • Elektronik mit Löten
    • Programmierung
  • Es sollte etwas dabei rauskommen, das cool ist und später auch benutzt wird. (Temperaturanzeige Min- und Maxwerte des Tages als Wecklicht)
  • Die Lampe muss vollständig in FHEM integrierbar sein. Wenn bei uns die Wohnung verlassen wird, kann man am Eingang per langen Tasterdruck das gesammte Licht in der Wohnung ausschalten.

Material:

  • Holzbrett 900x200mm (Baumarkt)
  • Holzstange, quadratisch (20x20x2000mm)
  • 4 Winkel
  • Schrauben,Kleber
  • Plastikbox für Elektronik
  • ESP32 board
  • WS2812B mit 300 LEDs 5m
  • 5V Stromversorgung
  • Widerstand 420Ohm und Kondesator 1000uF

Software:

Arbeitsschritte:

  • Gestellbau:
    Das Brett wurde in 4 Stücke 200x200mm zersägt. 3 dieser Stücke wurden zusammengeklebt. Das vierte Stück dient als Abdeckplatte. Aus dem Block, mit den 3 Stücken, wurde ein Loch 120x120mm gesägt. Dieses Loch nimmt später die Elektronik (ESP32 board) auf. Auf diese 3 Platten wird die Abdeckplatte geklebt.
    Die lange Stange wurde auf 1300mm gekürzt und mit den Winkeln an die Abdeckplatte geschraubt.
  • Ledstreifen:
    Der LED-Streifen wurde in 4 Teile a 75 LEDs geteilt. Diese Teile wurden dann an die Stange geklebt. Die Einzelstücke wurden so verklebt, dass auf jeder Seite der Stange ein LED Streifen mit 75 LEDs ist. Per Kabel wurden diese Streifen wieder zu einem Streifen verlötet. Die LEDs starten von unten bei 1 bit 75. Auf der gegenüberliegenden Seite die LEDs 76..150 von oben nach unten. Dann 151..225 von unten nach oben 90º versetzt und zuletzt auf der gegenüberliegenden Seite 226..300 von oben nach unten.
    Der Widerstand und Kondensator wurden wie in der Wiki con WLED eingelötet. 
  • Der ESP32 wurde mit der letzten Version von WLED geflashed und in der Plastikbox im Holzständer untergebracht. Dies ist auf der Wiki von WLED ausführlich erklärt.
  • In der Konfiguration von WLED wird das WLAN eingestellt. Die LEDs werden in 2 Segmente von 150 LEDs geteilt. Dabei wurden jeweils die gegenüberliegenden Seiten (75 LEDs) gespiegelt. Somit muss man bei der Programmierung nur 2 Segmente von 75 LEDs ansteuern. Die jeweils gegenüberliegenden Seiten spiegelt WLED selbst.
  • FHEM:
    Für die Anbindung haben wir uns für HTTPMOD entschieden. Damit sind HTTP-request API und JSON API nutzbar. In der aktuellen Version ist die JSON API am umfangreichsten. Damit ist auch die Ansteuerung einzelner LEDs möglich.
    Dies wird dann später für die Temperaturanzeige benutzt. Für On/Off haben wir die HTTP-request API genommen.
    Definition der Lampe. Ja wir haben sie Rudi genannt. War Idee der Kinder und ich denke im Zusammenhang mit FHEM ein würdiger Name :) .

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")}

  • Im set03 wird später der JSON String übergeben. Dieser enthält die Temperaturanzeige.
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

C@MP3R

Moin, ich habe deine Config etwas umgebaut um mit die Leistung der Photovoltaik anzeigen zu lassen.
Ich habe einen 60er LED Stripe.

Funktioniert soweit auch, also eine LED leuchtet ja nach PV Leistung.
Ich möchte aber gerne nicht nur die eine errechnete LED leuchten lassen sondern bis dahin alle LEDs.

Hast du da ne Idee für mich?
Gruß

bartman121