Creating a RGB selector and adding it to Domoticz

  • Mod

    I have created a node which has an RGB selector. I want to send the selected value to Domoticz whenever the selection is changed. The value should then be used to control one or more other nodes with RGB leds.

    I have setup the RGB selector with gw.present(0, S_RGB_LIGHT, "RGB"). When sending the first selected value, a new device was available in Domoticz. I added the Device in Domoticz and it shows as a Type=Lighting Limitless/Applamp and Subtype=RGB.

    When the messages are sent, the serial debug log on the selector looks like this:

    send: 6-6-0-0 s=0,c=1,t=40,pt=0,l=6,sg=0,st=ok:f8c0ff
    send: 6-6-0-0 s=0,c=1,t=40,pt=0,l=6,sg=0,st=ok:fafdff

    The Domoticz log looks like this:

    2016-01-29 22:37:40	On
    2016-01-29 22:37:23	Off
    2016-01-29 22:37:22	On
    2016-01-29 22:37:16	Off
    2016-01-29 22:37:16	Off
    2016-01-29 22:37:15	Off
    2016-01-29 22:37:06	On
    2016-01-29 22:37:05	On

    I don't want On/Off, I want the RGB hexstring that was sent. Does anyone know what I'm doing wrong?

    I'm not sure if the problem is with the MySensors code or the Domoticz configuration. I am using Domoticz 2.3530

  • Hardware Contributor

    Said it before - coding isnt my strong side 🙂 but looking at the code in parseline() it looks like it doesnt do anything in Domoticz...
    In the other hand the case S_RGBW_LIGHT: (a bit below) seem to be coded...

    What du you think?

    Edit: Nah, see now in the code below that V_RGB is used... and also V_RGBW as well.

  • Mod

    Thanks! Great idea to look at the Domoticz source.
    There is no break; after S_RGB_LIGHT, so the execution will continue with S_COLOR_SENSOR so Domoticz seems to handle RGB_LIGHT and COLOR_SENSOR exactly the same. That should be fine I think. I'll continue digging through the code.

  • Mod

    Looks like I need to upgrade to the Domoticz beta

  • This is the code i am using and it is working fine with MyS 1.5.1 and Domoticz 3.5877.

    /*PROJECT: MySensors / RGB test for Light & Sensor
     DATE: september 27, 2015/ last update: October 10, 2015
     FILE: AWI_RGB.ino
     LICENSE: Public domain
     Hardware: Nano and MySensors 1.5
      uses Fastled library with NeoPixel (great & fast RBG/HSV universal library)
      Fixed node-id
      Added option to request/apply last light state from gateway
     Domoticz typicals - 2015 10 10:
      - Domoticz is using HUE values internally, there might be a slight difference then using direct RGB colors.
    #include <MySensor.h>
    #include <SPI.h>
    #include <FastLED.h>
    const int stripPin = 4 ;                  // pin where 2812 LED strip is connected
    const int numPixel = 3 ;                  // set to number of pixels
    #define NODE_ID 254                       // fixed MySensors node id
    #define CHILD_ID 0                  // Child Id's
    CRGB leds[numPixel];
    char actRGBvalue[] = "000000";               // Current RGB value
    uint16_t actRGBbrightness = 0xFF ;         // Controller Brightness 
    int actRGBonoff=0;                        // OnOff flag
    MySensor gw;
    MyMessage lastColorStatusMsg(CHILD_ID,V_VAR1);
    void setup() {
      FastLED.addLeds<NEOPIXEL, stripPin >(leds, numPixel); // initialize led strip
      gw.begin(incomingMessage, NODE_ID, false);      // initialize MySensors
      gw.sendSketchInfo("AWI RGB Light", "1.1");
      gw.present(CHILD_ID, S_RGB_LIGHT);        // present to controller
      // Flash the "hello" color sequence: R, G, B, black. 
      //Request the last stored colors settings
      gw.request(CHILD_ID, V_VAR1);
    void loop() {
      gw.process();                       // wait for incoming messages
    void colorBars()
      SendColor2AllLEDs( CRGB::Red );; delay(500);
      SendColor2AllLEDs( CRGB::Green );; delay(500);
      SendColor2AllLEDs( CRGB::Blue );; delay(500);
      SendColor2AllLEDs( CRGB::Black );; delay(500);
    void SendColor2AllLEDs(const CRGB lcolor)
      for(int i = 0 ; i < numPixel ; i++) {
        leds[i] = lcolor;
    void SendLastColorStatus()
      String cStatus=actRGBvalue+String("&")+String(actRGBbrightness)+String("&")+String(actRGBonoff);
    String getValue(String data, char separator, int index)
     int found = 0;
      int strIndex[] = {0, -1};
      int maxIndex = data.length()-1;
      for(int i=0; i<=maxIndex && found<=index; i++){
      if(data.charAt(i)==separator || i==maxIndex){
      strIndex[0] = strIndex[1]+1;
      strIndex[1] = (i == maxIndex) ? i+1 : i;
      return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
    void incomingMessage(const MyMessage &message) {
      if (message.type == V_RGB) {            // check for RGB type
        strcpy(actRGBvalue, message.getString());    // get the payload
        SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
      else if (message.type == V_DIMMER) {           // if DIMMER type, adjust brightness
        actRGBbrightness = map(message.getLong(), 0, 100, 0, 255);
        FastLED.setBrightness( actRGBbrightness );
      else if (message.type == V_STATUS) {           // if on/off type, toggle brightness
        actRGBonoff = message.getInt();
        FastLED.setBrightness((actRGBonoff == 1)?actRGBbrightness:0);
      else if (message.type==V_VAR1) {            // color status
        String szMessage=message.getString();
        strcpy(actRGBvalue, getValue(szMessage,'&',0).c_str());
        SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
        FastLED.setBrightness((actRGBonoff == 1)?actRGBbrightness:0);

    When you get the RGB Light in Device, add it and edit the Device to be a Dimmer instead then click on the three cubes and start to select the color you like