Finally I tried this weekend but no success...
First I have updated your sketch to 2.0 version (I think I made everything right)
Didn't work on Home Assistant because the sketch don't send an initial value for each configuration of the Leds, such as Dimmer, RGB, Light, Fade, etc.
I did not figure out how to create an initial value loop because there are no MyMessage msg(Child_, V_) on the sketch...
Could you help me again?
Thanks very much...
Here is the updated sketch:
// RBG led strip plug in.
// by Bart Eversdijk (c) 2015.
#define MY_DEBUG
#define MY_RADIO_NRF24
#define MY_NODE_ID 3
#include <MySensors.h>
#include <SPI.h>
#define SUBID 1 // sensor number needed in the custom devices set up
#define RED 6 // Arduino PWM pin for Red
#define GREEN 5 // Arduino PWM pin for Green
#define BLUE 3 // Arduino PWM pin for Blue
#define NODENAME "RGB Led2"
enum ANIMATIOMODES {RAINBOW=0,RANDONMIZE,FADERGB,FADEMULTICOLR,FLASHCOLOR,LAST_PROGRAM};
byte FADE_RGB_COLOR_MODES[] = {0b0010,0b0011,0b0100,0b0101,0b1000,0b1001, 0xFF};
byte FADE_MULTI_COLOR_MODES[] = {0b0010,0b0011,0b0110,0b0111,0b0100,0b0101,0b1100,0b1101,0b1000,0b1001,0b1010,0b1011,0xFF};
static bool first_message_sent = false;
byte rgb_pins[] = {RED, GREEN, BLUE};
byte ledOffValues[] = {0, 0, 0, 0};
byte rgb_values[] = {0, 0, 0, 0};
void incomingMessage(const MyMessage &message);
#define NUM_OF_COLORS sizeof(rgb_pins)
int speedtable[] = { 0, 100, 50, 2 };
#define NUM_OF_SPEEDS sizeof(speedtable)
struct
{
byte values[4];
byte speedsetting;
byte mode;
bool status;
} rgb = { {0,0,0,0}, 0, RAINBOW, false};
bool flashOn = true;
int syscounter = 0;
int lastUpdate = 0;
bool newSetting = false;
void before() {
// Set the rgb(w) pins in output mode
for (int i = 0; i < NUM_OF_COLORS; i++) {
pinMode(rgb_pins[i], OUTPUT);
}
recallEeprom();
setLedValues(rgb.values, true);
Serial.println("Init done");
}
void presentation()
{
sendSketchInfo(NODENAME, "1.0");
present(SUBID, S_RGB_LIGHT);
}
void loop()
{
// Alway process incoming messages whenever possible
if (speedtable[rgb.speedsetting] > 0) {
if ((syscounter % speedtable[rgb.speedsetting]) == 0) {
switch (rgb.mode)
{
case RAINBOW:
animateRainbowStep();
break;
case FADERGB:
animateFadeColorStep(FADE_RGB_COLOR_MODES);
break;
case FADEMULTICOLR:
animateFadeColorStep(FADE_MULTI_COLOR_MODES);
break;
case FLASHCOLOR:
setLedValues(flashOn ? ledOffValues : rgb.values, false);
flashOn = !flashOn;
break;
case RANDONMIZE:
long number = random(0, 0xFFFFFF);
rgb_values[0] = number >> 16 & 0xFF ;
rgb_values[1] = number >> 8 & 0xFF ;
rgb_values[2] = number & 0xFF;
setLedValues(rgb_values, false);
break;
}
}
delay(rgb.mode == RANDONMIZE || rgb.mode == FLASHCOLOR ? 50 : 1);
}
if (newSetting && (lastUpdate + 30000 < syscounter)) {
// Wait for a couple of seconds be fore actual storing the current setting in to EEPROM
// This will save the EEPROM's life time, when playing around with colors
Serial.println(" Store EERPOM");
storeEeprom();
newSetting = false;
}
delay(1);
syscounter++;
}
void animateRainbowStep()
{
static float counter = 0;
float pi = 3.14159;
counter++;
rgb_values[0] = map(sin(counter/100 )*1000,-1000,1000,0,255);
rgb_values[1] = map(sin(counter/100 + pi*2/3)*1000,-1000,1000,0,255);
rgb_values[2] = map(sin(counter/100 + pi*4/3)*1000,-1000,1000,0,255);
setLedValues(rgb_values, false);
}
void animateFadeColorStep(byte *modes)
{
static int modecnt = 0;
if (updateRGBValues(modes[modecnt] >> 1, (modes[modecnt] & 0x1) == 0x1)) {
modecnt = (modes[modecnt+1] == 0xFF ? 0 : modecnt + 1);
}
}
bool updateRGBValues(byte mode, bool down)
{
bool endReached = false;
for (byte i = 0; i < 3; i++) {
if (((mode >> i) & 0x1) == 0x1) {
rgb_values[i] += (down ? -1 : 1);
endReached |= (down && (rgb_values[i] == 0x00)) || (!down && (rgb_values[i] == 0xFF));
}
}
setLedValues(rgb_values, false);
return endReached;
}
void incomingMessage(const MyMessage &message) {
if (message.type == V_RGB || message.type == V_RGBW) {
// starting to process the hex code
String hexstring = message.getString();
long number;
#ifdef RGBW
char white[3];
white[0] = hexstring[6];
white[1] = hexstring[7];
white[2] = 0;
number = (long) strtol( &white[0], NULL, 16);
rgb.values[3] = number & 0xFF;
#endif
hexstring[6] = 0;
number = (long) strtol( &hexstring[0], NULL, 16);
rgb.values[0] = number >> 16 & 0xFF ;
rgb.values[1] = number >> 8 & 0xFF ;
rgb.values[2] = number & 0xFF;
rgb.speedsetting = 0;
setLedValues(rgb.values, true);
lastUpdate = syscounter;
newSetting = true;
}
if (message.type == V_STATUS) {
if (message.getBool()) {
Serial.println("ON: Switch to last known color values");
setLedValues(rgb_values, true);
} else {
Serial.println("OFF: Switch colors off");
setLedValues(ledOffValues, true);
}
rgb.speedsetting = 0;
rgb.status = message.getBool();
lastUpdate = syscounter;
newSetting = true;
}
if (message.type == V_VAR1) {
Serial.println("Set speed and program value");
byte newsetting = message.getByte();
rgb.speedsetting = (newsetting >> 4) & 0x0F;
byte newmode = newsetting & 0x0F;
if (newmode != rgb.mode) {
for (byte i = 0; i < NUM_OF_COLORS; i++) {
rgb_values[i] = 0;
}
rgb.mode = newmode;
}
if (rgb.speedsetting > 0) {
rgb.status = true;
}
lastUpdate = syscounter;
newSetting = true;
Serial.print("Data 0x");
Serial.print(newsetting, HEX);
Serial.print(" speed:");
Serial.print(rgb.speedsetting);
Serial.print(" mode:");
Serial.println(rgb.mode);
}
}
void setLedValues(byte *rgb, bool show)
{
for (int i = 0; i < NUM_OF_COLORS; i++) {
analogWrite(rgb_pins[i], rgb[i]);
}
if (show) {
Serial.print("Red: " );
Serial.print(rgb[0], HEX);
Serial.print(" Green: " );
Serial.print(rgb[1], HEX);
Serial.print(" Blue: " );
Serial.print(rgb[2], HEX);
#ifdef RGBW
Serial.print(" White is " );
Serial.print(rgb[3], HEX);
#endif
Serial.println();
}
}
void storeEeprom()
{
byte address = 0;
byte *p = (byte *)&(rgb);
for (byte i = 0; i < sizeof(rgb); i++) {
saveState(address++, p[i]);
}
}
void recallEeprom()
{
byte address = 0;
byte *p = (byte *)&(rgb);
for (byte i = 0; i < sizeof(rgb); i++) {
p[i] = loadState(address++);
}
}