98_weblink.pm 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. ##############################################
  2. # $Id: 98_weblink.pm 16293 2018-02-28 21:33:57Z rudolfkoenig $
  3. package main;
  4. use strict;
  5. use warnings;
  6. use vars qw($FW_subdir); # Sub-path in URL for extensions, e.g. 95_FLOORPLAN
  7. use vars qw($FW_ME); # webname (default is fhem), used by 97_GROUP/weblink
  8. use vars qw($FW_CSRF); # CSRF Token or empty
  9. use IO::File;
  10. #####################################
  11. sub
  12. weblink_Initialize($)
  13. {
  14. my ($hash) = @_;
  15. $hash->{DefFn} = "weblink_Define";
  16. $hash->{AttrList} =
  17. "disable:0,1 disabledForIntervals htmlattr nodetaillink:1,0";
  18. $hash->{FW_summaryFn} = "weblink_FwFn";
  19. $hash->{FW_detailFn} = "weblink_FwFn";
  20. $hash->{FW_atPageEnd} = 1;
  21. }
  22. #####################################
  23. sub
  24. weblink_Define($$)
  25. {
  26. my ($hash, $def) = @_;
  27. my ($name, $type, $wltype, $link) = split("[ \t]+", $def, 4);
  28. my %thash = ( link=>1, image=>1, iframe=>1, htmlCode=>1,
  29. cmdList=>1,
  30. fileplot=>1, dbplot=>1);
  31. if(!$link || !$thash{$wltype}) {
  32. return "Usage: define <name> weblink [" .
  33. join("|",sort keys %thash) . "] <arg>";
  34. }
  35. if($wltype eq "fileplot" || $wltype eq "dbplot") {
  36. Log3 $name, 1, "Converting weblink $name ($wltype) to SVG";
  37. my $newm = LoadModule("SVG");
  38. return "Cannot load module SVG" if($newm eq "UNDEFINED");
  39. $hash->{TYPE} = "SVG";
  40. $hash->{DEF} = $link;
  41. return CallFn($name, "DefFn", $hash, "$name $type $link");
  42. }
  43. $hash->{WLTYPE} = $wltype;
  44. $hash->{LINK} = $link;
  45. $hash->{STATE} = "initialized";
  46. return undef;
  47. }
  48. #####################################
  49. # FLOORPLAN compat
  50. sub
  51. FW_showWeblink($$$$)
  52. {
  53. my ($d,undef,undef,$buttons) = @_;
  54. if($buttons !~ m/HASH/) {
  55. my %h = (); $buttons = \%h;
  56. }
  57. FW_pO(weblink_FwFn(undef, $d, "", $buttons));
  58. return $buttons;
  59. }
  60. ##################
  61. sub
  62. weblink_FwDetail($@)
  63. {
  64. my ($d, $text, $nobr)= @_;
  65. return "" if(AttrVal($d, "group", "") || AttrVal($d, "nodetaillink", ""));
  66. my $alias = AttrVal($d, "alias", $d);
  67. my $ret = ($nobr ? "" : "<br>");
  68. $ret .= "$text " if($text);
  69. $ret .= FW_pHPlain("detail=$d", $alias) if(!$FW_subdir);
  70. $ret .= "<br>";
  71. return $ret;
  72. }
  73. sub
  74. weblink_FwFn($$$$)
  75. {
  76. my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn.
  77. my $hash = $defs{$d};
  78. my $link = $hash->{LINK};
  79. my $wltype = $hash->{WLTYPE};
  80. my $ret = "";
  81. return "" if(IsDisabled($d));
  82. my $attr = AttrVal($d, "htmlattr", "");
  83. if($wltype eq "htmlCode") {
  84. $link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/s);
  85. $ret = $link;
  86. } elsif($wltype eq "link") {
  87. my $alias = AttrVal($d, "alias", $d);
  88. $ret = "<a href=\"$link\" $attr>$alias</a>"; # no FW_pH, open extra browser
  89. } elsif($wltype eq "image") {
  90. $ret = "<img src=\"$link\" $attr><br>" .
  91. weblink_FwDetail($d);
  92. } elsif($wltype eq "iframe") {
  93. $ret = "<iframe src=\"$link\" $attr>Iframes disabled</iframe>" .
  94. weblink_FwDetail($d);
  95. } elsif($wltype eq "cmdList") {
  96. my @lines = split(" ", $link);
  97. my $row = 1;
  98. $ret = "<table>";
  99. $ret .= "<tr><td><div class='devType'><a href='$FW_ME?detail=$d'>"
  100. . AttrVal($d, "alias", $d)."</a></div></td></tr>";
  101. $ret .= "<tr><td><table class=\"block wide\">";
  102. foreach my $line (@lines) {
  103. my @args = split(":", $line, 3);
  104. $ret .= "<tr class='".(($row++&1)?"odd":"even")."'>";
  105. $ret .= "<td><a href='$FW_ME?cmd=$args[2]$FW_CSRF'><div class='col1'>".
  106. "<img src='$FW_ME/icons/$args[0]' width='19' height='19' ".
  107. "align='center' alt='$args[0]' title='$args[0]'>".
  108. "$args[1]</div></a></td></td>";
  109. $ret .= "</tr>";
  110. }
  111. $ret .= "</table></td></tr>";
  112. $ret .= "</table><br>";
  113. }
  114. return $ret;
  115. }
  116. 1;
  117. =pod
  118. =item helper
  119. =item summary define a HTTP link for the FHEMWEB frontend
  120. =item summary_DE HTTP Link fuer das FHEMWEB Frontend
  121. =begin html
  122. <a name="weblink"></a>
  123. <h3>weblink</h3>
  124. <ul>
  125. <a name="weblinkdefine"></a>
  126. <b>Define</b>
  127. <ul>
  128. <code>define &lt;name&gt; weblink [link|image|iframe|htmlCode|cmdList]
  129. &lt;argument&gt;</code>
  130. <br><br>
  131. This is a placeholder device used with FHEMWEB to be able to add user
  132. defined links.
  133. Examples:
  134. <ul>
  135. <code>
  136. define homepage weblink link http://fhem.de<br>
  137. define webcam_picture weblink image http://w.x.y.z/current.jpg<br>
  138. define interactive_webcam weblink iframe http://w.x.y.z/webcam.cgi<br>
  139. define hr weblink htmlCode &lt;hr&gt<br>
  140. define w_Frlink weblink htmlCode { WeatherAsHtml("w_Frankfurt") }<br>
  141. define systemCommands weblink cmdList
  142. pair:Pair:set+cul2+hmPairForSec+60
  143. restart:Restart:shutdown+restart
  144. update:UpdateCheck:update+check
  145. </code>
  146. </ul>
  147. <br>
  148. Notes:
  149. <ul>
  150. <li>For cmdList &lt;argument&gt; consists of a list of space
  151. separated icon:label:cmd triples.</li>
  152. </ul>
  153. </ul>
  154. <a name="weblinkset"></a>
  155. <b>Set</b> <ul>N/A</ul><br>
  156. <a name="weblinkget"></a>
  157. <b>Get</b> <ul>N/A</ul><br>
  158. <a name="weblinkattr"></a>
  159. <b>Attributes</b>
  160. <ul>
  161. <a name="htmlattr"></a>
  162. <li>htmlattr<br>
  163. HTML attributes to be used for link, image and iframe type of links.
  164. E.g.:<br>
  165. <ul>
  166. <code>
  167. define yw weblink iframe http://weather.yahooapis.com/forecastrss?w=650272&amp;u=c<br>
  168. attr yw htmlattr width="480" height="560"<br>
  169. </code>
  170. </ul></li>
  171. <a name="nodetaillink"></a>
  172. <li>nodetaillink<br>
  173. Show no detail link for the types image and iframe.
  174. </li>
  175. <li><a href="#disable">disable</a></li>
  176. <li><a href="#disabledForIntervals">disabledForIntervals</a></li>
  177. </ul>
  178. <br>
  179. </ul>
  180. =end html
  181. =cut