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...
    https://github.com/domoticz/domoticz/blob/master/hardware/MySensorsBase.cpp#L1844
    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 https://www.domoticz.com/forum/viewtopic.php?f=42&t=8039



  • 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
     PROGRAMMER: AWI/GizMoCuz
     DATE: september 27, 2015/ last update: October 10, 2015
     FILE: AWI_RGB.ino
     LICENSE: Public domain
    
     Hardware: Nano and MySensors 1.5
        
     Special:
      uses Fastled library with NeoPixel (great & fast RBG/HSV universal library)       https://github.com/FastLED/FastLED
     
     Remarks:
      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. 
      colorBars();
    
      //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 );   FastLED.show(); delay(500);
      SendColor2AllLEDs( CRGB::Green ); FastLED.show(); delay(500);
      SendColor2AllLEDs( CRGB::Blue );  FastLED.show(); delay(500);
      SendColor2AllLEDs( CRGB::Black ); FastLED.show(); 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);
      gw.send(lastColorStatusMsg.set(cStatus.c_str()));
    }
    
    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){
      found++;
      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
        actRGBonoff=1;
        strcpy(actRGBvalue, message.getString());    // get the payload
        SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
        SendLastColorStatus();
      }
      else if (message.type == V_DIMMER) {           // if DIMMER type, adjust brightness
        actRGBonoff=1;
        actRGBbrightness = map(message.getLong(), 0, 100, 0, 255);
        FastLED.setBrightness( actRGBbrightness );
        SendLastColorStatus();
      }
      else if (message.type == V_STATUS) {           // if on/off type, toggle brightness
        actRGBonoff = message.getInt();
        FastLED.setBrightness((actRGBonoff == 1)?actRGBbrightness:0);
        SendLastColorStatus();
      }
      else if (message.type==V_VAR1) {            // color status
        String szMessage=message.getString();
        strcpy(actRGBvalue, getValue(szMessage,'&',0).c_str());
        actRGBbrightness=atoi(getValue(szMessage,'&',1).c_str());
        actRGBonoff=atoi(getValue(szMessage,'&',2).c_str());
        SendColor2AllLEDs(strtol(actRGBvalue, NULL, 16));
        FastLED.setBrightness((actRGBonoff == 1)?actRGBbrightness:0);
      }
      FastLED.show();
    }
    
    

    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


Log in to reply
 

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.