################################################################################ # FHEM PRIV-CGI # Stand: 08/2009 # Update: # 08/2009 ROOMS -> Übersicht aller Räume mit Devices und STATE # 08/2009 READINGS -> Übersicht aller READIMGS nach Datum -> READING -> Device # 08/2009 Excute FHEMCommands /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=ATTRIBUTE&val=Value ################################################################################ # # Beschreibung # Es werden lediglich vorhanden Information aus FHEM in eigenen Ansichten/Listen dargestellt. # # Ansicht/List # ALL -> Überblick über alle Devices # FHT -> Übersicht aller FHT's incl. Programme # FS20 -> Übersicht alle FS20-Devices # TH -> Alle Devices (die ich habe) die eine Temperatur oder Luftfeuchte messen (FHT,KS300,HMS,S300TH...) # ROOMS -> Übersicht aller Räume mit Devices und STATE # READINGS -> Übersicht aller READINGS; Gruppiert nach Datum -> READING -> Device # DUMMY -> Überischt aller DUMMY-Devices (als Beispiel für eigene Functionen) ################################################################################ # Installation # # Modul ins FHEM-Modul Verzeichnis kopieren # entweder FHEM neu starten # oder "reload 99_priv_cgi.pm" # ################################################################################ # Aufruf: # Bsp.: FHEMWEB => http://localhost:8083/fhem # PRIV-CGI => http://localhost:8083/fhem/privcgi # # Eigene Erweiterungen implementieren: # Aufruf: http://localhost:8083/fhem/privcgi?Type=FHT&Task=List # A. Ergänzung LIST-Funktion # - Eigene Funktion schreiben z.B. sub priv_cgi_my_function($) # - Eigenen Key festlegen z.B. myKey # - Function sub priv_cgi_Initialize($) ergänzen $data{$cgi_key}{TASK_LIST}{TYPE}{myKey} = "priv_cgi_my_function"; # - reload 99_priv_cgi.pm # # B. Eigene Funktion # - z.B. MyFunc # - eigenen Key im HASH $data{$cgi_key}{TASK} erzeugen # - $data{$cgi_key}{TASK}{MyFunc} = "Function_Aufruf" ############################################## package main; use strict; use warnings; use Data::Dumper; use vars qw(%data); sub priv_cgi_Initialize($) { my $cgi_key = "privcgi"; my $fhem_url = "/" . $cgi_key ; $data{FWEXT}{$fhem_url}{FUNC} = "priv_cgi_callback"; $data{FWEXT}{$fhem_url}{LINK} = "privcgi"; $data{FWEXT}{$fhem_url}{NAME} = "MyFHEM"; $data{$cgi_key}{QUERY} = {}; # Default: in Case of /privcgi # Task=List&Type=FHT $data{$cgi_key}{default}{QUERY} = "Task=List&Type=ALL"; # Dispatcher Functions # Task = List -> Call Function $data{$cgi_key}{TASK}{List} = "priv_cgi_list"; # List -> Type -> Call Function $data{$cgi_key}{TASK_LIST}{TYPE} = {};; $data{$cgi_key}{TASK_LIST}{TYPE}{ALL} = "priv_cgi_print_all"; $data{$cgi_key}{TASK_LIST}{TYPE}{FHT} = "priv_cgi_print_fht"; $data{$cgi_key}{TASK_LIST}{TYPE}{FS20} = "priv_cgi_print_fs20"; $data{$cgi_key}{TASK_LIST}{TYPE}{TH} = "priv_cgi_print_th"; $data{$cgi_key}{TASK_LIST}{TYPE}{ROOMS} = "priv_cgi_print_rooms"; $data{$cgi_key}{TASK_LIST}{TYPE}{READINGS} = "priv_cgi_print_readings"; # $data{$cgi_key}{TASK_LIST}{TYPE}{DUMMY} = "priv_cgi_print_dummy"; # ExcuteFhemCommands # /privcgi?EXEC=FHEMCOMMAD&DEVICE&VALUE-1&VALUE-2 # /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=VALUE-1 $data{$cgi_key}{TASK}{EXEC} = "priv_cgi_exec"; } sub priv_cgi_callback($$) { my ($htmlarg) = @_; my ($ret_html, $func,$qtask); my $cgikey = &priv_cgi_get_start($htmlarg); Log 0, "CGI-KEY: $cgikey"; # Dispatch TASK... choose Function $qtask = $data{$cgikey}{QUERY}{Task}; $func = $data{$cgikey}{TASK}{$qtask}; Log 0, "Func: $func"; no strict "refs"; # Call Function $ret_html .= &$func($cgikey); use strict "refs"; Log 1, "Got $htmlarg"; return ("text/html; charset=ISO-8859-1", $ret_html); } sub priv_cgi_get_start($) { my $in = shift; print "CGI_START: " . Dumper(@_) . "\n"; my (@tmp,$n,$v,$cgikey,$param); # Aufruf mit oder ohne Argumente # /privcgi oder /privcgi??Type=FHT&Task=List if($in =~ /\?/) { # Aufruf mit Argumenten: /privcgi?Type=FHT&Task=List @tmp = split(/\?/, $in); $cgikey = shift(@tmp); $cgikey =~ s/\///; $param = shift(@tmp); } else { $cgikey = $in; # Aufruf OHNE Argumenten: /privcgi $cgikey =~ s/\///; # Default Werte $param = $data{$cgikey}{default}{QUERY}; } # Param nach $data{$cgikey}{QUERY} schreiben Log 0, "PRIV-CGI: START -> param: " . $param; @tmp = split(/&/, $param); foreach my $pair(@tmp) { ($n,$v) = split(/=/, $pair); Log 0, "PRIV-CGI: START -> param: $n - $v"; $data{$cgikey}{QUERY}{$n} = $v; } return $cgikey; } sub priv_cgi_html_head($) { # HTML-Content for HEAD my $cgikey = shift; my $html = "\n"; $html .= "\n"; $html .= "\n"; $html .= "