10_FBDECT.pm 18 KB

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