Creating a RGB selector and adding it to Domoticz
-
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
-
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.
-
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.
-
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