10_FBDECT.pm 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  1. ##############################################
  2. # $Id: 10_FBDECT.pm 16798 2018-05-29 19:43:05Z 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. $fbprop = "none" if(!$fbprop); # 85930
  238. my $dp = $modules{FBDECT}{defptr};
  239. my $hash = $dp->{"$ioName:$ain"};
  240. $hash = $dp->{$ain} if(!$hash);
  241. $hash = $dp->{"$ioName:$h{id}"} if(!$hash);
  242. $hash = $dp->{$h{id}} if(!$hash);
  243. if(!$hash) {
  244. my $ret = "UNDEFINED FBDECT_${ioName}_$ain FBDECT $ioName:$ain $fbprop";
  245. Log3 $ioName, 3, "$ret, please define it";
  246. DoTrigger("global", $ret);
  247. return "";
  248. }
  249. $hash->{props} = $fbprop; # replace values from define
  250. readingsBeginUpdate($hash);
  251. Log3 $hash, 5, $hash->{NAME};
  252. foreach my $n (keys %h) {
  253. Log3 $hash, 5, " $n = $h{$n}";
  254. next if(!$fbhttp_readings{$n});
  255. my $val = $h{$n};
  256. $val = ($val==254 ? "on": ($val==253 ? "off" : sprintf("%0.1f C",$val/2)))
  257. if($n eq "tsoll");
  258. $val = $type if($n eq "productname" && $val eq "");
  259. my ($ptyp,$pyld) = split(":", eval $fbhttp_readings{$n}, 2);
  260. readingsBulkUpdate($hash, "state", "$ptyp: $pyld") if($n eq "tsoll");
  261. readingsBulkUpdate($hash, $ptyp, $pyld);
  262. readingsBulkUpdate($hash, "batteryState", $pyld ? "low" : "ok")
  263. if($ptyp eq "batterylow");
  264. }
  265. readingsEndUpdate($hash, 1);
  266. return $hash->{NAME};
  267. }
  268. sub
  269. FBDECT_renameIoDev($$) # Called from FBAHAHTTP
  270. {
  271. my ($new, $old) = @_;
  272. my $dp = $modules{FBDECT}{defptr};
  273. for my $ok (keys %{$dp}) {
  274. my $nk = $ok;
  275. $nk =~ s/^$old:/$new:/;
  276. next if($nk eq $ok);
  277. $dp->{$nk} = $dp->{$ok};
  278. delete $dp->{$ok};
  279. }
  280. }
  281. ###################################
  282. sub
  283. FBDECT_Parse($$@)
  284. {
  285. my ($iodev, $msg, $local) = @_;
  286. return FBDECT_ParseHttp($iodev, $msg, $1) if($msg =~ m/^<(device|group) /);
  287. my $mt = substr($msg, 0, 2);
  288. my $ioName = $iodev->{NAME};
  289. if($mt ne "07" && $mt ne "04") {
  290. Log3 $ioName, 1, "FBDECT: unknown message type $mt";
  291. return ""; # Nobody else is able to handle this
  292. }
  293. my $id = hex(substr($msg, 16, 4));
  294. my $hash = $modules{FBDECT}{defptr}{"$ioName:$id"};
  295. $hash = $modules{FBDECT}{defptr}{$id} if(!$hash);
  296. if(!$hash) {
  297. my $ret = "UNDEFINED FBDECT_${ioName}_$id FBDECT $ioName:$id switch";
  298. Log3 $ioName, 3, "$ret, please define it";
  299. DoTrigger("global", $ret);
  300. return "";
  301. }
  302. readingsBeginUpdate($hash);
  303. if($mt eq "07") {
  304. my $d = substr($msg, 32);
  305. while($d) {
  306. my ($ptyp, $plen, $pyld) = FBDECT_decodePayload($d, $hash, 1);
  307. Log3 $hash, 4, "Payload: $d -> $ptyp: $pyld";
  308. last if($ptyp eq "");
  309. readingsBulkUpdate($hash, $ptyp, $pyld);
  310. $d = substr($d, 16+$plen*2);
  311. }
  312. }
  313. if($mt eq "04") {
  314. my @answ = FBAHA_configInd(substr($msg,16), $id);
  315. my $state = "";
  316. if($answ[0] =~ m/ inactive,/) {
  317. $state = "inactive";
  318. } else {
  319. my $d = pop @answ;
  320. while($d) {
  321. if(length($d) <= 16) {
  322. push @answ, "FBDECT_DECODE_ERROR:short payload $d";
  323. last;
  324. }
  325. my ($ptyp, $plen, $pyld) = FBDECT_decodePayload($d, $hash, 1);
  326. last if($ptyp eq "");
  327. push @answ, " $ptyp: $pyld";
  328. $d = substr($d, 16+$plen*2);
  329. }
  330. Log3 $iodev, 4, "FBDECT PARSED: ".join(" / ", @answ);
  331. # Ignore the rest, is too confusing.
  332. @answ = grep /state:/, @answ;
  333. (undef, $state) = split(": ", $answ[0], 2) if(@answ > 0);
  334. }
  335. readingsBulkUpdate($hash, "state", $state) if($state);
  336. }
  337. readingsEndUpdate($hash, 1);
  338. Log3 $iodev, 5, "FBDECT_Parse for device $hash->{NAME} done";
  339. return $hash->{NAME};
  340. }
  341. sub
  342. FBDECT_decodeRelayTimes($)
  343. {
  344. my ($p) = @_;
  345. return "unknown" if(length($p) < 16);
  346. return "disabled" if(substr($p, 12, 4) eq "0000");
  347. return $p;
  348. }
  349. sub
  350. FBDECT_decodeTemp($$$)
  351. {
  352. my ($p, $hash, $addReading) = @_;
  353. my $v = hex(substr($p,0,8));
  354. $v = -(4294967296-$v) if($v > 2147483648);
  355. $v /= 10;
  356. if(hex(substr($p,8,8))+0) {
  357. readingsBulkUpdate($hash, "tempadjust", sprintf("%0.1f C", $v))
  358. if($addReading);
  359. return "";
  360. }
  361. return sprintf("%0.1f C (measured)", $v);
  362. }
  363. sub
  364. FBDECT_decodeOptions($)
  365. {
  366. my ($p) = @_;
  367. my @opts;
  368. return "uninitialized" if($p eq "0000ffff");
  369. if(length($p) >= 8) {
  370. my $o = hex(substr($p,0,8));
  371. push @opts, "powerOnState:".($o==0 ? "off" : ($o==1?"on" : "last"));
  372. }
  373. if(length($p) >= 16) {
  374. my $o = hex(substr($p,8,8));
  375. my @lo;
  376. push @lo, "none" if($o == 0);
  377. push @lo, "webUi" if($o & 1);
  378. push @lo, "remoteFB" if($o & 2);
  379. push @lo, "button" if($o & 4);
  380. push @opts, "lock:".join(",", @lo);
  381. }
  382. return join(",", @opts);
  383. }
  384. sub
  385. FBDECT_decodeControl($)
  386. {
  387. my ($p) = @_;
  388. my @ctrl;
  389. for(my $off=8; $off+28<=length($p)/2; $off+=28) {
  390. if(substr($p,($off+ 8)*2,24) eq "000000050000000000000000") {
  391. push @ctrl, "disabled";
  392. next;
  393. }
  394. my ($n, $s);
  395. $s = "on";
  396. $n = hex(substr($p,($off+ 4)*2,8));
  397. $s .= " ".($fbdect_payload{$n} ? $fbdect_payload{$n}{n} : "fn=$n");
  398. my %tbl = (3=>">", 4=>"=>", 5=>"<", 6=>"<=");
  399. $n = hex(substr($p,($off+ 8)*2,8));
  400. $s .= " ".($tbl{$n} ? $tbl{$n} : "rel=$n");
  401. $n = hex(substr($p,($off+12)*2,8));
  402. $s .= sprintf(" %0.2f", $n/100);
  403. $n = hex(substr($p,($off+16)*2,8));
  404. $s .= " delay:${n}sec";
  405. $n = hex(substr($p,($off+20)*2,8));
  406. $s .= " do:".($fbdect_payload{$n} ? $fbdect_payload{$n}{n} : "fn=$n");
  407. $n = hex(substr($p,($off+24)*2,8));
  408. $s .= " ".($n==0 ? "off" : "on");
  409. push @ctrl, $s;
  410. }
  411. return join(",", @ctrl);
  412. }
  413. sub
  414. FBDECT_decodePayload($$$)
  415. {
  416. my ($d, $hash, $addReading) = @_;
  417. if(length($d) < 12) {
  418. Log3 $hash, 4, "FBDECT ignoring payload: data too short";
  419. return ("", "", "");
  420. }
  421. my $ptyp = hex(substr($d, 0, 8));
  422. my $plen = hex(substr($d, 8, 4));
  423. if(length($d) < 16+$plen*2) {
  424. Log3 $hash, 4, "FBDECT ignoring payload: data shorter than given length($plen)";
  425. return ("", "", "");
  426. }
  427. my $pyld = substr($d, 16, $plen*2);
  428. if($fbdect_payload{$ptyp}) {
  429. $cmdFromAnalyze = $fbdect_payload{$ptyp}{fmt};
  430. $pyld = eval $cmdFromAnalyze if($cmdFromAnalyze);
  431. $cmdFromAnalyze = undef;
  432. $ptyp = ($pyld ? $fbdect_payload{$ptyp}{n} : "");
  433. }
  434. return ($ptyp, $plen, $pyld);
  435. }
  436. #####################################
  437. sub
  438. FBDECT_Undef($$)
  439. {
  440. my ($hash, $arg) = @_;
  441. my $homeId = $hash->{homeId};
  442. my $id = $hash->{id};
  443. delete $modules{FBDECT}{defptr}{$id};
  444. return undef;
  445. }
  446. 1;
  447. =pod
  448. =item summary DECT devices connected via the Fritz!OS AHA Server
  449. =item summary_DE &uuml;ber den Fritz!OS AHA Server angebundene DECT Ger&auml;te
  450. =begin html
  451. <a name="FBDECT"></a>
  452. <h3>FBDECT</h3>
  453. <ul>
  454. This module is used to control AVM FRITZ!DECT devices via FHEM, see also the
  455. <a href="#FBAHA">FBAHA</a> or <a href="#FBAHAHTTP">FBAHAHTTP</a> module for
  456. the base.
  457. <br><br>
  458. <a name="FBDECTdefine"></a>
  459. <b>Define</b>
  460. <ul>
  461. <code>define &lt;name&gt; FBDECT [&lt;FBAHAname&gt;:]&lt;id&gt; props</code>
  462. <br>
  463. <br>
  464. Example:
  465. <ul>
  466. <code>define lamp FBDECT 16 switch,powerMeter</code><br>
  467. </ul>
  468. <b>Note:</b>Usually the device is created via
  469. <a href="#autocreate">autocreate</a>. If you rename the corresponding FBAHA
  470. device, take care to modify the FBDECT definitions, as it is not done
  471. automatically.
  472. </ul>
  473. <br>
  474. <br>
  475. <a name="FBDECTset"></a>
  476. <b>Set</b>
  477. <ul>
  478. <li>on/off<br>
  479. set the device on or off.
  480. </li>
  481. <li>desired-temp &lt;value&gt;<br>
  482. set the desired temp on a Comet DECT (FBAHAHTTP IOdev only)
  483. </li>
  484. <li><a href="#setExtensions">set extensions</a> are supported.
  485. </li>
  486. <li>msgInterval &lt;sec&gt;<br>
  487. Number of seconds between the sensor messages (FBAHA IODev only).
  488. </li>
  489. </ul>
  490. <br>
  491. <a name="FBDECTget"></a>
  492. <b>Get</b>
  493. <ul>
  494. <li>devInfo<br>
  495. report device information (FBAHA IODev only)
  496. </li>
  497. </ul>
  498. <br>
  499. <a name="FBDECTattr"></a>
  500. <b>Attributes</b>
  501. <ul>
  502. <li><a href="#IODev">IODev</a></li>
  503. <li><a href="#disable">disable</a></li>
  504. <li><a href="#disabledForIntervals">disabledForIntervals</a></li>
  505. <li><a href="#do_not_notify">do_not_notify</a></li>
  506. <li><a href="#ignore">ignore</a></li>
  507. <li><a href="#dummy">dummy</a></li>
  508. <li><a href="#showtime">showtime</a></li>
  509. <li><a href="#model">model</a></li>
  510. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  511. </ul>
  512. <br>
  513. <a name="FBDECTevents"></a>
  514. <b>Generated events:</b>
  515. <ul>
  516. <li>on</li>
  517. <li>off</li>
  518. <li>set_on</li>
  519. <li>set_off</li>
  520. <li>current: $v A</li>
  521. <li>voltage: $v V</li>
  522. <li>power: $v W</li>
  523. <li>energy: $v Wh</li>
  524. <li>powerFactor: $v"</li>
  525. <li>temperature: $v C (measured)</li>
  526. <li>tempadjust: $v C</li>
  527. <li>options: uninitialized</li>
  528. <li>options: powerOnState:[on|off|last],lock:[none,webUi,remoteFb,button]</li>
  529. <li>control: disabled</li>
  530. <li>control: on power < $v delay:$d sec do:state [on|off]</li>
  531. <li>relaytimes: disabled</li>
  532. <li>relaytimes: HEX</li>
  533. </ul>
  534. </ul>
  535. =end html
  536. =begin html_DE
  537. <a name="FBDECT"></a>
  538. <h3>FBDECT</h3>
  539. <ul>
  540. Dieses Modul wird verwendet, um AVM FRITZ!DECT Ger&auml;te via FHEM zu
  541. steuern, siehe auch das <a href="#FBAHA">FBAHA</a> oder <a
  542. href="#FBAHAHTTP">FBAHAHTTP</a> Modul f&uuml;r die Anbindung an das FRITZ!Box.
  543. <br><br>
  544. <a name="FBDECTdefine"></a>
  545. <b>Define</b>
  546. <ul>
  547. <code>define &lt;name&gt; FBDECT [&lt;FBAHAname&gt;:]&lt;id&gt; props</code>
  548. <br>
  549. <br>
  550. Beispiel:
  551. <ul>
  552. <code>define lampe FBDECT 16 switch,powerMeter</code><br>
  553. </ul>
  554. <b>Achtung:</b>FBDECT Eintr&auml;ge werden normalerweise per
  555. <a href="#autocreate">autocreate</a> angelegt. Falls sie die zugeordnete
  556. FBAHA oder FBAHAHTTP Instanz umbenennen, dann muss die FBDECT Definition
  557. manuell angepasst werden.
  558. </ul>
  559. <br>
  560. <br
  561. <a name="FBDECTset"></a>
  562. <b>Set</b>
  563. <ul>
  564. <li>on/off<br>
  565. Ger&auml;t einschalten bzw. ausschalten.</li>
  566. <li>desired-temp &lt;value&gt;<br>
  567. Gew&uuml;nschte Temperatur beim Comet DECT setzen (nur mit FBAHAHTTP als
  568. IODev).
  569. </li>
  570. <li>
  571. Die <a href="#setExtensions">set extensions</a> werden
  572. unterst&uuml;tzt.
  573. </li>
  574. <li>msgInterval &lt;sec&gt;<br>
  575. Anzahl der Sekunden zwischen den Sensornachrichten (nur mit FBAHA als
  576. IODev).
  577. </li>
  578. </ul>
  579. <br>
  580. <a name="FBDECTget"></a>
  581. <b>Get</b>
  582. <ul>
  583. <li>devInfo<br>
  584. meldet Ger&auml;te-Informationen (nur mit FBAHA als IODev)</li>
  585. </ul>
  586. <br>
  587. <a name="FBDECTattr"></a>
  588. <b>Attribute</b>
  589. <ul>
  590. <li><a href="#IODev">IODev</a></li>
  591. <li><a href="#disable">disable</a></li>
  592. <li><a href="#disabledForIntervals">disabledForIntervals</a></li>
  593. <li><a href="#do_not_notify">do_not_notify</a></li>
  594. <li><a href="#ignore">ignore</a></li>
  595. <li><a href="#dummy">dummy</a></li>
  596. <li><a href="#showtime">showtime</a></li>
  597. <li><a href="#model">model</a></li>
  598. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  599. </ul>
  600. <br>
  601. <a name="FBDECTevents"></a>
  602. <b>Generierte events:</b>
  603. <ul>
  604. <li>on</li>
  605. <li>off</li>
  606. <li>set_on</li>
  607. <li>set_off</li>
  608. <li>current: $v A</li>
  609. <li>voltage: $v V</li>
  610. <li>power: $v W</li>
  611. <li>energy: $v Wh</li>
  612. <li>powerFactor: $v"</li>
  613. <li>temperature: $v C ([measured|corrected])</li>
  614. <li>options: uninitialized</li>
  615. <li>options: powerOnState:[on|off|last],lock:[none,webUi,remoteFb,button]</li>
  616. <li>control: disabled</li>
  617. <li>control: on power < $v delay:$d sec do:state [on|off]</li>
  618. <li>relaytimes: disabled</li>
  619. <li>relaytimes: HEX</li>
  620. </ul>
  621. </ul>
  622. =end html_DE
  623. =cut