From 788846cec5d01d4b5e2b5cb78a05a7eb41ec5865 Mon Sep 17 00:00:00 2001 From: justme1968 Date: Sat, 22 Jun 2013 21:11:55 +0000 Subject: [PATCH] new attribute color-icons to colored svg icons git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@3314 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/31_HUEDevice.pm | 177 +++++++++++++++++++++++++------------- 2 files changed, 117 insertions(+), 61 deletions(-) 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($) # ''.$hash->{STATE}.''. # '' 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
@@ -661,10 +713,13 @@ HUEDevice_GetUpdate($) Attributes