From 2c82c377c22abfe2d310f21abb474f3e6501524e Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sun, 23 Aug 2009 09:18:44 +0000 Subject: [PATCH] Windows bugfix for FHZ and other small changes git-svn-id: https://svn.fhem.de/fhem/trunk@430 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/00_FHZ.pm | 20 +++- fhem/FHEM/11_FHT.pm | 4 +- fhem/contrib/99_priv_cgi.pm | 177 ++++++++++++++++++++++------ fhem/docs/fhem.html | 4 +- fhem/webfrontend/pgm2/01_FHEMWEB.pm | 2 +- 6 files changed, 160 insertions(+), 48 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index a7507fc85..543ad9a63 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -524,3 +524,4 @@ - bugfix: Another "rereadcfg" bugfix - feature: Update to the current (1.27) CUL FHT interface - feature: suppress inplausible readings from USF1000 + - bugfix: FHZ_ReadAnswer bugfix for Windows (Klaus, 20.8.2009) diff --git a/fhem/FHEM/00_FHZ.pm b/fhem/FHEM/00_FHZ.pm index 2a1a31893..0678b2e39 100755 --- a/fhem/FHEM/00_FHZ.pm +++ b/fhem/FHEM/00_FHZ.pm @@ -442,21 +442,29 @@ FHZ_ReadAnswer($$$) return undef if(!$hash || ($^O!~/Win/ && !defined($hash->{FD}))); my ($mfhzdata, $rin) = ("", ''); - my $nfound; + my $buf; + for(;;) { + if($^O =~ m/Win/) { - $nfound=FHZ_Ready($hash); + $hash->{PortObj}->read_const_time($to*1000); # set timeout (ms) + # Read anstatt input sonst funzt read_const_time nicht. + $buf = $hash->{PortObj}->read(999); + return "Timeout reading answer for get $arg" + if(length($buf) == 0); + } else { vec($rin, $hash->{FD}, 1) = 1; - $nfound = select($rin, undef, undef, $to); + my $nfound = select($rin, undef, undef, $to); if($nfound < 0) { next if ($! == EAGAIN() || $! == EINTR() || $! == 0); die("Select error $nfound / $!\n"); } - } - return "Timeout reading answer for get $arg" if($nfound == 0); + return "Timeout reading answer for get $arg" + if($nfound == 0); + $buf = $hash->{PortObj}->input(); - my $buf = $hash->{PortObj}->input(); + } Log 5, "FHZ/RAW: " . unpack('H*',$buf); $mfhzdata .= $buf; diff --git a/fhem/FHEM/11_FHT.pm b/fhem/FHEM/11_FHT.pm index f67bc0929..ac0d9c24f 100755 --- a/fhem/FHEM/11_FHT.pm +++ b/fhem/FHEM/11_FHT.pm @@ -164,10 +164,10 @@ FHT_Set($@) splice(@a,$i,1,("report1","255","report2","255")) if($a[$i] eq "refreshvalues"); - if($a[$i] eq "time") { # CUL hack + if($a[$i] eq "time") { my @t = localtime; splice(@a,$i,1,("hour",$t[2],"minute",$t[1])); - IOWrite($hash, "", sprintf("T04%x", $t[0]) ) + IOWrite($hash, "", sprintf("T04%x", $t[0])) # CUL hack if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL"); } } diff --git a/fhem/contrib/99_priv_cgi.pm b/fhem/contrib/99_priv_cgi.pm index c16e0c25a..315da1db2 100644 --- a/fhem/contrib/99_priv_cgi.pm +++ b/fhem/contrib/99_priv_cgi.pm @@ -1,48 +1,40 @@ -# Beispiel für FHEM PRIV-CGI Schnittstelle -# +################################################################################ +# 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 +################################################################################ # 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. ;-)" -# +# Dies Modul als Beispiel für die Nutzung der Schnittstelle... # 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 -# -# +# 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 -# PROC-CGI => http://localhost:8083/fhem/privcgi -# +# 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 @@ -55,18 +47,15 @@ # - $data{$cgi_key}{TASK}{MyFunc} = "Function_Aufruf" ############################################## package main; - -# call it whith http://localhost:8083/fhem/privcgi - 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} = "priv_cgi_callback"; $data{FWEXT}{$fhem_url}{FUNC} = "priv_cgi_callback"; $data{FWEXT}{$fhem_url}{LINK} = "privcgi"; $data{FWEXT}{$fhem_url}{NAME} = "MyFHEM"; @@ -83,9 +72,14 @@ sub priv_cgi_Initialize($) $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 @@ -111,12 +105,13 @@ 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?ToDo=List&What=FHT + # /privcgi oder /privcgi??Type=FHT&Task=List if($in =~ /\?/) { - # Aufruf mit Argumenten: /privcgi?ToDo=List&What=FHT + # Aufruf mit Argumenten: /privcgi?Type=FHT&Task=List @tmp = split(/\?/, $in); $cgikey = shift(@tmp); $cgikey =~ s/\///; @@ -343,7 +338,6 @@ sub priv_cgi_print_th() foreach my $d (sort keys %defs) { $type = $defs{$d}{TYPE}; next if(!($type =~ m/^(FHT|HMS|KS300|CUL_WS)/)); - #next if($type ne "FHT" || $type ne "HMS" || $type ne "KS300" || $type ne "CUL_WS"); $t = ""; $h = ""; $i = ""; @@ -382,4 +376,113 @@ sub priv_cgi_print_all() $str .= "<\/table>\n"; return ($str); } +sub priv_cgi_print_rooms() +{ +my ($str,$r,$d,$ri); +my %rooms = (); +# Quelle 01_FHEMWEB.pm ... +foreach $d (sort keys %defs ) { + foreach my $r (split(",", FW_getAttr($d, "room", "Unsorted"))) { + $rooms{$r}{$d} = $defs{$d}{STATE};} + } +# print Dumper(%rooms); +# Tabelle +# Raum | DEVICE | TYPE | MODELL | STATE +$str = ""; +$str .= ""; +foreach $r (sort keys %rooms) + { + $ri = 0; +# $str .= "\n"; + foreach $d (sort keys %{$rooms{$r}}){ + if($ri eq 0) {$str .= "";} + else {$str .= ""} +# $str .= ""; + $str .= ""; + $str .= ""; + $str .= ""; + $str .= "\n"; + $ri++; + } + } +$str .= "
RaumDeviceTypeModelState
" . $r . "
" . $r . "
" . $d . "" . $d . "" . $defs{$d}{TYPE} . "" . $attr{$d}{model} . "" . $defs{$d}{STATE} . "
"; +return ($str); +} +sub priv_cgi_print_readings() +{ +my ($d,$r,$d1,$str,@tmp); +# Übersicht aller READINGS +# Tabelle: +# READING +# DATUM +# DEVICE VALUE TIME +# %reads{DATUM}{READINGS}{DEVICE}{READINGS}{VALUE} = VAL +# %reads{DATUM}{READINGS}{DEVICE}{READINGS}{TIME} = ZEIT +my (%reads,$readings,$datum,$device,$value,$zeit); +foreach $device (sort keys %defs ) +{ + foreach $r (sort keys %{$defs{$device}{READINGS}}) + { + @tmp = split(' ', $defs{$device}{READINGS}{$r}{TIME}); + $readings = $r; + $datum = $tmp[0]; + $value = $defs{$device}{READINGS}{$r}{VAL}; + $zeit = $tmp[1]; + $reads{$datum}{$readings}{$device}{$readings}{VALUE} = $defs{$device}{READINGS}{$r}{VAL}; + $reads{$datum}{$readings}{$device}{$readings}{TIME} = $zeit; + } +} +$str = "\n"; +# Counter +my ($ri,$di); +# Datum +foreach $r (sort keys %reads) + { + # READINGS + $ri = 0; + foreach $d (sort keys %{$reads{$r}}) + { + $di = 0; + foreach $d1 (sort keys %{$reads{$r}{$d}}) + { + if($ri eq 0){$str .= "";} + else{$str .= "";} + if($di eq 0) {$str .= "";} + else {$str .= ""} + $str .= "\n"; + $di++; + } + $ri++; + } + + } +$str .= "
" . $r . "
" . $d . "" . $d1 . "" . $reads{$r}{$d}{$d1}{$d}{VALUE} . "" .$reads{$r}{$d}{$d1}{$d}{TIME} . "
\n"; +return ($str); +} +sub +priv_cgi_exec($$) +{ +# /privcgi?Task=EXEC&cmd=FHEMCOMMAND&dev=DEVICENAME&attr=ATTRIBUTE&val=Value +# Task=EXEC&cmd=set&dev=WaWaZiDATA&attr=active&val=100 +# Task=EXEC&cmd=attr&dev=WaWaZiDATA&attr=room&val=PRIVCGIEXEC +Log 0, "PRIVCGIEXEC: @_\n"; +my $cgikey = shift; +my $ret_param = "text/plain; charset=ISO-8859-1"; +my $ret_txt = undef; +my $cmd = lc($data{$cgikey}{QUERY}{cmd}); +my $dev = $data{$cgikey}{QUERY}{dev}; +my $attr = $data{$cgikey}{QUERY}{attr}; +my $val = $data{$cgikey}{QUERY}{val}; +Log 0, "PRIVCGIEXEC: FHEM-Command: $cmd $dev $attr $val\n"; +if(!defined($cmds{$cmd})) + { + return ($ret_param, "PRIVCGIEXEC: unkown COMMAND $cmd"); + } + if(!defined($defs{$dev})) + { + return ($ret_param, "PRIVCGIEXEC: unknown DEVICE $dev"); + } +$ret_txt = AnalyzeCommand(undef, "$cmd $dev $attr $val"); +return ($ret_param, $ret_txt); +} 1; diff --git a/fhem/docs/fhem.html b/fhem/docs/fhem.html index 1d3ef9919..bf6f89175 100644 --- a/fhem/docs/fhem.html +++ b/fhem/docs/fhem.html @@ -41,8 +41,8 @@ Currently implemented features:
  • reading HMS data (HMS100-T,-TF,-WD,-MG,-TFK,-CO,-FIT and RM100-2)
  • reading KS300 data
  • - Note: The FHZ1350 WLAN is probably not working due to a prorietary - encryption. + Note: The FHZ1350 WLAN works with fhem if you replace the standard + (AVISARIO) WLAN module with one that won't encrypt the data.
  • Via the CM11 module (with access to a X10 computer interface):