Loxone - WLAN-Status-Display selbst gebaut
Ursprünglich habe ich das Status-Display mal für FHEM gebaut. Der komplette Aufbau und die Logik wurde im Arduino-Kurs ausführlich erklärt. Nun dachte ich: Warum zeige ich nicht auch, wie man über UDP das Display direkt aus Loxone heraus ansteuern könnte. Also fix eine neue Firmware für den ESP8266 geschrieben (welche längst nicht perfekt ist) und dann an Loxone angebunden. Super einfach!
Was Du brauchst?
- Ein Loxone-System
- Einen Wemos D1-Mini ** + CH340 Treiber
- WS2812B-LEDs **
- Einen Lötkolben und Drähtchen
- Einen Bilderrahmen in welchem die LEDs positioniert werden
- Etwas Zeit
Video
Produkte
Schaltplan
»Wemos WS2812B LEDs«
Code
Was Du anpassen musst:
- Anzahl der LEDs
- WLAN-SSID
- WLAN-Passwort
Bevor Du das Projekt bauen kannst, brauchst Du PlatformIO (siehe Video unten). Dann muss in das Lib-Verzeichnis ein Release von Adafruit Neopixel abgelegt werden. Das Projekt findest Du auf GitHub. Einfach nur entpacken und verschieben.
Dann einfach (wie im Video gezeigt) auf den Wemos übertragen.
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>
#define PIN D5
#define NUM_LEDS 7
const char* ssid = "...";
const char* password = "...";
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
WiFiClient net;
WiFiUDP Udp;
unsigned int localUdpPort = 5555;
char incomingPacket[255];
void setup() {
Serial.begin(9600);
strip.begin();
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
WiFi.mode(WIFI_AP_STA);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
}
Udp.begin(localUdpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
initSequence();
}
void initSequence() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 255, 0));
strip.show();
delay(50);
}
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();
delay(50);
}
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0) {
incomingPacket[len] = 0;
}
String sPacket = String(incomingPacket);
String sValue = sPacket.substring(sPacket.lastIndexOf(":") + 1);
int ledIndex = sPacket.substring(0, sPacket.lastIndexOf(":")).toInt() - 1;
if (ledIndex >= 0 && ledIndex < strip.numPixels()) {
if (sValue == "off") {
strip.setPixelColor(ledIndex, strip.Color(0, 0, 0));
} else {
long number = (long)strtol(&sValue[0], NULL, 16);
int r = number >> 16;
int g = number >> 8 & 0xFF;
int b = number & 0xFF;
strip.setPixelColor(ledIndex, strip.Color(r, g, b));
}
strip.show();
}
Serial.printf("UDP packet contents: %s\n", incomingPacket);
// Antwort
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write("OK");
Udp.endPacket();
}
}
Offene Themen:
- Werte in EEPROM ablegen, sodass diese bei Neustart wiederhergestellt werden
- Ruhemodus (alles aus, wenn niemand im Raum)
- Statische IP optional (WiFi-Manager?)
Miniserver-Konfiguration
Als Adresse trägst Du folgendes ein: /dev/udp/192.168.44.107/5555
. Wobei Du natürlich die IP anpassen musst. Der Port ist oben im Code bereits vorgegeben. Hast Du diese geändert, musst Du hier den gleichen angeben.
Befehl bei EIN: <led>:<farbcode>
Befehl bei AUS: <led>:off
Als Farbcode gibst Du einfach HEX-RGB an. Also RRGGBB. Wenn Du bei Google nach “colorpicker” suchst, kannst Du die Farben ganz einfach aussuchen und den Code kopieren.
3D-Druckdaten
Für mein Statusdisplay habe ich den IKEA Ribba-Rahmen genutzt und für diesen ein Passepartout entworfen. Dieses findest Du auf Thingiverse.
PlatformIO
Transparenz-Hinweis (Level 1)
An diesem Beitrag ist kein Hersteller beteiligt! Sämtliche Produkte habe ich selbst gekauft und trage die kompletten Kosten für diesen Beitrag alleine! Die Inhalte wurden somit von niemandem gesehen oder abgestimmt. Es handelt sich zu 100% um meine persönliche Meinung und Erfahrung!