# Beispiel für FHEM PRIV-CGI Schnittstelle # # Danke an Rudi für die Schnittstelle.... # # "Eigentlich wollte ich nur sehen, wie meine FHT's eingestellt sind, # "und eine Übersicht aller vergbener FS20-Code's. ;-)" # # Das Modul verändert nichts an FHEM # das Orginal-Mudol ist im CVS unter Contrib 99_priv_cgi.pm zu finden # # 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 # Die eingestellten Schaltzeitpunkte an denen der FHT zwischen Tag- und Nacht-Temperatur wechslet; bzw. umgekehrt. # # FS20 # Übersicht alle FS20-Devices # # TH # Temperatur & Humidity # Alle Devices (die ich habe) die eine Temperatur oder Luftfeuchte messen (FHT,KS300,HMS,S300TH...) # # DUMMY (als Beispiel für eigene Functionen) # Überischt aller DUMMY-Devices # # # Installation # # Modul ins FHEM-Modul Verzeichnis kopieren # entweder FHEM neu starten # oder "reload 99_priv_cgi.pm" # # Aufruf: # Bsp.: FHEMWEB => http://localhost:8083/fhem # PROC-CGI => http://localhost:8083/fhem/privcgi # # # Eigene Erweiterungen implementieren: # 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; # call it whith http://localhost:8083/fhem/privcgi use strict; use warnings; use vars qw(%data); sub priv_cgi_Initialize($) { my $cgi_key = "privcgi"; my $fhem_url = "/" . $cgi_key ; # $data{FWEXT}{$fhem_url} = "priv_cgi_callback"; $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}{DUMMY} = "priv_cgi_print_dummy"; } 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; my (@tmp,$n,$v,$cgikey,$param); # Aufruf mit oder ohne Argumente # /privcgi oder /privcgi?ToDo=List&What=FHT if($in =~ /\?/) { # Aufruf mit Argumenten: /privcgi?ToDo=List&What=FHT @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 .= "