diff --git a/fhem/contrib/99_TXT.pm b/fhem/contrib/99_TXT.pm new file mode 100755 index 000000000..88c1863d3 --- /dev/null +++ b/fhem/contrib/99_TXT.pm @@ -0,0 +1,318 @@ +################################################################################ +# 99 TXT +# Feedback: http://groups.google.com/group/fhem-users +# TXT WEBINTERFACE +# +################################################################################ +# Usage: +# Values seperated by Semikolon +# FHEM-BASE-URL: http:///FHEM/ +# # Info returns FHEM&FHEMTXT Version -> /TXT/INFO +# +# /TXT -> Lists alle Devices with ;;; +# +# Devices By Type +# /TXT/TYPE/ -> ; +# +# Devices By ROOM +# /TXT/ROOM -> Lists All Rooms +# /TXT/ROOM/ -> ;;; +# +# Devices ALL / By Name +# /TXT/DEFS -> List alls Devices ; +# /TXT/DEFS/ -> +# READ = READINGS -> READ;;; +# ATTR = Attributes -> ATTR;; +# INT = Internals -> INT;; +# /TXT/DEFS//READINGS -> READINGS ;; +# /TXT/DEFS//ATTR -> Attributes ; +# /TXT/DEFS//INT -> Internals ;VALUE> +# +# FHEM-Commands +# /TXT/CMD/; +# Values seperated by Semikolon +# Returns OK if Command has no Output +# Otherwise Command-Output +# TXT-Commands +# Test returns 1 -> /TXT/CMD/TEST +# List all FHEM CMDs -> /TXT/CMD/ALL +# State for DeviceList -> /TXT/CMD/LIST_STATE +# DeviceList: ;;... -> Returns: ;;;... +################################################################################ +package main; +use strict; +use warnings; +use Data::Dumper; +use vars qw(%data); +#------------------------------------------------------------------------------- +sub TXT_Initialize($) +{ + my ($hash) = @_; + # CGI + my ($name,$fhem_url); + $name = "TXT"; + $fhem_url = "/" . $name ; + $data{FWEXT}{$fhem_url}{FUNC} = "TXT_CGI"; + $data{FWEXT}{$fhem_url}{LINK} = $name; + $data{FWEXT}{$fhem_url}{NAME} = $name; + # Lookup URI -> CallBack-Funktion + $data{T9X9T}{DEFS}{FUNC} = "txt_uri_defs"; + $data{T9X9T}{TYPE}{FUNC} = "txt_uri_type"; + $data{T9X9T}{ROOM}{FUNC} = "txt_uri_room"; + $data{T9X9T}{CMD}{FUNC} = "txt_uri_cmd"; + $data{T9X9T}{INFO}{FUNC} = "txt_uri_info"; + + # Eigene Commands + $data{T9X9T}{CMD}{EXEC}{ALL} = "exec_all"; + $data{T9X9T}{CMD}{EXEC}{TEST} = "exec_test"; + $data{T9X9T}{CMD}{EXEC}{LIST_STATE} = "exec_list_state"; + return undef; +} +#------------------------------------------------------------------------------- +sub TXT_CGI() { + my ($htmlarg) = @_; + Log 5, "TXT HTMLARG $htmlarg"; + my ($ret_html,$uri,$callback); + # Remove trailing slash + $htmlarg =~ s/\/$//; + # $ret_html = "TXT HTMLARG $htmlarg"; + my @params = split(/\//,$htmlarg); + $uri = undef; + if($params[2]) { + $uri = $params[2]; + if (defined($data{T9X9T}{$uri}{FUNC})) { + $callback = $data{T9X9T}{$uri}{FUNC}; + $htmlarg =~ s/TXT\///; + no strict "refs"; + # Call Function + Log 5,"TXT URI-DISPATCHER -> $uri"; + $ret_html = &$callback($htmlarg); + use strict "refs"; + } + else {$ret_html = "ERROR;URI_NOT_FOUND;" . $uri;} + } + else { + # Lists alle Devices with ;;; + foreach my $d (sort keys %defs) { + $ret_html .= $d . ";" ; + $ret_html .= $defs{$d}{TYPE} . ";" ; + if(defined($attr{$d}{ROOM})) {$ret_html .= $attr{$d}{ROOM} . ";" ;} + else {$ret_html .= ";";} + $ret_html .= $defs{$d}{STATE} . "\n" ; + } + } + return ("text/plain; charset=ISO-8859-1", $ret_html); +} +#------------------------------------------------------------------------------- +sub txt_uri_defs() { + my ($params) = @_; + my $ret; + my @args = split(/\//,$params); + # $ret .= "ARG-COUNT: " . @args . "\n"; + # $ret .= "ARG-VALUE: " . join(";",@args) . "\n"; + my $def_name = "xxx"; + if(int(@args) > 2) { + $def_name = $args[2]; + if(!defined($defs{$def_name})) { + $ret .= "ERROR;DEVICE_NOT_FOUND;$def_name\n"; + return $ret; + } + } + # Show All Devices with STATE + if($params =~ m/^\/DEFS$/) { + # List alle Device Names + foreach my $d (sort keys %defs) { + $ret .= "$d;" . $defs{$d}{STATE} . "\n"; + } + } + # List alle READINGS + elsif($params =~ m/^\/DEFS.*\/READ/) { + $ret .= &txt_uri_defs_readings($def_name); + } + # List alle ATTRIBUTES + elsif($params =~ m/^\/DEFS.*\/ATTR/) { + $ret .= &txt_uri_defs_attributes($def_name); + } + elsif($params =~ m/^\/DEFS.*\/INT/) { + $ret .= &txt_uri_defs_internals($def_name); + } + else { + $ret .= "###READINGS\n"; + $ret .= &txt_uri_defs_readings($def_name); + $ret .= "###ATTR\n"; + $ret .= &txt_uri_defs_attributes($def_name); + $ret .= "###INT\n"; + $ret .= &txt_uri_defs_internals($def_name); + } + return $ret; +} +#------------------------------------------------------------------------------- +sub txt_uri_defs_readings() { + my ($d) = @_; + my $ret; + foreach my $r (sort keys %{$defs{$d}{READINGS}}) { + $ret .= $r . ";" . $defs{$d}{READINGS}{$r}{VAL} . ";" . $defs{$d}{READINGS}{$r}{TIME} . "\n"; + } + return $ret; + } +#------------------------------------------------------------------------------- +sub txt_uri_defs_attributes() { + my ($d) = @_; + my $ret; + foreach my $a (sort keys %{$attr{$d}}) { + $ret .= $a . ";" . $attr{$d}{$a} . "\n"; + } + return $ret; + } +#------------------------------------------------------------------------------- +sub txt_uri_defs_internals() { + my ($d) = @_; + my $ret; + foreach my $i (sort keys %{$defs{$d}}) { + next if($i eq "READINGS"); + $ret .= $i . ";" . $defs{$d}{$i} . "\n"; + } + return $ret; + } +#------------------------------------------------------------------------------- +sub txt_uri_type() { + my ($params) = @_; + my @args = split(/\//,$params); + my ($type,$d,$ret); + if(int(@args) > 2) { + $type = $args[2]; + foreach $d (sort keys %defs ) { + next if(IsIgnored($d)); + next if($defs{$d}{TYPE} ne $type); + $ret .= $d . ";" . $defs{$d}{STATE} . "\n"; + } + return $ret; + } + # List all Types + my %types; + foreach $d (sort keys %defs ) { + next if(IsIgnored($d)); + $types{$defs{$d}{TYPE}}{$d} = 1; + } + foreach my $k (sort keys %types) { + $ret .= $k . "\n"; + } + return $ret; +} +#------------------------------------------------------------------------------- +sub txt_uri_room() { + my ($params) = @_; + my @args = split(/\//,$params); + my ($ret,$room,$d,$r); + # Get All Rooms + my (%rooms,$dev_room); + foreach my $d (keys %defs ) { + next if(IsIgnored($d)); + if (!$attr{$d}{room}) { + $dev_room = "Default"; + } + else { + $dev_room = $attr{$d}{room}; + } + Log 5,"TXT ROOM: $d:" . $dev_room; + foreach my $r (split(",", $dev_room)) { + $rooms{$r}{$d} = 1; + } + } + # List Devices in ROOM yxz with STATE + if(int(@args) > 2) { + $room = $args[2]; + if(defined($rooms{$room})){ + foreach $d (sort keys %{$rooms{$room}}) { + $ret .= $d . ";" . $defs{$d}{STATE} . "\n"; + } + return $ret; + } + else {return "ERROR;ROOM_NOT_FOUND;" . $room;} + } + # List alle Rooms + foreach $r (sort keys %rooms) { + $ret .= $r . "\n"; + } + return $ret; +} +#------------------------------------------------------------------------------- +sub txt_uri_cmd() { + my ($params) = @_; + my @args = split(/\//,$params); + my ($ret,$cmd,$cmd_ret); + $cmd = $args[2]; + if ($cmd =~ m/\%20/) { $cmd =~ s/\%20/ /g} + if ($cmd =~ m/;/) { $cmd =~ s/;/ /g} + if ($cmd =~ m/\%25/) { $cmd =~ s/\%25/\%/g} + Log 5,"TXT CMD " . $cmd; + if(defined $data{T9X9T}{CMD}{EXEC}{$cmd}) { + Log 5,"TXT EXEC " . $params; + my $callback = $data{T9X9T}{CMD}{EXEC}{$cmd}; + no strict "refs"; + # Call Function + $ret = &$callback($params); + use strict "refs"; + return $ret; + } + # Excute FHEM-Command + $cmd_ret = fhem "$cmd"; + if (!$cmd_ret) { + $ret = "OK" ; + } else { + $ret = "$cmd_ret" + } + $ret .= "\n"; + return $ret; +} +#------------------------------------------------------------------------------- +sub exec_all() { + # List all FHEM CMDs + my $ret = ""; + foreach my $c (sort keys %{cmds}) { + $ret .= $c . "\n"; + } + return $ret; + +} +#------------------------------------------------------------------------------- +sub exec_list_state() { + # List State for Device Array + my ($params) = @_; + # STATE/CMD/LIST_STATE/def1;def2 + my ($ret,@args,@defs,$d); + @args = split(/\//,$params); + @defs = split(/;/,$args[$#args]); + Log 5,"TXT EXEC LIST STATE: " . int(@defs); + if(int(@defs) gt 0 ) { + foreach(@defs) { + if(defined($defs{$_})) { + $ret .= $defs{$_}{STATE} . "\n"; + } + else { $ret.= "ERROR" . "\n"; + } + } + } + return $ret; +} +#------------------------------------------------------------------------------- +sub exec_test() { + return "1" . "\n"; +} +#------------------------------------------------------------------------------- +sub txt_uri_info() { + my ($params) = @_; + # my @args = split(/\//,$params); + my($ret,$TXTVersion,$FHEMVersion); + # Version + $TXTVersion = "FHTMTXT:01.07.2012\n"; + # FHEM Version + # =VERS= from =DATE= ($Id: fhem.pl 1204 2012-01-22 12:21:05Z rudolfkoenig $) + my @a = split(/\$/,$attr{global}{version}); + my @b = split(/\s+/,$a[1]); + $FHEMVersion = "FHEM: " . $b[2] . " " . $b[3]; + $ret = $FHEMVersion . "\n"; + $ret .= $TXTVersion; +} +#------------------------------------------------------------------------------- +1;