10_FBDECT.pm 19 KB

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