10_FBDECT.pm 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. ##############################################
  2. # $Id: 10_FBDECT.pm 15295 2017-10-20 07:03:57Z rudolfkoenig $
  3. package main;
  4. use strict;
  5. use warnings;
  6. use SetExtensions;
  7. sub FBDECT_Parse($$@);
  8. sub FBDECT_Set($@);
  9. sub FBDECT_Get($@);
  10. sub FBDECT_Cmd($$@);
  11. sub FBDECT_decodePayload($$$);
  12. my @fbdect_models = qw(Powerline546E Dect200 CometDECT);
  13. my %fbdect_payload = (
  14. 7 => { n=>"connected" },
  15. 8 => { n=>"disconnected" },
  16. 10 => { n=>"configChanged" },
  17. 15 => { n=>"state", fmt=>'hex($pyld)?"on":"off"' },
  18. 16 => { n=>"relayTimes", fmt=>'FBDECT_decodeRelayTimes($pyld)' },
  19. 18 => { n=>"current", fmt=>'sprintf("%0.4f A", hex($pyld)/10000)' },
  20. 19 => { n=>"voltage", fmt=>'sprintf("%0.3f V", hex($pyld)/1000)' },
  21. 20 => { n=>"power", fmt=>'sprintf("%0.2f W", hex($pyld)/100)' },
  22. 21 => { n=>"energy", fmt=>'sprintf("%0.0f Wh",hex($pyld))' },
  23. 22 => { n=>"powerFactor", fmt=>'sprintf("%0.3f", hex($pyld))' },
  24. 23 => { n=>"temperature", fmt=>'FBDECT_decodeTemp($pyld, $hash, $addReading)' },
  25. 35 => { n=>"options", fmt=>'FBDECT_decodeOptions($pyld)' },
  26. 37 => { n=>"control", fmt=>'FBDECT_decodeControl($pyld)' },
  27. );
  28. sub
  29. FBDECT_Initialize($)
  30. {
  31. my ($hash) = @_;
  32. $hash->{Match} = ".*";
  33. $hash->{SetFn} = "FBDECT_Set";
  34. $hash->{GetFn} = "FBDECT_Get";
  35. $hash->{DefFn} = "FBDECT_Define";
  36. $hash->{UndefFn} = "FBDECT_Undef";
  37. $hash->{ParseFn} = "FBDECT_Parse";
  38. $hash->{AttrList} =
  39. "IODev do_not_notify:1,0 ignore:1,0 dummy:1,0 showtime:1,0 ".
  40. "disable:0,1 disabledForIntervals ".
  41. "$readingFnAttributes " .
  42. "model:".join(",", sort @fbdect_models);
  43. $hash->{AutoCreate}=
  44. { "FBDECT.*" => {
  45. GPLOT => "power4:Power,",
  46. FILTER => "%NAME:power\\x3a.*",
  47. ATTR => "event-min-interval:power:120" } };
  48. }
  49. #############################
  50. sub
  51. FBDECT_Define($$)
  52. {
  53. my ($hash, $def) = @_;
  54. my @a = split("[ \t][ \t]*", $def);
  55. my $name = shift @a;
  56. my $type = shift(@a); # always FBDECT
  57. my $u = "wrong syntax for $name: define <name> FBDECT [FBAHAname:]id props";
  58. return $u if(int(@a) != 2);
  59. my $ioNameAndId = shift @a;
  60. my ($ioName, $id) = (undef, $ioNameAndId);
  61. if($ioNameAndId =~ m/^([^:]*):(.*)$/) {
  62. $ioName = $1; $id = $2;
  63. }
  64. $hash->{id} = $id;
  65. $hash->{props} = shift @a;
  66. $modules{FBDECT}{defptr}{$ioNameAndId} = $hash;
  67. AssignIoPort($hash, $ioName);
  68. return undef;
  69. }
  70. ###################################
  71. sub
  72. FBDECT_SetHttp($@)
  73. {
  74. my ($hash, @a) = @_;
  75. my %cmd;
  76. my $p = $hash->{props};
  77. if($p =~ m/switch/) {
  78. $cmd{off} = $cmd{on} = $cmd{toggle} = "noArg";
  79. }
  80. if($p =~ m/actuator/) {
  81. $cmd{"desired-temp"} = "slider,8,0.5,28,1";
  82. $cmd{open} = $cmd{closed} = "noArg";
  83. }
  84. if(!$cmd{$a[1]}) {
  85. my $cmdList = join(" ", map { "$_:$cmd{$_}" } sort keys %cmd);
  86. return SetExtensions($hash, $cmdList, @a)
  87. }
  88. SetExtensionsCancel($hash);
  89. my $cmd = $a[1];
  90. my $name = $hash->{NAME};
  91. return "" if(IsDisabled($name));
  92. Log3 $name, 3, "FBDECT set $name $cmd";
  93. if($cmd =~ m/^(on|off|toggle)$/) {
  94. IOWrite($hash, ReadingsVal($name,"AIN",0), "setswitch$cmd");
  95. my $state = ($cmd eq "toggle" ? ($hash->{state} eq "on" ? "off":"on"):$cmd);
  96. readingsSingleUpdate($hash, "state", $state, 1);
  97. return undef;
  98. }
  99. if($cmd =~ m/^(open|closed|desired-temp)$/) {
  100. if($cmd eq "desired-temp") {
  101. return "Usage: set $name desired-temp value" if(int(@a) != 3);
  102. return "desired-temp must be between 8 and 28"
  103. if($a[2] !~ m/^[\d.]+$/ || $a[2] < 8 || $a[2] > 28)
  104. }
  105. my $val = ($cmd eq "open" ? 254 : ($cmd eq "closed" ? 253: int(2*$a[2])));
  106. IOWrite($hash, ReadingsVal($name,"AIN",0),"sethkrtsoll&param=$val");
  107. return undef;
  108. }
  109. }
  110. ###################################
  111. sub
  112. FBDECT_Set($@)
  113. {
  114. my ($hash, @a) = @_;
  115. my %sets = ("on"=>1, "off"=>1, "msgInterval"=>1);
  116. return FBDECT_SetHttp($hash, @a)
  117. if($hash->{IODev} && $hash->{IODev}{TYPE} eq "FBAHAHTTP");
  118. my $ret = undef;
  119. my $cmd = $a[1];
  120. if(!$sets{$cmd}) {
  121. my $usage = join(" ", sort keys %sets);
  122. return SetExtensions($hash, $usage, @a);
  123. }
  124. SetExtensionsCancel($hash);
  125. my $name = $hash->{NAME};
  126. return "" if(IsDisabled($name));
  127. Log3 $name, 3, "FBDECT set $name $cmd";
  128. my $relay;
  129. if($cmd eq "on" || $cmd eq "off") {
  130. my $relay = sprintf("%08x%04x0000%08x", 15, 4, $cmd eq "on" ? 1 : 0);
  131. my $msg = sprintf("%04x0000%08x$relay", $hash->{id}, length($relay)/2);
  132. IOWrite($hash, "07", $msg);
  133. readingsSingleUpdate($hash, "state", "set_$cmd", 1);
  134. }
  135. if($cmd eq "msgInterval") {
  136. return "msgInterval needs seconds as parameter"
  137. if(!defined($a[2]) || $a[2] !~ m/^\d+$/);
  138. # Set timer for RELAY, CURRENT, VOLTAGE, POWER, ENERGY,
  139. # POWER_FACTOR, TEMP, RELAY_TIMES,
  140. foreach my $i (24, 26, 27, 28, 29, 30, 31, 32) {
  141. my $txt = sprintf("%08x%04x0000%08x", $i, 4, $a[2]);
  142. my $msg = sprintf("%04x0000%08x$txt", $hash->{id}, length($txt)/2);
  143. IOWrite($hash, "07", $msg);
  144. }
  145. }
  146. return undef;
  147. }
  148. sub
  149. FBDECT_Get($@)
  150. {
  151. my ($hash, @a) = @_;
  152. my $ret = undef;
  153. my $cmd = ($a[1] ? $a[1] : "");
  154. my %gets = ("devInfo"=>1);
  155. my $cmdList = ($hash->{IODev} && $hash->{IODev}{TYPE} eq "FBAHA") ?
  156. join(" ", sort keys %gets) : "";
  157. return "Unknown argument $cmd, choose one of $cmdList" if(!$gets{$cmd});
  158. if($cmd eq "devInfo") {
  159. my @answ = FBAHA_getDevList($hash->{IODev}, $hash->{id});
  160. return $answ[0] if(@answ == 1);
  161. readingsBeginUpdate($hash);
  162. if($answ[0] &&
  163. $answ[0] =~ m/NAME:(.*), ID:(.*), (.*), TYPE:(.*) PROP:(.*)/) {
  164. readingsBulkUpdate($hash, "FBNAME", $1, 1);
  165. readingsBulkUpdate($hash, "FBTYPE", $4, 1);
  166. readingsBulkUpdate($hash, "FBPROP", $5, 1);
  167. }
  168. my $d = pop @answ;
  169. while($d) {
  170. my ($ptyp, $plen, $pyld) = FBDECT_decodePayload($d, $hash, 0);
  171. Log3 $hash, 4, "Payload: $d -> $ptyp: $pyld";
  172. last if($ptyp eq "");
  173. readingsBulkUpdate($hash, $ptyp, $pyld, 1);
  174. push @answ, " $ptyp: $pyld";
  175. $d = substr($d, 16+$plen*2);
  176. }
  177. readingsEndUpdate($hash, 1);
  178. return join("\n", @answ);
  179. }
  180. return undef;
  181. }
  182. my %fbhttp_readings = (
  183. absenk => 'sprintf("night-temp:%.1f C", $val/2)',
  184. batterylow => '"batterylow:$val"',
  185. celsius => 'sprintf("temperature:%.1f C (measured)", $val/10)',
  186. energy => 'sprintf("energy:%d Wh", $val)',
  187. functionbitmask => '"FBPROP:$fbprop"',
  188. fwversion => '"fwversion:$val"',
  189. id => '"ID:$val"',
  190. identifier => '"AIN:$val"',
  191. komfort => 'sprintf("day-temp:%.1f C", $val/2)',
  192. lock => '"locked:".($val ? "yes":"no")',
  193. mode => '"mode:$val"',
  194. name => '"FBNAME:$val"',
  195. offset => 'sprintf("tempadjust:%.1f C", $val/10)', # ??
  196. power => 'sprintf("power:%.2f W", $val/1000)',
  197. present => '"present:".($val?"yes":"no")',
  198. productname => '"FBTYPE:$val"',
  199. state => '"state:".($val?"on":"off")',
  200. # tist => 'sprintf("temperature:%.1f C (measured)", $val/2)', # Forum #57644
  201. tsoll => 'sprintf("desired-temp:%s", $val)',
  202. members => '"members:$val"',
  203. );
  204. sub
  205. FBDECT_ParseHttp($$$)
  206. {
  207. my ($iodev, $msg, $type) = @_;
  208. my $ioName = $iodev->{NAME};
  209. my %h;
  210. $msg =~ s,<([^/>]+?)>([^<]+?)<,$h{$1}=$2,ge; # Quick & Dirty: Tags
  211. $msg =~ s, ([a-z]+?)="([^"]*)",$h{$1}=$2,ge; # Quick & Dirty: Attributes
  212. my $ain = $h{identifier};
  213. $ain =~ s/[-: ]/_/g;
  214. my %ll = (6=>"actuator", 7=>"powerMeter", 8=>"tempSensor",
  215. 9=>"switch", 10=>"repeater");
  216. my $lsn = int($h{functionbitmask});
  217. my @fb;
  218. map { push @fb, $ll{$_} if((1<<$_) & $lsn) } sort keys %ll;
  219. my $fbprop = join(",", @fb);
  220. my $dp = $modules{FBDECT}{defptr};
  221. my $hash = $dp->{"$ioName:$ain"};
  222. $hash = $dp->{$ain} if(!$hash);
  223. $hash = $dp->{"$ioName:$h{id}"} if(!$hash);
  224. $hash = $dp->{$h{id}} if(!$hash);
  225. if(!$hash) {
  226. my $ret = "UNDEFINED FBDECT_${ioName}_$ain FBDECT $ioName:$ain $fbprop";
  227. Log3 $ioName, 3, "$ret, please define it";
  228. DoTrigger("global", $ret);
  229. return "";
  230. }
  231. $hash->{props} = $fbprop; # replace values from define
  232. readingsBeginUpdate($hash);
  233. Log3 $hash, 5, $hash->{NAME};
  234. foreach my $n (keys %h) {
  235. Log3 $hash, 5, " $n = $h{$n}";
  236. next if(!$fbhttp_readings{$n});
  237. my $val = $h{$n};
  238. $val = ($val==254 ? "on": ($val==253 ? "off" : sprintf("%0.1f C",$val/2)))
  239. if($n eq "tsoll");
  240. $val = $type if($n eq "productname" && $val eq "");
  241. my ($ptyp,$pyld) = split(":", eval $fbhttp_readings{$n}, 2);
  242. readingsBulkUpdate($hash, "state", "$ptyp: $pyld") if($n eq "tsoll");
  243. readingsBulkUpdate($hash, $ptyp, $pyld);
  244. }
  245. readingsEndUpdate($hash, 1);
  246. return $hash->{NAME};
  247. }
  248. sub
  249. FBDECT_renameIoDev($$) # Called from FBAHAHTTP
  250. {
  251. my ($new, $old) = @_;
  252. my $dp = $modules{FBDECT}{defptr};
  253. for my $ok (keys %{$dp}) {
  254. my $nk = $ok;
  255. $nk =~ s/^$old:/$new:/;
  256. next if($nk eq $ok);
  257. $dp->{$nk} = $dp->{$ok};
  258. delete $dp->{$ok};
  259. }
  260. }
  261. ###################################
  262. sub
  263. FBDECT_Parse($$@)
  264. {
  265. my ($iodev, $msg, $local) = @_;
  266. return FBDECT_ParseHttp($iodev, $msg, $1) if($msg =~ m/^<(device|group) /);
  267. my $mt = substr($msg, 0, 2);
  268. my $ioName = $iodev->{NAME};
  269. if($mt ne "07" && $mt ne "04") {
  270. Log3 $ioName, 1, "FBDECT: unknown message type $mt";
  271. return ""; # Nobody else is able to handle this
  272. }
  273. my $id = hex(substr($msg, 16, 4));
  274. my $hash = $modules{FBDECT}{defptr}{"$ioName:$id"};
  275. $hash = $modules{FBDECT}{defptr}{$id} if(!$hash);
  276. if(!$hash) {
  277. my $ret = "UNDEFINED FBDECT_${ioName}_$id FBDECT $ioName:$id switch";
  278. Log3 $ioName, 3, "$ret, please define it";
  279. DoTrigger("global", $ret);
  280. return "";
  281. }
  282. readingsBeginUpdate($hash);
  283. if($mt eq "07") {
  284. my $d = substr($msg, 32);
  285. while($d) {
  286. my ($ptyp, $plen, $pyld) = FBDECT_decodePayload($d, $hash, 1);
  287. Log3 $hash, 4, "Payload: $d -> $ptyp: $pyld";
  288. last if($ptyp eq "");
  289. readingsBulkUpdate($hash, $ptyp, $pyld);
  290. $d = substr($d, 16+$plen*2);
  291. }
  292. }
  293. if($mt eq "04") {
  294. my @answ = FBAHA_configInd(substr($msg,16), $id);
  295. my $state = "";
  296. if($answ[0] =~ m/ inactive,/) {
  297. $state = "inactive";
  298. } else {
  299. my $d = pop @answ;
  300. while($d) {
  301. if(length($d) <= 16) {
  302. push @answ, "FBDECT_DECODE_ERROR:short payload $d";
  303. last;
  304. }
  305. my ($ptyp, $plen, $pyld) = FBDECT_decodePayload($d, $hash, 1);
  306. last if($ptyp eq "");
  307. push @answ, " $ptyp: $pyld";
  308. $d = substr($d, 16+$plen*2);
  309. }
  310. Log3 $iodev, 4, "FBDECT PARSED: ".join(" / ", @answ);
  311. # Ignore the rest, is too confusing.
  312. @answ = grep /state:/, @answ;
  313. (undef, $state) = split(": ", $answ[0], 2) if(@answ > 0);
  314. }
  315. readingsBulkUpdate($hash, "state", $state) if($state);
  316. }
  317. readingsEndUpdate($hash, 1);
  318. Log3 $iodev, 5, "FBDECT_Parse for device $hash->{NAME} done";
  319. return $hash->{NAME};
  320. }
  321. sub
  322. FBDECT_decodeRelayTimes($)
  323. {
  324. my ($p) = @_;
  325. return "unknown" if(length($p) < 16);
  326. return "disabled" if(substr($p, 12, 4) eq "0000");
  327. return $p;
  328. }
  329. sub
  330. FBDECT_decodeTemp($$$)
  331. {
  332. my ($p, $hash, $addReading) = @_;
  333. my $v = hex(substr($p,0,8));
  334. $v = -(4294967296-$v) if($v > 2147483648);
  335. $v /= 10;
  336. if(hex(substr($p,8,8))+0) {
  337. readingsBulkUpdate($hash, "tempadjust", sprintf("%0.1f C", $v))
  338. if($addReading);
  339. return "";
  340. }
  341. return sprintf("%0.1f C (measured)", $v);
  342. }
  343. sub
  344. FBDECT_decodeOptions($)
  345. {
  346. my ($p) = @_;
  347. my @opts;
  348. return "uninitialized" if($p eq "0000ffff");
  349. if(length($p) >= 8) {
  350. my $o = hex(substr($p,0,8));
  351. push @opts, "powerOnState:".($o==0 ? "off" : ($o==1?"on" : "last"));
  352. }
  353. if(length($p) >= 16) {
  354. my $o = hex(substr($p,8,8));
  355. my @lo;
  356. push @lo, "none" if($o == 0);
  357. push @lo, "webUi" if($o & 1);
  358. push @lo, "remoteFB" if($o & 2);
  359. push @lo, "button" if($o & 4);
  360. push @opts, "lock:".join(",", @lo);
  361. }
  362. return join(",", @opts);
  363. }
  364. sub
  365. FBDECT_decodeControl($)
  366. {
  367. my ($p) = @_;
  368. my @ctrl;
  369. for(my $off=8; $off+28<=length($p)/2; $off+=28) {
  370. if(substr($p,($off+ 8)*2,24) eq "000000050000000000000000") {
  371. push @ctrl, "disabled";
  372. next;
  373. }
  374. my ($n, $s);
  375. $s = "on";
  376. $n = hex(substr($p,($off+ 4)*2,8));
  377. $s .= " ".($fbdect_payload{$n} ? $fbdect_payload{$n}{n} : "fn=$n");
  378. my %tbl = (3=>">", 4=>"=>", 5=>"<", 6=>"<=");
  379. $n = hex(substr($p,($off+ 8)*2,8));
  380. $s .= " ".($tbl{$n} ? $tbl{$n} : "rel=$n");
  381. $n = hex(substr($p,($off+12)*2,8));
  382. $s .= sprintf(" %0.2f", $n/100);
  383. $n = hex(substr($p,($off+16)*2,8));
  384. $s .= " delay:${n}sec";
  385. $n = hex(substr($p,($off+20)*2,8));
  386. $s .= " do:".($fbdect_payload{$n} ? $fbdect_payload{$n}{n} : "fn=$n");
  387. $n = hex(substr($p,($off+24)*2,8));
  388. $s .= " ".($n==0 ? "off" : "on");
  389. push @ctrl, $s;
  390. }
  391. return join(",", @ctrl);
  392. }
  393. sub
  394. FBDECT_decodePayload($$$)
  395. {
  396. my ($d, $hash, $addReading) = @_;
  397. if(length($d) < 12) {
  398. Log3 $hash, 4, "FBDECT ignoring payload: data too short";
  399. return ("", "", "");
  400. }
  401. my $ptyp = hex(substr($d, 0, 8));
  402. my $plen = hex(substr($d, 8, 4));
  403. if(length($d) < 16+$plen*2) {
  404. Log3 $hash, 4, "FBDECT ignoring payload: data shorter than given length($plen)";
  405. return ("", "", "");
  406. }
  407. my $pyld = substr($d, 16, $plen*2);
  408. if($fbdect_payload{$ptyp}) {
  409. $cmdFromAnalyze = $fbdect_payload{$ptyp}{fmt};
  410. $pyld = eval $cmdFromAnalyze if($cmdFromAnalyze);
  411. $cmdFromAnalyze = undef;
  412. $ptyp = ($pyld ? $fbdect_payload{$ptyp}{n} : "");
  413. }
  414. return ($ptyp, $plen, $pyld);
  415. }
  416. #####################################
  417. sub
  418. FBDECT_Undef($$)
  419. {
  420. my ($hash, $arg) = @_;
  421. my $homeId = $hash->{homeId};
  422. my $id = $hash->{id};
  423. delete $modules{FBDECT}{defptr}{$id};
  424. return undef;
  425. }
  426. 1;
  427. =pod
  428. =item summary DECT devices connected via the Fritz!OS AHA Server
  429. =item summary_DE &uuml;ber den Fritz!OS AHA Server angebundene DECT Ger&auml;te
  430. =begin html
  431. <a name="FBDECT"></a>
  432. <h3>FBDECT</h3>
  433. <ul>
  434. This module is used to control AVM FRITZ!DECT devices via FHEM, see also the
  435. <a href="#FBAHA">FBAHA</a> or <a href="#FBAHAHTTP">FBAHAHTTP</a> module for
  436. the base.
  437. <br><br>
  438. <a name="FBDECTdefine"></a>
  439. <b>Define</b>
  440. <ul>
  441. <code>define &lt;name&gt; FBDECT [&lt;FBAHAname&gt;:]&lt;id&gt; props</code>
  442. <br>
  443. <br>
  444. Example:
  445. <ul>
  446. <code>define lamp FBDECT 16 switch,powerMeter</code><br>
  447. </ul>
  448. <b>Note:</b>Usually the device is created via
  449. <a href="#autocreate">autocreate</a>. If you rename the corresponding FBAHA
  450. device, take care to modify the FBDECT definitions, as it is not done
  451. automatically.
  452. </ul>
  453. <br>
  454. <br>
  455. <a name="FBDECTset"></a>
  456. <b>Set</b>
  457. <ul>
  458. <li>on/off<br>
  459. set the device on or off.
  460. </li>
  461. <li>desired-temp &lt;value&gt;<br>
  462. set the desired temp on a Comet DECT (FBAHAHTTP IOdev only)
  463. </li>
  464. <li><a href="#setExtensions">set extensions</a> are supported.
  465. </li>
  466. <li>msgInterval &lt;sec&gt;<br>
  467. Number of seconds between the sensor messages (FBAHA IODev only).
  468. </li>
  469. </ul>
  470. <br>
  471. <a name="FBDECTget"></a>
  472. <b>Get</b>
  473. <ul>
  474. <li>devInfo<br>
  475. report device information (FBAHA IODev only)
  476. </li>
  477. </ul>
  478. <br>
  479. <a name="FBDECTattr"></a>
  480. <b>Attributes</b>
  481. <ul>
  482. <li><a href="#IODev">IODev</a></li>
  483. <li><a href="#disable">disable</a></li>
  484. <li><a href="#disabledForIntervals">disabledForIntervals</a></li>
  485. <li><a href="#do_not_notify">do_not_notify</a></li>
  486. <li><a href="#ignore">ignore</a></li>
  487. <li><a href="#dummy">dummy</a></li>
  488. <li><a href="#showtime">showtime</a></li>
  489. <li><a href="#model">model</a></li>
  490. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  491. </ul>
  492. <br>
  493. <a name="FBDECTevents"></a>
  494. <b>Generated events:</b>
  495. <ul>
  496. <li>on</li>
  497. <li>off</li>
  498. <li>set_on</li>
  499. <li>set_off</li>
  500. <li>current: $v A</li>
  501. <li>voltage: $v V</li>
  502. <li>power: $v W</li>
  503. <li>energy: $v Wh</li>
  504. <li>powerFactor: $v"</li>
  505. <li>temperature: $v C (measured)</li>
  506. <li>tempadjust: $v C</li>
  507. <li>options: uninitialized</li>
  508. <li>options: powerOnState:[on|off|last],lock:[none,webUi,remoteFb,button]</li>
  509. <li>control: disabled</li>
  510. <li>control: on power < $v delay:$d sec do:state [on|off]</li>
  511. <li>relaytimes: disabled</li>
  512. <li>relaytimes: HEX</li>
  513. </ul>
  514. </ul>
  515. =end html
  516. =begin html_DE
  517. <a name="FBDECT"></a>
  518. <h3>FBDECT</h3>
  519. <ul>
  520. Dieses Modul wird verwendet, um AVM FRITZ!DECT Ger&auml;te via FHEM zu
  521. steuern, siehe auch das <a href="#FBAHA">FBAHA</a> oder <a
  522. href="#FBAHAHTTP">FBAHAHTTP</a> Modul f&uumlr die Anbindung an das FRITZ!Box.
  523. <br><br>
  524. <a name="FBDECTdefine"></a>
  525. <b>Define</b>
  526. <ul>
  527. <code>define &lt;name&gt; FBDECT [&lt;FBAHAname&gt;:]&lt;id&gt; props</code>
  528. <br>
  529. <br>
  530. Beispiel:
  531. <ul>
  532. <code>define lampe FBDECT 16 switch,powerMeter</code><br>
  533. </ul>
  534. <b>Achtung:</b>FBDECT Eintr&auml;ge werden normalerweise per
  535. <a href="#autocreate">autocreate</a> angelegt. Falls sie die zugeordnete
  536. FBAHA oder FBAHAHTTP Instanz umbenennen, dann muss die FBDECT Definition
  537. manuell angepasst werden.
  538. </ul>
  539. <br>
  540. <br
  541. <a name="FBDECTset"></a>
  542. <b>Set</b>
  543. <ul>
  544. <li>on/off<br>
  545. Ger&auml;t einschalten bzw. ausschalten.</li>
  546. <li>desired-temp &lt;value&/gt;<br>
  547. Gew&uuml;nschte Temperatur beim Comet DECT setzen (nur mit FBAHAHTTP als
  548. IODev).
  549. </li>
  550. <li>
  551. Die <a href="#setExtensions">set extensions</a> werden
  552. unterst&uuml;tzt.
  553. </li>
  554. <li>msgInterval &lt;sec&gt;<br>
  555. Anzahl der Sekunden zwischen den Sensornachrichten (nur mit FBAHA als
  556. IODev).
  557. </li>
  558. </ul>
  559. <br>
  560. <a name="FBDECTget"></a>
  561. <b>Get</b>
  562. <ul>
  563. <li>devInfo<br>
  564. meldet Ger&auml;te-Informationen (nur mit FBAHA als IODev)</li>
  565. </ul>
  566. <br>
  567. <a name="FBDECTattr"></a>
  568. <b>Attribute</b>
  569. <ul>
  570. <li><a href="#IODev">IODev</a></li>
  571. <li><a href="#disable">disable</a></li>
  572. <li><a href="#disabledForIntervals">disabledForIntervals</a></li>
  573. <li><a href="#do_not_notify">do_not_notify</a></li>
  574. <li><a href="#ignore">ignore</a></li>
  575. <li><a href="#dummy">dummy</a></li>
  576. <li><a href="#showtime">showtime</a></li>
  577. <li><a href="#model">model</a></li>
  578. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  579. </ul>
  580. <br>
  581. <a name="FBDECTevents"></a>
  582. <b>Generierte events:</b>
  583. <ul>
  584. <li>on</li>
  585. <li>off</li>
  586. <li>set_on</li>
  587. <li>set_off</li>
  588. <li>current: $v A</li>
  589. <li>voltage: $v V</li>
  590. <li>power: $v W</li>
  591. <li>energy: $v Wh</li>
  592. <li>powerFactor: $v"</li>
  593. <li>temperature: $v C ([measured|corrected])</li>
  594. <li>options: uninitialized</li>
  595. <li>options: powerOnState:[on|off|last],lock:[none,webUi,remoteFb,button]</li>
  596. <li>control: disabled</li>
  597. <li>control: on power < $v delay:$d sec do:state [on|off]</li>
  598. <li>relaytimes: disabled</li>
  599. <li>relaytimes: HEX</li>
  600. </ul>
  601. </ul>
  602. =end html_DE
  603. =cut