MySensors/RGB Stripe(DIODER)/ColorPicker

Begonnen von JasonMask, 20 Mai 2015, 00:36:39

Vorheriges Thema - Nächstes Thema

JasonMask

Hi zusammen,

eigentlich bin ich schon recht glücklich mit dem was ich bisher hinbekommen habe. Deshalb möchte ich das hier auch etwas ausführlicher erklären um vielleicht auch für andere eine Hilfe zu sein.

Im wesentlichen geht es darum eine IKEA DIODER RGB Leiste per Funk über MySensors anzusprechen.

Stand jetzt ist wie folgt:

Der Code für den Arduino Sketch ist weitestgehend von hier geklaut: http://forum.pidome.org/viewtopic.php?id=58
Ich habe mir lediglich erlaubt einiges zu vereinfachen um es hoffentlich verständlicher zu machen:

#include <MyConfig.h>
#include <MyGateway.h>
#include <MyMessage.h>
#include <MyMQTT.h>
#include <MySensor.h>
#include <Version.h>

// Example sketch showing how to control an RGB Led Strip.
// This example will not remember the last rgb color set after power failure.

#include <MySensor.h>
#include <SPI.h>

#define RED 3  // Arduino PWM pin for Red
#define GREEN 5 // Arduino PWM pin for Green
#define BLUE 6  // Arduino PWM pin for Blue
#define node 100  // Assigning the node (this will be the address for Pidome)
#define strip 1  // sensor number needed in the custom devices set up

MySensor gw;

void setup()
{
    // Initialize library and add callback for incoming messages
    gw.begin(incomingMessage, node, true);
   
    // Send the sketch version information to the gateway and Controller
    gw.sendSketchInfo("RGB Node", "1.0");
   
    // Register the sensor to gw
    gw.present(strip, S_CUSTOM);
   
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);
}


void loop()
{
    // Alway process incoming messages whenever possible
    gw.process();
}

void incomingMessage(const MyMessage &message) {
     Serial.print("got msg: " );
     Serial.println(message.getLong());
    if (message.type==V_VAR1) {
       applyColor(message.getLong());
    }
}
void applyColor(long number){
  analogWrite(RED,    number >> 16 & 0xFF);
  analogWrite(GREEN,  number >> 8 & 0xFF);
  analogWrite(BLUE,   number & 0xFF);
  Serial.print("asigned as hex: " );
  Serial.println(String(number, HEX));
}


Im Einsatz ist ein Arduino Nano sowie ein ULN2003A Chip.

Den Schaltplan vom Breadboard hab ich angehängt (board.jpg).

Soweit funktioniert auch die Ansteuerung des ganzen (gui.jpg):
define RGBNode MYSENSORS_DEVICE 100
attr RGBNode IODev gateway
attr RGBNode mapReading_switch11 11 value1
attr RGBNode mode repeater
attr RGBNode room RGB
attr RGBNode setCommands off:switch11:off white:switch11:16777215 red:switch11:16711680 green:switch11:65280  blue:switch11:255
attr RGBNode version 1.4.1

define LED dummy
attr LED room RGB
attr LED setList off white red green blue
attr LED webCmd off:white:red:green:blue

define LEDoff notify LED:off set RGBNode off
define LEDwhite notify LED:white set RGBNode white
define LEDred notify LED:red set RGBNode red
define LEDgreen notify LED:green set RGBNode green
define LEDblue notify LED:blue set RGBNode blue


Das "einzige" was mir jetzt noch fehlt ist die Farbe frei über einen ColorPicker definieren zu können.

Irgendwie finde ich nur Anleitungen wie ich zb das hue modul oder pilight konfiguriere. Eine Anleitung wie ich jetzt aber einen ColorPicker definiere und dafür sorge dass dessen Werte an mein Arduino übertragen werden, konnte ich leider bisher nicht finden.

Für eine Rollladensteuerung wüsste ich außerdem auch gerne wie ich die Werte eines Sliders auf die gleiche Weise verschicken kann.

Danke schonmal für jede Hilfe.

CU Jason

justme1968

für den colorpicker gibt es im wiki eine beschreibung: http://www.fhemwiki.de/wiki/Color

die notifys kannst du über $EVENT zu einem zusammenfassen.

ansonsten schau dir mal die beispiele zu den farbigen lampen in der aktuellen fhem.cfg.demo an. mit einem readingsProxy statt einem dummy sparst du die notifys ganz.

was ist dir am slider nicht klar? damit fhemweb ein widget darstellt muss das modul eine richtig formatierte antwort auf 'set ?' zurück liefern. das ist z.b. hier: http://www.fhemwiki.de/wiki/DevelopmentModuleIntro beschrieben und die möglichen widgets sind in der commandref unter widgetOverride beschrieben.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JasonMask

Hi Andre,

endlich bin ich dazu gekommen hier weiter zu machen.
Danke für Deine Tipps.

Ich kann jetzt auch tatsächlich über den Colorpicker Farben auswählen.

define RGBNode MYSENSORS_DEVICE 100
attr RGBNode IODev gateway
attr RGBNode mapReading_switch11 11 value1
attr RGBNode mode repeater
attr RGBNode room RGB
attr RGBNode setCommands off:switch11:0 on:switch11:16777215 16777215:switch11:16777215 0:switch11:0 16711680:switch11:16711680 65280:switch11:65280 255:switch11:255
attr RGBNode version 1.4.1

define RGB readingsProxy RGB
attr RGB userattr Light Light_map structexclude
attr RGB devStateIcon {Color::devStateIcon("RGB","rgb","rgb","state")}
attr RGB room RGB
attr RGB setFn {fhem ("set RGBNode ".hex($ARGS));;if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem ("setreading $DEVICE state on");;} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1);; my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );; fhem ("setreading $DEVICE rgb $rgb");;} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);; my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b);; my $hue = int($h*359);;  fhem ("setreading $DEVICE hue $hue");;} fhem ("setreading $DEVICE $CMD $ARGS");;return undef;;}
attr RGB setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
attr RGB webCmd hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off


Leider aber werden nur die Werte übernommen, die ich auch als mögliche Werte definiert hab.

Das hier gibt zwar die Werte richtig weiter:
attr RGB setFn {fhem ("set RGBNode ".hex($ARGS));;if( $CMD ...

Tatsächlich wird aber der parameter aber als command interpretiert das aufgerufen werden soll.
Das hier übersetzt es dann in die gleichen werte und gibt sie tatsächlich weiter.
attr RGBNode setCommands off:switch11:0 on:switch11:16777215 16777215:switch11:16777215 0:switch11:0 16711680:switch11:16711680 65280:switch11:65280

Wie kann ich dem RGBNode sagen dass er bitte einfach alle neuen Werte an das Gerät weitergeben soll?

Danke nochmal für ein paar weitere Tipps ;)

CU Jason

gloob

Ich wäre auch sehr an der Lösung interessiert. Aktuell kann ich zwar das Reading setzen aber es wird nicht zum MySensor Device gesendet.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

#4
Okay nach langem Probieren habe ich eine Lösung gefunden.
Lediglich das Aussehen des readingsProxy gefällt mir noch nicht ganz. On und Off funktionieren nicht so wie sie sollen und woher das "initialized" kommt weiß ich auch noch nicht.

Hier der Code auf dem Arduino:


// Example sketch showing how to control an RGB Led Strip.
// This example will not remember the last rgb color set after power failure.
#include <MySensor.h>
#include <SPI.h>
#include "FastLED.h"

#define node 15  // Assigning the node (this will be the address for Pidome)
#define strip 1  // sensor number needed in the custom devices set up
#define NUM_LEDS 4
#define LED_PIN     6
#define COLOR_ORDER GRB
#define CHIPSET     WS2812

CRGB leds[NUM_LEDS];

int hue = 0;
int sat = 255;
int val = 255;

MySensor gw;

void setup()
{
  // Initialize library and add callback for incoming messages
  gw.begin(incomingMessage, node, true);

  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("RGB Node", "1.0");

  // Register the sensor to gw
  gw.present(strip, S_CUSTOM);

  // add the leds
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB::Black;
  }
  // initialise the leds
  FastLED.show();

}

void loop()
{
  // Alway process incoming messages whenever possible
  gw.process();
}

void incomingMessage(const MyMessage &message) {
  Serial.print("got msg: " );
  Serial.println(message.getString());

  if (message.type == V_VAR1) {
    applyColor(message.getString());
  }
}

void applyColor(const char* value) {
 
  long number = (long) strtol(value, NULL, 16);
 
  int r = number >> 16 & 0xFF;
  int g = number >> 8 & 0xFF;
  int b = number & 0xFF;

  for (int i = 0; i < NUM_LEDS; i++)
  {
    //leds[i] = CHSV(map(number,0,359,0,255), sat, val);
    leds[i] = CRGB(r, g, b);
  }

  FastLED.show();

  Serial.print("asigned as hex: " );
  Serial.println(String(number, HEX));
  Serial.print(F("r/g/b "));
  Serial.print(r);
  Serial.print(F("/"));
  Serial.print(g);
  Serial.print(F("/"));
  Serial.print(b);
  Serial.println();
}


und hier die Integration in FHEM:


#########################################################################
# RGB Light
#########################################################################
define RGBNode MYSENSORS_DEVICE 15
attr RGBNode IODev mysensor_gateway
attr RGBNode mapReading_value11 1 value1
attr RGBNode mapReading_value21 1 value2
attr RGBNode mapReading_value31 1 value3
attr RGBNode mode repeater
attr RGBNode room RGB
attr RGBNode setReading_value11 1
attr RGBNode version 1.4.1

define RGB readingsProxy RGBNode.value11
attr RGB userattr Light Light_map structexclude
attr RGB room RGB
attr RGB setFn {fhem ("set RGBNode value11 $ARGS")}
attr RGB setList on:noArg off:noArg rgb:colorpicker,RGB
attr RGB verbose 5
attr RGB webCmd rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off

define rg_rgbnode readingsGroup RGBNode:.*
attr rg_rgbnode room RGB



Über Feedback was gut oder schlecht ist würde ich mich sehr freuen.
Man lernt ja nie aus und will es auch besser machen.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

justme1968

sorry für die späte antwort.

was genau heisst on und off funktioniert nicht wie es soll ?

wenn du das state reading nicht setzt musst du über stateFormat dafür sorgen das in STATE etwas erscheint und dann mit devStateIcon ein passendes icon setzen. das hier hilft dir dabei: http://www.fhemwiki.de/wiki/Color#Farbige_Lampen_Icons.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

JasonMask

hi gloob,
hi andre,

vielen Dank an euch beide. Mit den zusätzlichen infos konnte ich jetzt den ein oder anderen fehler bei mir finden.

Zu aller erst war da wohl der Fehler, dass man mit
attr mySensNode setReading_value11
das Setzen beliebiger Werte freischalten muss.

Mit
attr mySensNode setCommands off:value11:0 on:value11:16777215
könnte man "nur" zusätzliche states definieren die dann als buttons auftauchen.

Bei mir hab ich das weggelassen und das ganze MYSENSORS_DEVICE in den "hidden" Raum verschoben.  Die Steuerung erfolgt nurnoch über den readingsProxy.

Zur funktionalität vom readingsProxy hat sich bei mir auch die ein oder andere Erkenntnis eingestellt

Die Angaben im define hinter readingsProxy sind in der folge als $DEVICE bzw $READING verfügbar.
Zudem ist mir klar geworden dass ich über $name auch Zugriff auf den readingsProxy selbst bekomme.
Dadurch konnte ich den weiteren Code generischer gestallten was es zumindest leichter machen dürfte ihn zu kopieren

Die setFn der Proxies macht jetzt also zwei Dinge:
1) schreibt sie neue Werte zurück an die anderen Inputs des Proxies. Dadurch zeigen der HUE-ColorPicker und der RGB-ColorPicker auch dann die richtigen Werte an wenn ich die Farbe über die vordefinierten Buttons (siehe Zeile webCmd) oder einen der ColorPicker gesetzt habe. Das sind alle Codeteile die $name nutzen.
2) schickt sie die neuen Wert an das MYSENSORS_DEVICE das im define angegeben wurde (hier mySensNode), an das Reading das nach den : definiert wurde (hier value11). Im Code stehen nurnoch $DEVICE und $READING

Ich hoffe mal das erspart dem ein oder anderen lästige Suchen.

hier nochmal meine angepasste config:


define mySensNode MYSENSORS_DEVICE 100
attr mySensNode IODev gateway
attr mySensNode mapReading_value11 11 value1
attr mySensNode mode repeater
attr mySensNode room hidden
attr mySensNode setReading_value11
attr mySensNode version 1.4.1

define readProx readingsProxy mySensNode:value11
attr readProx userattr Light Light_map structexclude
attr readProx devStateIcon {Color::devStateIcon($name,"RGB","rgb","state","state")}
attr readProx room Wohnzimmer
attr readProx setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem ("setreading $name state on");;}if($CMD eq "state"){if($ARGS eq "on"){fhem ("set $DEVICE $READING ".hex(ReadingsVal("readProx","rgb","FFFFFF")));;} elsif($ARGS eq "off"){fhem ("set $DEVICE $READING 0");;}} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1);; my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );; fhem ("setreading $name rgb $rgb");;fhem ("set $DEVICE $READING ".hex($rgb));;} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);; my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b);; my $hue = int($h*359);;  fhem ("setreading $name hue $hue");; fhem ("set $DEVICE $READING ".hex($ARGS));;} fhem ("setreading $name $CMD $ARGS");;return undef;;}
attr readProx setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
attr readProx webCmd hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off


Wenn jemand vorschläge für eine elegantere Lösung hat bitte immer raus damit.

Der nächste Punkt an dem ich gerade "hänge" ist jetzt zwei der Devices über einen Proxy zu steuern bzw. zwei Proxies über einen weiteren Proxy zu steuern.
An sich funktioniert das auch schon:
define rpRGB readingsProxy proxyA,proxyB:rgb
attr rpRGB userattr Light Light_map structexclude
attr rpRGB devStateIcon {Color::devStateIcon($name,"RGB","rgb","state","state")}
attr rpRGB room Wohnzimmer
attr rpRGB setFn {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;;$CMD = "state" } else {fhem ("setreading $name state on");;}if($CMD eq "state"){if($ARGS eq "on"){fhem ("set proxyA,proxyB rgb ".ReadingsVal($name,"rgb","FFFFFF"));;} elsif($ARGS eq "off"){fhem ("set proxyA,proxyB rgb 0");;}} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1);; my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );; fhem ("setreading $name rgb $rgb");;fhem ("set proxyA,proxyB rgb ".$rgb);;} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);; my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b);; my $hue = int($h*359);;  fhem ("setreading $name hue $hue");; fhem ("set proxyA,proxyB rgb ".$ARGS);;} fhem ("setreading $name $CMD $ARGS");;return undef;;}
attr rpRGB setList on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
attr rpRGB webCmd hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off


Allerdings muss ich die Namen der beiden Proxies bzw ihr Reading fest im Code angeben und hab es noch nicht hinbekommen das auch als konfigurierbare liste zu übergeben wie bei den anderen.
Hat jemand einen Tip?

Danke

CU Jason

justme1968

dein einzigen vorschlag den ich noch hätte wäre die langen {...} perl teile aus den attributen in eine routine in 99_myUtils.pm zu verlagern und nur noch mit attr <device> <attr> {mySub($name,$DEVICE,$READING)} nur noch aufzurufen.

das hat den vorteil das du den code tatsächlich in mehr als einem device verwenden kannst ohne zu kopieren und du kannst das ganze lesbarere formatieren weil nicht alles auf eine zeile passen muss.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

gloob

#8
Hallo,

Irgendwie bekomme ich folgenden Fehler wenn ich das setFn nehme:



2015.06.09 12:58:31 1: devStateIcon RGB: Undefined subroutine &Color::devStateIcon called at (eval 20970) line 1.

2015.06.09 12:58:31 3: RGB: setFn: Undefined subroutine &Color::hsv2rgb called at (eval 20969) line 1.


Ein Update habe ich schon gemacht. Fehlt mir noch irgend etwas anderes?

Edit: Gelöst: ich hatte vergessen das Color Modul zu initialisieren.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

herrmannj

Hi,

so als Angebot: grundsätzlich könnte ich mir vorstellen einen mysensors support in Wifilight einzubauen. Wifilight würde sich dann um das timing, Farbkorrektur, fades etc kümmern. Der IO sollte über das mysensors modul stattfinden.

Allerdings fehlt mir aktuell das Verständnis wie die Daten an mysensors übergeben werden können.

vg
joerg

JasonMask

hi zusammen,

@andre: danke für den hinweis. ich hatte bisher darauf verzichtet um das ganze kompakter bzw leichter kopierbar zu halten, werd den code aber jetzt auslagern.

@joerg: danke für dein angebot. ich hab mir dein projekt gerade nur sehr oberflächlich angeschaut und bin mir nicht ganz sicher ob das so ohne weiteres mit mysensors zusammenarbeiten wird.  das fängt schon damit an dass mysensors nicht zwangsläufig über ein klassisches netzwerk, geschweigeden wlan, arbeitet. man definiert mit MYSENSORS ein gateway das über einen nrf24l01 "chip" mit anderen geräten (meist arduino o.ä.) spricht. in meinem fall hab ich mir ne plantine gebaut die ich direkt auf einen raspberry stecken kann (meinen gateway spreche ich über "/dev/ttyMySensorsGateway" an). andere haben wohl einen arduino per usb angeschloßen und wieder andere nutzen einen arduino mit ethernet um den nrf24l01 zu nutzen. wie der name MySensors schon sagt geht es da auch überwiegend um das auslesen von sensoren. meine nutzung zum steuern von rgb stripes erscheint mir ein eher esoterisches einsatzgebiet zu sein. nachdem mich aber die hardware für die steuerung deutlich unter 10€ pro rgb stripe kostet wollte ich es erstmal damit versuchen ;) irgendwie sprengt das aber gerade auch den rahmen dieses threads. wenn du möglichkeiten siehts meinen ansatz in wifilight sinnvoll zu integrieren wäre das natürlich super und ich will dir da gern beim setup helfen. meld dich doch einfach per pm.

ich mach das hier jetzt erstmal alles hübsch, werds noch ein wenig testen und euch dann mal ein kleines howto um die ohren hauen ;)

cu jason

gloob

Hallo,

Ich hab jetzt meinen Arduino Code noch erweitert und es wird jetzt ein weiches Überblenden beim Farbwechsel gemacht. Vielleicht hat ja jemand Interesse daran.

Der Farbwert muss als RGB Wert übertragen werden. Intern wird er dann in HSV umgerechnet und der Farbwechsel berechnet.

//****************************************************
// includes
//****************************************************
#include <MySensor.h>
#include <SPI.h>
#include "FastLED.h"

//****************************************************
// defines
//****************************************************
#define node 15
#define strip 1
#define NUM_LEDS 4
#define LED_PIN     6
#define COLOR_ORDER GRB
#define CHIPSET     WS2812

//****************************************************
// variables
//****************************************************
CRGB leds[NUM_LEDS];

MySensor gw;

int hue = 0;
int sat = 0;
int val = 0;
int newhue = 0;
int newsat = 0;
int newval = 0;

unsigned long lastUpdate = 0;

//****************************************************
// setup
//****************************************************
void setup()
{
  // Initialize library and add callback for incoming messages
  gw.begin(incomingMessage, node, true);

  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("RGB Node", "1.0");

  // Register the sensor to gw
  gw.present(strip, S_CUSTOM);

  // add the leds
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB::Black;
  }

  // initialise the leds
  FastLED.show();
}

//****************************************************
// loop
//****************************************************
void loop()
{
  // process messages
  gw.process();

  if (millis() > lastUpdate + 10)
  {
    // fade colors
    fadeHsv();

    // set colors
    if (hue != newhue || sat != newsat || val != newval)
    {
      setColor(hue, sat, val);
    }
   
    // save the last update time
    lastUpdate = millis();
  }
}

//****************************************************
// handle incoming messages
//****************************************************
void incomingMessage(const MyMessage &message) {
  if (message.type == V_VAR1) {
    hexToHsv(message.getLong(), newhue, newsat, newval);
    Serial.println(newhue);
    Serial.println(newsat);
    Serial.println(newval);
  }
}

//****************************************************
// convert hex to hsv
//****************************************************
void hexToHsv(long number, int &_h, int &_s, int &_v)
{
  int r = number >> 16 & 0xFF;
  int g = number >> 8 & 0xFF;
  int b = number & 0xFF;

  RGBtoHSV(r, g, b, _h, _s, _v);
}

//****************************************************
// convert rgb to hsv
//****************************************************
void RGBtoHSV( int r, int g, int b, int &_h, int &_s, int &_v )
{
  double h, s, v;
  float min_value, max_value, delta;

  min_value = min(min(r, g), b);
  max_value = max(max(r, g), b);

  delta = max_value - min_value;

  //********************************
  // value
  //********************************
  v = max_value;

  //********************************
  // saturation
  //********************************
  if ( max_value != 0 )
  {
    s = delta / max_value;
  }
  else
  {
    _h = 0;
    _s = 0;
    _v = 0;
    return;
  }

  if ( r == max_value )
  {
    h = ( g - b ) / delta; // between yellow & magenta
  }
  else if ( g == max_value )
  {
    h = 2 + ( b - r ) / delta; // between cyan & yellow
  }
  else
  {
    h = 4 + ( r - g ) / delta; // between magenta & cyan
  }

  h *= 60; // degrees

  if ( h < 0 )
  {
    h += 360;
  }

  _h = (int)map(h, 0, 359, 0, 255);
  _s = (int)map((int)100 * s, 0, 100, 0, 255);
  _v = (int)map(v, 0, 255, 0, 255);
}


//****************************************************
// set hsv colors
//****************************************************
void setColor(int hue, int sat, int val) {
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CHSV(hue, sat, val);
    //leds[i] = CRGB(r, g, b);
  }
  FastLED.show();
}

//****************************************************
// fade hsv colors
//****************************************************
void fadeHsv()
{
  //**************************
  // fade hue
  //**************************
  if (hue != newhue)
  {
    if (hue < newhue)
    {
      hue = (newhue - hue) > (255 - newhue + hue) ? hue - 1 : hue = hue + 1;
    }
    else
    {
      hue = (hue - newhue) > (255 - hue + newhue) ? hue + 1 : hue - 1;
    }
    if (hue < 0) hue = 255;
    if (hue > 255) hue = 0;
  }

  //**************************
  // fade saturation
  //**************************
  if (sat != newsat)
  {
    sat = sat > newsat ? sat - 1 : sat + 1;
  }

  //**************************
  // fade value
  //**************************
  if (val != newval)
  {
    val = val > newval ? val - 1 : val + 1;
  }
}
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

Ich habe die MySensors Bibliothek jetzt geupdatet und jetzt funktioniert das Senden der RGB Werte nicht mehr.
Hat jemand von euch eine Idee woran es liegen könnte?
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

Hat jemand noch eine Idee für die Ansteuerung von LEDs über MySensors?
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Hauswart

Also du kannst keine Werte mehr an den Sensor schicken nachdem du ein FHEM Update gemacht hast?

Kannst du mir einen Link zum Sketch schicken?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Hauswart

Wenn es der Sketch aus Link 1 ist habe ich den Fehler gefunden. Habe nur gerade leider keinen PC da zum korrigieren.

In Zeile 110: http://sourceforge.net/p/fhem/code/10593/tree/trunk/fhem/FHEM/10_MYSENSORS_DEVICE.pm#l110 Mitte: "receives => [V_VAR1],"
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

gloob

Hallo,

Ich würde gerne einen anderen Sketch nutzen und das neue Reading S_RGB.

Einen Sketch für den Arduino habe ich auch:

// Example sketch showing how to control an RGB Led Strip.
// This example will not remember the last rgb color set after power failure.

#include <MySensor.h>
#include <SPI.h>

#include "Adafruit_NeoPixel.h"

#define NUMPIXELS 4   // Number of connected pixels on a single datapin
#define PIN 4         // Digital output pin

#define node 254  //254 for testing purpose
#define CHILD_ID 0 


Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
long RGB_values[3] = {0,0,0};

MySensor gw;

void setup()
{
    gw.begin(incomingMessage, node, true);
    gw.sendSketchInfo("RGB Node", "1.0");
    gw.present(CHILD_ID, S_RGB_LIGHT);
    strip.begin();
    strip.show(); // Update the strip, to start they are all 'off'
}


void loop()
{
    gw.process();
}

void incomingMessage(const MyMessage &message) {
    if (message.type==V_RGB) {
  // starting to process the hex code
        String hexstring = message.getString(); //here goes the hex color code coming from through MySensors (like FF9A00)
        long number = (long) strtol( &hexstring[0], NULL, 16);
        RGB_values[0] = number >> 16;
        RGB_values[1] = number >> 8 & 0xFF;
        RGB_values[2] = number & 0xFF;

        colorWipe(Color(RGB_values[0],RGB_values[1],RGB_values[2]), 60);
     }
     
    if (message.type==V_DIMMER) {
      strip.setBrightness(round((2.55*message.getInt())));
      strip.show();
      }
     
    if (message.type==V_LIGHT) {
       if (message.getInt() == 0) {
        strip.clear();
        strip.show();
       }
    }
 
}

void colorWipe(uint32_t c, uint8_t wait) {
  int i;

  for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

    /* Helper functions */

// Create a 15 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}
   


Ich glaube das mir nur die richtige Integration in FHEM fehlt. Das Modul sollte eigentlich so passen.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

Hallo,

Also am Arduino Sketch scheint es nicht zu liegen. Wenn ich mit einem anderen Controller die Daten schicke, werden sie richtig vom Arduino Empfangen und ausgewertet.

Es kann also nur noch am Gateway oder an FHEM liegen.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

Es scheint an meinem Gateway gelegen zu haben. Ich hatte einen Sensebende Micro direkt an die RX und TX Leitung vom Raspberry Pi geklemmt und scheinbar hat die TX Leitung nicht funktioniert.
FHEM konnte zwar alles vom Gateway empfangen und somit gingen die Sensoren auch aber senden ging irgendwie nicht und die Nachrichten für die RGB Werte wurden garnicht gesendet.

Jetzt habe ich aktuell einen Arduino Nano als Gateway benutzt und damit geht es. Mal gucken ob ich den Sensebender irgendwie als Gateway trotzdem benutzen kann.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Hauswart

Mmh also mir ist klar, wieso du einige Werte nicht senden kannst.

Der Sensor gibt sich als RGB light zu erkennen:
S_RGB_LIGHT             => { receives => [V_RGB,V_WATT], sends => [V_RGB,V_WATT] }, # RGB light

Dein Sketch arbeitet aber mit folgenden Variablen:
V_DIMMER
V_RGB
V_LIGHT

Ist die ein Standard Sketch? Ich denke nein?

Daher würde es wahrscheinlich Sinn machen den Sketch anzupassen. Ich habe gerade an Norbert eine Anpassung des MySensors-Modul geschickt, ich hoffe diese ist bald im FHEM-Update enthalten.

So lange könntest du folgendes testen: https://raw.githubusercontent.com/Kolbi/fhem-mirror/master/fhem/FHEM/10_MYSENSORS_DEVICE.pm

Und diesen Sketch:

// Example sketch showing how to control an RGB Led Strip.
// This example will not remember the last rgb color set after power failure.

#include <MySensor.h>
#include <SPI.h>

#include "Adafruit_NeoPixel.h"

#define NUMPIXELS 4   // Number of connected pixels on a single datapin
#define PIN 4         // Digital output pin

#define node 254  //254 for testing purpose
#define CHILD_ID 0 


Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
long RGB_values[3] = {0,0,0};

MySensor gw;

void setup()
{
    gw.begin(incomingMessage, node, true);
    gw.sendSketchInfo("RGB Node", "1.0");
    gw.present(CHILD_ID, S_CUSTOM);
    strip.begin();
    strip.show(); // Update the strip, to start they are all 'off'
}


void loop()
{
    gw.process();
}

void incomingMessage(const MyMessage &message) {
//if (message.type==V_RGB) {
    if (message.type==V_VAR1) {
  // starting to process the hex code
        String hexstring = message.getString(); //here goes the hex color code coming from through MySensors (like FF9A00)
        long number = (long) strtol( &hexstring[0], NULL, 16);
        RGB_values[0] = number >> 16;
        RGB_values[1] = number >> 8 & 0xFF;
        RGB_values[2] = number & 0xFF;

        colorWipe(Color(RGB_values[0],RGB_values[1],RGB_values[2]), 60);
     }
   
//if (message.type==V_DIMMER) {
    if (message.type==V_VAR2) {
      strip.setBrightness(round((2.55*message.getInt())));
      strip.show();
      }
   
//if (message.type==V_LIGHT) {
    if (message.type==V_VAR3) {
       if (message.getInt() == 0) {
        strip.clear();
        strip.show();
       }
    }
 
}

void colorWipe(uint32_t c, uint8_t wait) {
  int i;

  for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

    /* Helper functions */

// Create a 15 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)