99_priv_cgi.pm 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. ################################################################################
  2. # FHEM PRIV-CGI
  3. # Stand: 08/2009
  4. # Update:
  5. # 08/2009 ROOMS -> Übersicht aller Räume mit Devices und STATE
  6. # 08/2009 READINGS -> Übersicht aller READIMGS nach Datum -> READING -> Device
  7. # 08/2009 Excute FHEMCommands /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=ATTRIBUTE&val=Value
  8. ################################################################################
  9. #
  10. # Beschreibung
  11. # Es werden lediglich vorhanden Information aus FHEM in eigenen Ansichten/Listen dargestellt.
  12. #
  13. # Ansicht/List
  14. # ALL -> Überblick über alle Devices
  15. # FHT -> Übersicht aller FHT's incl. Programme
  16. # FS20 -> Übersicht alle FS20-Devices
  17. # TH -> Alle Devices (die ich habe) die eine Temperatur oder Luftfeuchte messen (FHT,KS300,HMS,S300TH...)
  18. # ROOMS -> Übersicht aller Räume mit Devices und STATE
  19. # READINGS -> Übersicht aller READINGS; Gruppiert nach Datum -> READING -> Device
  20. # DUMMY -> Überischt aller DUMMY-Devices (als Beispiel für eigene Functionen)
  21. ################################################################################
  22. # Installation
  23. #
  24. # Modul ins FHEM-Modul Verzeichnis kopieren
  25. # entweder FHEM neu starten
  26. # oder "reload 99_priv_cgi.pm"
  27. #
  28. ################################################################################
  29. # Aufruf:
  30. # Bsp.: FHEMWEB => http://localhost:8083/fhem
  31. # PRIV-CGI => http://localhost:8083/fhem/privcgi
  32. #
  33. # Eigene Erweiterungen implementieren:
  34. # Aufruf: http://localhost:8083/fhem/privcgi?Type=FHT&Task=List
  35. # A. Ergänzung LIST-Funktion
  36. # - Eigene Funktion schreiben z.B. sub priv_cgi_my_function($)
  37. # - Eigenen Key festlegen z.B. myKey
  38. # - Function sub priv_cgi_Initialize($) ergänzen $data{$cgi_key}{TASK_LIST}{TYPE}{myKey} = "priv_cgi_my_function";
  39. # - reload 99_priv_cgi.pm
  40. #
  41. # B. Eigene Funktion
  42. # - z.B. MyFunc
  43. # - eigenen Key im HASH $data{$cgi_key}{TASK} erzeugen
  44. # - $data{$cgi_key}{TASK}{MyFunc} = "Function_Aufruf"
  45. ##############################################
  46. package main;
  47. use strict;
  48. use warnings;
  49. use Data::Dumper;
  50. use vars qw(%data);
  51. sub priv_cgi_Initialize($)
  52. {
  53. my $cgi_key = "privcgi";
  54. my $fhem_url = "/" . $cgi_key ;
  55. $data{FWEXT}{$fhem_url}{FUNC} = "priv_cgi_callback";
  56. $data{FWEXT}{$fhem_url}{LINK} = "privcgi";
  57. $data{FWEXT}{$fhem_url}{NAME} = "MyFHEM";
  58. $data{$cgi_key}{QUERY} = {};
  59. # Default: in Case of /privcgi
  60. # Task=List&Type=FHT
  61. $data{$cgi_key}{default}{QUERY} = "Task=List&Type=ALL";
  62. # Dispatcher Functions
  63. # Task = List -> Call Function
  64. $data{$cgi_key}{TASK}{List} = "priv_cgi_list";
  65. # List -> Type -> Call Function
  66. $data{$cgi_key}{TASK_LIST}{TYPE} = {};;
  67. $data{$cgi_key}{TASK_LIST}{TYPE}{ALL} = "priv_cgi_print_all";
  68. $data{$cgi_key}{TASK_LIST}{TYPE}{FHT} = "priv_cgi_print_fht";
  69. $data{$cgi_key}{TASK_LIST}{TYPE}{FS20} = "priv_cgi_print_fs20";
  70. $data{$cgi_key}{TASK_LIST}{TYPE}{TH} = "priv_cgi_print_th";
  71. $data{$cgi_key}{TASK_LIST}{TYPE}{ROOMS} = "priv_cgi_print_rooms";
  72. $data{$cgi_key}{TASK_LIST}{TYPE}{READINGS} = "priv_cgi_print_readings";
  73. # $data{$cgi_key}{TASK_LIST}{TYPE}{DUMMY} = "priv_cgi_print_dummy";
  74. # ExcuteFhemCommands
  75. # /privcgi?EXEC=FHEMCOMMAD&DEVICE&VALUE-1&VALUE-2
  76. # /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=VALUE-1
  77. $data{$cgi_key}{TASK}{EXEC} = "priv_cgi_exec";
  78. }
  79. sub
  80. priv_cgi_callback($$)
  81. {
  82. my ($htmlarg) = @_;
  83. my ($ret_html, $func,$qtask);
  84. my $cgikey = &priv_cgi_get_start($htmlarg);
  85. Log 0, "CGI-KEY: $cgikey";
  86. # Dispatch TASK... choose Function
  87. $qtask = $data{$cgikey}{QUERY}{Task};
  88. $func = $data{$cgikey}{TASK}{$qtask};
  89. Log 0, "Func: $func";
  90. no strict "refs";
  91. # Call Function
  92. $ret_html .= &$func($cgikey);
  93. use strict "refs";
  94. Log 1, "Got $htmlarg";
  95. return ("text/html; charset=ISO-8859-1", $ret_html);
  96. }
  97. sub
  98. priv_cgi_get_start($)
  99. {
  100. my $in = shift;
  101. print "CGI_START: " . Dumper(@_) . "\n";
  102. my (@tmp,$n,$v,$cgikey,$param);
  103. # Aufruf mit oder ohne Argumente
  104. # /privcgi oder /privcgi??Type=FHT&Task=List
  105. if($in =~ /\?/)
  106. {
  107. # Aufruf mit Argumenten: /privcgi?Type=FHT&Task=List
  108. @tmp = split(/\?/, $in);
  109. $cgikey = shift(@tmp);
  110. $cgikey =~ s/\///;
  111. $param = shift(@tmp);
  112. }
  113. else
  114. {
  115. $cgikey = $in;
  116. # Aufruf OHNE Argumenten: /privcgi
  117. $cgikey =~ s/\///;
  118. # Default Werte
  119. $param = $data{$cgikey}{default}{QUERY};
  120. }
  121. # Param nach $data{$cgikey}{QUERY} schreiben
  122. Log 0, "PRIV-CGI: START -> param: " . $param;
  123. @tmp = split(/&/, $param);
  124. foreach my $pair(@tmp)
  125. {
  126. ($n,$v) = split(/=/, $pair);
  127. Log 0, "PRIV-CGI: START -> param: $n - $v";
  128. $data{$cgikey}{QUERY}{$n} = $v;
  129. }
  130. return $cgikey;
  131. }
  132. sub
  133. priv_cgi_html_head($)
  134. {
  135. # HTML-Content for HEAD
  136. my $cgikey = shift;
  137. my $html = "<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01\/\/EN\" \"http:\/\/www.w3.org\/TR\/html4\/strict.dtd\">\n";
  138. $html .= "<html>\n";
  139. $html .= "<head>\n";
  140. $html .= "<style type=\"text/css\"><!--";
  141. $html .= "\#hdr {margin: 0em 0em 1em 0em;padding: 0em 1em;background-color: \#CCCCCC;}";
  142. $html .= "\#left {float: left; width: 15%; padding: 1em;}";
  143. $html .= "\#right {float: left;width: 70%;}";
  144. $html .= "body {font-size: 14px;padding: 0px;margin: 0px;font-family: 'Courier New', Courier, Monospace;";
  145. $html .= "\/\/--><\/style>";
  146. $html .= "<title>FHEM PRIV-CGI<\/title>\n";
  147. $html .= "<\/head>\n";
  148. $html .= "<body>\n";
  149. return $html;
  150. }
  151. sub
  152. priv_cgi_html_body_div_hdr($)
  153. {
  154. # HTML-Content BODY & DIV-ID HDR
  155. my $cgikey = shift;
  156. my $html = "<div id=\"hdr\">";
  157. $html .= "<h3><a href=\"/fhem\">FHEM</a></h3>\n";
  158. $html .= "<p style=\"font-size:8pt;\">";
  159. $html .= $attr{global}{version} . "<br></p>\n";
  160. $html .= "<hr><br>\n";
  161. return $html;
  162. }
  163. sub
  164. priv_cgi_html_div_left($)
  165. {
  166. # HTML-Content BODY & DIV-ID LEFT
  167. my $cgikey = shift;
  168. my $html = "<\/div>";
  169. $html .= "<div id=\"left\">";
  170. $html .= "<h3>Ansichten:<h3>";
  171. $html .= "<form method=\"get\" action=\"\/fhem\/privcgi\" name=\"myfhem\">\n";
  172. $html .= "<select name=\"Type\">\n";
  173. foreach my $d (sort keys %{$data{$cgikey}{TASK_LIST}{TYPE}}) {
  174. $html .= "<option value=\"$d\">$d</option>\n";
  175. }
  176. $html .= "</select>\n";
  177. $html .= "<input name=\"Task\" value=\"List\"type=\"submit\"><br>\n";
  178. $html .= "</form>\n";
  179. $html .= "<\/div>";
  180. return $html ;
  181. }
  182. sub
  183. priv_cgi_list($)
  184. {
  185. my $cgikey = shift;
  186. my $html;
  187. Log 0,"PRIV_CGI_LIST: START";
  188. # HTML-HEAD
  189. $html = &priv_cgi_html_head($cgikey);
  190. # HTML-BODY-DIV-HDR
  191. $html .= &priv_cgi_html_body_div_hdr($cgikey);
  192. # HTML-BODY-DIV-ID-LEFT
  193. $html .= &priv_cgi_html_div_left($cgikey);
  194. my $type = $data{$cgikey}{QUERY}{Type};
  195. Log 0,"PRIV_CGI_LIST: TYPE = " . $type;
  196. my $func = $data{$cgikey}{TASK_LIST}{TYPE}{$type};
  197. Log 0,"PRIV_CGI_LIST: TYPE = $type -> Func -> $func";
  198. no strict "refs";
  199. # Call Function
  200. $html .= &$func;
  201. use strict "refs";
  202. # HTML-BODY-FOOTER
  203. $html .= priv_cgi_html_footer();
  204. return $html;
  205. }
  206. sub
  207. priv_cgi_html_footer()
  208. {
  209. # HTML-BODY Footer
  210. my $html = "<\/body>\n";
  211. $html .= "<\/html>\n";
  212. return $html;
  213. }
  214. sub priv_cgi_print_fs20()
  215. {
  216. my $str = "<table summary=\"List of FS20 devices\">\n";
  217. $str .= "<tr ALIGN=LEFT><th>Name<\/th><th>Model<\/th><th>State<\/th><th>Code<\/th><th>Button<\/th><th>Room<\/th><\/tr>\n";
  218. $str .= "<colgroup>\n";
  219. $str .= "<col width=\"130\"><col width=\"130\"><col width=\"130\"><col width=\"130\">\n";
  220. $str .= "</colgroup>\n";
  221. foreach my $d (sort keys %defs) {
  222. next if($defs{$d}{TYPE} ne "FS20");
  223. $str .= "<tr ALIGN=LEFT><td>" . $d . "<\/td><td>" . $attr{$d}{model} . "<\/td><td>". $defs{$d}{STATE} . "<\/td><td>". $defs{$d}{XMIT} . "<\/td><td>". $defs{$d}{BTN} . "<\/td><td>". $attr{$d}{room} . "<\/td><\/tr>\n";
  224. }
  225. $str .= "<\/table>\n";
  226. return ($str);
  227. }
  228. sub priv_cgi_print_fht()
  229. {
  230. my ($str,@fp);
  231. $str = "<table class=\"Fht\" summary=\"List of fht devices\">\n";
  232. $str .= "<tr ALIGN=LEFT><th>Name<\/th><th>Ventil<\/th><th>Ziel<\/th><th>Aktuell<\/th>" ;
  233. $str .= "<th>Nacht<\/th><th>Tag<\/th><th>Fenster<\/th><th>IODev<\/th><th>Time<\/th><th>CODE<\/th><\/tr>\n";
  234. # Init Tabel FHT-Program
  235. $fp[0] .= "<th></th>";
  236. $fp[1] .= "<td>Montag</td>";
  237. $fp[2] .= "<td></td>";
  238. $fp[3] .= "<td>Dienstag</td>";
  239. $fp[4] .= "<td></td>";
  240. $fp[5] .= "<td>Mittwoch</td>";
  241. $fp[6] .= "<td></td>";
  242. $fp[7] .= "<td>Donnerstag</td>";
  243. $fp[8] .= "<td></td>";
  244. $fp[9] .= "<td>Freitag</td>";
  245. $fp[10] .= "<td></td>";
  246. $fp[11] .= "<td>Samstag</td>";
  247. $fp[12] .= "<td></td>";
  248. $fp[13] .= "<td>Sonntag</td>";
  249. $fp[14] .= "<td></td>";
  250. # actuator desired-temp measured-temp night-temp day-temp windowopen-temp
  251. foreach my $d (sort keys %defs)
  252. {
  253. next if($defs{$d}{TYPE} ne "FHT");
  254. $str .= "<tr ALIGN=LEFT>" ;
  255. $str .= "<td>" . $d . "<\/td>" ;
  256. $str .= "<td>" . $defs{$d}{READINGS}{"actuator"}{VAL} . "<\/td>" ;
  257. $str .= "<td>" . $defs{$d}{READINGS}{"desired-temp"}{VAL} . "<\/td>" ;
  258. $str .= "<td>" . $defs{$d}{READINGS}{"measured-temp"}{VAL} . "<\/td>" ;
  259. $str .= "<td>" . $defs{$d}{READINGS}{"night-temp"}{VAL} . "<\/td>" ;
  260. $str .= "<td>" . $defs{$d}{READINGS}{"day-temp"}{VAL} . "<\/td>" ;
  261. $str .= "<td>" . $defs{$d}{READINGS}{"windowopen-temp"}{VAL} . "<\/td>" ;
  262. $str .= "<td>" . $defs{$d}{IODev}{NAME} . "<\/td>" ;
  263. $str .= "<td>" . $defs{$d}{READINGS}{"actuator"}{TIME} . "<\/td>" ;
  264. $str .= "<td>" . $defs{$d}{CODE} . "<\/td>" ;
  265. $str .= "<\/tr>\n";
  266. # FHT-Programme
  267. no strict "subs";
  268. $fp[0] .= "<th>" . $d . "</th>";
  269. $fp[1] .= "<td>" . $defs{$d}{READINGS}{'mon-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'mon-to1'}{VAL} . "</td>";
  270. $fp[2] .= "<td>" . $defs{$d}{READINGS}{'mon-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'mon-to2'}{VAL} . "</td>";
  271. $fp[3] .= "<td>" . $defs{$d}{READINGS}{'tue-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'tue-to1'}{VAL} . "</td>";
  272. $fp[4] .= "<td>" . $defs{$d}{READINGS}{'tue-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'tue-to2'}{VAL} . "</td>";
  273. $fp[5] .= "<td>" . $defs{$d}{READINGS}{'wed-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'wed-to1'}{VAL} . "</td>";
  274. $fp[6] .= "<td>" . $defs{$d}{READINGS}{'wed-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'wed-to2'}{VAL} . "</td>";
  275. $fp[7] .= "<td>" . $defs{$d}{READINGS}{'thu-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'thu-to1'}{VAL} . "</td>";
  276. $fp[8] .= "<td>" . $defs{$d}{READINGS}{'thu-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'thu-to2'}{VAL} . "</td>";
  277. $fp[9] .= "<td>" . $defs{$d}{READINGS}{'fri-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'fri-to1'}{VAL} . "</td>";
  278. $fp[10] .= "<td>" . $defs{$d}{READINGS}{'fri-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'fri-to2'}{VAL} . "</td>";
  279. $fp[11] .= "<td>" . $defs{$d}{READINGS}{'sat-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'sat-to1'}{VAL} . "</td>";
  280. $fp[12] .= "<td>" . $defs{$d}{READINGS}{'sat-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'sat-to2'}{VAL} . "</td>";
  281. $fp[13] .= "<td>" . $defs{$d}{READINGS}{'sun-from1'}{VAL} . "-" . $defs{$d}{READINGS}{'sun-to1'}{VAL} . "</td>";
  282. $fp[14] .= "<td>" . $defs{$d}{READINGS}{'sun-from2'}{VAL} . "-" . $defs{$d}{READINGS}{'sun-to2'}{VAL} . "</td>";
  283. use strict "subs";
  284. }
  285. $str .= "<\/table>\n";
  286. $str .= "<br>\n";
  287. $str .= "<table>\n";
  288. $str .= "<colgroup>\n";
  289. $str .= "<col width=\"130\"><col width=\"130\"><col width=\"130\"><col width=\"130\">\n";
  290. $str .= "<col width=\"130\"><col width=\"130\"><col width=\"130\"><col width=\"130\">\n";
  291. $str .= "</colgroup>\n";
  292. foreach (@fp) {
  293. $str .= "<tr ALIGN=LEFT>" . $_ . "</tr>\n";
  294. }
  295. $str .= "<\/table>\n";
  296. return ($str);
  297. }
  298. sub priv_cgi_print_dummy()
  299. {
  300. my $str = "<table summary=\"List of Dummy devices\">\n";
  301. $str .= "<colgroup>\n";
  302. $str .= "<col width=\"130\"><col width=\"130\">\n";
  303. $str .= "</colgroup>\n";
  304. $str .= "<tr ALIGN=LEFT><th>Name<\/th><th>State<\/th><\/tr>\n";
  305. foreach my $d (keys %defs) {
  306. next if($defs{$d}{TYPE} ne "dummy");
  307. $str .= "<tr ALIGN=LEFT><td>" . $d . "<\/td><td>". $defs{$d}{STATE} . "<\/td><\/tr>\n";}
  308. $str .= "<\/table>\n";
  309. return ($str);
  310. }
  311. sub priv_cgi_print_th()
  312. {
  313. # List All-Devices with Temp od Humidity
  314. my ($type,$str,$s,$t,$h,$i);
  315. $str = "<table summary=\"List of ALL devices\">\n";
  316. $str .= "<tr ALIGN=LEFT><th>Name</th><th>Temperature</th><th>Humidity</th><th>Information</th><th>Type</th><th>Room</th></tr>";
  317. foreach my $d (sort keys %defs) {
  318. $type = $defs{$d}{TYPE};
  319. next if(!($type =~ m/^(FHT|HMS|KS300|CUL_WS)/));
  320. $t = "";
  321. $h = "";
  322. $i = "";
  323. if ($type eq "FHT"){
  324. $i = $defs{$d}{'READINGS'}{'warnings'}{'VAL'};
  325. $t = $defs{$d}{'READINGS'}{'measured-temp'}{'VAL'};
  326. $t =~ s/\(Celsius\)//;};
  327. if ($type eq "HMS" || $type eq "CUL_WS"){
  328. $i = $defs{$d}{'READINGS'}{'battery'}{'VAL'};
  329. $t = $defs{$d}{'READINGS'}{'temperature'}{'VAL'};
  330. $t =~ s/\(Celsius\)//;
  331. $h = $defs{$d}{'READINGS'}{'humidity'}{'VAL'};
  332. $h =~ s/\(%\)//;};
  333. if ($type eq "KS300"){
  334. $i = "Raining: " . $defs{$d}{'READINGS'}{'israining'}{'VAL'};
  335. $i =~ s/\(yes\/no\)//;
  336. $t = $defs{$d}{'READINGS'}{'temperature'}{'VAL'};
  337. $t =~ s/\(Celsius\)//;
  338. $h = $defs{$d}{'READINGS'}{'humidity'}{'VAL'};
  339. $h =~ s/\(%\)//;};
  340. $str .= "<tr ALIGN=LEFT><td>" . $d . "<\/td><td>". $t . "<\/td><td>". $h . "<\/td><td>". $i . "<\/td><td>". $type . "<\/td><td>". $attr{$d}{room} . "<\/td><\/tr>\n";
  341. }
  342. $str .= "<\/table>\n";
  343. return ($str);
  344. }
  345. sub priv_cgi_print_all()
  346. {
  347. # List All-Devices
  348. my ($type,$str,$s,$t,$h,$i);
  349. $str = "<table summary=\"List of ALL devices\">\n";
  350. $str .= "<tr ALIGN=LEFT><th>Name</th><th>State</th><th>Type</th><th>Model</th><th>Room</th><th>IODev</th></tr>";
  351. foreach my $d (sort keys %defs)
  352. {
  353. $str .= "<tr ALIGN=LEFT><td>" . $d . "<\/td><td>". $defs{$d}{STATE} . "<\/td><td>". $defs{$d}{TYPE} . "<\/td><td>". $attr{$d}{model} . "<\/td><td>". $attr{$d}{room} . "<\/td><td>". $defs{$d}{IODev}{NAME} . "<\/td><\/tr>\n";
  354. }
  355. $str .= "<\/table>\n";
  356. return ($str);
  357. }
  358. sub priv_cgi_print_rooms()
  359. {
  360. my ($str,$r,$d,$ri);
  361. my %rooms = ();
  362. # Quelle 01_FHEMWEB.pm ...
  363. foreach $d (sort keys %defs ) {
  364. foreach my $r (split(",", FW_getAttr($d, "room", "Unsorted"))) {
  365. $rooms{$r}{$d} = $defs{$d}{STATE};}
  366. }
  367. # print Dumper(%rooms);
  368. # Tabelle
  369. # Raum | DEVICE | TYPE | MODELL | STATE
  370. $str = "<table>";
  371. $str .= "<tr ALIGN=LEFT><th>Raum</th><th>Device</th><th>Type</th><th>Model</th><th>State</th></tr>";
  372. foreach $r (sort keys %rooms)
  373. {
  374. $ri = 0;
  375. # $str .= "<tr><td>" . $r . "</td><td></td><td></td><td></td><td></td></tr>\n";
  376. foreach $d (sort keys %{$rooms{$r}}){
  377. if($ri eq 0) {$str .= "<tr bgcolor=\"#CCCCCC\"><td>" . $r . "</td>";}
  378. else {$str .= "<tr><td></td>"}
  379. # $str .= "<tr><td></td><td>" . $d . "</td>";
  380. $str .= "<td>" . $d . "</td>";
  381. $str .= "<td>" . $defs{$d}{TYPE} . "</td>";
  382. $str .= "<td>" . $attr{$d}{model} . "</td>";
  383. $str .= "<td>" . $defs{$d}{STATE} . "</td></tr>\n";
  384. $ri++;
  385. }
  386. }
  387. $str .= "</table>";
  388. return ($str);
  389. }
  390. sub priv_cgi_print_readings()
  391. {
  392. my ($d,$r,$d1,$str,@tmp);
  393. # Übersicht aller READINGS
  394. # Tabelle:
  395. # READING
  396. # DATUM
  397. # DEVICE VALUE TIME
  398. # %reads{DATUM}{READINGS}{DEVICE}{READINGS}{VALUE} = VAL
  399. # %reads{DATUM}{READINGS}{DEVICE}{READINGS}{TIME} = ZEIT
  400. my (%reads,$readings,$datum,$device,$value,$zeit);
  401. foreach $device (sort keys %defs )
  402. {
  403. foreach $r (sort keys %{$defs{$device}{READINGS}})
  404. {
  405. @tmp = split(' ', $defs{$device}{READINGS}{$r}{TIME});
  406. $readings = $r;
  407. $datum = $tmp[0];
  408. $value = $defs{$device}{READINGS}{$r}{VAL};
  409. $zeit = $tmp[1];
  410. $reads{$datum}{$readings}{$device}{$readings}{VALUE} = $defs{$device}{READINGS}{$r}{VAL};
  411. $reads{$datum}{$readings}{$device}{$readings}{TIME} = $zeit;
  412. }
  413. }
  414. $str = "<table>\n";
  415. # Counter
  416. my ($ri,$di);
  417. # Datum
  418. foreach $r (sort keys %reads)
  419. {
  420. # READINGS
  421. $ri = 0;
  422. foreach $d (sort keys %{$reads{$r}})
  423. {
  424. $di = 0;
  425. foreach $d1 (sort keys %{$reads{$r}{$d}})
  426. {
  427. if($ri eq 0){$str .= "<tr bgcolor=\"#CCCCCC\"><td>" . $r . "</td>";}
  428. else{$str .= "<tr><td></td>";}
  429. if($di eq 0) {$str .= "<td>" . $d . "</td>";}
  430. else {$str .= "<td></td>"}
  431. $str .= "<td>" . $d1 . "</td><td>" . $reads{$r}{$d}{$d1}{$d}{VALUE} . "</td><td>" .$reads{$r}{$d}{$d1}{$d}{TIME} . "</td></tr>\n";
  432. $di++;
  433. }
  434. $ri++;
  435. }
  436. }
  437. $str .= "</table>\n";
  438. return ($str);
  439. }
  440. sub
  441. priv_cgi_exec($$)
  442. {
  443. # /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=ATTRIBUTE&val=Value
  444. # Task=EXEC&cmd=set&dev=WaWaZiDATA&attr=active&val=100
  445. # Task=EXEC&cmd=attr&dev=WaWaZiDATA&attr=room&val=PRIVCGIEXEC
  446. Log 0, "PRIVCGIEXEC: @_\n";
  447. my $cgikey = shift;
  448. my $ret_param = "text/plain; charset=ISO-8859-1";
  449. my $ret_txt = undef;
  450. my $cmd = lc($data{$cgikey}{QUERY}{cmd});
  451. my $dev = $data{$cgikey}{QUERY}{dev};
  452. my $attr = $data{$cgikey}{QUERY}{attr};
  453. my $val = $data{$cgikey}{QUERY}{val};
  454. Log 0, "PRIVCGIEXEC: FHEM-Command: $cmd $dev $attr $val\n";
  455. if(!defined($cmds{$cmd}))
  456. {
  457. return ($ret_param, "PRIVCGIEXEC: unkown COMMAND $cmd");
  458. }
  459. if(!defined($defs{$dev}))
  460. {
  461. return ($ret_param, "PRIVCGIEXEC: unknown DEVICE $dev");
  462. }
  463. $ret_txt = AnalyzeCommand(undef, "$cmd $dev $attr $val");
  464. return ($ret_param, $ret_txt);
  465. }
  466. 1;