HomeStatusDisplay (ESP8266, MQTT, WS2812B)

Begonnen von Joker, 12 März 2017, 23:48:10

Vorheriges Thema - Nächstes Thema

Joker

Hallo,

hier möchte ich mein Projekt "HomeStatusDisplay" vorstellen.
Hierbei handelt es sich um eine Anzeigemöglichkeit von verschiedenen Zuständen aus FHEM (aber prinzipiell auch anderen System, dazu weiter unten mehr) via LEDs.

Zur Anzeige werden RGB (WS2812B) LEDs verwendet. Der Gedanke ist, mit einem Blick auf die Anzeige schnell einen Überblick über das System zu bekommen, ähnlich der Homematic LED-Statusanzeige. Ich nutze es, um mir z.B. die Zustände von Fenstern (getriggert von Homematic Fensterkontakten), Lichtern (getriggert von Homemematic Schaltaktoren) und anderen Dingen wie z.B. der Müllabfuhr zu visualiseren. Verbaut ist das ganze aktuell in einem zweckentfremdeten Bilderrahmen. Siehe Bild "01_hardware.jpg" , als Einstieg wie das ganze aussieht.

Die Idee ist zugegebenermaßen nicht neu, auch hier im Forum gab es schon entsprechende Ansätze und auf anderen Seiten ebenso. Ich habe allerdings -meiner Meinung nach- mein System etwas universeller und vor allem auch "kompletter" gestaltet.

Was wurde verbaut?
- ESP8266 als Mikrocontroller mit WLAN Unterstützung (in meinem Fall ein wemos D1 Mini Klon)
- ein WS2812B LED Stripe, in meinem Fall kommen 33 LEDs in drei Reihen zum Einsatz
- minimale Beschaltung (ein Kondensator und ein Widerstand, Standard-Beschaltung für die WS2812B Stripes)
- ein Bilderrahmen aus einem schwedischen Möbelhaus
- eine Holzplatte als Trägerrahmen für die LEDs und den Rest
- zwei Holzleisten als Klemmbefestigung

Siehe Bilder, "02_hardware.jpg", "03_hardware.jpg", "04_hardware.jpg".

Wie man sieht, wirklich minimaler Aufwand auf der Hardware-Seite, siehe auch "10_schematic.png"

Was braucht man noch?
- ein laufendes FHEM System (oder ein anderes System das MQTT-Nachrichten verschicken kann)
- einen MQTT-Broker, z.B. mosquitto. Dieser kann z.B. auf dem selben Gerät laufen wie FHEM, beispielsweise einem Raspberry Pi

Was kann das System?
- der ESP8266 kommuniziert mit FHEM per WLAN
- als Protokoll kommt MQTT zum Einsatz
- auf FHEM-Seite werden die Module MQTT_BRIDGE und MQTT_DEVICE verwendet, diese senden konfigurierte Topics an das Display, und dieses schaltet entsprechend der Konfiguration bestimmte LEDs
- über eine Konfigurations-Webseite kann man sämtliche Parameter festlegen, wie z.B. die MQTT Topics, Anzahl der LEDs, WLAN Zugangsdaten, MQTT-Zugangsdaten etc.
- ebenso frei konfigurierbar per Webseite ist das Mapping von MQTT-Nachrichten auf LED-Verhalten
- als LED-Verhalten gibt es (aktuell) die Möglichkeit An, Aus, Blinken (500ms an, 500ms aus), Blitzen (200ms an, 2s aus) sowie Flackern (100ms an, 100ms aus) zu wählen
- die Software für den ESP8266 wurde in der Arduino-IDE geschrieben
- es muss nichts in der Software verändert werden, um das Gerät ans eigene System anzupassen- alle Einstellungen können per Webseite gemacht werden
- OTA Firmware Update

Die Inbetriebnahme des Geräts kann wie folgt erfolgen:
- beim ersten Start wird versucht eine WLAN-Verbindung aufzubauen, da noch keine Zugangsdaten bekannt sind, schlägt dies fehl und es wird ein Access Point aufgemacht
- der Access Point heißt "StatusDisplay", Passwort "statusdisplay". Mit diesem kann man sich verbinden und danach gelangt man über die Seite 192.168.4.1 auf die Konfigurationsseite (Bild "06_software_general.png")

-- Hier kann man nun Basiskonfiguration vornehmen, wichtig ist zunächst WiFi SSID und Passwort. Sinvollerweise kann man auch schon LED-Anzahl und LED-Datenpin eingeben. Nach einem Reboot sollte sich das Gerät mit dem WLAN verbinden. Visualisiert wird dies -sofern korrekt eingegeben- schon über die LEDs:
--- alle LEDs rot bedeutet: Keine WLAN Verbindung vorhanden
--- alle LEDs gelb bedeutet: WLAN Verbindung vorhanden, MQTT Verbindung steht noch nicht
--- man sollte nun die Konfigurationsseite erneut aufrufen (diesmal über die IP, die das Gerät vom lokalen DHCP-Server bekommen hat), und die restlichen Einstellungen machen. Auf der Statusseite (Bild "05_software_status.png") sieht man eine Übersicht über den Zustand des Geräts.

Weiter geht es auf der "General" Seite mit den Einstellungen:

MQTT Server: Servername oder IP des MQTT-Servers
Status Topic: Topic, über das die Statusmeldungen übermittelt werden, auf die die LEDs reagieren sollen. Dieses MUSS eine Wildcard enthalten in der Form, dass auf alle gewünschten Nachrichten reagiert wird. Beispiel "fhem/status/#" -> Alle Nachrichten die mit fhem/status beginnen, werden für die Statusanzeige hergenommen. Es wird davon ausgegangen, dass danach einer der unterstützten Gerätetypen im String folgt (derzeit "door", "window", "light" und "alarm"), sowie der Name des Geräts, Beispiel: fhem/status/light/kitchen.
Test Topic: Ein Topic zu Testzwecken. Dieses wird nur komplett erkannt, also keine Wildcards. Als Message können die Werte 1-5 übermittelt werden, diese schalten verschiedene LEDs dauerhaft an, um die Funktion der LEDs testen zu können. Mit Message "0" wird in den normalen Betrieb zurück geschaltet.
Will Topic: Dieses Topic wird beim Startup des Geräts mit der Message "on" gepublished. Wenn die Verbindung zum Gerät abbricht (z.B. weil stromlos), schickt der MQTT Broker dieses Topic mit der Message "off". Hiermit kann man überwachen, ob das Gerät einsatzbereit ist

Nach Klick auf "Save" und "Reboot" sollten nun nicht mehr alle LEDs in rot oder gelb an sein, sondern aus (normaler Betrieb).

Nun muss noch das "Color Mapping" konfiguriert werden (Bild "07_software_colormapping.jpg")
Hier müssen Message, Type, Color und Behavior gewählt werden.

Zum Verständnis hier ein Beispiel, wie ein Statustopic aussehen soll: "fhem/status/light/kitchen open". -> Konfiguration z.B.:
open, Window, Blue, On -> "Wenn im Topic "fhem/status/window/DEVICENAME" die Message "open" empfangen wird, soll dies mit einer blauen LED signalisiert werden.

Allgemein gesprochen konfiguriert man hier "Wenn eine Message X für den Gerätetyp Y empfangen wird, wie soll sich eine LED verhalten".

Was alles in DEVICENAME stehen darf, wird im Device Mapping eingestellt (Bild 08_software_devicemapping.png).
Hier müssen Device, Type und LedNummer gewählt werden.

Beispiel:
kitchen, Window, 2

Im Zusammenhang mit dem Color Mapping bedeutet dies:
Wenn die message "fhem/status/window/kitchen open" empfangen wird, soll dies an der LED 2 signalisiert werden, diese würde dann blau leuchten (Zusammenspiel mit Color Mapping).
Wenn man im Device Mapping noch hinzufügt z.B. "eating, Window, 3", dann wird auch die Message "fhem/status/light/eating open" erkannt, hier würde die LED 3 blau leuchten.

Allgemein gesprochen konfiguriert man hier "Wenn eine Message für Device X vom Typ Y eintrifft, welche LED soll reagieren".

Ich hoffe das ist so einigermaßen verständlich, wenn nicht bitte nachfragen :-) Meine eigene Konfiguration seht ihr in den Screenshots.
Vielleicht könnte man das auch noch ein wenig einfacher machen, für Vorschläge bin ich offen.

Ach ja, den Code gibt es zum Download natürlich auf gitHub:
https://github.com/MTJoker/HomeStatusDisplay

Bitte als work-in-progress betrachten- ich habe das System schon länger produktiv im Einsatz, aber es ist sicherlich noch einiges zu verbessern. Auch dafür bin ich offen, entweder hier im Thread oder gern per pull-Request.

Billy

Interessantes Projekt.
Vielen Dank für die Veröffentlichung! :)

Sobald ich wieder mehr Zeit habe werde ich mich an die Umsetzung machen und meine Homematic LED-Statusanzeige deren Anzeigemöglichkeiten begrenzt sind ersetzen.

Billy

FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Groej

FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

ckbln

Hallo Joker

wenn ich den Sketch auf den ESP hochlade und neu starte wird kein AP erzeugt.
Mache ich etwas falsch oder ist im Code noch ein Fehler?

Viele Grüße

Der Serielle Monitor zeigt folgendes:
##########################
Initializing config.
Mounted file system.
Reading config file /config.json
File does not exist
Creating default main config file.
Writing config file /config.json
File does not exist
Failed to write file, formatting file system.
Done.
Reading config file /colormapping.json
File does not exist
Creating default color mapping config file.
Deleting color mapping config data.
Writing config file /colormapping.json
File does not exist
Failed to write file, formatting file system.
Done.
Reading config file /devicemapping.json
File does not exist
Creating default device mapping config file.
Deleting device mapping config data.
Writing device mapping config file.
Writing config file /devicemapping.json
File does not exist
Failed to write file, formatting file system.
Done.

Starting WebServer.

Initializing MQTT connection to
Free RAM: 34384
Connecting to MQTT broker  with client id ESP8266Client-3d4f... failed, rc=-2
Connecting to MQTT broker  with client id ESP8266Client-49c0... failed, rc=-2
Connecting to MQTT broker  with client id ESP8266Client-5a51... failed, rc=-2
Connecting to MQTT broker  with client id ESP8266Client-e2ed... failed, rc=-2
usw.

Joker

Hi ckbln,

da kommen mehrere Dinge zusammen, konnte es mir gerade nur kurz ansehen:

1. Es gibt einen Bug, wenn die Konfigurationsdateien noch nicht vorhanden sind. Dadurch werden die Files initial nicht erzeugt. Das werde ich beheben, schaue ich mir die Tage an, evtl komme ich heute abend schon dazu.

2. Ich vermute, der ESP war schon einmal mit deinem WLAN verbunden oder? Der ESP hat die Eigenheit dass er die Zugangsinformationen zum letztgenutzen WLAN intern wohl irgendwo speichert und mit diesen versucht eine Verbindung in dieses WLAN aufzubauen. Schau mal in deinen Router, ich vermute der ESP ist schon in deinem WLAN und deswegen baut er keinen AP auf. Daher versucht er als nächsten Schritt den MQTT Broker zu erreichen, welcher aber noch nicht hinterlegt ist. Das geht auch noch nicht solange der Punkt 1. nicht behoben ist.

Als Info für mich: Hast du schon den kompletten Hardware Aufbau, also inklusive LEDs? Benutzt du ein wemos D1 oder ein anderes Board?

ckbln

Hallo Joker,

danke für die schnelle Antwort.

zu 2. Ja du hast die richtige Vermutung gehabt. Der ESP hatte vorher ESPEASY drauf und er ist unter der alten IP Adresse erreichbar.

Nach ändern der Basiskonfiguration gibt der serielle Monitor folgendes aus

Main config has changed, storing it.
Writing config file /config.json
File does not exist
Failed to write file, formatting file system.
Done.


Das dauert dann ein wenig aber jetzt sind die geänderten Daten zu sehen.

Hardwareaufbau kommt noch. Ich nutze einen Wemos D1 mini. Nicht original aber sieht so aus.

Grüße

Joker

Zitat von: ckbln am 05 April 2017, 12:59:58
Main config has changed, storing it.
Writing config file /config.json
File does not exist
Failed to write file, formatting file system.
Done.


Das dauert dann ein wenig aber jetzt sind die geänderten Daten zu sehen.
Hm, wundert mich aktuell ein wenig, denn wenn ich es richtig gesehen habe führt der Bug dazu dass die Config-Dateien gar nicht erzeugt werden können. Ich vermute die Einstellungen sind nach einem PowerOff wieder weg  :) Aber ich sehe es mir noch genauer an.

ZitatHardwareaufbau kommt noch. Ich nutze einen Wemos D1 mini. Nicht original aber sieht so aus.
Ich nutze auch einen Klon, also das passt schon.

Ralf W.

Hallo,

gefällt mir sehr gut. Das werde ich als nächsten Umbau für https://forum.fhem.de/index.php/topic,33979.0.html ins Auge fassen. Muss mich dazu noch mit dem zusätzlichen OLED beschäftigen und irgendwie integrieren. Dann kann der RasPi endlich in Rente gehen.

MfG
http://twitter.com/RWausD
Schon gewusst, dass Haarausfall zu einer Glatze führen kann?

FHEM: NUC7PJYH2, Ubuntu Server 22.04.2 LTS, HMCCU - RaspberryMatic, DE ConBee II, diverse Sensoren und Aktoren.

ckbln

Hallo Joker,

du hast Recht. Der ESP verliert seine Einstellungen nach einen Reboot oder PowerOff.

Und bei jedem Save dauert es eine knappe Minute bis der ESP wieder erreichbar ist

Leider habe ich es bisher nicht geschafft eine oder mehrere LED´s ans Leuchten zu bekommen. Der LED Pin ist doch die Nummer des GPIO vom ESP, oder?
Also D6 ist dann GPIO 12 somt LED Pin 12

Grüße

Joker

Zitat von: Ralf W. am 05 April 2017, 18:30:21
Das werde ich als nächsten Umbau für https://forum.fhem.de/index.php/topic,33979.0.html ins Auge fassen. Muss mich dazu noch mit dem zusätzlichen OLED beschäftigen und irgendwie integrieren. Dann kann der RasPi endlich in Rente gehen.
Auch sehr schöne Variante! Muss zugeben dass ich deins bisher noch gar nicht gesehen hatte. Das OLED ist ne nette Sache. Wie wird es angesteuert? Sollte eigentlich kein Thema sein das mit dem ESP zu nutzen.

Zitat von: ckbln
du hast Recht. Der ESP verliert seine Einstellungen nach einen Reboot oder PowerOff.

Und bei jedem Save dauert es eine knappe Minute bis der ESP wieder erreichbar ist
Ich habe gerade den Bug mit den Config-Files und noch ein paar weitere Kleinigkeiten gefixed. Bitte probiere es damit mal. Auf jeden Fall sollte der ESP jetzt seine Einstellungen nicht mehr verlieren.
Das mit der langen Wartezeit nach Save habe ich auch gesehen. Es tritt dann auf, wenn eine WiFi Verbindung besteht, aber noch keine Verbindung zum MQTT Broker, z.B. weil er noch nicht konfiguriert ist oder nicht erreichbar ist. Der Grund ist mir noch unklar da ich nirgends längere Delays verwende.
Achtung: Aktuell muss beim MQTT Broker der DNS Name des Brokers eingetragen werden, IP geht aktuell nicht. Wenn das ein Problem ist werde ich da demnächst was einbauen.

Zitat von: ckbln
Leider habe ich es bisher nicht geschafft eine oder mehrere LED´s ans Leuchten zu bekommen. Der LED Pin ist doch die Nummer des GPIO vom ESP, oder?
Also D6 ist dann GPIO 12 somt LED Pin 12
Ja, so ist es. Folgendes:
Lade bitte mal die neuen Files runter (am besten alle, da ich zwischenzeitlich auch noch ein paar andere Dinge verbessert hatte), und dann schaue dass das Editieren der General config soweit klappt und die Verbindung zum WiFi und MQTT Broker besteht.
Dann schauen wir weiter. Ich vermute dann wird es mit den LEDs auch klappen, denn der Pin wird aus dem Config File geholt, aber wenn das nicht geschrieben werden kann, dann geht es auch nicht.

Gib mal Feedback wie es aussieht  ;)

ckbln

Hallo Joker,

deine Änderungen waren erfolgreich. Aus meiner Sicht läuft es jetzt so wie du es beschrieben hast.

Jetzt mache ich mich an die Einbindung in FHEM ran.

Noch eine Frage: Wäre es möglich über ein Eingabefeld die Helligkeit der LED´s anzupassen?

Vielen Dank für die schnelle Anpassung und Unterstützung

Joker

Zitat von: ckbln am 06 April 2017, 00:46:08
deine Änderungen waren erfolgreich. Aus meiner Sicht läuft es jetzt so wie du es beschrieben hast.

Jetzt mache ich mich an die Einbindung in FHEM ran.
Super, freut mich dass es klappt!

ZitatNoch eine Frage: Wäre es möglich über ein Eingabefeld die Helligkeit der LED´s anzupassen?
Ja, darüber habe ich auch schon nachgedacht. Prinzipiell geht es, aber ich muss ein paar Sachen umbauen, da ich aktuell mit fix codierten Farbwerten (die ja die Helligkeit beinhalten) arbeite. Aber es macht absolut Sinn, von daher werde ich das einbauen, geht aber nicht ganz so schnell  ;)

Wenn sonst noch irgendwas auffällt... gerne melden, ich sehe das ganze noch immer als work-in-progress...

Franz Tenbrock

#12
Hallo
das Bild hier macht dann schnell einiges klarer,

https://github.com/MTJoker/HomeStatusDisplay
ev wäre es sinnvoll im 1. Post es noch einzufügen.

Kann man jede Mehrfarben LED Stripe da anschließen, oder was muss man dann beachten?
Aufbau scheint ja wirklcih sehr einfach im Nachbau zu sein,
Haben am WE einen FHEM Workshop in Waltrop wo wir das nachbauen wollen

das hier, dann wird Verdrahtung sofort klar
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Joker

Welches Bild meinst du, das vom Anschlussschema? Kann ich einfügen ja. Das andere ist ja im 1. Post.

Es muss natürlich ein digitaler LED Streifen sein, also einer wo jede LED seperat angesteuert werden kann. Und da geht jeder den die Adafruit Neopixel Library ansteuern kann. WS2812B oder z.B. auch SK6812 (habe ich nicht getestet, ich habe nur WS2812B verwendet).

Papaloewe

#14
Hallo Franz,

Zitatoder was muss man dann beachten?

Auf jeden Fall bitte die Stromversorgung für die LED's beachten.
Eine einzelne LED ist pro Farbe mit max 20mA agegeben. Das macht bei drei Farben max. 60mA pro LED.

Da kommt der ESP ganz schnell in Schwitzen.

P.S.: Ich komme vorr. auch am Sonntag. Dann können wir uns ja darüber unterhalten.

Hier noch ein Link zu diesem Thema: https://learn.adafruit.com/adafruit-neopixel-uberguide/power