Wifilight.pm

Begonnen von herrmannj, 18 Januar 2014, 04:10:07

Vorheriges Thema - Nächstes Thema

gloob

Für den Anfang würde es ja reichen wenn einmal Weiß unterstützt wird.
Eine Testversion des Moduls gab es ja vor einem Jahr schonmal. Die Läuft bei mir ohne Probleme.
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

ja, das würde sauber gehen.

Könntest Du die Befehle nochmal raus schreiben ? (on und set rgb)

Danke und vg
Joerg

gloob

#2117
Hier ist das angepasste Modul. Solltest du relativ leicht über ein diff die Änderungen sehen:

https://forum.fhem.de/index.php/topic,50799.msg511749.html#msg511749

oder suchst du "nur" sowas:

###############################################################################
#
# device specific controller functions RGBW LD686 (R-G-B-WW-CW)
#
###############################################################################

sub
WifiLight_RGBWLD686_On(@)
{
  my ($ledDevice, $ramp) = @_;
  my $delay = 50;
  my $on = sprintf("%c%c%c%c", 0x71, 0x23, 0x0F, 0xA3);
  my $msg = sprintf("%c%c%c%c%c", 0x56, 0, 0, 0, 0xAA);
  my $receiver;
  WifiLight_LowLevelCmdQueue_Add($ledDevice, $on, $receiver, $delay);
  my ($h, $s, $v, $warmw, $coldw) = split(',', AttrVal($ledDevice->{NAME}, "defaultColor", "0,0,100,100,100"));
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set on ($h, $s, $v) $ramp");
  return WifiLight_HSV_Transition($ledDevice, $h, $s, $v, $ramp, '', 100, undef, $warmw, $coldw) if ($ledDevice->{LEDTYPE} eq 'RGBWW');
  return WifiLight_HSV_Transition($ledDevice, $h, $s, $v, $ramp, '', 100, undef);
}

sub
WifiLight_RGBWLD686_Off(@)
{
  my ($ledDevice, $ramp) = @_;
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set off $ramp");
  return WifiLight_RGBWLD686_Dim($ledDevice, 0, $ramp, '');
}

sub
WifiLight_RGBWLD686_Dim(@)
{
  my ($ledDevice, $level, $ramp, $flags) = @_;
  my $h = ReadingsVal($ledDevice->{NAME}, "hue", 0);
  my $s = ReadingsVal($ledDevice->{NAME}, "saturation", 0);
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 dim $level $ramp $flags");
  return WifiLight_HSV_Transition($ledDevice, $h, $s, $level, $ramp, $flags, 100, undef, $level, $level) if ($ledDevice->{LEDTYPE} eq 'RGBWW');
  return WifiLight_HSV_Transition($ledDevice, $h, $s, $level, $ramp, $flags, 100, undef);
}

sub
WifiLight_RGBWLD686_WWCW(@)
{
  my ($ledDevice, $warmw, $coldw, $ramp, $flags) = @_;
  my $h = ReadingsVal($ledDevice->{NAME}, "hue", 0);
  my $s = ReadingsVal($ledDevice->{NAME}, "saturation", 0);
  my $v = ReadingsVal($ledDevice->{NAME}, "brightness", 0);
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 WWCW $warmw, $coldw, $ramp $flags");
  return WifiLight_HSV_Transition($ledDevice, $h, $s, $v, $ramp, $flags, 100, undef, $warmw, $coldw);
}

sub
WifiLight_RGBWLD686_setHSV(@)
{
  my ($ledDevice, $hue, $sat, $val, $warmw, $coldw) = @_;
  my $receiver = sockaddr_in($ledDevice->{PORT}, inet_aton($ledDevice->{IP}));
  my $delay = 50;

  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set h:$hue, s:$sat, v:$val, ww:$warmw, cw:$coldw") if ($ledDevice->{LEDTYPE} eq 'RGBWW');
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set h:$hue, s:$sat, v:$val") if ($ledDevice->{LEDTYPE} ne 'RGBWW');
  WifiLight_setHSV_Readings($ledDevice, $hue, $sat, $val, $warmw, $coldw) if ($ledDevice->{LEDTYPE} eq 'RGBWW');
  WifiLight_setHSV_Readings($ledDevice, $hue, $sat, $val) if ($ledDevice->{LEDTYPE} ne 'RGBWW');
  # apply gamma correction, may be doing it after wb more ok
  my $gammaVal = $ledDevice->{helper}->{GAMMAMAP}[$val];


my $msg;
if (($ledDevice->{LEDTYPE} eq 'RGBWW'))
{
   my ($rr, $rg, $rb) = WifiLight_HSV2RGB($hue, $sat, $val);
   $msg = sprintf("%c%c%c%c%c%c%c%c", 0x31, $rr, $rg, $rb, $warmw, $coldw, 0xFF, 0x0F);
   Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set r:$rr, g:$rg, b:$rb, ww:$warmw, cw:$coldw") if ($ledDevice->{LEDTYPE} eq 'RGBWW');
}
else
{
  ##########################################
  # sat is spread by 10% so there is room
  # for a smoth switch to white and adapt to
  # higher brightness of white led
  ########################################## 
  $sat = ($sat * 1.1) -10;
  my $wl = ($sat<0)?$sat * -1:0;
  $sat = ($sat<0)?0:$sat;

  # color cast correction
  my $h = $ledDevice->{helper}->{COLORMAP}[$hue];

  # convert to device 4 channels (remaining r,g,b after substract white, white, rgb)
  my ($rr, $rg, $rb, $white) = WifiLight_HSV2fourChannel($h, $sat, $gammaVal);

  ##########################################
  # experimental white temp adjustment
  # G - 50%
  # B - 04%
  # sat is spread by 10% so there is room
  # for a smoth switch to white and adapt to
  # higher brightness of whte led
  ##########################################

  my ($wr, $wg, $wb) = split(',', AttrVal($ledDevice->{NAME}, 'whitePoint', '1, 1, 1'));
  # rgb mode
  if (($val > 0))
  {
    #replace the removed part of white light and apply white balance
    $rr += int(($white * $wr) + 0.5);
    $rg += int(($white * $wg) + 0.5);
    $rb += int(($white * $wb) + 0.5);

#smoth brightness adaption of white led
    my $wo = $gammaVal - ($gammaVal * (10-$wl) * 0.08); #0.07
    $wo = int(0.5 + ($wo * 2.55));
 
  Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set value ($rr, $rg, $rb, $wo)");

    #new proto 0x56, r, g, b, white level, cold white level, f0 (color) || 0f (white), 0xaa (terminator)
    my ($rr, $rg, $rb) = WifiLight_HSV2RGB($hue, $sat, $val);
    $msg = sprintf("%c%c%c%c%c%c%c%c", 0x31, $rr, $rg, $rb, $wo, 0x00, 0xFF, 0x0F);
    Log3 ($ledDevice, 3, "$ledDevice->{NAME} $ledDevice->{LEDTYPE} LD686 set r:$rr, g:$rg, b:$rb, ww:$warmw, cw:$coldw") if ($ledDevice->{LEDTYPE} eq 'RGBWW');
  }
  else
  {
    $msg = sprintf("%c%c%c%c%c%c%c%c", 0x31, 0, 0, 0, 0x00, 0x00, 0xFF, 0x0F);
  }
}
  #add checksum
  $msg = WifiLight_RGBWLD382_Checksum($ledDevice, $msg);
  # lock ll queue to prevent a bottleneck within llqueue
  # in cases where the high level queue fills the low level queue (which should not be interrupted) faster then it is processed (send out)
  # this lock will cause the hlexec intentionally drop frames which can safely be done because there are further frames for processing avialable 
  $ledDevice->{helper}->{llLock} += 1; 
  WifiLight_LowLevelCmdQueue_Add($ledDevice, $msg, $receiver, $delay);
  # unlock ll queue
  return WifiLight_LowLevelCmdQueue_Add($ledDevice, "\x00", $receiver, 0, 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

herrmannj

ja, so etwas. Danke :)

In dem verlinkten Beitrag wurde das modul 114 mal runter geladen. Sind so viele ld686 im Umlauf ?

Die Anpassungen scheinen so ein mix aus ld316 und ld382 zu. Speziell zu den code Teilen die von der ld316 stammen habe ich Fragen. Da habe ich einen Kunstkniff gemacht weil die ld316 die weiße und die farbigen LEDs nicht gleichzeitig ansteuert. Die Sättigung arbeitet so das von 100..90% weiß (RGB) gemischt wird und bei unter 10% wird fest auf die weiße LED umgeschaltet wobei die letzten 10 Punkte der Sättigung die Helligkeit der weißen LED auf das jeweilige Maximum hochfahren. Das war sinnvoll da so ein fade über die Sättigung sauber dargestellt werden kann.

Die Teile des codes liegen jetzt auch im ld686. Kann der auch nur RGB(mix) _oder_ weiß ? Oder ist das da nur "rein gerutscht" ?

vg
joerg

arne.dien

Ich habe schon vier im Einsatz...

Es ist selten zu spät, aber immer höchste Zeit

FHEM 5.9, RasPi 3 B, HM-LAN, RFXtrx433, Harmony
Homematic, Licht, Rolladen, Heizkörper, Rauchmelder...
ESP RGBWW, LD316...

Es ist selten zu spät aber immer höchste Zeit...

moonsorrox

Hallo Jörg...
ich habe ja das Modul im Einsatz in Verbindung mit einem DOIF, wie ich etwas weiter oben geschrieben habe.
Das alles klappt wunderbar, was mich jetzt etwas stört sind das sehr schnelle und stufige dimmen bei einem langen Tastendruck, hast du eine Möglichkeit eingebaut das man dieses evtl. langsam hoch dimmen kann gibt es da evtl. ein Attribut, ich habe da nichts passendes gefunden.

Ich finde das umsetzen des dimmens mit dem DOIF absolut easy, man braucht keinen riesigen Code nichts in der 99_myUtils, einfach nur das DOIF. Evtl. schaust du es dir mal an und kannst mir einen Tipp geben. Es kann ja auch sein das es dieses gar nicht gibt im Modul, dann brauche ich nicht lange suchen.
Vielen Dank
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

herrmannj

Schau dir mal das Attribut defaultRamp an

Vg
Jörg

fabse

Hallo,

Ich habe ein LD285A LED Controller "UFO" ... hab da eine weiße LED dran (AquariumLicht).

Wie steuer ich die weiße LED an?

attr AquariumLicht separateColorAndWhiteControl 1

geht bei mir nicht. Das attribut ist nicht vorhanden!

Die LED leuchten bereits wenn ich die Montiere - aber kann die nicht mit RGB steuern (was ja auch klar ist)
Gibts da ne möglichkeit? oder brauch ich eine modifizierte wifilight.pm ???

Schon mal danke für Eure Antwort!

herrmannj

385, oder?

Was möchtest du den machen? Rgb und white werden automatisch
Angesteuert. Set HSV 0,0,100 ist white

Vg
Jörg

fabse

Zitat von: herrmannj am 09 Juli 2017, 17:31:55
385, oder?

Was möchtest du den machen? Rgb und white werden automatisch
Angesteuert. Set HSV 0,0,100 ist white

Vg
Jörg

Mit HSV gehts, danke danke danke! Geilo! ich freu mich

herrmannj

Zitat von: arne.dien am 01 Juli 2017, 23:14:04
Ich habe schon vier im Einsatz...

Es ist selten zu spät, aber immer höchste Zeit
Zur Info: ich habe 2 bestellt, die sind noch auf dem Weg.

Ein Aufruf in eigener(?) Sache:
(ich gebe das folgende nur ungern zu ;) )
Ich führe Änderungen am Modul, (threads -> richtig cool*) und schreibe die RGB Transitions neu. Dummerweise konfrontiert mich das mit einigen komplexen mathematischen Themen. Gibt es einen Mathe Crack mit "Programmierdenke" hier der mich unterstützen mag ?

Danke vg
Joerg

*ich lasse gerade eine ld316A mit 50Hz Transitons laufen. Nicht mal die Ausgabe eines 100MB logs via fhemweb bremst die aus.

Kruemel

#2126
Hallo allerseits,
vlt. kann mir hier jemand einen Tipp geben.
Ich möchte gerne diesen Strahler einsetzen: https://www.led-trading.de/led-gartenstrahler-milight-aussenstrahler-rgbww-warmweiss_2
Der Hersteller nennt folgende Bridge: https://www.led-trading.de/led-wlan-milight-router-bridge-ibox-24g-iphone-android-steuergeraet
Laut Hardwareliste wird sie nicht unterstützt, oder?

Zitat: Milight bridge iBox2
Diese Version lässt sich aktuell nicht mit WifiLight einbinden.

Vielen Dank für Eure Hilfe.

LG
Wolfgang
RPi, Homematik, LAN-CFG, Bewegungsmelder, Rauchmelder, Rolläden, Schalter, Türkontakte, Heizungsventile, FB7390, Owncloud, xBMC

herrmannj

Hallo Wolfgang,

ja ist richtig. Das neue Milight Protokoll haben die mit Absicht so gemacht das es schwer zu reversen ist und eine offene API haben die auch nicht. Leider haben sich die alten bridge (bis v4) auch nicht als Stabilitäts- oder Performance Monster erwiesen (ich habe bei mir die milights weitestgehend gegen andere ausgetauscht).

Mittlerweile ist da v5 Protokoll weitestgehend entschlüsselt. So rein aus Zeitgründen steht das bei mir aber recht weit unten auf der Liste. Ich bin dabei den RFLINK zu integrieren (der steht weit oben) und da soll die nächste FW Version die neuen Milights unterstützen. Daher werde ich wohl zuerst die Milights via RFLINK einbinden und später (irgendwann!) die Original Milight Bridge. Zum RFLINK siehe hier http://www.rflink.nl/blog2/devlist

Zu dem Strahler kennen ich jetzt allerdings auch keine Lösung die out-of-the box läuft - ich habe mir welche umgebaut und betreibe die am ld382. Wenn Du jetzt damit leben kannst die erst später in fhem einzubinden dann nimm die ruhig. Wann die rflink FW kommt und ob die das so einbauen muss man natürlich abwarten. Sonst basteln (ld382, he801 etc + billigstrahler, Gehäuse aufbrechen, controller reinwurschteln :) )

vg
joerg

Kruemel

#2128
Hallo Jörg,

danke für die schnelle Antwort.
Ich habe auch bereits einen ld382 am fhem laufen.
Kann man mit dem auch Lampen steuern, die 220V brauchen?

LG
Wolfgang
RPi, Homematik, LAN-CFG, Bewegungsmelder, Rauchmelder, Rolläden, Schalter, Türkontakte, Heizungsventile, FB7390, Owncloud, xBMC

herrmannj

nicht das ich wüsste. Also via Netzteil halt irgendwas mit 12V oder 24V

vg
joerg