Mysensors zu Neopixel Node

Begonnen von grobby, 10 Januar 2016, 11:57:28

Vorheriges Thema - Nächstes Thema

grobby

Hallo,

nachdem ich mir nun paar schöne W2812b zusammengelötet habe und den nachfolgenden Sketch der des Inet entstammt und diesen geringfügig angepasst habe, stehe ich vor eher einem Mysensorseitigem Verständnisproblem.

#define MY_RADIO_NRF24
#define MY_NODE_ID 9
#include <SPI.h>
#include <MySensor.h>

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, 4, NEO_GRB + NEO_KHZ800);

unsigned int requestedMode = 0 ;
unsigned int requestedSpeed = 0 ;
unsigned int currentSpeed = 0 ;
int messageType = 0 ;
long hexColor = -1 ;

unsigned long previousTime = 0 ;
int j = 0 ;
int q = 0 ;
MySensor gw;
void setup() {
  Serial.begin(115200);
  gw.begin(receive, MY_NODE_ID, true);
  gw.sendSketchInfo("Neopixel Node", "1.0");
  gw.present(0, S_RGB_LIGHT, "Makes strip said color", true);
  gw.present(1, S_CUSTOM, "Makes strip said color", true);
  strip.begin();
  strip.show();
  Serial.println("Neopixel Node device ready");
}


void loop() {
  gw.process();
  switch (messageType) {
    case (1):
      Serial.print("Hex color override: "); Serial.println(hexColor);
      colorWipe(hexColor);
      messageType = 0 ;
    break;

    case (2):
   
      if ( (previousTime + (long) currentSpeed) < millis() ){
        if (requestedMode == 2) {
          if (j > 256) { j = 0;}
          for(int i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, Wheel((i+j) & 255)) ; strip.show(); }
          j++;
          if ( (j%255) == 0 ) { Serial.println("Rainbow  completed, continuing");}
        }
         
        if (requestedMode == 3) {
          if (j > 256) { j = 0;}
          for(int i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); strip.show(); }
          j = j + 5;
          if ( (j%255) == 0 ) { Serial.println("Rainbow cycle completed, continuing");}
        }

        if (requestedMode == 4) {
          if (j > 10) { j = 0;}
          if (q > 3) { q = 0;}
          for (int j=0; j<10; j++) {
            for (q=0; q < 3; q++) {
              for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, hexColor ); }
              strip.show();
              delay(50);
              for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); }
            }
          }
        }
       
        previousTime = millis();
      }
    break;

    case (3):   // Adjust timing of case 2 using non-blocking code (no DELAYs)
      Serial.print("Case 3 received. Speed set to: "); Serial.print(requestedSpeed * 10); Serial.println(" ms.");
      currentSpeed = requestedSpeed * 10;
      messageType = 2 ;
    break;
  }
}



void receive(const MyMessage &message) {
  Serial.println("Message received: ");

  if (message.type == V_RGB) {
    messageType = 1 ;
    String hexstring = message.getString();
    Serial.print("RGB color: "); Serial.println(hexstring);
    hexColor = strtol( &hexstring[0], NULL, 16);
    }
   
  if (message.type == V_VAR1) {
    String junkString = message.getString();
    Serial.println(junkString);
    requestedMode = junkString.charAt(0) - 48;
    messageType = 2 ;
    Serial.print("Neo mode: "); Serial.println(requestedMode);
  }

  if (message.type == V_VAR2) { // This line is for the speed of said mode
    String junkString = message.getString();
    Serial.println(junkString);
    requestedSpeed = junkString.charAt(0) - 48;
    messageType = 3 ;
    Serial.print("Neo speed: "); Serial.println(requestedSpeed);
  }
}



//************* Neopixel subroutines, with DELAYs removed. ***************


void rainbowCycle() {
  Serial.println("Rainbow Cycle loop");
  uint16_t i, j;
  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));}
    strip.show();
  }
}

void colorWipe(long number) {
  long r = hexColor >> 16;
  long g = hexColor >> 8 & 0xFF;
  long b = hexColor & 0xFF;
  for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, r,g,b);
    strip.show();
  }
}

uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}


"message.type == V_RGB" empfängt die Hexwerte vom Gateway, ich sende FFFFFF für Weiß und das funktioniert auch.
Nun das Problem, wie bediene ich "message.type == V_VAR1" vom Gateway aus um die einzelnen Neopixelroutinen anzusprechen?? Das Node gibt nur rgb,reboor,clear und time her. Hat jemand eine Idee?

Grobby

LuBeDa

Hallo,
das liegt an der Programierung des MYSENSOR_DEVICE Moduls.

S_RGB_LIGHT             => { receives => [V_RGB,V_WATT], sends => [V_RGB,V_WATT] }, # RGB light

Darin ist festgelegt dass bei RGB_LIGHTS nur die Parameter V_RGB und V_WATT funktionieren.

Du kannst also nur V_WATT als Steuerungsparameter benutzen.

Werde deinen Sketch mal nachbauen. Nette Spielerei :-)

Ludger

Beta-User

Vielleicht verschiebst Du den Thread nach MySensors?

Du präsentierst ja ein CUSTOM-Child, also sollten auch die Readings angelegt worden sein. Da aber keine Info von der Node auf das Reading kommt, gibt es erst mal auch nichts, was Du editieren kannst. Ein direktes set <node> value11 2sollte aber eigentlich gehen, um den Mode 2 einzuschalten. Danach sollte es auch ein editierbares Feld für VAR1 geben. (Ich hoffe, den Namen des Readings zutreffend erraten zu haben und den Steuerungsbefehl, bitte ggf. anpassen).

BTW noch:
Hat es einen bestimmten Grund, warum Du das noch mit lib Version 1.5 machst?
@grobby: Man kann auch die .pm anpassen, dass VAR1 für diesen Typ direkt möglich ist. Man muß nur in receives V_VAR1 zusätzlich eintragen.
Wenn ich Config-Infos oder Steuerungsbefehle mittels CUSTOM zu einzelnen ChildIDs zuordnen möchte, finde ich es zwischenzeitlich einfacher (jedenfalls, wenn V_VARx nicht anderweitig belegt ist), das CUSTOM-Child unter derselben ID zu präsentieren wie das zu konfigurierende Child bzw. ChildID 0 zu verwenden, wenn es sich um die ganze Node handelt (oder die 5 Infos dann seperat zugeordnet werden sollen). Damit empfinde ich die Nummern-Vergabe als etwas intuitiver in der FHEM-Welt.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors