smarthome-tricks.de

ioBroker LED-Status-Display Prototyp

In diesem Artikel zeige ich Dir, wie Du Dir dein eigenes LED-Status-Display bauen kannst. Fertige Status-Displays für Homematic oder andere Smart-Home Hersteller kosten schnell an die 100 Euro und sind dann leider immer an einen Hersteller gebunden. Da bei uns mittlerweile mehrere Systeme von verschiedenen Herstellern im Einsatz sind, und diese zentral über ioBroker gesteuert werden können, habe ich mir mit einfachen Mitteln ein eigenes Display aufgebaut. Hier nun zunächst die Liste der verwendeten Materialien:

Der Materialwert beläuft sich auf nicht einmal 10 Euro 🙂 Alternativ können hier natürlich auch LED Strips (WS2812) kompatibel eingesetzt werden, ich fand die Panel aber geschickter. Die LED-Panel können einfach in Reihe geschaltet werden, um so mehr als 8 LEDs adressieren zu können. Ich habe für unser Objekt 4 Panels gewählt, so habe ich noch Reserve für weitere Datenpunkte, welche ich Software-technisch dann einfach aktivieren kann.

Alternatives LED-Strip (WS2812 kompatibel, verschiedene Längen und LED-Abstände):

1. Vorbereitungen in ioBroker
Im ersten Schritt beginnen wir nun mit den Vorbereitungen in ioBroker. Wir legen hier zunächst im mqtt Adapter neue Datenpunkte an. In meinem Fall habe ich 4×8=32 neue Datenpunkte, welche den Zustand einer LED darstellen. Für die Datenpunkte habe ich einen weiteren Ordner angelegt und somit für mehr Ordnung gesorgt. Evtl. kommt ja später ein weiteres Display dazu… Die Datenpunkte werden vom Typ Zeichenkette angelegt, da wir hier die Bezeichnung der Farbe speichern, welche die LED annehmen soll.

2. Skripte für Objektüberwachungen und LED StatusColor

Im nächsten Schritt schreiben wir uns im Ordner Scripte ein Script, mit dem wir bei Objektänderungen den jeweiligen Farbwert setzen. Ich habe dazu auch im Bereich Skripts einen weiteren Ordner angelegt und hier das Skript erstellt.


function UpdateLEDStatus()
{
var StatusColor = "green";

// Status EG Eingangstür
StatusColor = "green";
if ( getState("hm-rpc.0.OEQ0167091.1.STATE").val == true ) { StatusColor = "red"; }
setState('mqtt.0.LedStatusDisplay.led_02', StatusColor );

// Status EG Terassentür
StatusColor = "green";
if ( getState("hm-rpc.0.NEQ1835804.1.STATE").val == true ) { StatusColor = "red"; }
setState('mqtt.0.LedStatusDisplay.led_03', StatusColor );

// ... weitere Sensoren/Aktoren

}

Die Funktion UpdateLEDStatus() überprüft nun die definierten States der einzelnen Aktoren und setzt den entsprechenden Farbwert (StatusColor). Hier kann zudem eigene Logik für das Display hinterlegt werden. Die Funktion wird mittels folgendem Skript direkt bei einer Objektänderung aufgerufen:


on({id: "hm-rpc.0.OEQ0167091.1.STATE", change: "ne"}, function (obj) { UpdateLEDStatus(); });
on({id: "hm-rpc.0.NEQ1835804.1.STATE", change: "ne"}, function (obj) { UpdateLEDStatus(); });

Wenn sich jetzt der Status eines Aktors ändert, sollte direkt der hinterlegte StatusColor-Wert geschrieben werden. Ich habe für die LEDs folgende Farbbezeichnungen vorgesehen: (red, green, blue, yellow, white und off). Die Auflösung der Farbbezeichnung in die RGB-Werte erfolgt dann später auf dem ESP8266.

3. Aufbau des Prototyps

Für einen ersten Test habe ich die LED-Panels in Reihe geschaltet (out-in, gnd und vin Pins entsprechend verbunden) und zudem dem ersten LED-Panel Stecker für das Breadboard angelötet. Der GND-Pin wird mit Ground auf dem Board verbunden. Der 4-7 VDC mit dem 3,3V oder 5V Pin. Der DIN-Pin wird mit D04 auf dem Board verbunden.

4. ESP8266 Arduino Sketch

Im nächsten Schritt implementieren wir den ESP8266. Im Sketch erstellen wir zunächst eine WLAN-Verbindung, initialisieren das LED-Display und verbinden uns dann mit dem MQTT-Server. Um Veränderungen der ioBroker Datenpunkte direkt zu erhalten werden zudem die 32 Datenpunkte der einzelnen Status abonniert. Der Zugriff auf die einzelnen LEDs erfolgt null-basiert (LED 0-31). Daher müssen wir unsere Datenpunkte noch entsprechend anpassen. Alternativ kann natürlich aber auch direkt mit der LED 0 begonnen werden.  Ich denke der restliche Code ist selbsterklärend.

#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define PIN D4
#define NUMPIXELS 32

const char* ssid = "WLAN_SSID";
const char* password = "WLAN_PWD";
const char* mqtt_server = "192.168.2.90";

WiFiClient espClient;
PubSubClient client(espClient);

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

randomSeed(micros());

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void MQTTCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
Serial.println(" ");

String ColorName = "";

for (int i = 0; i < length; i++) { ColorName = ColorName + (char)payload[i]; }

Serial.println(ColorName);

String TopicName = topic;

TopicName.replace("LedStatusDisplay/led_","");

int LedIndex = TopicName.toInt();
LedIndex = LedIndex - 1;

if (ColorName.equals("red")) { pixels.setPixelColor(LedIndex, pixels.Color(255,0,0)); }
if (ColorName.equals("green")) { pixels.setPixelColor(LedIndex, pixels.Color(0,255,0)); }
if (ColorName.equals("blue")) { pixels.setPixelColor(LedIndex, pixels.Color(0,0,255)); }
if (ColorName.equals("yellow")) { pixels.setPixelColor(LedIndex, pixels.Color(255,255,0)); }
if (ColorName.equals("white")) { pixels.setPixelColor(LedIndex, pixels.Color(255,255,255)); }
if (ColorName.equals("off")) { pixels.setPixelColor(LedIndex, pixels.Color(0,0,0)); }

pixels.show();
}

void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");

client.subscribe("LedStatusDisplay/led_01");
client.subscribe("LedStatusDisplay/led_02");
client.subscribe("LedStatusDisplay/led_03");
client.subscribe("LedStatusDisplay/led_04");
client.subscribe("LedStatusDisplay/led_05");
client.subscribe("LedStatusDisplay/led_06");
client.subscribe("LedStatusDisplay/led_07");
client.subscribe("LedStatusDisplay/led_08");
client.subscribe("LedStatusDisplay/led_09");
client.subscribe("LedStatusDisplay/led_10");
client.subscribe("LedStatusDisplay/led_11");
client.subscribe("LedStatusDisplay/led_12");
client.subscribe("LedStatusDisplay/led_13");
client.subscribe("LedStatusDisplay/led_14");
client.subscribe("LedStatusDisplay/led_15");
client.subscribe("LedStatusDisplay/led_16");
client.subscribe("LedStatusDisplay/led_17");
client.subscribe("LedStatusDisplay/led_18");
client.subscribe("LedStatusDisplay/led_19");
client.subscribe("LedStatusDisplay/led_20");
client.subscribe("LedStatusDisplay/led_21");
client.subscribe("LedStatusDisplay/led_22");
client.subscribe("LedStatusDisplay/led_23");
client.subscribe("LedStatusDisplay/led_24");
client.subscribe("LedStatusDisplay/led_25");
client.subscribe("LedStatusDisplay/led_26");
client.subscribe("LedStatusDisplay/led_27");
client.subscribe("LedStatusDisplay/led_28");
client.subscribe("LedStatusDisplay/led_29");
client.subscribe("LedStatusDisplay/led_30");
client.subscribe("LedStatusDisplay/led_31");
client.subscribe("LedStatusDisplay/led_32");
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}

void setup() {
pixels.begin(); // Initialisierung der NeoPixel
pixels.setBrightness(255);

Serial.begin(115200);

setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(MQTTCallback);
}

void loop()
{
if (!client.connected())
{
reconnect();
}

client.loop();
}


Wenn wir jetzt den Status eines Aktors ändern, wir das Skript ausgeführt und im nächsten Schritt der entsprechende Datenpunkt aktualisiert und damit auch das Display via MQTT aktualisiert.

Im Prototyp habe ich nun über die LED-Panel ein beschriftetes Papier gelegt. Im nächsten Teil des Artikels wird das Projekt dann in ein entsprechendes Gehäuse verbaut.

Die mobile Version verlassen