diff --git a/fhem/CHANGED b/fhem/CHANGED
index 33c8e35dc..22e7a7d5d 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII
- SVN
+ - feature: HUEDevice: new attribute color-icons to colored svg icons
- feature: FHEMWEB: longpoll is default now, longpollSVG (default off) added
- feature: HUEDevice: allow usage of openautomation svg icons
- feature: FHEMWEB: svg icons / iconPath / www/images/openautomation added
diff --git a/fhem/FHEM/31_HUEDevice.pm b/fhem/FHEM/31_HUEDevice.pm
index 14e9377fe..69c0b7874 100644
--- a/fhem/FHEM/31_HUEDevice.pm
+++ b/fhem/FHEM/31_HUEDevice.pm
@@ -54,9 +54,10 @@ sub HUEDevice_Initialize($)
$hash->{SetFn} = "HUEDevice_Set";
$hash->{GetFn} = "HUEDevice_Get";
$hash->{AttrList} = "IODev ".
- "$readingFnAttributes ".
+ "color-icons:1,2 ".
"model:".join(",", sort keys %hueModels)." ".
- "subType:colordimmer,dimmer,switch";
+ "subType:colordimmer,dimmer,switch ".
+ $readingFnAttributes;
#$hash->{FW_summaryFn} = "HUEDevice_summaryFn";
@@ -85,6 +86,12 @@ HUEDevice_devStateIcon($)
# '
'.
# '' if( ReadingsVal($name,"colormode","") eq "ct" );
+ my $percent = ReadingsVal($name,"pct","100");
+ my $s = $dim_values{int($percent/7)};
+
+ return ".*:$s@#".CommandGet("","$name RGB").":toggle" if( $percent < 100 && AttrVal($name, "color-icons", 0) == 2 );
+ return ".*:on@#".CommandGet("","$name rgb").":toggle" if( AttrVal($name, "color-icons", 0) == 1 );
+
return '
';
}
@@ -327,12 +334,96 @@ HUEDevice_Set($@)
}
my $list = "off on toggle statusRequest";
- $list .= " pct:slider,0,1,100 bri:slider,0,1,254" if( AttrVal($hash->{NAME}, "subType", "colordimmer") =~ m/dimmer/ );
+ $list .= " pct:slider,0,1,100 bri:slider,0,1,254" if( AttrVal($name, "subType", "colordimmer") =~ m/dimmer/ );
#$list .= " dim06% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dim100%" if( AttrVal($hash->{NAME}, "subType", "colordimmer") =~ m/dimmer/ );
$list .= " rgb:colorpicker,RGB color:slider,2000,1,6500 ct:slider,154,1,500 hue:slider,0,1,65535 sat:slider,0,1,254 xy effect:none,colorloop" if( AttrVal($hash->{NAME}, "subType", "colordimmer") =~ m/color/ );
return SetExtensions($hash, $list, $name, @aa);
}
+sub
+cttorgb($)
+{
+ my ($ct) = @_;
+
+ # calculation from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code
+ # adjusted by 1000K
+ my $temp = (1000000/$ct)/100 + 10;
+
+ my $r = 0;
+ my $g = 0;
+ my $b = 0;
+
+ $r = 255;
+ $r = 329.698727446 * ($temp - 60) ** -0.1332047592 if( $temp > 66 );
+ $r = 0 if( $r < 0 );
+ $r = 255 if( $r > 255 );
+
+ if( $temp <= 66 ) {
+ $g = 99.4708025861 * log($temp) - 161.1195681661;
+ } else {
+ $g = 288.1221695283 * ($temp - 60) ** -0.0755148492;
+ }
+ $g = 0 if( $g < 0 );
+ $g = 255 if( $g > 255 );
+
+ $b = 255;
+ $b = 0 if( $temp <= 19 );
+ if( $temp < 66 ) {
+ $b = 138.5177312231 * log($temp-10) - 305.0447927307;
+ }
+ $b = 0 if( $b < 0 );
+ $b = 255 if( $b > 255 );
+
+ return( $r, $g, $b );
+}
+
+sub
+xyYtorgb($$$)
+{
+ # calculation from http://www.brucelindbloom.com/index.html
+ my ($x,$y,$Y) = @_;
+#Log 3, "xyY:". $x . " " . $y ." ". $Y;
+
+ my $r = 0;
+ my $g = 0;
+ my $b = 0;
+
+ if( $y > 0 ) {
+ my $X = $x * $Y / $y;
+ my $Z = (1 - $x - $y)*$Y / $y;
+
+ if( $X > 1
+ || $Y > 1
+ || $Z > 1 ) {
+ my $f = max($X,max($Y,$Z));
+ $X /= $f;
+ $Y /= $f;
+ $Z /= $f;
+ }
+#Log 3, "XYZ: ". $X . " " . $Y ." ". $Y;
+
+ $r = 0.7982 * $X + 0.3389 * $Y - 0.1371 * $Z;
+ $g = -0.5918 * $X + 1.5512 * $Y + 0.0406 * $Z;
+ $b = 0.0008 * $X + 0.0239 * $Y + 0.9753 * $Z;
+
+ if( $r > 1
+ || $g > 1
+ || $b > 1 ) {
+ my $f = max($r,max($g,$b));
+ $r /= $f;
+ $g /= $f;
+ $b /= $f;
+ }
+#Log 3, "rgb: ". $r . " " . $g ." ". $b;
+
+ $r *= 255;
+ $g *= 255;
+ $b *= 255;
+ }
+
+ return( $r, $g, $b );
+}
+
sub
HUEDevice_Get($@)
{
@@ -350,76 +441,36 @@ HUEDevice_Get($@)
if( ReadingsVal($name,"colormode","") eq "ct" ) {
if( ReadingsVal($name,"ct","") =~ m/(\d+) .*/ ) {
- # calculation from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code
- # adjusted by 1000K
- my $temp = (1000000/$1)/100 + 10;
-
- $r = 255;
- $r = 329.698727446 * ($temp - 60) ** -0.1332047592 if( $temp > 66 );
- $r = 0 if( $r < 0 );
- $r = 255 if( $r > 255 );
-
- if( $temp <= 66 ) {
- $g = 99.4708025861 * log($temp) - 161.1195681661;
- } else {
- $g = 288.1221695283 * ($temp - 60) ** -0.0755148492;
- }
- $g = 0 if( $g < 0 );
- $g = 255 if( $g > 255 );
-
- $b = 255;
- $b = 0 if( $temp <= 19 );
- if( $temp < 66 ) {
- $b = 138.5177312231 * log($temp-10) - 305.0447927307;
- }
- $b = 0 if( $b < 0 );
- $b = 255 if( $b > 255 );
+ ($r,$g,$b) = cttorgb($1);
}
} elsif( ReadingsVal($name,"xy","") =~ m/(.+),(.+)/ ) {
- # calculation from http://www.brucelindbloom.com/index.html
my ($x,$y) = ($1, $2);
my $Y = ReadingsVal($name,"bri","") / 254.0;
-#Log 3, "xyY:". $x . " " . $y ." ". $Y;
- if( $y > 0 ) {
- my $X = $x * $Y / $y;
- my $Z = (1 - $x - $y)*$Y / $y;
+ ($r,$g,$b) = xyYtorgb($x,$y,$Y);
+ }
+ return sprintf( "%02x%02x%02x", $r+0.5, $g+0.5, $b+0.5 );
+ } elsif($cmd eq "RGB") {
+ my $r = 0;
+ my $g = 0;
+ my $b = 0;
- if( $X > 1
- || $Y > 1
- || $Z > 1 ) {
- my $f = max($X,max($Y,$Z));
- $X /= $f;
- $Y /= $f;
- $Z /= $f;
- }
-#Log 3, "XYZ: ". $X . " " . $Y ." ". $Y;
-
- $r = 0.7982 * $X + 0.3389 * $Y - 0.1371 * $Z;
- $g = -0.5918 * $X + 1.5512 * $Y + 0.0406 * $Z;
- $b = 0.0008 * $X + 0.0239 * $Y + 0.9753 * $Z;
-
- if( $r > 1
- || $g > 1
- || $b > 1 ) {
- my $f = max($r,max($g,$b));
- $r /= $f;
- $g /= $f;
- $b /= $f;
- }
-#Log 3, "rgb: ". $r . " " . $g ." ". $b;
-
- $r *= 255;
- $g *= 255;
- $b *= 255;
+ if( ReadingsVal($name,"colormode","") eq "ct" ) {
+ if( ReadingsVal($name,"ct","") =~ m/(\d+) .*/ ) {
+ ($r,$g,$b) = cttorgb($1);
}
+ } elsif( ReadingsVal($name,"xy","") =~ m/(.+),(.+)/ ) {
+ my ($x,$y) = ($1, $2);
+ my $Y = 1;
+
+ ($r,$g,$b) = xyYtorgb($x,$y,$Y);
}
return sprintf( "%02x%02x%02x", $r+0.5, $g+0.5, $b+0.5 );
} elsif ( $cmd eq "devStateIcon" ) {
return HUEDevice_devStateIcon($hash);
}
- return "Unknown argument $cmd, choose one of rgb devStateIcon";
+ return "Unknown argument $cmd, choose one of rgb RGB devStateIcon";
}
@@ -654,6 +705,7 @@ HUEDevice_GetUpdate($)
Get
- rgb
+ - RGB
- devStateIcon
returns html code that can be used to create an icon that represents the device color in the room overview.
@@ -661,10 +713,13 @@ HUEDevice_GetUpdate($)
Attributes
+ - color-icon
+ 1 -> use lamp color as icon color and 100% shape as icon shape
+ 2 -> use lamp color scaled to full brightness as icon color and dim state as icon shape
- subType
colordimmer, dimmer or switch, default is initialized according to device model.
- devStateIcon
- will be initialized to {CommandGet("","<name> devStateIcon")} to show device color as default in room overview.
+ will be initialized to {(HUEDevice_devStateIcon($name),"toggle")} to show device color as default in room overview.
- webCmd
will be initialized to rgb:rgb FF0000:rgb C8FF12:rgb 0000FF:toggle:on:off to show colorpicker and 3 color preset buttons in room overview.