Loxone - WLAN-Status-Display selbst gebaut

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Loxone - WLAN-Status-Display selbst gebaut
Loxone - WLAN-Status-Display selbst gebaut
  • 07.04.2019
  • Level 1
  • Hardware
  • Integration

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?

Video

Lox-Kurs

Produkte

AZDelivery D1 Mini NodeMcu mit ESP8266-12F WLAN Module CH340G Lua kompatibel mit Arduino inklusive E-Book! **

CHINLY 100 stücke WS2812B Adressierbare 5050 smart RGB LED Pixel licht auf Schwarz Kühlkörper PCB Board für Arduino 5 V DC **

Schaltplan

Wemos WS2812B LEDs

»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

Lox-Kurs

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!

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig' noch tiefer in die Themen ein und meistere Deine Projekte! Über 15.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.