Fhem mit LED Statusanzeige / LED-Stripe WD2812B / 433 MHz drahtlos Übertragung

11.03.2016 Aktualisierung für das neue ABFALL-Modul (das alte hat nicht mehr funktioniert)
27.12.2015 Happy Birthday Bilderrahmen zum Einjähriges! Ein Jahr ist er nun schon aktiv, meine Statusanzeige mit dem LED-Stripe WD2812B. Bisher keine Störungen und läuft perfekt! Wie siehts bei Euch aus? Habt ihr die Statusanzeige mal nachgebaut? Schreibt mir in den Kommentaren!

Update 19.08.2015 Blogbeitrag erweitert
fhemIch hatte mir neulich einen 20 LED-langen LED-Stripe mit dem Controller WD2812B gekauft, welcher bisher seit langem unangetastet bei mir in der Schublade lag. In den Weihnachtsfeiertagen habe ich ihn mal wieder herausgeholt und überlegt, was man damit wohl machen könnte. Die LED-Stripes sind heutzutage nicht mehr teuer und ein wenig Hardware, wie ein Arduino Nano, hat heutzutage wohl jeder Bastler in der Schublade. Wer noch keinen hat, kurze Anfrage unten in den Kommentaren. Ich habe noch einige in meiner Testumgebung. Also habe ich gestern ein kurzes Youtube-Video gedreht, herausgekommen ist sowas:


Das Video wurde, wie die ganze Schaltung mal eben fix entwickelt aus vorherigen Projekten, also betrachtet es nicht als filmisches Meisterwerk.

Die Idee: Man nehme einen WS2812-LED-Stripe, beschalte ihn mit einem Arduino-Nano und einem 433-MHz-Empfänger und betanke den Nano mit einem Sketch. Der Sketch empfängt vom Fhem aus codierte Statusdaten, welche, je nach Gusto, eine LED in verschiedenen Farben leuchten läßt. Wichtig: Fhem sendet zum LED-Stripe einen nicht- Intertechno-Code aus, damit dieser nicht woanders aufschlägt und etwaige Steckdosen ein- oder ausschaltet.

Die Möglichkeiten sind ziemlich cool:

Die Kreativität liegt bei Euch.

Arduino Sketch: Ich habe mal meinen Quick&Dirty Sketch hier gepostet. Es werden die Libraries von RCSwitch.h und FastLED.h benötigt. Die FastLED-Library befindet sich hier, die RC-Switch-Library befindet sich hier. In Github beide Libraries mit Download ZIP in einem Ordner Eurer Wahl speichern (meistens Download). Dann in der Arduino GUI als Administrator mit Sketch -> Include Library -> Add Zip-Library die Libraries in die Arduino Gui importieren. Anschließend den Test-Programm-Code in einem neuen Arduino Projekt einkopieren. Dann kompilieren.

Die Zahlen werden von Fhem gesendet (z. B. send 10001 1 0) und dezimal im Sketch empfangen. Das kann man leicht über den Serial-Monitor vom Arduino sehen. Die empfangene Zahl wird dann der LED zugeordnet und festgelegt, ob, und welcher Farbe sie leuchtet.


#include "FastLED.h"
#define DATA_PIN 3
#define CLOCK_PIN 13
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
#include <RCSwitch.h;
RCSwitch mySwitch = RCSwitch();
unsigned long Pir1 = 283924; // blaue Tonne Papiertonne schwarz myLEDSend("11010",4,0);
unsigned long Pir2 = 283732; // blaue Tonne Papiertonne rot heute myLEDSend("11010",3,0);
unsigned long Pir3 = 1049937; // gelbe Mülltonne rot myLEDSend("10111",1,1);
unsigned long Pir4 = 1049940; // gelbe Mülltonne aus myLEDSend("10111",1,0);
unsigned long Pir5 = 1381649; // offen Entertainment-Room
unsigned long Pir6 = 1381652; // zu Entertainmaent-Room
unsigned long TFK1 = 1381460; //offen test TFK
unsigned long TFK2 = 1381457; // zu Test-TFK
unsigned long TFK3 = 1381700; // offen TFK buero
unsigned long TFK4 = 1381697; // zu TFK buero
unsigned long TFK5 = 1316164; // temperaturen
unsigned long TFK6 = 1316161; // temperaturen
unsigned long TFK7 = 1115473; // graue Tonne morgen myLEDSend("10101",1,1);
unsigned long TFK8 = 1119313; // graue Tonne > paar tage led aus {myLEDSend("10101",3,1)};
unsigned long TFK9 = 1380689; // biomüll braune Mülltonne AUS {myLEDSend("10001",2,1)};
unsigned long TFK10= 1380692; // biomüll braune Mülltonne ROT {myLEDSend("10001",2,0)};
unsigned long TFK11 = 1328468; // strom < 0.5 grün
unsigned long TFK12= 1328465; // strom > 0.5 rot
unsigned long TFK13 = 1331540; // Kamera 1 Alarm aktiv ROT
unsigned long TFK14= 1331537; // Kamera 1 Alarm deaktiv GRÜN
unsigned long TFK15 =1118545; // graue Tonne - Restmüll heute {myLEDSend("10101",2,1)};
unsigned long TFK16= 283729; // blaue Tonne - Paiertonne Tag zuvor GELB myLEDSend("11010",3,1);
unsigned long TFK17= 1053009; // gelbe Tonne - Tag zuvor GELB myLEDSend("10111",2,1);
unsigned long TFK18= 283972; // braune Tonne - Tag zuvor GELB myLEDSend("11010",5,0);
unsigned long FB1T1on=263505;
unsigned long FB1T1off=263508;
unsigned long FB1T2on=266577;
unsigned long FB1T2off=266580;
unsigned long FB1T3on=267345;
unsigned long FB1T3off=267348;
unsigned long FB1T4on=267537;
unsigned long FB1T4off=267540;
int high_or_low;
int pin_selected;
int verification_number;
void setup() {
Serial.begin(115200);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
// testLED();
}
void loop() {
if (mySwitch.available()) { //If a message is sended with RF Code
unsigned long value = mySwitch.getReceivedValue(); // Copy the value
Serial.println(value);
if (value == Pir1)
{
leds[10] = CRGB::Black;
FastLED.show();
}
if (value == Pir2)
{
leds[10] = CRGB::Red;
FastLED.show();
}
if (value == Pir3)
{
leds[9] = CRGB::Red;
FastLED.show();
}
if (value == Pir4)
{
leds[9] = CRGB::Black;
FastLED.show();
}
if (value == Pir5)
{
leds[1] = CRGB::Green;
FastLED.show();
}
if (value == Pir6)
{
leds[1] = CRGB::Red;
FastLED.show();
}
if (value == TFK1)
{
leds[3] = CRGB::Red;
FastLED.show();
}
if (value == TFK2)
{
leds[3] = CRGB::Green;
FastLED.show();
}
if (value == TFK3)
{
leds[2] = CRGB::Red;
FastLED.show();
}
if (value == TFK4)
{
leds[2] = CRGB::Green;
FastLED.show();
}
if (value == TFK5)
{
leds[11] = CRGB::Blue;
FastLED.show();
}
if (value == TFK6)
{
leds[11] = CRGB::Green;
FastLED.show();
}
if (value == TFK7)
{
leds[7] = CRGB::Orange;
FastLED.show();
}
if (value == TFK8)
{
leds[7] = CRGB::Black;
FastLED.show();
}
if (value == TFK9)
{
leds[8] = CRGB::Black;
FastLED.show();
}
if (value == TFK10)
{
leds[8] = CRGB::Red;
FastLED.show();
}
if (value == TFK11)
{
leds[12] = CRGB::Green;
FastLED.show();
}
if (value == TFK12)
{
leds[12] = CRGB::Red;
FastLED.show();
}
if (value == TFK13)
{
leds[5] = CRGB::Red;
FastLED.show();
}
if (value == TFK14)
{
leds[5] = CRGB::Green;
FastLED.show();
}
if (value == TFK15)
{
leds[7] = CRGB::Red;
FastLED.show();
}
if (value == TFK16)
{
leds[10] = CRGB::Yellow;
FastLED.show();
}
if (value == TFK17)
{
leds[9] = CRGB::Yellow;
FastLED.show();
}
if (value == TFK18)
{
leds[8] = CRGB::Yellow;
FastLED.show();
}
}
}

Fhem-Scripte – eine Auswahl

Anzeigen kann man mit dieser Strategie fast alles. Ich habe am Raspberry Pi einen 433 MHz Sender, mit dem ich Codes zum Rahmen schicke. Es muss sich dabei nicht um genormte Codes handeln. Ich versende absichtlich Codes, die nicht mit einer Baumarkt-Fernbedienung kompatibel sind.

Beispiel – Strom-LED: Leuchtet Grün, wenn wenig Strom derzeitig verbraucht wird, leuchtet Rot, wenn viel Strom verbraucht wird. Ich greife hier die Daten am ESA 2000 -Modul ab, Reading actual.

define Stromverbrauch_LED notify esa2000WZ_43CB:actual.* { myLEDSend("10010",1,$EVTPART1 < 0.5?0:1) }

Den Sende-Code habe ich in einer separaten Datei abgelegt, nennt sich 99_FhemUtils.pm


sub myLEDSend($$$) {
my ($dev,$id,$value) = @_;
my $cmd = "send $dev $id $value";
system( "$cmd;$cmd;$cmd" );
return undef;
}

In diesem Beispiel leuchtet die grüne LED auf dem Bilderrahmen (Strom), wenn 0.5 Ticks verbraucht werden, Rot wenn > 0.5 Ticks verbraucht werden. Der Wert kann beliebig in den Einstellungen von Fhem verändert werden und benötigt keine Aktualisierung des Arduino-Sketches.

Warning vor niedrigen Temperaturen: Hier leuchtet die blaue LED auf dem Bilderrahmen wenn die Temperatur < 5 Grad beträgt, Grün wenn sie über 5 Grad ist. Der Temperatur-Wert kann beliebt in Fhem verändert werden und benötigt keine Aktualisierung des Arduino-Sketches.

define Temperaturwarnung_LED notify CUL_WS_1:temperature.* { myLEDSend("10011",5,$EVTPART1 < 5.0?0:1) }

Tür-Fensterkontakte mit MySensors und FHT80TS-2: Hier leuchtet die rote LED, wenn das Fenster geöffnet ist, grün bei geschlossenen Fenster.

define Fenster1_LED notify Fenster_1:tripped3.* { myLEDSend("10001",3,$EVTPART1 == 1?0:1) }
define Fenster0_LED notify Fenster_0:tripped4.* { myLEDSend("10001",4,$EVTPART1 == 1?0:1) }
define Fenster2_LED notify TFK_Buero:Window.* { myLEDSend("10001",5,$EVTPART1 eq "Open"?0:1) }

Die Scripte sind zu 100% aus dem Fhem-Forum geklaut.

Update: Müllabfuhr mit dem neuen ABFALL-Modul von Fhem-Forum User uniqueck (-> Link zum Fhem-Forum):

Müllabfuhr -> Beispiel gelbe Tonne:

define Gelb_LED notify myAbfall:Abfall_gelb_tage.* {\
if ((ReadingsVal("myAbfall", "Abfall_gelb_tage", "99")) == 1) {\
myLEDSend("10111",2,1,"LEDgelberSack",1);;\
} elsif ((ReadingsVal("myAbfall", "Abfall_gelb_tage", "99")) == 0) {\
myLEDSend("10111",1,1,"LEDgelberSack",0);;\
} else {\
myLEDSend("10111",1,0,"LEDgelberSack",99);;\
}\
}\

Vielen Dank an Stromer-12Justme1968 und UniCheck für die Hilfe.

Benötigte Bauteile:

Das könnte Euch auch interessieren:

IMG_1887

IMG_1888

IMG_1893

IMG_1894

LED - Bilderrahmen innerhalb von Fhem angezeigt

LED – Bilderrahmen innerhalb von Fhem angezeigt

LED-Bilderrahmen vom Blog-Leser Christian

LED-Bilderrahmen vom Blog-Leser Christian

War der Beitrag für Dich sinnvoll?
  • Interessant (0)
  • Nützlich (0)
  • Langweilig (0)
  • Schlecht (0)
  • Genial (2)
Dieser Beitrag wurde unter Fhem-Hausautomation abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

59 Kommentare zu Fhem mit LED Statusanzeige / LED-Stripe WD2812B / 433 MHz drahtlos Übertragung

  1. Andy sagt:

    kannst du mir das beispiel für die anzeige in FHEM mailen
    danke

  2. Robin sagt:

    Hallo Nico,
    sieht klasse aus Dein Bilderrahmen.
    Nur es sind zwei unterschiedliche Ansätze:
    Dein Bilderrahmen hat normale LEDs, meiner hat RGB-LEDs – also eine LED kann verschiedene Farben anzeigen.
    Dein Bilderrahmen ist mit einem Raspberry Pi verbunden, welchen du aber nicht für insgesamt 10 Euro bekommst. – Mein Bilderrahmen kannst du überall hinstellen, nur ein 5 V USB-Netzteil ist notwendig und ein funktionierendes WLAN.
    Trotzdem – schön gemacht!

    LG
    /robin

  3. Nico sagt:

    Hallo Robin, vielen Dank für die Inspiration – vor allem mit dem Bilderrahmen als Display! Wir haben das etwas vereinfacht (nur LED an oder aus) nachgebaut, damit es in einen noch dünneren Rahmen passt – dabei sparen wir uns Arduino und Funkmodul und haben das Display direkt an einen Raspberry mit darauf laufendem FHEM angeschlossen: http://www.computerhilfen.de/info/smart-home-display-zum-selberbauen.html

  4. christian sagt:

    Hallo Robin,
    du hast mir den Tag gerettet, es funktioniert.

    DANKE !!!!!

    Gruß Chris

  5. Robin sagt:

    Hallo Christian,
    im Grunde steht es da: to many Arguments. Du übergibts der Funktion zuviele Parameter.
    Meine Ledsend sieht jetzt derzeitig so aus

    sub myLEDSend($$$$$) {
    my ($dev,$id,$value,$BRType,$BRStatus) = @_;
    my $cmd = "send $dev $id $value";
    system( "$cmd;$cmd;$cmd" );
    # fhem("set $BRType $BRStatus");
    # fhem("set LEDRahmenSwitch 2 FF0000");
    return undef;
    }

  6. christian sagt:

    Hallo Robin,
    kalender funktioniert, nur bekomme ich irgend wie immer noch ein Fehler.

    Gelbetonne_LED return value: Too many arguments for main::myLEDSend at (eval 166) line 3, near „1)“
    Too many arguments for main::myLEDSend at (eval 166) line 5, near „0)“
    Too many arguments for main::myLEDSend at (eval 166) line 7, near „99)“

    Kannst du mir weiter helfen ?

    Gruß Chris

  7. Robin sagt:

    Hallo Christian,
    nutze das Fhem Forum, da sitzen die Programmierer von dem Modul.

    LG
    /robin

  8. christian sagt:

    Hallo Robin,

    habe Problem mit er umstellung des Abfallmodul. Könntest du mir mal helfen?

    Gruß Christian

  9. Pingback: Fhem mit LED Statusanzeige / LED-Stripe WD2812B / ESP 8266 | Robins Blog – Technik und Multimedia

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.