IKEA Dioder RGB LED Leiste mit openHAB steuern

Ich habe mich von einer Webseiten, mit modifizierten Dioder LED Leisten von Ikea  (Another IKEA DIODER HACK), anstecken lassen. Mein Ziel war es die IKEA® Dioder RGB Leiste über openHAB zu steuern. Für die Ansteuerung verwende ich ein Arduino® UNO mit einem Ethernet Shield und eine Dioder Leiste der ersten Generation.

Den Arduino Uno samt Ethernet Shield habe ich wie folgt an die Dioder Leiste angeschlossen.  

DioderAnschlu
image-80
Nach einer weile hatte ich ein merkwürdiges verhalten der Farben. Deshalb habe ich den PIC ausgelötet. Wichtig ist das nicht nur die RGB PINs angeschloßen sind, sondern auch der Ground.

 

Den 12V Anschluss habe ich gleich mit für den Arduino® verwendet. Am Ende sah die Verkabelung wie folgt aus:

ArduinoUno
image-81

Dann habe ich in der Arduino Entwicklungsumgebung ein Programm geschrieben was per HTTP GET die RGB Werte an den Ausgängen schaltet. Vieles ist aus den Beispieldeteien der Ethernet Bibliothek.

<pre style="color: #000000;">//90-a2-da-00-33-e4
#include <SPI.h>
#include <Ethernet.h>

// Ethernet client library
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x33, 0xE4 };
EthernetClient client;
EthernetServer server(80);

// LEDs
int LEDPINred   = 6;
int LEDPINgreen = 3;
int LEDPINblue  = 5;

int LEDred   = 0;
int LEDgreen = 0;
int LEDblue  = 255;

void setup() {

  Serial.begin(9600); // Open serial communications and wait for port to open:

  analogWrite(LEDPINred, LEDred);
  analogWrite(LEDPINgreen, LEDgreen);
  analogWrite(LEDPINblue, LEDblue);

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    LEDred   = 255;
    LEDgreen = 0;
    LEDblue  = 0;
    analogWrite(LEDPINred, LEDred); // LEDs auf Rot setzen
    analogWrite(LEDPINgreen, LEDgreen);
    analogWrite(LEDPINblue, LEDblue);
    for(;;);     // no point in carrying on, so do nothing forevermore:
  }
  // print your local IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP()); // print the value of each byte of the IP address:
  LEDred   = 0;
  LEDgreen = 255;
  LEDblue  = 0;
  analogWrite(LEDPINred, LEDred); // LEDs auf Grün setzen
  analogWrite(LEDPINgreen, LEDgreen);
  analogWrite(LEDPINblue, LEDblue);
  Serial.println();

  server.begin(); //Ethernet Server auf Port 80 starten

}

void loop() {

  webServer();
  analogWrite(LEDPINred, LEDred); // LEDs auf Grün setzen
  analogWrite(LEDPINgreen, LEDgreen);
  analogWrite(LEDPINblue, LEDblue);

}

void webServer () {

  String WEBtmp = "";
  String WEBget = "";
  int POSstart = 0;
  int POSend = 0;

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.write(c);
        WEBtmp = WEBtmp + c;
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          // client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          client.print("RED: ");
          client.print(LEDred);
          client.println("<br />");       

          client.print("GREEN: ");
          client.print(LEDgreen);
          client.println("<br />");       

          client.print("BLUE: ");
          client.print(LEDblue);
          client.println("<br />");       

          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          Serial.print (WEBtmp);
          if (WEBtmp.substring(0,3) == "GET") {
            WEBget = WEBtmp;
          }
          WEBtmp = "";
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");

    if (WEBget.length() >= 24) {
      POSstart =  WEBget.indexOf("rgb=") + 4;
      POSend = WEBget.indexOf("HTTP");
      WEBtmp = WEBget.substring(POSstart,WEBget.indexOf(","));
      LEDred = atoi(WEBtmp.c_str());
      if (LEDred >= 100) {LEDred = 100;}
      LEDred = round(LEDred * 2.55);
      Serial.println(LEDred);

      WEBget = WEBget.substring(WEBget.indexOf(",")+1);
      WEBtmp = WEBget.substring(0,WEBget.indexOf(","));
      LEDgreen = atoi(WEBtmp.c_str());
      if (LEDgreen >= 100) {LEDgreen = 100;}
      LEDgreen = round(LEDgreen * 2.55);
      Serial.println(LEDgreen);

      WEBget = WEBget.substring(WEBget.indexOf(",")+1);
      WEBtmp = WEBget.substring(0,WEBget.indexOf(" "));
      LEDblue = atoi(WEBtmp.c_str());
      if (LEDblue >= 100) {LEDblue = 100;}
      LEDblue = round(LEDblue * 2.55);
      Serial.println(LEDblue);

      WEBtmp = "";

    }

  }
}

In Openhab sieht die Config wie folgt aus:
ITEMS-Datei

Color  RGB "RGB Light" &lt;slider&gt;

SITEMAP-Datei

Colorpicker item=RGB icon="slider"

RULES-Datei

import org.openhab.core.library.types.*

var HSBType hsbValue
var int redValue
var int greenValue
var int blueValue
var String httpRGB

rule "Set RGB value"
   when
      Item RGB changed 
   then 
      hsbValue = RGB.state as HSBType 
      redValue = hsbValue.red.intValue 
      greenValue = hsbValue.green.intValue 
      blueValue = hsbValue.blue.intValue

      logInfo( "RED", redValue.toString )
      logInfo( "GREEN", greenValue.toString )
      logInfo( "BLUE", blueValue.toString )

      httpRGB= "http://192.168.2.20/" + "?rgb=" + redValue.toString + "," +greenValue.toString + "," + blueValue.toString

      logInfo( "HTTPRGB", httpRGB )
      sendHttpGetRequest(httpRGB)
   end

Nun kann ich nicht nur Ein / Aus und 8 Farben wählen, sondern mit dem Colorpicker die Farbe auswählen die ich will.

Das ist übrigens das einzigste Element im Haus, was ich wirklich steuern kann. Ich habe leider kein KNX und Homematic. ZWave würde ich gerne mal umsetzen aber das ist teilweise noch so teuer und ich habe bisher kein Heizungsventil per zwave gefunden das bei mir funktionieren würde.

Schreibe einen Kommentar

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