98_QRCode.pm 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. ##############################################
  2. # $Id: 98_QRCode.pm 13209 2017-01-23 15:35:11Z Benni $
  3. ##############################################
  4. package main;
  5. use strict;
  6. use warnings;
  7. use POSIX;
  8. #use Encode qw(encode);
  9. my $version='0.95';
  10. my $apiurl='http://qrcode.tec-it.com/API/QRCode';
  11. my $service='TEC-IT';
  12. my $modulename='QRCode'; #Module-Name = TYPE
  13. my $defsyntax="define <name> $modulename";
  14. my $defImgPath='/tmp';
  15. my $defWidth=200;
  16. my $defHeight=200;
  17. sub
  18. #======================================================================
  19. QRCode_Log3($$$)
  20. #======================================================================
  21. #Using my own Log3 method, expecting the same
  22. #parameters as the official method
  23. #QRCode_Log3 <devicename>,<loglevel>,<logmessage>
  24. #making sure, the device-name is always contained in the log message
  25. {
  26. my ($name,$lvl,$text)=@_;
  27. Log3 $name,$lvl,"$name: $text";
  28. return undef;
  29. }
  30. sub
  31. #======================================================================
  32. QRCode_Initialize($)
  33. #======================================================================
  34. #Module instance initialization (constructor)
  35. {
  36. my ($hash) = @_;
  37. #Telling FHEM what routines to use for module handling
  38. $hash->{SetFn} = $modulename."_Set"; #setter
  39. $hash->{DefFn} = $modulename."_Define"; #define
  40. $hash->{FW_detailFn} = $modulename."_FWDetail";
  41. $hash->{AttrFn} = $modulename."_Attr";
  42. $hash->{NotifyFn} = $modulename."_Notify";
  43. #Telling FHEM what attributes are available
  44. $hash->{AttrList} =
  45. "qrData:textField " #Text für den QRCode im generic Modus
  46. . "qrSize:small,medium,large "
  47. . "qrColor "
  48. . "qrBackColor "
  49. . "qrTransparent:True,False "
  50. . "qrQuietZone "
  51. . "qrQuietUnit:mm,in,mil,mod,px "
  52. . "qrCodepage:UTF8,Cyrillic,Ansi "
  53. . "qrResolutionDPI "
  54. . "qrErrorCorrection:L,M,Q,H "
  55. . "qrDisplayWidth "
  56. . "qrDisplayHeight "
  57. . "qrDisplayData:0,1 "
  58. . "qrNoAutoUpdate:1 "
  59. . "qrDisplayNoImage:1 "
  60. . "qrDisplayNoText:1 "
  61. . "qrDisplayText:textField-long "
  62. #. "qrDeliveryMethod:Base64,Image,Download " # We only use 'Image'
  63. . $readingFnAttributes; #default FHEM FnAttributes -> see commandref.
  64. }
  65. sub
  66. #======================================================================
  67. QRCode_Set($@)
  68. #======================================================================
  69. #Setter - Handling set commands for device
  70. {
  71. my ($hash, @a) = @_;
  72. my $name = shift @a;
  73. my $cmd=shift @a;
  74. #Currently only the update command is available to refressh
  75. #feed date
  76. if ($cmd eq 'update') {
  77. QRCode_update(@_);
  78. }
  79. else {
  80. return "Unknown argument $cmd, choose one of update:noArg";
  81. }
  82. return undef;
  83. }
  84. sub
  85. #======================================================================
  86. QRCode_Define($$)
  87. #======================================================================
  88. #defining the device using following syntax
  89. #define <name> QRCode
  90. {
  91. my ($hash, $def) = @_;
  92. my @a = split("[ \t][ \t]*", $def);
  93. #Check if at least 2 arguments are specified (name and url)
  94. return "Wrong syntax: use $defsyntax" if(int(@a) != 2);
  95. my $name = shift @a;
  96. my $type = shift @a;
  97. $hash->{SERVICE}=$service;
  98. $hash->{APIURL}=$apiurl;
  99. $hash->{NOTIFYDEV}='global';
  100. $hash->{VERSION}=$version;
  101. #setting initial state reading for device
  102. readingsSingleUpdate($hash,'state','defined',1);
  103. return undef;
  104. }
  105. #======================================================================
  106. sub QRCode_Attr ($$$$)
  107. #======================================================================
  108. #Checking Attributes for validity
  109. {
  110. my ( $cmd, $name, $attrName, $attrValue ) = @_;
  111. my $error=undef;
  112. if($cmd eq 'set') {
  113. QRCode_Log3 $name,4,"checking new attribute value $attrName=$attrValue";
  114. if($attrName eq 'qrResolutionDPI') {
  115. $error='dpi value is out of range (96...600)'
  116. if($attrValue < 96 || $attrValue > 600);
  117. }
  118. elsif ($attrName eq 'qrTransparent') {
  119. $error='transparent flag must be set to True or False'
  120. if($attrValue !~ /(True|False)/);
  121. }
  122. elsif ($attrName eq 'qrSize') {
  123. $error='size must be one of small, medium or large'
  124. if ($attrValue !~ /(small|medium|large)/);
  125. }
  126. elsif ($attrName =~ /(qrBackColor|qrColor)/) {
  127. $error='color must be a hex color RGB value (e.g. FF0000 for red)'
  128. if ($attrValue !~ /^(?:[0-9a-fA-F]{3}){1,2}$/);
  129. }
  130. elsif ($attrName eq 'qrQuietUnit') {
  131. $error='unit must be one of mm,in,mil,mod,px'
  132. if ($attrValue !~/(mm|in|mil|mod|px)/);
  133. }
  134. elsif ($attrName eq 'qrErrorCorrection') {
  135. $error='error correction must be one of L,M,Q,H'
  136. if ($attrValue !~ /^[LMQH]$/);
  137. }
  138. elsif ($attrName eq 'qrCodepage') {
  139. $error='codepage must be one of UTF8,Cyrillic,Ansi'
  140. if ($attrValue !~ /(UTF8|Cyrillic|Ansi)/);
  141. }
  142. elsif ($attrName =~/(qrQuietZone|qrDisplayHeight|qrDisplayWidth)/) {
  143. $error='value must be a positive number'
  144. if ($attrValue <= 0);
  145. }
  146. elsif ($attrName =~ /(qrNoAutoUpdate|qrDisplayNoImage|qrDisplayNoText)/) {
  147. $error='value can be only set to 1 (otherwise delete the attribute)'
  148. if ($attrValue != 1);
  149. }
  150. }
  151. return $error;
  152. }
  153. #======================================================================
  154. sub QRCode_Notify($$)
  155. #======================================================================
  156. #Getting notifications to enable auto update feature when attributes
  157. #are changed that are relevant for url and QRCode generation
  158. {
  159. return undef unless ($init_done);
  160. my ($hash,$dev)=@_;
  161. my $name=$hash->{NAME};
  162. my $src=$dev->{NAME};
  163. my $needsUpdate=undef;
  164. if($src eq 'global') {
  165. foreach my $event (@{$dev->{CHANGED}})
  166. {
  167. QRCode_Log3 $name,4,"global event for $name: $event";
  168. my @evtArray = split /\s+/, $event;
  169. my $cmd=$evtArray[0];
  170. QRCode_Log3 $name,4,"event is $cmd";
  171. if($cmd =~ /.*ATTR/) {
  172. my $devName=$evtArray[1];
  173. my $attrName=$evtArray[2];
  174. QRCode_Log3 $name,4,"attribute $attrName of $devName";
  175. if($devName eq $name) {
  176. if($attrName =~ /^(qrData|qrSize|qrColor|qrBackColor|qrTransparent|qrQuietZone|qrQuietUnit|qrCodepage|qrResolutionDPI|qrErrorCorrection)$/) {
  177. QRCode_Log3 $name,4,"$name auto update relevant attribute changed";
  178. $needsUpdate=1;
  179. }
  180. } else {
  181. QRCode_Log3 $name,4,"only checking own attributes this one was for $devName -> ignoring!";
  182. }
  183. }
  184. }
  185. }
  186. QRCode_Log3 $name,5,"$name was notified by $src erhalten";
  187. foreach my $event (@{$dev->{CHANGED}})
  188. {
  189. QRCode_Log3 $name,5,"$src EVENT: $event";
  190. }
  191. if($needsUpdate && !AttrVal($name,'qrNoAutoUpdate',undef)) {
  192. QRCode_Log3 $name,4,"auto updating ...";
  193. QRCode_update($hash);
  194. }
  195. return undef;
  196. }
  197. sub
  198. #======================================================================
  199. QRCode_update(@)
  200. #======================================================================
  201. #This subroutine is actually doing the update of QRCode-url
  202. {
  203. my ($dhash,@a)=@_;
  204. my $name=$dhash->{NAME};
  205. my $errText='';
  206. QRCode_Log3 $name,4,'updating url ...';
  207. #Check if something wrong with the device's hash.
  208. if (!$name) {
  209. $errText='Unable to extract device name';
  210. QRCode_Log3($modulename.'_update',3,$errText);
  211. readingsSingleUpdate($dhash,'data',$errText,1);
  212. #readingsSingleUpdate($dhash,'error',1,1);
  213. $defs{$name}{ERROR}=1;
  214. return;
  215. }
  216. #Getting Api-URL from internals
  217. my $url=InternalVal($name,'APIURL','');
  218. if (!$url) {
  219. #If there's no URL in internals, something is very wrong (see define)
  220. $errText='APIURL is not defined';
  221. QRCode_Log3($modulename.'_update',3,$errText);
  222. readingsSingleUpdate($dhash,'data',$errText,1);
  223. #readingsSingleUpdate($dhash,'error',1,1);
  224. $defs{$name}{ERROR}=1;
  225. return;
  226. }
  227. delete($defs{$name}{ERROR}) if defined ReadingsVal($name,'error',undef);
  228. my $data=AttrVal($name,'qrData',undef);
  229. if(!$data) {
  230. $errText='No data to encode! Attribute qrData not defined!';
  231. QRCode_Log3($modulename.'_update',3,$errText);
  232. readingsSingleUpdate($dhash,'data',$errText,1);
  233. #readingsSingleUpdate($dhash,'error',1,1);
  234. $defs{$name}{ERROR}=1;
  235. return;
  236. }
  237. delete($defs{$name}{ERROR}) if defined InternalVal($name,'ERROR',undef);
  238. my $encdata=urlEncode($data);
  239. $url.="?data=$encdata";
  240. my $fcolor=AttrVal($name,'qrColor',undef);
  241. $url.="&color=$fcolor" if($fcolor && $fcolor ne '000000');
  242. my $transp=AttrVal($name,'qrTransparent',undef);
  243. $url.="&istransparent=$transp" if($transp && $transp ne 'False');
  244. my $bcolor=AttrVal($name,'qrBackColor',undef);
  245. $url.="&backcolor=$bcolor" if($bcolor && $bcolor !~ /^(?:[fF]{3}){1,2}$/ && !$transp);
  246. my $qzone=AttrVal($name,'qrQuietZone',undef);
  247. $url.="&quietzone=$qzone" if($qzone && $qzone > 0);
  248. my $qunit=AttrVal($name,'qrQuietUnit',undef);
  249. $url.="&quietunit=$qunit" if($qunit && $qunit ne 'mm' );
  250. my $cerr=AttrVal($name,'qrErrorCorrection',undef);
  251. $url.="&errorcorrection=$cerr" if($cerr && $cerr ne 'L');
  252. my $cpage=AttrVal($name,'qrCodepage',undef);
  253. $url.="&codepage=$cpage" if($cpage && $cpage ne 'UTF8');
  254. my $dpi=AttrVal($name,'qrResolutionDPI',undef);
  255. $url.="&dpi=$dpi" if($dpi && $dpi != 300);
  256. my $size=AttrVal($name,'qrSize',undef);
  257. $url.="&size=$size" if($size && $ size ne 'medium');
  258. my $response = GetFileFromURLQuiet($url,5,undef,1);
  259. QRCode_Log3 $name,5,"--- BOF ---";
  260. QRCode_Log3 $name,5,$response;
  261. QRCode_Log3 $name,5,"--- EOF ---";
  262. # Maybe I'll do a caching of the created QRCode later
  263. # my $fpath=AttrVal($name,'qrFilePath',$defImgPath);
  264. # my $fname="$fpath/$name.png";
  265. # my @fcontent=($response);
  266. # my $err=FileWrite({ FileName=>$fname,ForceType=>"file",NoNL=>1 },@fcontent);
  267. #Now starting update of the readings
  268. readingsBeginUpdate($dhash);
  269. # readingsBulkUpdateIfChanged($dhash,'file_name',$fname);
  270. readingsBulkUpdateIfChanged($dhash,'data',$data);
  271. readingsBulkUpdateIfChanged($dhash,'qrcode_url',$url);
  272. readingsBulkUpdate($dhash,'state',TimeNow());
  273. #mass updating/generation of readings is complete so
  274. #tell FHEM to update them now!
  275. readingsEndUpdate($dhash,1);
  276. return;
  277. }
  278. #======================================================================
  279. sub QRCode_getHtml($;$$)
  280. #======================================================================
  281. #Generate the details HTML code for display in device details
  282. #or use with an weblink or something else.
  283. {
  284. my ($name,$noImage,$noText)=@_;
  285. #Checking if device exists ...
  286. return "<div style=\"color:red\">$name is not defined</div>" if(!$defs{$name});
  287. #...and is of correct TYPE
  288. return "<div style=\"color:red\">$name is not of TYPE $modulename</div>" if(!($defs{$name}{'TYPE'} eq $modulename));
  289. #Check for errors set by QRCode_update
  290. return '<div style="color:red">'.ReadingsVal($name,'data','unknown error!').'</div>'
  291. if(InternalVal($name,'ERROR',undef));
  292. my $imageurl=ReadingsVal($name,'qrcode_url',undef);
  293. return '<div style="color:red">No image url available! Use set update to create it.</div>'
  294. if(!$imageurl);
  295. my $width='width="'.AttrVal($name,'qrDisplayWidth',$defWidth).'"';
  296. my $height='height="'.AttrVal($name,'qrDisplayHeight',$defHeight).'"';
  297. my $ret = "<table>";
  298. $ret .= "<tr><td rowspan=3>";
  299. $ret .= "<td>";
  300. $ret .= "<img $width $height src=\"".ReadingsVal($name,'qrcode_url',undef)."\"/>"
  301. if($imageurl && !$noImage);
  302. $ret .= "No image url available!<br>Use set update to create it"
  303. if(!$imageurl);
  304. $ret .= "</td></tr>";
  305. $ret .= "<tr><td>";
  306. my $stylecolor='';
  307. $stylecolor=' style="color:red"' if !AttrVal($name,'qrData',undef);
  308. $ret .= '<div'.$stylecolor.'>'.AttrVal($name,'qrData',ReadingsVal($name,'data','attr qrData n/a')).'</div>'
  309. if($imageurl && AttrVal($name,'qrDisplayData',undef) || !AttrVal($name,'qrData',undef));
  310. $ret .= "</td>";
  311. $ret .= "</tr>";
  312. my $dtext=AttrVal($name,'qrDisplayText',undef);
  313. if ($dtext && !$noText && AttrVal($name,'qrData',undef)) {
  314. $dtext =~ s/\n/\<br\>/g;
  315. $ret .= "<tr><td>";
  316. $ret .= $dtext;
  317. $ret .= "</td></tr>";
  318. }
  319. $ret .= "</table>";
  320. return $ret;
  321. }
  322. #======================================================================
  323. sub QRCode_FWDetail($@) {
  324. #======================================================================
  325. #Display the QRCode in device details in FHEMWEB
  326. my ($FW_wname, $name, $room, $pageHash) = @_;
  327. QRCode_Log3 $name,4,"FWDetail.name=$name";
  328. return QRCode_getHtml($name,AttrVal($name,'qrDisplayNoImage',undef),AttrVal($name,'qrDisplayNoText',undef));
  329. }
  330. 1;
  331. #======================================================================
  332. #======================================================================
  333. #
  334. # HTML Documentation for help and commandref
  335. #
  336. #======================================================================
  337. #======================================================================
  338. =pod
  339. =item device
  340. =item summary create and display QRCode in FHEMWEB
  341. =item summary_DE QRCode erzeugen und in FHEMWEB darstellen
  342. =begin html
  343. <a name="QRCode"></a>
  344. <h3>QRCode</h3>
  345. <ul>
  346. Devices of this module are used to generate an URL that will be used to generate
  347. and receive a QRCode from the service of TEC-IT<br/>
  348. The device will also display the generated QRCode in the device details. It can
  349. also provide the HTML-code used for display for other purposes (e.g. weblink devices)
  350. <br/><br/>
  351. <b>ATTENTION:</b>The sevice provider does not allow more than 30 QRCode generations / minute
  352. without special permission<br/><br/>
  353. See terms of sevice on TEC-IT homepage: http://qrcode.tec-it.com/de#TOS
  354. <br/><br/>
  355. <a name="QRCodedefine"></a>
  356. <b>Define</b><br/>
  357. <ul>
  358. <code>define &lt;name&gt; QRCode</code>
  359. <br/><br/>
  360. </ul>
  361. <br/>
  362. <a name="QRCodeset"></a>
  363. <b>Set</b><br/>
  364. <ul>
  365. <code>set &lt;name&gt; update</code><br/>
  366. Refreshes the QRCode-URL for Image generation.
  367. </ul>
  368. <br/>
  369. <a name="QRCodeattr"></a>
  370. <b>Attributes</b><br/><br/>
  371. <ul>
  372. <b>QRCode-URL relevant attributes</b>
  373. <br/><br/>
  374. The following attributes take influence on the QRCode generation.
  375. <br/><br/>
  376. If one of those attributes is changed, per default an auto update of the QRCode-URL is performed.
  377. <br/><br/>
  378. <li><a name="qrData">qrData</a><br/>
  379. This attribute is used to set the data that will be encoded in the QRCode.<br/>
  380. If this attribute is not set an error message is generatet.
  381. <br/><br/>
  382. </li>
  383. <li><a name="qrSize">qrSize</a><br/>
  384. Defines the size of the generated QRCode image<br/>
  385. Possible values are small, medium (default), large.
  386. <br/><br/>
  387. </li>
  388. <li><a name="qrResolutionDPI">qrResolutionDPI</a><br/>
  389. Defines the resolution for QRCode generaation<br/>
  390. Valid values are between 96 and 600 (Default is 300dpi)
  391. <br/><br/>
  392. </li>
  393. <li><a name="qrColor">qrColor</a><br/>
  394. Defines the foreground color of the genereted QRCode image<br/>
  395. This is a RGB color value in hex format (eg. FF0000 = red)
  396. Default is 000000 (black)
  397. <br/><br/>
  398. </li>
  399. <li><a name="qrBackColor">qrBackColor</a><br/>
  400. Defines the background color of the genereted QRCode image<br/>
  401. This is a RGB color value in hex format (eg. 0000FF = blue)
  402. Default is FFFFFF (white).
  403. <br/><br/>
  404. </li>
  405. <li><a name="qrTransparent">qrTransparent</a><br/>
  406. Defines that the background of the generated QRCode will be transparent<br/>
  407. Possible values are False (non-tranparent background) or True (transparent background)<br/>
  408. default is non-transparent.
  409. <br/><br/>
  410. </li>
  411. <li><a name="qrQuietZone">qrQuietZone</a><br/>
  412. defines the size of a quiet zone around the QRCode in the image.<br/>
  413. This is a blank zone making it easier to scan the QRCode for some scanners.<br/>
  414. Default ist 0, if attribute is not set.
  415. <br/><br/>
  416. </li>
  417. <li><a name="qrQuietUnit">qrQuietUnit</a><br/>
  418. specifies the unit for qrQuietZone attribute<br/>
  419. Possible values are mm (default), in (=inch), mil (=mils), mod (=Module) or px (=Pixel).
  420. <br/><br/>
  421. </li>
  422. <li><a name="qrCodepage">qrCodepage</a><br/>
  423. Used Codepage for QRCode generation.<br/>
  424. Possible values are UTF8 (default), Cyrillic or Ansi
  425. <br/><br/>
  426. </li>
  427. <li><a name="qrErrorCorrection">qrErrorCorrection</a><br/>
  428. Error correction used in generated QRCode image.<br/>
  429. Possible values are L (default), M,Q or H
  430. <br/><br/>
  431. </li>
  432. <b>Display relevant attributes</b>
  433. <br/><br/>
  434. The followin Attribute change the behaviour and display parameters for the detail view<br/>
  435. of QRCode devices in FHEMWEB. Therfore it changes the result of QRCode_getHtml function<br/>
  436. (see below.)<br/><br/>
  437. In cas of an error, neither QRCode, nor qrDisplayText will be displayed. Instead<br/>
  438. an error message is displayed.
  439. <br/><br/>
  440. <li><a name="qrDisplayWidth">qrDisplayWidth</a><br/>
  441. display width of the QRCode image<br/>
  442. Default is 200
  443. <br/><br/>
  444. </li>
  445. <li><a name="qrDisplayHeigth">qrDisplayHeight</a><br/>
  446. Display height of the QRCode image<br/>
  447. Default is 200
  448. <br/><br/>
  449. </li>
  450. <li><a name="qrDisplayData">qrDisplayData</a><br/>
  451. If set the contents or the reading data is displayed below the QRCode image<br/>
  452. Usually this is the contents of attribute qrData.
  453. <br/><br/>
  454. </li>
  455. <li><a name="qrDisplayNoImage">qrDisplaNoImage</a><br/>
  456. If set, the QRCode image will not be displayed
  457. <br/><br/>
  458. </li>
  459. <li><a name="qrDisplayText">qrDisplaText</a><br/>
  460. user defined text to be displayed below QRCode image
  461. <br/><br/>
  462. </li>
  463. <li><a name="qrDisplayNoText">qrDisplaNoText</a><br/>
  464. If this attribute is set, the text specified in qrDisplayText will not be displayed<br/>
  465. below QRCode image. So qrDisplayText doesn't have to be deleted.
  466. <br/><br/>
  467. </li>
  468. <li><a name="qrNoAutoUpdate">qrNoAutoUpdate</a><br/>
  469. If set not auto update will be processed for QRCode relevant attributes.
  470. <br/><br/>
  471. </li>
  472. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  473. </ul>
  474. <br/><br/>
  475. <a name="QRCodereadings"></a>
  476. <b>Generated Readings</b>
  477. <br/><br/>
  478. <ul>
  479. <br/>
  480. <li>data<br/>
  481. This reading contains the data to be encoded by the QRCode<br/>
  482. Usually this is the contents of attribute qrData.<br/>
  483. In case of an error it contains the error message.
  484. <br/><br/>
  485. </li>
  486. <li>qrcode_url<br/>
  487. By <code>set update</code> generated URL, used to get the QRCode image<br/>
  488. <br/><br/>
  489. </li>
  490. <li>state<br/>
  491. The state of the device<br/>
  492. Initially this is <code>defined</code> or the timestamp of last <code>set update</code>, or auto-update
  493. <br/><br/>
  494. </li>
  495. </ul>
  496. <br/><br/>
  497. <a name="QRCodefunctions"></a>
  498. <b>Usefull Funktionen</b>
  499. <br/><br/>
  500. The module comes with a useful function to provide the HTML code used for display in detail view of the<br/>
  501. QRCode device in FHEMWEB for other purposes, e.g. weblink.
  502. <br/><br/>
  503. <ul>
  504. <br/>
  505. <li><code>QRCode_getHtml($;$$)</code><br/><br/>
  506. Returns the HTML code for the specified QRCode device
  507. <br/><br/>
  508. Arguments:
  509. <br/><br/>
  510. <ul>
  511. <li>QRCodeDevice<br/>
  512. Name of the QRCode device as a string.
  513. </li>
  514. <li>noImage (Optional)<br/>
  515. The same as attribute qrDisplayNoImage<br/>
  516. </li>
  517. <li>noText (Optional)<br/>
  518. The same as attribute qrDisplayNoText<br/>
  519. </li>
  520. </ul>
  521. <br/><br/>
  522. Example:
  523. <br/><br/>
  524. <code>QRCode_getHtml('MyQRCode',1,0)</code>
  525. <br/><br/>
  526. Generate HTML code of (QRCode-) device named MyQRCode with QRCode image but not with the<br/>
  527. user defined Text (qrDisplayText).
  528. </li>
  529. </ul>
  530. </ul>
  531. =end html
  532. =begin html_DE
  533. <a name="QRCode"></a>
  534. <h3>QRCode</h3>
  535. <ul>
  536. Mit hilfe dieses Moduls, kann auf einfache Weise eine URL generiert werden, mit
  537. der vom Dienstleister TEC-IT ein QRCode abgerufen werden kann.<br/>
  538. Ein Device dieses Moduls kann außerdem den QRCode auch selbst direkt in FHEMWEB
  539. darstellen und auch anderen Devices (bspw. weblink) als HTML zur Verfügung stellen.
  540. <br/><br/>
  541. <b>HINWEIS:</b> Es ist ohne schriftliche Genehmigung des Dienstaanbieters nur erlaubt,
  542. maximal 30 QRCode-Abrufe / Minute durchzuführen.<br/><br/>
  543. Siehe dazu auch die Nutzungsbedingungen von TEC-IT: http://qrcode.tec-it.com/de#TOS
  544. <br/><br/>
  545. <a name="QRCodedefine"></a>
  546. <b>Define</b><br/>
  547. <ul>
  548. <code>define &lt;name&gt; QRCode</code>
  549. <br/><br/>
  550. </ul>
  551. <br/>
  552. <a name="QRCodeset"></a>
  553. <b>Set</b><br/>
  554. <ul>
  555. <code>set &lt;name&gt; update</code><br/>
  556. Führt eine aktualisierung der QRCode-Url durch.
  557. </ul>
  558. <br/>
  559. <a name="QRCodeattr"></a>
  560. <b>Attributes</b><br/><br/>
  561. <ul>
  562. <b>QRCode-URL-relevante Attribute</b>
  563. <br/><br/>
  564. Die folgenden Attribute sind für die Erzeugung der Abruf-URL relevant und haben somit<br/>
  565. direkten Einfluß auf die Erzeugung des QRCode-Images.<br/><br/>
  566. Für diese Attribute wird bei Änderung, standardmäßig ein automatisches Udate der QRCode-URL<br/>
  567. durchgeführt. Dies kann durch setzen des Attirbutes qrNoAutoUpdate (s.w.u.) deaktiviert werden.
  568. <br/><br/>
  569. <li><a name="qrData">qrData</a><br/>
  570. Dieses Attribut legt die Daten fest, die im QRCode kodiert werden sollen.<br/>
  571. Ist dieses Attribut nicht gesetzt, wird beim update eine entsprechende
  572. Fehlermeldung erzeugt.
  573. <br/><br/>
  574. </li>
  575. <li><a name="qrSize">qrSize</a><br/>
  576. Dieses Attribut legt die Größe fest, in der das QRCode-Image erstellt werden
  577. soll.<br/> Mögliche Ausprägungen sind small, medium (default), large.
  578. <br/><br/>
  579. </li>
  580. <li><a name="qrResolutionDPI">qrResolutionDPI</a><br/>
  581. Dieses Attribut legt die Auflösung fest, in der das QRCode-Image erstellt werden
  582. soll.<br/> Mögliche Werte liegen zwischen 96 und 600 (Default ist 300dpi)
  583. <br/><br/>
  584. </li>
  585. <li><a name="qrColor">qrColor</a><br/>
  586. Dieses Attribut legt die Vordergrundfarbe fest, in der das QRCode-Image erstellt werden
  587. soll.<br/> Der Wert ist ein RGB-Farbwert in Hexadezimaler schreibweise (Bspw. FF0000 für rot)
  588. Default ist 000000 (schwarz)
  589. <br/><br/>
  590. </li>
  591. <li><a name="qrBackColor">qrBackColor</a><br/>
  592. Dieses Attribut legt die Hintergrundfarbe fest, in der das QRCode-Image erstellt werden
  593. soll.<br/> Der Wert ist ein RGB-Farbwert in Hexadezimaler schreibweise (Bspw. 0000FF für blau)
  594. Default ist FFFFFF (weiß).
  595. <br/><br/>
  596. </li>
  597. <li><a name="qrTransparent">qrTransparent</a><br/>
  598. Dieses Attribut legt fest, ob der Hintergrund transparent sein soll.<br/>
  599. Mögliche Werte sind True für transparenten Hintergrund und False für nicht-transparenten
  600. Hintergrund (default)
  601. <br/><br/>
  602. </li>
  603. <li><a name="qrQuietZone">qrQuietZone</a><br/>
  604. Über diesen Wert kann eine Ruhe-Zone, also ein Rand um den eigentlichen QRCode festgelegt
  605. werden.<br/> Dies ermöglicht ggf. ein erleichtertes Erfassen des QRCodes beim Scannen.<br/>
  606. Mögliche Werte sind positive numerische Werte. Default ist 0, wenn das Attribut nicht gesetzt ist.
  607. <br/><br/>
  608. </li>
  609. <li><a name="qrQuietUnit">qrQuietUnit</a><br/>
  610. Über diesen Wert kann die Maßeinheit für das Festlegen einer Ruhe-Zone eingestellt werden.<br/>
  611. Mögliche Ausptägungen sind mm (default), in (=inch), mil (=mils), mod (=Module) oder px (=Pixel).
  612. <br/><br/>
  613. </li>
  614. <li><a name="qrCodepage">qrCodepage</a><br/>
  615. Über diesen Wert kann die Zeichentabelle für die QRCode-Erzeugung festgelegt werden.<br/>
  616. Mögliche Werte sind UTF8 (default), Cyrillic oder Ansi
  617. <br/><br/>
  618. </li>
  619. <li><a name="qrErrorCorrection">qrErrorCorrection</a><br/>
  620. Über diesen Wert kann Fehlerkorrektur für die QRCode-Erzeugung festgelegt werden.<br/>
  621. Mögliche Werte sind L (default), M,Q oder H
  622. <br/><br/>
  623. </li>
  624. <b>darstellungsrelevante Attribute</b>
  625. <br/><br/>
  626. Die folgenden Attribute haben nur Einfluß auf das Verhalten und die Darstellung in FHEMWEB<br/>
  627. in der Deatailansicht des QRCode-Devices, bzw. beim Abruf der HTML-Daten mittels
  628. QRCode_getHtml (s.u.)<br/><br/>
  629. Im Fehlerfall wird weder der QRCode, noch qrDisplayText dargestellt, sondern eine entsprechend<br/>
  630. Fehlermeldung stattdessen eingeblendet.
  631. <br/><br/>
  632. <li><a name="qrDisplayWidth">qrDisplayWidth</a><br/>
  633. Breite des Images bei der Darstellung in FHEMWEB in der Detailübersicht<br/>
  634. Default ist 200
  635. <br/><br/>
  636. </li>
  637. <li><a name="qrDisplayHeigth">qrDisplayHeight</a><br/>
  638. Höhe des Images bei der Darstellung in FHEMWEB in der Detailübersicht<br/>
  639. Default ist 200
  640. <br/><br/>
  641. </li>
  642. <li><a name="qrDisplayData">qrDisplayData</a><br/>
  643. Wenn dieses Attribut gesetzt ist, wird unterhalb des QRCodes der Datenteil als einfacher<br/>
  644. Text dargestellt.
  645. <br/><br/>
  646. </li>
  647. <li><a name="qrDisplayNoImage">qrDisplaNoImage</a><br/>
  648. Wenn dieses Attribut gesetzt ist, der QRCode nicht in der Detailansicht dargestellt.
  649. <br/><br/>
  650. </li>
  651. <li><a name="qrDisplayText">qrDisplaText</a><br/>
  652. Hier kann ein beliebiger Text eingetragen werden, der unterhalb des QRCodes eingeblendet werden soll.
  653. <br/><br/>
  654. </li>
  655. <li><a name="qrDisplayNoText">qrDisplaNoText</a><br/>
  656. Ist dieses Attribut gesetzt, so wird der, im Attribut qrDisplayText eingetragene Text nicht
  657. eingeblendet, auch ohne das Attribut qrDisplayText zu löschen.
  658. <br/><br/>
  659. </li>
  660. <li><a name="qrNoAutoUpdate">qrNoAutoUpdate</a><br/>
  661. Ist dieses Attribut gesetzt, so wird bei Änderung eines für die QRCode-Erzeugung relevanten<br/>
  662. Attributs kein automatisches Update der QRCode-URL durchgeführt.
  663. <br/><br/>
  664. </li>
  665. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  666. </ul>
  667. <br/><br/>
  668. <a name="QRCodereadings"></a>
  669. <b>Erzeugte Readings</b>
  670. <br/><br/>
  671. <ul>
  672. <br/>
  673. <li>data<br/>
  674. Dieses Reading enthält die vom QRCode zu kodierenden Daten.<br/>
  675. Das ist im Normalfall der Inhalt aus dem Attribut qrData.<br/>
  676. Im Fehlerfall steht hier stattdessen der entsprechende Fehlertext.
  677. <br/><br/>
  678. </li>
  679. <li>qrcode_url<br/>
  680. Dies ist die durch <code>set update</code> erzeugte URL, die für den Abruf des QRCode-Image<br/>
  681. verwendet wird.
  682. <br/><br/>
  683. </li>
  684. <li>state<br/>
  685. Status des QRCode-Device.<br/>
  686. Das ist entweder <code>defined</code>, oder der Zeitpunkt des letzten <code>set update</code>, bzw. auto-update
  687. <br/><br/>
  688. </li>
  689. </ul>
  690. <br/><br/>
  691. <a name="QRCodefunctions"></a>
  692. <b>Enthaltene Funktionen</b>
  693. <br/><br/>
  694. Es gibt im Modul eine Funktion, die auch für andere Anwendungsfälle einsetzbar ist, wie bspw. in einem weblink
  695. <br/><br/>
  696. <ul>
  697. <br/>
  698. <li><code>QRCode_getHtml($;$$)</code><br/><br/>
  699. Die Funktion gibt den HTML-Code zurück, wie er auch für die Darstellung im QRCode-Device in der<br/>
  700. Detail-Ansicht verwendet wird.
  701. <br/><br/>
  702. Parameter:
  703. <br/><br/>
  704. <ul>
  705. <li>QRCodeDevice<br/>
  706. Hier ist der Name des QRCode-Devices anzugeben, dessen HTML-Code abgerufen werden soll.
  707. </li>
  708. <li>noImage (Optional)<br/>
  709. Entspricht dem Attribut qrDisplayNoImage<br/>
  710. Wenn dieser Parameter angezeigt wird, wird also keine Referenz auf QRCode-Image im HTML-Code<br/>
  711. erzeugt.
  712. </li>
  713. <li>noText (Optional)<br/>
  714. Entspricht dem Attribut qrDisplayNoText<br/>
  715. Wenn dieser Parameter angezeigt wird, wird also Benutzerdefinierter Text unterhalb des QRCode<br/>
  716. im HTML-Code erzeugt.
  717. </li>
  718. </ul>
  719. <br/><br/>
  720. Beispiel:
  721. <br/><br/>
  722. <code>QRCode_getHtml('MyQRCode',1,0)</code>
  723. <br/><br/>
  724. Damit wird der HTML-Code für das (QRCode-)Device MyQRCode abgerufen, das nur das Image enthält,<br>
  725. aber nicht den Benutzerdefinierten text.
  726. </li>
  727. </ul>
  728. </ul>
  729. =end html_DE
  730. =cut