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 .= "| Raum | Device | Type | Model | State |
";
+foreach $r (sort keys %rooms)
+ {
+ $ri = 0;
+# $str .= "| " . $r . " | | | | |
\n";
+ foreach $d (sort keys %{$rooms{$r}}){
+ if($ri eq 0) {$str .= "| " . $r . " | ";}
+ else {$str .= "
| "}
+# $str .= "
| " . $d . " | ";
+ $str .= "" . $d . " | ";
+ $str .= "" . $defs{$d}{TYPE} . " | ";
+ $str .= "" . $attr{$d}{model} . " | ";
+ $str .= "" . $defs{$d}{STATE} . " |
\n";
+ $ri++;
+ }
+ }
+$str .= "
";
+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 .= "| " . $r . " | ";}
+ else{$str .= "
| ";}
+ if($di eq 0) {$str .= "" . $d . " | ";}
+ else {$str .= " | "}
+ $str .= "" . $d1 . " | " . $reads{$r}{$d}{$d1}{$d}{VALUE} . " | " .$reads{$r}{$d}{$d1}{$d}{TIME} . " |
\n";
+ $di++;
+ }
+ $ri++;
+ }
+
+ }
+$str .= "
\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):
diff --git a/fhem/webfrontend/pgm2/01_FHEMWEB.pm b/fhem/webfrontend/pgm2/01_FHEMWEB.pm
index 485fed74b..2b1693b0d 100755
--- a/fhem/webfrontend/pgm2/01_FHEMWEB.pm
+++ b/fhem/webfrontend/pgm2/01_FHEMWEB.pm
@@ -117,7 +117,7 @@ FW_Undef($$)
if(defined($hash->{CD})) { # Clients
close($hash->{CD});
- delete($selectlist{$hash->{NAME}});
+ delete($selectlist{$name});
}
if(defined($hash->{SERVERSOCKET})) { # Server
close($hash->{SERVERSOCKET});