ESP RGBWW Wifi Led Controller - fhem - Modul

Begonnen von pjakobs, 28 Juni 2016, 10:31:13

Vorheriges Thema - Nächstes Thema

pjakobs

#285
Zitat von: Papaloewe am 25 April 2017, 19:03:10
Beim Versuch eine Updates bekomme ich folgende Fehlermeldung:
ledcontroller
2017.04.25 19:01:07 1 : UPD FHEM/32_LedController.pm
2017.04.25 19:01:07 1 : Got 50803 bytes for FHEM/32_LedController.pm, expected 50793
2017.04.25 19:01:07 1 : aborting.


Stimmt da was nur bei mir nicht, oder liegt es an der controll-Datei?

Gruß
Thomas

da stimmt die Control Datei nicht. Ist das master oder devel?
[edit]
ich hab das für develop gerade mal korrigiert, versuch's bitte nochmal.

pj

Papaloewe


Per

Der kleine Nerv mal wieder :D

Mittels dem Zeit-Parameter
set [dev] val 0 [Zeit]
kann ich ja in einer festem Zeit auf 0 runterfahren.
Wie kann ich das aber mit einer festen Steigung machen, also dass er aus 100% doppelt so lange braucht wie aus 50%. Außer natürlich mit Berechnung (Endwert - Ausgangswert)* Faktor ;) ?
Geht das über die defaultRamp?

pjakobs

Zitat von: Per am 02 Mai 2017, 14:59:53
Der kleine Nerv mal wieder :D

Mittels dem Zeit-Parameter
set [dev] val 0 [Zeit]
kann ich ja in einer festem Zeit auf 0 runterfahren.
Wie kann ich das aber mit einer festen Steigung machen, also dass er aus 100% doppelt so lange braucht wie aus 50%. Außer natürlich mit Berechnung (Endwert - Ausgangswert)* Faktor ;) ?
Geht das über die defaultRamp?

hmm... ist so nicht implementiert, könnte man aber mal machen. Die default Ramp ist allerdings einfach eine Zeit, die generell für jeden fade gilt.

pj

vbs

Finde die Idee ziemlich interessant! Gehört mMn aber eher in die Firmware. Also entweder gibt man bei einem Fade die Ramp-Time oder die Geschwindigkeit an.

pjakobs

Zitat von: vbs am 02 Mai 2017, 15:14:44
Finde die Idee ziemlich interessant! Gehört mMn aber eher in die Firmware. Also entweder gibt man bei einem Fade die Ramp-Time oder die Geschwindigkeit an.

an der Stelle hätte ich jetzt auch kein Problem, es im Modul unterzubringen, aber in der FW wäre es natürlich noch besser untergebracht.
Die Frage, die sich mir stellt ist: wie würde denn das definiert?
Wir haben drei Parameter, die einen Fade bestimmen: Hue, Saturation und Value.
So wie ich es verstehe würden wir sagen: für 100% der Gesamtänderung sollen z.B. 10s vergehen.
Wenn ich jetzt einen Fade von h1,s1,v1 nach h2,s2,v2 mache, dann wäre die Zeit max(abs(h2-h1)/360*10s,abs(s2-s1)/100*10s,abs(v2-v1)/100*10s), richtig?
Das Modul müsste dafür ein zusätzliches flag bekommen, vielleicht "r" für "relative (speed)"...
Das ließe sich imho relativ leicht abbilden.

pj

vbs

Hab damit schon ein bisschen rumgespielt und habe das jetzt in der FW so gemacht, dass man entweder wie bisher den Parameter "t" im JSON-Befehl mitgeben kann oder den Parameter "s" für Speed. Der Speed ist (erstmal) definiert als "Prozentpunkte/Hue-Grad pro Minute" als double-Wert.

Im Modul bin ich gerade am überlegen, wie man unterscheidet zwischen Fade-Time und Fade-Speed. Variante A wäre so, dass man ein Präfix oder Suffix an die Zeit selbst schreibt, wenn man Speed meint: z.B. "50s" oder "s50". Variante B wäre, dass man ein weiteres Flag einführt, z.B. "s".


Per

Ich pack es mal hier mit rein, obwohl es eigentlich eine Anfängerfrage :-[ bzgl. Perl ist.
Wie frage ich den Hex-RGB-Wert ab, ob z.B. nur Grün (00XX00, mit XX > 0) beliebiger Helligkeit an ist?
Klar kann ich mit Division und Rest und so was machen, wie ich Perl kenne, geht das aber eleganter.

pjakobs

#293
Zitat von: Per am 05 Mai 2017, 11:07:50
Ich pack es mal hier mit rein, obwohl es eigentlich eine Anfängerfrage :-[ bzgl. Perl ist.
Wie frage ich den Hex-RGB-Wert ab, ob z.B. nur Grün (00XX00, mit XX > 0) beliebiger Helligkeit an ist?
Klar kann ich mit Division und Rest und so was machen, wie ich Perl kenne, geht das aber eleganter.

Du brauchts drei Dinge:
* hex to integer (hex())
* binäres und (&)
* bit shift (>>/<<)


my $hex="7f3c25"; #irgendwas mit hex
my $int=hex($hex);
# Blau ist das dritte Byte, also die niederwertigsten 8 bit
my $b=$int&0xff;
# Grün sind die Bits 8-15, also muss die Maske um acht Stellen nach links und das Ergebnis danach um acht Stellen nach rechts verschoben werden
my $g=($int&0xff<<8)>>8;
# Rot analog nur noch acht bits weiter "links"
my $r=($int % 0xff<<16)>>16;
printf ("r: %i, g: %i, b: %i",$r,$g,$b);


das ganze kannst Du Dir in eine Subroutine gießen:

my $hex="7f3c25"; #irgendwas mit hex
my ($r,$g,$b)=RGBs2i($hex);

printf ("r: %i, g: %i, b: %i",$r,$g,$b);

sub
RGBs2i($){
  my ($rgb)=@_;
  my $i=hex($rgb);
  return(($i&0xff<<16)>>16,($i&0xff<<8)>>8,$i&0xff);
}


Grüße

pj

vbs

Reicht nicht sowas, um zu prüfen ob grün an ist? Kann man natürlich auch auf die anderen Kanäle erweitern.

my $hex="7f3c25"; #irgendwas mit hex
if (hex(substr($hex, 2, 2)) > 0) {
  print "ich bin gruen";
}

Per

 :o
Das sieht doch nicht so elegant aus wie erwartet :(. Aber du gibst ja auch die genauen Werte zurück, so "granular" brauche ich es gar nicht.

Geht da nicht was in Richtung bitweise-Und und dann > 0?
([LED:rgb] & 0x00ff00) and !([LED:rgb] & 0xff00ff)
ergab zumindest bei ideone das gewünschte Ergebnis.

pjakobs

Zitat von: Per am 05 Mai 2017, 12:25:33
:o
Das sieht doch nicht so elegant aus wie erwartet :(. Aber du gibst ja auch die genauen Werte zurück, so "granular" brauche ich es gar nicht.

Geht da nicht was in Richtung bitweise-Und und dann > 0?
([LED:rgb] & 0x00ff00) and !([LED:rgb] & 0xff00ff)
ergab zumindest bei ideone das gewünschte Ergebnis.
vielleicht habe ich Dich missverstanden, denn ich wollte Dir tatsächlich genau das an die Hand geben. Die Zeile, die Du da stehen hast liefert TRUE wenn grün und nur grün. Funktioniert. Wobei ich mir grad nicht ganz sicher bin, ob LED:rgb einen Zahlenwert oder einen String liefert, ggf. musst Du noch ein hex() drumrum setzen.

pj

Per

Gibt es eigentlich eine Übersicht, welche Befehle aktuell gehen und was nicht?
Wie ist z.B. der aktuelle Status von "pause"?
Habe mir zwei weisse Streifen angeschlossen, wie bekomme ich die aktiviert? Mit rgb ja schon mal nicht und rgbww (oder rgbwwcw o.ä.) gibt es nicht.

pjakobs

Zitat von: Per am 23 Mai 2017, 11:54:47
Gibt es eigentlich eine Übersicht, welche Befehle aktuell gehen und was nicht?
Wie ist z.B. der aktuelle Status von "pause"?

elsif ($cmd eq 'pause'){
  347
  348         # For use in queued fades.
  349         # Will stay at the current color for $fadetime seconds.
  350         # NOTE: Does not make sense without $doQueue == "true".
  351         # TODO: Add a check for queueing = true? Or just execute anyway?
  352         my $val = InternalVal($hash->{NAME}, "valValue", 0);
  353         my $hue = InternalVal($hash->{NAME}, "hueValue", 0);
  354         my $sat = InternalVal($hash->{NAME}, "satValue", 0);
  355         if ($fadeTime eq 0 || $doQueue eq 'false'){
  356             Log3 ($hash, 3, "$hash->{NAME} Note: pause only makes sense if fadeTime is > 0 AND if queueing is acti
  357         }
  358         LedController_SetHSVColor($hash, $hue, $sat, $val, $colorTemp, $fadeTime, 'solid', $doQueue, $direction);
  359

also: ein Pause führt zu einem "solid" für $fadeTime sekunden.
Zitat von: Per am 23 Mai 2017, 11:54:47
Habe mir zwei weisse Streifen angeschlossen, wie bekomme ich die aktiviert? Mit rgb ja schon mal nicht und rgbww (oder rgbwwcw o.ä.) gibt es nicht.
Du hast zwei weiße Streifen und nur zwei weiße Streifen angeschlossen und möchtest die als unabhängige Devices benutzen?
Das wird aktuell von der Firmware noch nicht so unterstützt, wie wir uns das vorstellen - und daher auch noch nicht vom Modul. Du kannst da mit "raw" arbeiten, dann macht der Controller aber garnichts, als nur den 10 Bit Wert zu setzen (also 0-1023)

set LED raw 1023,511,0,0,0

aktuell übernimmt das Modul *alle* Werte und pusht sie an den Controller, also wenn Du folgendes machst:

set LED raw 0,255,0,0,0
set LED raw 511,0,0,0,0

dann geht der zweite Kanal mit dem zweiten Kommando wieder aus.
raw unterstütz auch aktuell keine Fades.
Es gibt von @vbs eine Test Firmware, ich hab selbst leider noch keine Zeit gehabt, mir das anzusehen, aber die geht schon deutlich in die Richtung , die ich mir vorstelle

Grüße

pj

Per

Zitat von: pjakobs am 23 Mai 2017, 12:10:45
also: ein Pause führt zu einem "solid" für $fadeTime sekunden.Du hast zwei weiße Streifen und nur zwei weiße Streifen angeschlossen und möchtest die als unabhängige Devices benutzen?
Also ich kann kein "Pause" auswählen, update behauptet aber, bei 73_LEDcontroller (richtig geschrieben? Habe gerade keinen Zugriff) nix tun zu müssen.

Zitat von: pjakobs am 23 Mai 2017, 12:10:45Du hast zwei weiße Streifen und nur zwei weiße Streifen angeschlossen und möchtest die als unabhängige Devices benutzen?
Nein, ich habe rgb + 2x weiss angeschlossen. Auch wenn letztere nur zum Testen und zwei identische, optisch wird das Ergebnis also eher "mau" aussehen.
Aber wenn es mit raw r,g,b,ww,cw geht, reicht mir das fürs Erste. Hoffe ich.

Nach meinen ersten Spielereien mit rgb-Streifen wird das Ganze in Zukunft eher auf 5x weiss hinauslaufen. Ist aber keine Folge des "schlechten Moduls" oder so, ich habe nur festgestellt, das Farbe noch mehr "Spielerei" als Fhem an sich ist ;D.