35_SWAP_0000002200000003.pm 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. # $Id: 35_SWAP_0000002200000003.pm 12056 2016-08-22 19:30:31Z justme1968 $
  2. package main;
  3. use strict;
  4. use warnings;
  5. use Color;
  6. use constant CMD_REG => '0F';
  7. use constant { CMD_NOOP => '00',
  8. RET_OK => '05',
  9. RET_ERR => '06',
  10. CMD_On => '10',
  11. CMD_Off => '11',
  12. CMD_DimUp => '12',
  13. CMD_DimDown => '13',
  14. CMD_OnForTimer => '14',
  15. CMD_Toggle => '20',
  16. CMD_GetIR => '30',
  17. CMD_SetIR => '31',
  18. CMD_LearnIR => '32',
  19. CMD_GetFade => '40',
  20. CMD_SetFade => '41',
  21. CMD_StartFade => '42',
  22. CMD_SendIR => '50',
  23. CMD_RESET => 'FF', };
  24. my %dim_values = (
  25. 0 => "dim06%",
  26. 1 => "dim12%",
  27. 2 => "dim18%",
  28. 3 => "dim25%",
  29. 4 => "dim31%",
  30. 5 => "dim37%",
  31. 6 => "dim43%",
  32. 7 => "dim50%",
  33. 8 => "dim56%",
  34. 9 => "dim62%",
  35. 10 => "dim68%",
  36. 11 => "dim75%",
  37. 12 => "dim81%",
  38. 13 => "dim87%",
  39. 14 => "dim93%",
  40. );
  41. sub
  42. SWAP_0000002200000003_Initialize($)
  43. {
  44. my ($hash) = @_;
  45. require "$attr{global}{modpath}/FHEM/34_SWAP.pm";
  46. $hash->{SWAP_SetFn} = "SWAP_0000002200000003_Set";
  47. $hash->{SWAP_SetList} = { off => 0, on => 0, "on-for-timer" => 1, fadeTo => undef,
  48. "rgb:colorpicker,RGB" => 1,
  49. "hue:colorpicker,HUE,0,1,359" => 1,
  50. "pct:slider,0,1,100" => 1,
  51. toggle => 0,
  52. dimUp => 0, dimDown => 0,
  53. getIR => 1, setIR => 2, learnIR => 1, storeIR => 3,
  54. getFade => 1, setFade => 3, startFade => 2,
  55. sendIR => 1,
  56. reset => 0 };
  57. $hash->{SWAP_GetFn} = "SWAP_0000002200000003_Get";
  58. $hash->{SWAP_GetList} = { devStateIcon => 0, rgb => 0, RGB => 0, pct => 0,
  59. listIR => 0,
  60. listFade => 0 };
  61. $hash->{SWAP_ParseFn} = "SWAP_0000002200000003_Parse";
  62. my $ret = SWAP_Initialize($hash);
  63. $hash->{AttrList} .= " color-icons:1,2 defaultFadeTime";
  64. #$hash->{FW_summaryFn} = "SWAP_0000002200000003_summaryFn";
  65. FHEM_colorpickerInit();
  66. return $ret;
  67. }
  68. sub
  69. SWAP_0000002200000003_devStateIcon($@)
  70. {
  71. my($hash,$state) = @_;
  72. $hash = $defs{$hash} if( ref($hash) ne 'HASH' );
  73. return undef if( !$hash );
  74. my $name = $hash->{NAME};
  75. my $rgb = CommandGet("","$name rgb");
  76. $rgb = $state if( $state );
  77. $state = ReadingsVal($name,"state","unknown") if( !$state );
  78. return undef if( !defined($attr{$name}{ProductCode}) );
  79. return undef if( $attr{$name}{ProductCode} ne '0000002200000003' );
  80. return ".*:light_question" if( $state eq "unknown" );
  81. return ".*:light_exclamation" if( $state =~m/^set/ );
  82. return ".*:off:toggle" if( $state eq "off" );
  83. my ($pct,$RGB) = SWAP_0000002200000003_rgbToPct($rgb);
  84. my $s = $dim_values{int($pct/7)};
  85. return ".*:$s@#".$RGB.":toggle" if( $pct < 100 && AttrVal($name, "color-icons", 2) == 2 );
  86. $rgb = substr( $rgb, 0, 6 );
  87. return ".*:on@#".$rgb.":toggle" if( AttrVal($name, "color-icons", 2) != 0 );
  88. return ".*:on@#".$rgb.":toggle";
  89. return '<div style="width:32px;height:19px;'.
  90. 'border:1px solid #fff;border-radius:8px;background-color:#'.CommandGet("","$name rgb").';"></div>';
  91. }
  92. sub
  93. SWAP_0000002200000003_summaryFn($$$$)
  94. {
  95. my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn.
  96. my $hash = $defs{$d};
  97. my $name = $hash->{NAME};
  98. return SWAP_0000002200000003_devStateIcon( $hash );
  99. }
  100. sub
  101. SWAP_0000002200000003_Watchdog($)
  102. {
  103. my ($hash) = @_;
  104. readingsSingleUpdate($hash, "state", "unknown", 1);
  105. }
  106. sub
  107. SWAP_0000002200000003_Parse($$$$)
  108. {
  109. my ($hash, $reg, $func, $data) = @_;
  110. my $name = $hash->{NAME};
  111. if( ($reg == 0x01 || $reg == 0x02 )
  112. && defined($hash->{"SWAP_01-HardwareVersion"})
  113. && defined($hash->{"SWAP_02-FirmwareVersion"}) ) {
  114. if( my $register = SWAP_getRegister($hash,0x0B) ) {
  115. $hash->{CHANNELS} = $register->{endpoints}->[0]{size};
  116. }
  117. if( my $register = SWAP_getRegister($hash,0x0F) ) {
  118. $hash->{CMD_SIZE} = $register->{endpoints}->[0]{size};
  119. $hash->{helper}->{RGB_SIZE} = 5;
  120. $hash->{helper}->{RGB_SIZE} = 3 if( $hash->{CMD_SIZE} < 10 );
  121. }
  122. }
  123. if( $reg == 0x00 ) {
  124. my $productcode = $data;
  125. $attr{$name}{devStateIcon} = '{(SWAP_0000002200000003_devStateIcon($name),"toggle")}' if( $productcode eq '0000002200000003'&& !defined( $attr{$name}{devStateIcon} ) );
  126. $attr{$name}{webCmd} = 'rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:toggle:on:off:dimUp:dimDown' if( $productcode eq '0000002200000003'&& !defined( $attr{$name}{webCmd} ) );
  127. } elsif( $reg == hex(CMD_REG) ) {
  128. if( defined($hash->{waiting_for_ir_cmd}) ) {
  129. my $ir_reg = $hash->{ir_reg}->[$hash->{waiting_for_ir_cmd}];
  130. $ir_reg->{command} = $data;
  131. delete($hash->{waiting_for_ir_cmd});
  132. } else {
  133. my $cmd = substr( $data, 0, 2 );
  134. if( $cmd eq CMD_GetIR ) {
  135. my $reg = substr( $data, 2, 2 );
  136. my $ir_value = substr( $data, 4, 8 );
  137. my %ir_reg;
  138. $ir_reg{ir_value} = $ir_value;
  139. $hash->{ir_reg}->[hex($reg)] = \%ir_reg;
  140. $hash->{waiting_for_ir_cmd} = hex($reg);
  141. }
  142. elsif( $cmd eq CMD_GetFade || $cmd eq CMD_SetFade ) {
  143. my $reg = substr( $data, 2, 2 );
  144. my $fade_rgb = substr( $data, 4, 6 );
  145. my $fade_time = substr( $data, 10, 2 );
  146. my %fade_reg;
  147. $fade_reg{fade_rgb} = $fade_rgb;
  148. $fade_reg{fade_time} = $fade_time;
  149. $hash->{fade_reg}->[hex($reg)] = \%fade_reg;
  150. }
  151. }
  152. } elsif( $reg == 0x0B ) {
  153. my $rgb = ReadingsVal( $name, "0B-RGBlevel", undef );
  154. if( $rgb =~ m/([\da-f]{2})([\da-f]{2})([\da-f]{2})/i ) {
  155. my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);
  156. my ($h, $s, $v) = Color::rgb2hsv($r,$g,$b);
  157. my $hue = int($h*359);
  158. my $pct = int($v*100);
  159. readingsBeginUpdate($hash);
  160. readingsBulkUpdate($hash, 'hue', $hue);
  161. readingsBulkUpdate($hash, 'pct', $pct);
  162. readingsEndUpdate($hash,1);
  163. }
  164. }
  165. RemoveInternalTimer($hash);
  166. InternalTimer(gettimeofday()+hex($hash->{'SWAP_0A-PeriodicTxInterval'})+10, "SWAP_0000002200000003_Watchdog", $hash, 0) if( defined $hash->{'SWAP_0A-PeriodicTxInterval'} );
  167. }
  168. sub SWAP_0000002200000003_Set($@);
  169. sub
  170. SWAP_0000002200000003_Set($@)
  171. {
  172. my ($hash, $name, $cmd, $arg, $arg2, $arg3) = @_;
  173. InternalTimer(gettimeofday()+10, "SWAP_0000002200000003_Watchdog", $hash, 0);
  174. our $data = "00" x $hash->{CMD_SIZE};
  175. sub ret($) {
  176. my ($cmd) = @_;
  177. substr( $data, 0, length($cmd), $cmd );
  178. return $data;
  179. }
  180. #$cmd = (ReadingsVal( $name, "0B-RGBlevel", "FFFFFF" ) eq "000000" ? "on" :"off") if( $cmd eq "toggle" );
  181. if( $cmd eq "on" ) {
  182. if( hex($hash->{"SWAP_02-FirmwareVersion"}) >= 0x00020002 ) {
  183. return( "regSet", CMD_REG, ret(CMD_On. "00" x $hash->{helper}->{RGB_SIZE} ."01") );
  184. } else {
  185. return( "regSet", CMD_REG, ret(CMD_On. "FF" x $hash->{helper}->{RGB_SIZE} ."01") );
  186. }
  187. } elsif( $cmd eq "on-for-timer" ) {
  188. return( "regSet", CMD_REG, ret(CMD_OnForTimer. sprintf( "%04X",$arg ) ) ) if( $arg =~ /^\d{1,4}$/ );
  189. return (undef, "$arg not a valid time" );
  190. } elsif( $cmd eq "off" ) {
  191. return( "regSet", CMD_REG, ret(CMD_Off."0001" ) );
  192. return( "regSet", CMD_REG, ret(CMD_Off) );
  193. } elsif( $cmd eq "toggle" ) {
  194. return( "regSet", CMD_REG, ret(CMD_Toggle) );
  195. } elsif( $cmd eq "rgb" ) {
  196. my $d = $hash->{CHANNELS}*2;
  197. $d = 6 if( !$d );
  198. $arg .= "00" x ($d/2-length($arg)/2);
  199. return (undef, "$arg is not a valid color" ) if( $arg !~ /^[\da-f]{$d}$/i );
  200. $arg .= "00" x ($hash->{helper}->{RGB_SIZE}-length($arg)/2);
  201. if( $arg eq "00" x $hash->{helper}->{RGB_SIZE} ) {
  202. return( "regSet", CMD_REG, ret(CMD_Off) );
  203. } else {
  204. return( "regSet", CMD_REG, ret(CMD_On.$arg."00") );
  205. }
  206. return (undef, "$arg is not a valid color" );
  207. } elsif( $cmd eq 'hue' ) {
  208. return (undef, "$arg is not a valid color" ) if( $arg !~ /^\d{1,3}$/ );
  209. return (undef, "$arg is not a valid color" ) if( $arg > 359 );
  210. my $h = $arg/359;
  211. my $s = 1;
  212. my ($v,undef) = SWAP_0000002200000003_rgbToPct(ReadingsVal( $name, "0B-RGBlevel", undef));
  213. $v /= 100;
  214. my ($r,$g,$b) = Color::hsv2rgb($h,$s,$v);
  215. my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );
  216. return SWAP_0000002200000003_Set( $hash, $name, 'rgb', $rgb );
  217. } elsif( $cmd eq 'pct' ) {
  218. return (undef, "$arg is not a dim level" ) if( $arg !~ /^\d{1,3}$/ );
  219. return (undef, "$arg is not a valid dim level" ) if( $arg > 100 );
  220. my $rgb = ReadingsVal( $name, "0B-RGBlevel", undef );
  221. if( $rgb =~ m/([\da-f]{2})([\da-f]{2})([\da-f]{2})/i ) {
  222. my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0);
  223. my ($h, $s, $v) = Color::rgb2hsv($r,$g,$b);
  224. $v = $arg/100;
  225. ($r,$g,$b) = Color::hsv2rgb($h,$s,$v);
  226. $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 );
  227. }
  228. return SWAP_0000002200000003_Set( $hash, $name, 'rgb', $rgb );
  229. } elsif( $cmd eq "fadeTo" ) {
  230. return (undef, "set $cmd requires 1 or 2 parameters" ) if( !defined($arg) || defined($arg3) );
  231. $arg2 = AttrVal($name, "defaultFadeTime", 1) if( !defined($arg2) );
  232. my $d = $hash->{CHANNELS}*2;
  233. $arg .= "00" x ($d/2-length($arg)/2);
  234. return (undef, "$arg is not a valid color" ) if( $arg !~ /^[\da-f]{$d}$/i );
  235. return (undef, "$arg2 not a valid time" ) if( $arg2 !~ /^\d{1,2}$/ );
  236. $arg .= "00" x ($hash->{helper}->{RGB_SIZE}-length($arg)/2);
  237. if( $arg eq "00" x $hash->{helper}->{RGB_SIZE} ) {
  238. return( "regSet", CMD_REG, ret(CMD_Off."00".sprintf( "%02X",$arg2 ) ) );
  239. } else {
  240. return( "regSet", CMD_REG, ret(CMD_On.$arg.sprintf( "%02X",$arg2 ) ) );
  241. }
  242. return (undef, "$arg is not a valid color" );
  243. } elsif( $cmd eq "dimUp" ) {
  244. return( "regSet", CMD_REG, ret(CMD_DimUp) );
  245. } elsif( $cmd eq "dimDown" ) {
  246. return( "regSet", CMD_REG, ret(CMD_DimDown) );
  247. } elsif( $cmd eq "getIR" ) {
  248. if( $arg eq "all" ) {
  249. for( my $reg = 0; $reg <= 0xF; ++$reg) {
  250. SWAP_Send($hash, $hash->{addr}, "02", CMD_REG, ret(CMD_GetIR."0".sprintf("%1X",$reg)) );
  251. }
  252. return undef;
  253. }
  254. return( "regSet", CMD_REG, ret(CMD_GetIR."0".sprintf("%1X",$arg) ) ) if( $arg =~ /^(\d|0\d|1[0-5])$/ );
  255. return (undef, "$arg is not a valid ir register number" );
  256. } elsif( $cmd eq "setIR" ) {
  257. return (undef, "$arg2 not a valid ir value" )if( $arg2 !~ /^[\da-f]{8}$/i );
  258. return( "regSet", CMD_REG, ret(CMD_SetIR."0".sprintf("%1X",$arg).$arg2 ) ) if( $arg =~ /^(\d|0\d|1[0-5])$/ );
  259. return (undef, "$arg is not a valid ir register" );
  260. } elsif( $cmd eq "learnIR" ) {
  261. return( "regSet", CMD_REG, ret(CMD_LearnIR."0".sprintf("%1X",$arg) ) ) if( $arg =~ /^(\d|0\d|1[0-5])$/ );
  262. return (undef, "$arg is not a valid ir register number" );
  263. } elsif( $cmd eq "storeIR" ) {
  264. return (undef, "$arg is not a valid ir register number" ) if( $arg !~ /^(\d|0\d|1[0-5])$/ );
  265. return (undef, "$arg2 not a valid ir value" )if( $arg2 !~ /^[\da-f]{8}$/i );
  266. return (undef, "$arg3 not a valid command" ) if( $arg3 !~ /^[\da-f]{20}$/i );
  267. SWAP_Send($hash, $hash->{addr}, "02", CMD_REG, ret(CMD_SetIR."0".sprintf("%1X",$arg).$arg2 ) );
  268. SWAP_Send($hash, $hash->{addr}, "02", CMD_REG, ret($arg3) );
  269. return( "regSet", CMD_REG, CMD_GetIR."0".sprintf("%1X",$arg)."00000000" );
  270. } elsif( $cmd eq "getFade" ) {
  271. if( $arg eq "all" ) {
  272. for( my $reg = 0; $reg <= 0xF; ++$reg) {
  273. SWAP_Send($hash, $hash->{addr}, "02", CMD_REG, ret(CMD_GetFade."0".sprintf("%1X",$reg) ) );
  274. }
  275. return undef;
  276. }
  277. return( "regSet", CMD_REG, ret(CMD_GetFade."0".sprintf("%1X",$arg) ) ) if( $arg =~ /^(\d|0\d|1[0-5])$/ );
  278. return (undef, "$arg is not a valid fade register number" );
  279. } elsif( $cmd eq "setFade" ) {
  280. return (undef, "$arg2 not a valid rgb value" ) if( $arg2 !~ /^[\da-f]{6}$/i );
  281. return (undef, "$arg3 not a valid time value" ) if( $arg3 !~ /^[\da-f]{1,3}$/i );
  282. return( "regSet", CMD_REG, ret(CMD_SetFade."0".sprintf("%1X",$arg).$arg2.sprintf( "%02X",$arg3 ) ) ) if( $arg =~ /^(\d|0\d|1[0-5])$/ );
  283. return (undef, "$arg not a valid fade register" );
  284. } elsif( $cmd eq "startFade" ) {
  285. return (undef, "$arg is not a valid fade register number" ) if( $arg !~ /^(\d|0\d|1[0-5])$/ );
  286. return( "regSet", CMD_REG, ret(CMD_StartFade."0".sprintf("%1X",$arg)."0".sprintf( "%1X",$arg2 ) ) ) if( $arg2 =~ /^(\d|0\d|1[0-5])$/ );
  287. return (undef, "$arg2 not a valid fade register number" );
  288. } elsif( $cmd eq "sendIR" ) {
  289. return( "regSet", CMD_REG, ret(CMD_SendIR.$arg ) ) if( $arg =~ /^[\da-f]{10}$/i );
  290. return (undef, "$arg is not a valid IR command" );
  291. } elsif( $cmd eq "reset" ) {
  292. return( "regSet", CMD_REG, ret(CMD_RESET) );
  293. }
  294. return undef;
  295. }
  296. sub
  297. SWAP_0000002200000003_max($@)
  298. {
  299. my ($max, @vars) = @_;
  300. for (@vars) {
  301. $max = $_ if $_ > $max;
  302. }
  303. return $max;
  304. }
  305. sub
  306. SWAP_0000002200000003_rgbToPct($)
  307. {
  308. my ($rgb) = @_;
  309. $rgb = "000000" if( $rgb eq "off" );
  310. $rgb = "FFFFFF" if( $rgb eq "on" );
  311. if( $rgb =~ m/([\da-f]{2})([\da-f]{2})([\da-f]{2})/i ) {
  312. my( $r, $g, $b ) = (hex($1), hex($2), hex($3));
  313. my $f = SWAP_0000002200000003_max($r,$g,$b);
  314. my $p = $f / 2.55;
  315. $f = 255.0 / $f if( $f > 0 );
  316. return (int($p), sprintf( "%02x%02x%02x", $f*$r, $f*$g, $f*$b ));
  317. }
  318. return (0,undef) ;
  319. }
  320. sub
  321. SWAP_0000002200000003_Get($@)
  322. {
  323. my ($hash, $name, $cmd, @a) = @_;
  324. if( $cmd eq 'rgb' ) {
  325. return ReadingsVal( $name, "0B-RGBlevel", undef );
  326. } elsif( $cmd eq 'RGB' ) {
  327. my ($pct,$RGB) = SWAP_0000002200000003_rgbToPct(ReadingsVal( $name, "0B-RGBlevel", undef));
  328. return $RGB;
  329. } elsif( $cmd eq 'pct' ) {
  330. my ($pct,$RGB) = SWAP_0000002200000003_rgbToPct(ReadingsVal( $name, "0B-RGBlevel", undef));
  331. return $pct + " ";
  332. } elsif( $cmd eq 'devStateIcon' ) {
  333. return SWAP_0000002200000003_devStateIcon( $hash );
  334. } elsif( $cmd eq 'listIR' ) {
  335. my $ret = "no ir registers known";
  336. if( defined($hash->{ir_reg}) ) {
  337. $ret = "known ir registers:\n";
  338. $ret .= sprintf( "%s\t%s\t%s\n", "reg", "ir_value", "command" );
  339. for( my $reg = 0; $reg <= 0xF; ++$reg) {
  340. if( defined($hash->{ir_reg}->[$reg]) ) {
  341. $ret .= sprintf( "%02i\t%8s\t%s\n", $reg, $hash->{ir_reg}->[$reg]->{ir_value}, $hash->{ir_reg}->[$reg]->{command} );
  342. }
  343. }
  344. }
  345. return $ret;
  346. } elsif( $cmd eq 'listFade' ) {
  347. my $ret = "no fade registers known";
  348. if( defined($hash->{fade_reg}) ) {
  349. $ret = "known fade registers:\n";
  350. $ret .= sprintf( "%s\t%s\t%s\n", "reg", "rgb", "time" );
  351. for( my $reg = 0; $reg <= 0xF; ++$reg) {
  352. if( defined($hash->{fade_reg}->[$reg]) ) {
  353. $ret .= sprintf( "%02i\t%6s\t%4s\n", $reg, $hash->{fade_reg}->[$reg]->{fade_rgb}, $hash->{fade_reg}->[$reg]->{fade_time} );
  354. }
  355. }
  356. }
  357. return $ret;
  358. }
  359. return undef;
  360. }
  361. 1;
  362. =pod
  363. =item summary specialized module for SWAP based rgb(w) led drivers
  364. =item summary_DE spezialisiertes Modul für SWAP basierte RGB(W) LED Driver
  365. =begin html
  366. <a name="SWAP_0000002200000003"></a>
  367. <h3>SWAP_0000002200000003</h3>
  368. <ul>
  369. Module for the justme version of the panstamp rgb driver board with ir (sketch product code 0000002200000003).
  370. <br><br>
  371. to learn an ir command the simplest way ist to use 'learnIR #'. the on board led will start to blink indicating ir learning mode. after an ir command is received the blinking will switch to slow and the boards waits for a fhem command (on/off/...) and will link the ir command to the fhem command.
  372. <br><br>
  373. received ir commands that will not trigger one of the 16 possible learned commands will be send as SWAP register 0C to fhem and can be used in notifys.
  374. <br><br>
  375. SWAP register 0E will configure the power on state of the board: off, configured color, last color before power down.
  376. <br><br>
  377. <a name="SWAP_0000002200000003_Define"></a>
  378. <b>Define</b>
  379. <ul>
  380. <code>define &lt;name&gt; SWAP_0000002200000003 &lt;ID&gt; 0000002200000003</code> <br>
  381. <br>
  382. </ul>
  383. <br>
  384. <a name="SWAP_0000002200000003_Set"></a>
  385. <b>Set </b>
  386. all SWAP set commands and:
  387. <ul>
  388. <li>on<br>
  389. </li>
  390. <li>on-for-timer &lt;time&gt;<br>
  391. </li>
  392. <li>off<br>
  393. </li>
  394. <li>toggle<br>
  395. </li><br>
  396. <li>rgb &lt;RRGGBB&gt;<br>
  397. set the led color
  398. </li><br>
  399. <li>dimUP<br>
  400. </li>
  401. <li>dimDown<br>
  402. </li><br>
  403. <li>setIR # &lt;code&gt;<br>
  404. </li>
  405. <li>learnIR #<br>
  406. </li>
  407. <li>storeIR # &lt;code&gt; &lt;command&gt;<br>
  408. </li><br>
  409. <li>getIR # | all<br>
  410. read content of IR regisgter # or all IR registers
  411. </li><br>
  412. <li>setFade &lt;RRGGBB&gt; &lt;time&gt;<br>
  413. stores color and time in fede register #
  414. </li><br>
  415. <li>startFade &lt;#1&gt; &lt;#2&gt;<br>
  416. starts an endless fading loop over all fading registers [#1..#2]
  417. </li><br>
  418. <li>getFade # | all<br>
  419. read content of fade regisgter # or all fade regisgters
  420. </li><br>
  421. <li><a href="#setExtensions"> set extensions</a> are supported.</li>
  422. </ul><br>
  423. <a name="SWAP_0000002200000003_Get"></a>
  424. <b>Get</b>
  425. all SWAP get commands and:
  426. <ul>
  427. <li>rgb<br>
  428. returns the current led color
  429. </li><br>
  430. <li>listIR<br>
  431. list all IR registers of this device. use getIR first.
  432. </li><br>
  433. <li>listFade<br>
  434. list all fade registers. use getFade first.
  435. </li><br>
  436. </ul><br>
  437. <a name="SWAP_0000002200000003_Attr"></a>
  438. <b>Attributes</b>
  439. <ul>
  440. <li>color-icon<br>
  441. 1 -> use lamp color as icon color and 100% shape as icon shape<br>
  442. 2 -> use lamp color scaled to full brightness as icon color and dim state as icon shape</li>
  443. <li>ProductCode<br>
  444. must be 0000002200000003</li><br>
  445. </ul><br>
  446. </ul>
  447. =end html
  448. =cut