99_TXT.pm 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. ################################################################################
  2. # 99 TXT
  3. # Feedback: http://groups.google.com/group/fhem-users
  4. # TXT WEBINTERFACE
  5. #
  6. # Feedback: http://groups.google.com/group/fhem-users
  7. # Autor: Axel Rieger fhem[bei]anax.info
  8. # Stand: 05.07.2012
  9. # Version: 1.0
  10. #
  11. ################################################################################
  12. # Usage:
  13. # Values seperated by Semikolon
  14. # FHEM-BASE-URL: http://<MyFHEM-IP>/FHEM/
  15. # # Info returns FHEM&FHEMTXT Version -> /TXT/INFO
  16. #
  17. # /TXT -> Lists alle Devices with <DeviceName>;<DEVCIE-TYPE>;<ROOM>;<STATE>
  18. #
  19. # Devices By Type
  20. # /TXT/TYPE/<DeviceType> -> <DeviceName>;<STATE>
  21. #
  22. # Devices By ROOM
  23. # /TXT/ROOM -> Lists All Rooms <ROOM-NAME>
  24. # /TXT/ROOM/<ROOM-NAME> -> <DeviceName>;<DEVCIE-TYPE>;<ROOM>;<STATE>
  25. #
  26. # Devices ALL / By Name
  27. # /TXT/DEFS -> List alls Devices <DEVICE-NAME>;<STATE>
  28. # /TXT/DEFS/<DEVICE-NAME> ->
  29. # READ = READINGS -> READ;<READINGS-NAME>;<VALUE>;<TIMESTAMP>
  30. # ATTR = Attributes -> ATTR;<ATTR-NAME>;<VALUE>
  31. # INT = Internals -> INT;<NAME>;<VALUE>
  32. # /TXT/DEFS/<DEVICE-NAME>/READINGS -> READINGS <READINGS-NAME>;<VALUE>;<TIMESTAMP>
  33. # /TXT/DEFS/<DEVICE-NAME>/ATTR -> Attributes <ATTR-NAME>;<VALUE>
  34. # /TXT/DEFS/<DEVICE-NAME>/INT -> Internals <NAME>;VALUE>
  35. #
  36. # FHEM-Commands
  37. # /TXT/CMD/<command>;<parameters>
  38. # Values seperated by Semikolon
  39. # Returns OK if Command has no Output
  40. # Otherwise Command-Output
  41. # TXT-Commands
  42. # Test returns 1 -> /TXT/CMD/TEST
  43. # List all FHEM CMDs -> /TXT/CMD/ALL
  44. # State for DeviceList -> /TXT/CMD/LIST_STATE
  45. # DeviceList: <Device01>;<Device01>;<Device03>... -> Returns: <STATE01>;<STATE02>;<STATE03>;...
  46. ################################################################################
  47. package main;
  48. use strict;
  49. use warnings;
  50. use vars qw(%data);
  51. #-------------------------------------------------------------------------------
  52. sub TXT_Initialize($)
  53. {
  54. my ($hash) = @_;
  55. # CGI
  56. my ($name,$fhem_url);
  57. $name = "TXT";
  58. $fhem_url = "/" . $name ;
  59. $data{FWEXT}{$fhem_url}{FUNC} = "TXT_CGI";
  60. $data{FWEXT}{$fhem_url}{LINK} = $name;
  61. $data{FWEXT}{$fhem_url}{NAME} = $name;
  62. # Lookup URI -> CallBack-Funktion
  63. $data{T9X9T}{DEFS}{FUNC} = "txt_uri_defs";
  64. $data{T9X9T}{TYPE}{FUNC} = "txt_uri_type";
  65. $data{T9X9T}{ROOM}{FUNC} = "txt_uri_room";
  66. $data{T9X9T}{CMD}{FUNC} = "txt_uri_cmd";
  67. $data{T9X9T}{INFO}{FUNC} = "txt_uri_info";
  68. # Eigene Commands
  69. $data{T9X9T}{CMD}{EXEC}{ALL} = "exec_all";
  70. $data{T9X9T}{CMD}{EXEC}{TEST} = "exec_test";
  71. $data{T9X9T}{CMD}{EXEC}{LIST_STATE} = "exec_list_state";
  72. return undef;
  73. }
  74. #-------------------------------------------------------------------------------
  75. sub TXT_CGI() {
  76. my ($htmlarg) = @_;
  77. Log 5, "TXT HTMLARG $htmlarg";
  78. my ($ret_html,$uri,$callback);
  79. # Remove trailing slash
  80. $htmlarg =~ s/\/$//;
  81. # $ret_html = "TXT HTMLARG $htmlarg";
  82. my @params = split(/\//,$htmlarg);
  83. $uri = undef;
  84. if($params[2]) {
  85. $uri = $params[2];
  86. if (defined($data{T9X9T}{$uri}{FUNC})) {
  87. $callback = $data{T9X9T}{$uri}{FUNC};
  88. $htmlarg =~ s/TXT\///;
  89. no strict "refs";
  90. # Call Function
  91. Log 5,"TXT URI-DISPATCHER -> $uri";
  92. $ret_html = &$callback($htmlarg);
  93. use strict "refs";
  94. }
  95. else {$ret_html = "ERROR;URI_NOT_FOUND;" . $uri;}
  96. }
  97. else {
  98. # Lists alle Devices with <DeviceName>;<DEVCIE-TYPE>;<ROOM>;<STATE>
  99. foreach my $d (sort keys %defs) {
  100. $ret_html .= $d . ";" ;
  101. $ret_html .= $defs{$d}{TYPE} . ";" ;
  102. if(defined($attr{$d}{ROOM})) {$ret_html .= $attr{$d}{ROOM} . ";" ;}
  103. else {$ret_html .= ";";}
  104. $ret_html .= $defs{$d}{STATE} . "\n" ;
  105. }
  106. }
  107. return ("text/plain; charset=ISO-8859-1", $ret_html);
  108. }
  109. #-------------------------------------------------------------------------------
  110. sub txt_uri_defs() {
  111. my ($params) = @_;
  112. my $ret;
  113. my @args = split(/\//,$params);
  114. # $ret .= "ARG-COUNT: " . @args . "\n";
  115. # $ret .= "ARG-VALUE: " . join(";",@args) . "\n";
  116. my $def_name = "xxx";
  117. if(int(@args) > 2) {
  118. $def_name = $args[2];
  119. if(!defined($defs{$def_name})) {
  120. $ret .= "ERROR;DEVICE_NOT_FOUND;$def_name\n";
  121. return $ret;
  122. }
  123. }
  124. # Show All Devices with STATE
  125. if($params =~ m/^\/DEFS$/) {
  126. # List alle Device Names
  127. foreach my $d (sort keys %defs) {
  128. $ret .= "$d;" . $defs{$d}{STATE} . "\n";
  129. }
  130. }
  131. # List alle READINGS
  132. elsif($params =~ m/^\/DEFS.*\/READ/) {
  133. $ret .= &txt_uri_defs_readings($def_name);
  134. }
  135. # List alle ATTRIBUTES
  136. elsif($params =~ m/^\/DEFS.*\/ATTR/) {
  137. $ret .= &txt_uri_defs_attributes($def_name);
  138. }
  139. elsif($params =~ m/^\/DEFS.*\/INT/) {
  140. $ret .= &txt_uri_defs_internals($def_name);
  141. }
  142. else {
  143. $ret .= "###READINGS\n";
  144. $ret .= &txt_uri_defs_readings($def_name);
  145. $ret .= "###ATTR\n";
  146. $ret .= &txt_uri_defs_attributes($def_name);
  147. $ret .= "###INT\n";
  148. $ret .= &txt_uri_defs_internals($def_name);
  149. }
  150. return $ret;
  151. }
  152. #-------------------------------------------------------------------------------
  153. sub txt_uri_defs_readings() {
  154. my ($d) = @_;
  155. my $ret;
  156. foreach my $r (sort keys %{$defs{$d}{READINGS}}) {
  157. $ret .= $r . ";" . $defs{$d}{READINGS}{$r}{VAL} . ";" . $defs{$d}{READINGS}{$r}{TIME} . "\n";
  158. }
  159. return $ret;
  160. }
  161. #-------------------------------------------------------------------------------
  162. sub txt_uri_defs_attributes() {
  163. my ($d) = @_;
  164. my $ret;
  165. foreach my $a (sort keys %{$attr{$d}}) {
  166. $ret .= $a . ";" . $attr{$d}{$a} . "\n";
  167. }
  168. return $ret;
  169. }
  170. #-------------------------------------------------------------------------------
  171. sub txt_uri_defs_internals() {
  172. my ($d) = @_;
  173. my $ret;
  174. foreach my $i (sort keys %{$defs{$d}}) {
  175. next if($i eq "READINGS");
  176. $ret .= $i . ";" . $defs{$d}{$i} . "\n";
  177. }
  178. return $ret;
  179. }
  180. #-------------------------------------------------------------------------------
  181. sub txt_uri_type() {
  182. my ($params) = @_;
  183. my @args = split(/\//,$params);
  184. my ($type,$d,$ret);
  185. if(int(@args) > 2) {
  186. $type = $args[2];
  187. foreach $d (sort keys %defs ) {
  188. next if(IsIgnored($d));
  189. next if($defs{$d}{TYPE} ne $type);
  190. $ret .= $d . ";" . $defs{$d}{STATE} . "\n";
  191. }
  192. return $ret;
  193. }
  194. # List all Types
  195. my %types;
  196. foreach $d (sort keys %defs ) {
  197. next if(IsIgnored($d));
  198. $types{$defs{$d}{TYPE}}{$d} = 1;
  199. }
  200. foreach my $k (sort keys %types) {
  201. $ret .= $k . "\n";
  202. }
  203. return $ret;
  204. }
  205. #-------------------------------------------------------------------------------
  206. sub txt_uri_room() {
  207. my ($params) = @_;
  208. my @args = split(/\//,$params);
  209. my ($ret,$room,$d,$r);
  210. # Get All Rooms
  211. my (%rooms,$dev_room);
  212. foreach my $d (keys %defs ) {
  213. next if(IsIgnored($d));
  214. if (!$attr{$d}{room}) {
  215. $dev_room = "Default";
  216. }
  217. else {
  218. $dev_room = $attr{$d}{room};
  219. }
  220. Log 5,"TXT ROOM: $d:" . $dev_room;
  221. foreach my $r (split(",", $dev_room)) {
  222. $rooms{$r}{$d} = 1;
  223. }
  224. }
  225. # List Devices in ROOM yxz with STATE
  226. if(int(@args) > 2) {
  227. $room = $args[2];
  228. if(defined($rooms{$room})){
  229. foreach $d (sort keys %{$rooms{$room}}) {
  230. $ret .= $d . ";" . $defs{$d}{STATE} . "\n";
  231. }
  232. return $ret;
  233. }
  234. else {return "ERROR;ROOM_NOT_FOUND;" . $room;}
  235. }
  236. # List alle Rooms
  237. foreach $r (sort keys %rooms) {
  238. $ret .= $r . "\n";
  239. }
  240. return $ret;
  241. }
  242. #-------------------------------------------------------------------------------
  243. sub txt_uri_cmd() {
  244. my ($params) = @_;
  245. my @args = split(/\//,$params);
  246. my ($ret,$cmd,$cmd_ret);
  247. $cmd = $args[2];
  248. if ($cmd =~ m/\%20/) { $cmd =~ s/\%20/ /g}
  249. if ($cmd =~ m/;/) { $cmd =~ s/;/ /g}
  250. if ($cmd =~ m/\%25/) { $cmd =~ s/\%25/\%/g}
  251. Log 5,"TXT CMD " . $cmd;
  252. if(defined $data{T9X9T}{CMD}{EXEC}{$cmd}) {
  253. Log 5,"TXT EXEC " . $params;
  254. my $callback = $data{T9X9T}{CMD}{EXEC}{$cmd};
  255. no strict "refs";
  256. # Call Function
  257. $ret = &$callback($params);
  258. use strict "refs";
  259. return $ret;
  260. }
  261. # Excute FHEM-Command
  262. $cmd_ret = fhem "$cmd";
  263. if (!$cmd_ret) {
  264. $ret = "OK" ;
  265. } else {
  266. $ret = "$cmd_ret"
  267. }
  268. $ret .= "\n";
  269. return $ret;
  270. }
  271. #-------------------------------------------------------------------------------
  272. sub exec_all() {
  273. # List all FHEM CMDs
  274. my $ret = "";
  275. foreach my $c (sort keys %{cmds}) {
  276. $ret .= $c . "\n";
  277. }
  278. return $ret;
  279. }
  280. #-------------------------------------------------------------------------------
  281. sub exec_list_state() {
  282. # List State for Device Array
  283. my ($params) = @_;
  284. # STATE/CMD/LIST_STATE/def1;def2
  285. my ($ret,@args,@defs,$d);
  286. @args = split(/\//,$params);
  287. @defs = split(/;/,$args[$#args]);
  288. Log 5,"TXT EXEC LIST STATE: " . int(@defs);
  289. if(int(@defs) gt 0 ) {
  290. foreach(@defs) {
  291. if(defined($defs{$_})) {
  292. $ret .= $defs{$_}{STATE} . "\n";
  293. }
  294. else { $ret.= "ERROR" . "\n";
  295. }
  296. }
  297. }
  298. return $ret;
  299. }
  300. #-------------------------------------------------------------------------------
  301. sub exec_test() {
  302. return "1" . "\n";
  303. }
  304. #-------------------------------------------------------------------------------
  305. sub txt_uri_info() {
  306. my ($params) = @_;
  307. # my @args = split(/\//,$params);
  308. my($ret,$TXTVersion,$FHEMVersion);
  309. # Version
  310. $TXTVersion = "FHTMTXT:01.07.2012\n";
  311. # FHEM Version
  312. # 5.8 from 2017-02-19 ($Id: fhem.pl 1204 2012-01-22 12:21:05Z rudolfkoenig $)
  313. my @a = split(/\$/,$attr{global}{version});
  314. my @b = split(/\s+/,$a[1]);
  315. $FHEMVersion = "FHEM: " . $b[2] . " " . $b[3];
  316. $ret = $FHEMVersion . "\n";
  317. $ret .= $TXTVersion;
  318. }
  319. #-------------------------------------------------------------------------------
  320. 1;