98_FS20_ZDR.pm 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package main;
  2. use utf8;
  3. sub
  4. fs20_zdr_Initialize($)
  5. {
  6. my ($hash) = @_;
  7. $hash->{DefFn} = "fs20_zdr_Define";
  8. $hash->{SetFn} = "fs20_set";
  9. $hash->{AttrList} = "loglevel:0,1,2,3,4,5 powerDev volumeDev leftRightDev sleepMSDev 1_2_dev 3_4_dev 5_6_dev 7_8_dev";
  10. }
  11. sub
  12. fs20_set {
  13. my ($hash, @a) = @_;
  14. my $v = @a[1];
  15. my $name = $hash->{NAME};
  16. my $powerDev = AttrVal($name, "powerDev", "");
  17. my $volumeDev = AttrVal($name, "volumeDev", "");
  18. my $leftRightDev = AttrVal($name, "leftRightDev", "");
  19. my $sleepMSDev = AttrVal($name, "sleepMSDev", "");
  20. my $prog_1_2dev = AttrVal($name, "1_2_dev", "");
  21. my $prog_3_4dev = AttrVal($name, "3_4_dev", "");
  22. my $prog_5_6dev = AttrVal($name, "5_6_dev", "");
  23. my $prog_7_8dev = AttrVal($name, "7_8_dev", "");
  24. my $isToggle = 0;
  25. if ($v eq "toggle") {
  26. $isToggle = 1;
  27. my $state = Value($powerDev);
  28. my $name = $hash->{NAME};
  29. fhem("setstate $name $state");
  30. if ($state eq "off") {
  31. $v = "on";
  32. } else {
  33. $v = "off";
  34. }
  35. }
  36. if ($v eq "on") {
  37. return "no power device set" if $powerDev eq "";
  38. fhem("set $powerDev on");
  39. } elsif ($v eq "off") {
  40. return "no power device set" if $powerDev eq "";
  41. fhem("set $powerDev off");
  42. } elsif ($v eq "volume_up") {
  43. return "no volume device set" if $volumeDev eq "";
  44. fhem("set $volumeDev on");
  45. } elsif ($v eq "volume_down") {
  46. return "no volume device set" if $volumeDev eq "";
  47. fhem("set $volumeDev off");
  48. } elsif ($v eq "left") {
  49. return "no leftRight device set" if $leftRightDev eq "";
  50. fhem("set $leftRightDev off");
  51. } elsif ($v eq "right") {
  52. return "no leftRight device set" if $leftRightDev eq "";
  53. fhem("set $leftRightDev on");
  54. } elsif ($v eq "sleep") {
  55. return "no sleepMS device set" if $sleepMSDev eq "";
  56. fhem("set $sleepMSDev off");
  57. } elsif ($v eq "ms") {
  58. return "no leftRight device set" if $sleepMSDev eq "";
  59. fhem("set $sleepMSDev on");
  60. } elsif ($v eq "1") {
  61. return "no 1_2 device set" if $prog_1_2dev eq "";
  62. fhem("set $prog_1_2dev off");
  63. } elsif ($v eq "2") {
  64. return "no 1_2 device set" if $prog_1_2dev eq "";
  65. fhem("set $prog_1_2dev on");
  66. } elsif ($v eq "3") {
  67. return "no 3_4 device set" if $prog_3_4dev eq "";
  68. fhem("set $prog_3_4dev off");
  69. } elsif ($v eq "4") {
  70. return "no 3_4 device set" if $prog_3_4dev eq "";
  71. fhem("set $prog_3_4dev on");
  72. } elsif ($v eq "5") {
  73. return "no 5_6 device set" if $prog_5_6dev eq "";
  74. fhem("set $prog_5_6dev off");
  75. } elsif ($v eq "6") {
  76. return "no 5_6 device set" if $prog_5_6dev eq "";
  77. fhem("set $prog_5_6dev on");
  78. } elsif ($v eq "7") {
  79. return "no 7_8 device set" if $prog_7_8dev eq "";
  80. fhem("set $prog_7_8dev off");
  81. } elsif ($v eq "8") {
  82. return "no 7_8 device set" if $prog_7_8dev eq "";
  83. fhem("set $prog_7_8dev on");
  84. } elsif ($v eq "program_1") {
  85. return "no 1_2 device set" if $prog_1_2dev eq "";
  86. fs20_zdr_program($prog_1_2dev, "dimdown");
  87. } elsif ($v eq "program_2") {
  88. return "no 1_2 device set" if $prog_1_2dev eq "";
  89. fs20_zdr_program($prog_1_2dev, "dimup");
  90. } elsif ($v eq "program_3") {
  91. return "no 3_4 device set" if $prog_3_4dev eq "";
  92. fs20_zdr_program($prog_3_4dev, "dimdown");
  93. } elsif ($v eq "program_4") {
  94. return "no 3_4 device set" if $prog_3_4dev eq "";
  95. fs20_zdr_program($prog_3_4dev, "dimup");
  96. } elsif ($v eq "program_5") {
  97. return "no 5_6 device set" if $prog_5_6dev eq "";
  98. fs20_zdr_program($prog_5_6dev, "dimdown");
  99. } elsif ($v eq "program_6") {
  100. return "no 5_6 device set" if $prog_5_6dev eq "";
  101. fs20_zdr_program($prog_5_6dev, "dimup");
  102. } elsif ($v eq "program_7") {
  103. return "no 7_8 device set" if $prog_7_8dev eq "";
  104. fs20_zdr_program($prog_7_8dev, "dimdown");
  105. } elsif ($v eq "program_8") {
  106. return "no 7_8 device set" if $prog_7_8dev eq "";
  107. fs20_zdr_program($prog_7_8dev, "dimup");
  108. } else {
  109. return "unknown set value, choose one of on off toggle volume_up volume_down left right sleep ms 1 2 3 4 5 6 7 8 program_1 program_2 program_3 program_4 program_5 program_6 program_7 program_8";
  110. }
  111. if ($v eq "on" || $v eq "off") {
  112. $hash->{READINGS}{state}{VAL} = $v;
  113. $hash->{READINGS}{state}{TIME} = TimeNow();
  114. my $name = $hash->{NAME};
  115. if ($isToggle == 0) {
  116. $hash->{STATE} = $v;
  117. }
  118. }
  119. return undef;
  120. }
  121. sub
  122. fs20_zdr_program($$)
  123. {
  124. my ($deviceName, $command) = @_;
  125. my $toSend = "";
  126. for (my $i=0; $i<30; $i++) {
  127. fhem("sleep 0.15");
  128. fhem("set $deviceName $command");
  129. }
  130. return undef;
  131. }
  132. sub
  133. fs20_zdr_Define($$)
  134. {
  135. my ($hash, $def) = @_;
  136. my @args = split("[ \t]+", $def);
  137. if (int(@args) < 1)
  138. {
  139. return "fs20_zdr__Define: too many arguments. Usage:\n" .
  140. "define <name> FS20_zdr";
  141. }
  142. return "Invalid arguments. Usage: \n define <name> FS20_ZDR" if(int(@a) != 0);
  143. $hash->{STATE} = '??';
  144. return undef;
  145. }
  146. 1;
  147. =pod
  148. =begin html
  149. <a name="FS20_ZDR"></a>
  150. <h3>FS20_ZDR</h3>
  151. <ul>
  152. Creates a container device holding the sub devices for a FS20 ZDR device.
  153. <br><br>
  154. <a name="FS20_ZDRdefine"></a>
  155. <h4>Define</h4>
  156. <ul>
  157. <code>define &lt;name&gt; FS20_ZDR</code>
  158. <br><br>
  159. Defines a FS20_ZDR device.<br><br>
  160. Example:
  161. <ul>
  162. <code>define radio FS20_ZDR</code><br>
  163. </ul>
  164. </ul>
  165. <a name="FS20_ZDRSet"></a>
  166. <h4>Set </h4>
  167. <ul>
  168. <code>set &lt;name&gt; &lt;value&gt;</code>
  169. <br><br>
  170. where <code>value</code> is one of:<br>
  171. <pre>
  172. on # turn device on
  173. off # turn device off
  174. volume_up # volume up
  175. volume_down # volume down
  176. left # channel down
  177. right # channel up
  178. sleep # sleep
  179. ms # M/S command
  180. 1 2 3 4 5 6 7 8 # radio channels
  181. </pre>
  182. Examples:
  183. <ul>
  184. <code>set radio volume_up</code><br>
  185. </ul>
  186. </ul>
  187. powerDev volumeDev leftRightDev sleepMSDev 1_2_dev 3_4_dev 5_6_dev 7_8_dev
  188. <a name="FS20_ZDRAttr"></a>
  189. <h4>Attributes</h4>
  190. <ul>
  191. <li><a name="FS20_ZDR_powerDev"><code>attr &lt;name&gt; powerDev &lt;deviceName&gt;</code></a>
  192. <br />Name of the device representing the power button</li>
  193. <li><a name="FS20_ZDR_volumeDev"><code>attr &lt;name&gt; volumeDev &lt;deviceName&gt;</code></a>
  194. <br />Name of the device representing the volume button</li>
  195. <li><a name="FS20_ZDR_leftRightDev"><code>attr &lt;name&gt; leftRightDev &lt;deviceName&gt;</code></a>
  196. <br />Name of the device representing the channel up/down (left/right) button</li>
  197. <li><a name="FS20_ZDR_sleepMSDev"><code>attr &lt;name&gt; sleepMSDev &lt;deviceName&gt;</code></a>
  198. <br />Name of the device representing the channel sleep / M/S button</li>
  199. <li><a name="FS20_ZDR_1_2_dev"><code>attr &lt;name&gt; 1_2_dev &lt;deviceName&gt;</code></a>
  200. <br />Name of the device representing channels 1 and 2/li>
  201. <li><a name="FS20_ZDR_3_4_dev"><code>attr &lt;name&gt; 3_4_dev &lt;deviceName&gt;</code></a>
  202. <br />Name of the device representing channels 3 and 4/li>
  203. <li><a name="FS20_ZDR_5_6_dev"><code>attr &lt;name&gt; 5_6_dev &lt;deviceName&gt;</code></a>
  204. <br />Name of the device representing channels 5 and 6/li>
  205. <li><a name="FS20_ZDR_7_8_dev"><code>attr &lt;name&gt; 7_8_dev &lt;deviceName&gt;</code></a>
  206. <br />Name of the device representing channels 7 and 8/li>
  207. </ul>
  208. </ul>
  209. =end html
  210. =cut