Windows bugfix for FHZ and other small changes
git-svn-id: https://svn.fhem.de/fhem/trunk@430 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -524,3 +524,4 @@
|
|||||||
- bugfix: Another "rereadcfg" bugfix
|
- bugfix: Another "rereadcfg" bugfix
|
||||||
- feature: Update to the current (1.27) CUL FHT interface
|
- feature: Update to the current (1.27) CUL FHT interface
|
||||||
- feature: suppress inplausible readings from USF1000
|
- feature: suppress inplausible readings from USF1000
|
||||||
|
- bugfix: FHZ_ReadAnswer bugfix for Windows (Klaus, 20.8.2009)
|
||||||
|
|||||||
@@ -442,21 +442,29 @@ FHZ_ReadAnswer($$$)
|
|||||||
return undef if(!$hash || ($^O!~/Win/ && !defined($hash->{FD})));
|
return undef if(!$hash || ($^O!~/Win/ && !defined($hash->{FD})));
|
||||||
|
|
||||||
my ($mfhzdata, $rin) = ("", '');
|
my ($mfhzdata, $rin) = ("", '');
|
||||||
my $nfound;
|
my $buf;
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
|
||||||
if($^O =~ m/Win/) {
|
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 {
|
} else {
|
||||||
vec($rin, $hash->{FD}, 1) = 1;
|
vec($rin, $hash->{FD}, 1) = 1;
|
||||||
$nfound = select($rin, undef, undef, $to);
|
my $nfound = select($rin, undef, undef, $to);
|
||||||
if($nfound < 0) {
|
if($nfound < 0) {
|
||||||
next if ($! == EAGAIN() || $! == EINTR() || $! == 0);
|
next if ($! == EAGAIN() || $! == EINTR() || $! == 0);
|
||||||
die("Select error $nfound / $!\n");
|
die("Select error $nfound / $!\n");
|
||||||
}
|
}
|
||||||
}
|
return "Timeout reading answer for get $arg"
|
||||||
return "Timeout reading answer for get $arg" if($nfound == 0);
|
if($nfound == 0);
|
||||||
|
$buf = $hash->{PortObj}->input();
|
||||||
|
|
||||||
my $buf = $hash->{PortObj}->input();
|
}
|
||||||
|
|
||||||
Log 5, "FHZ/RAW: " . unpack('H*',$buf);
|
Log 5, "FHZ/RAW: " . unpack('H*',$buf);
|
||||||
$mfhzdata .= $buf;
|
$mfhzdata .= $buf;
|
||||||
|
|||||||
@@ -164,10 +164,10 @@ FHT_Set($@)
|
|||||||
splice(@a,$i,1,("report1","255","report2","255"))
|
splice(@a,$i,1,("report1","255","report2","255"))
|
||||||
if($a[$i] eq "refreshvalues");
|
if($a[$i] eq "refreshvalues");
|
||||||
|
|
||||||
if($a[$i] eq "time") { # CUL hack
|
if($a[$i] eq "time") {
|
||||||
my @t = localtime;
|
my @t = localtime;
|
||||||
splice(@a,$i,1,("hour",$t[2],"minute",$t[1]));
|
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");
|
if($hash->{IODev} && $hash->{IODev}->{TYPE} eq "CUL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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....
|
# Danke an Rudi für die Schnittstelle....
|
||||||
#
|
# Dies Modul als Beispiel für die Nutzung der 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 Modul verändert nichts an FHEM
|
||||||
# das Orginal-Mudol ist im CVS unter Contrib 99_priv_cgi.pm zu finden
|
################################################################################
|
||||||
#
|
|
||||||
# Beschreibung
|
# Beschreibung
|
||||||
# Es werden lediglich vorhanden Information aus FHEM in eigenen Ansichten/Listen dargestellt.
|
# Es werden lediglich vorhanden Information aus FHEM in eigenen Ansichten/Listen dargestellt.
|
||||||
#
|
#
|
||||||
# Ansicht/List
|
# Ansicht/List
|
||||||
# ALL
|
# ALL -> Überblick über alle Devices
|
||||||
# Überblick über alle Devices
|
# FHT -> Übersicht aller FHT's incl. Programme
|
||||||
#
|
# FS20 -> Übersicht alle FS20-Devices
|
||||||
# FHT
|
# TH -> Alle Devices (die ich habe) die eine Temperatur oder Luftfeuchte messen (FHT,KS300,HMS,S300TH...)
|
||||||
# Übersicht aller FHT's
|
# ROOMS -> Übersicht aller Räume mit Devices und STATE
|
||||||
# Die eingestellten Schaltzeitpunkte an denen der FHT zwischen Tag- und Nacht-Temperatur wechslet; bzw. umgekehrt.
|
# READINGS -> Übersicht aller READINGS; Gruppiert nach Datum -> READING -> Device
|
||||||
#
|
# DUMMY -> Überischt aller DUMMY-Devices (als Beispiel für eigene Functionen)
|
||||||
# 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
|
# Installation
|
||||||
#
|
#
|
||||||
# Modul ins FHEM-Modul Verzeichnis kopieren
|
# Modul ins FHEM-Modul Verzeichnis kopieren
|
||||||
# entweder FHEM neu starten
|
# entweder FHEM neu starten
|
||||||
# oder "reload 99_priv_cgi.pm"
|
# oder "reload 99_priv_cgi.pm"
|
||||||
#
|
#
|
||||||
|
################################################################################
|
||||||
# Aufruf:
|
# Aufruf:
|
||||||
# Bsp.: FHEMWEB => http://localhost:8083/fhem
|
# Bsp.: FHEMWEB => http://localhost:8083/fhem
|
||||||
# PROC-CGI => http://localhost:8083/fhem/privcgi
|
# PRIV-CGI => http://localhost:8083/fhem/privcgi
|
||||||
#
|
|
||||||
#
|
#
|
||||||
# Eigene Erweiterungen implementieren:
|
# Eigene Erweiterungen implementieren:
|
||||||
|
# Aufruf: http://localhost:8083/fhem/privcgi?Type=FHT&Task=List
|
||||||
# A. Ergänzung LIST-Funktion
|
# A. Ergänzung LIST-Funktion
|
||||||
# - Eigene Funktion schreiben z.B. sub priv_cgi_my_function($)
|
# - Eigene Funktion schreiben z.B. sub priv_cgi_my_function($)
|
||||||
# - Eigenen Key festlegen z.B. myKey
|
# - Eigenen Key festlegen z.B. myKey
|
||||||
@@ -55,18 +47,15 @@
|
|||||||
# - $data{$cgi_key}{TASK}{MyFunc} = "Function_Aufruf"
|
# - $data{$cgi_key}{TASK}{MyFunc} = "Function_Aufruf"
|
||||||
##############################################
|
##############################################
|
||||||
package main;
|
package main;
|
||||||
|
|
||||||
# call it whith http://localhost:8083/fhem/privcgi
|
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use Data::Dumper;
|
||||||
use vars qw(%data);
|
use vars qw(%data);
|
||||||
|
|
||||||
sub priv_cgi_Initialize($)
|
sub priv_cgi_Initialize($)
|
||||||
{
|
{
|
||||||
my $cgi_key = "privcgi";
|
my $cgi_key = "privcgi";
|
||||||
my $fhem_url = "/" . $cgi_key ;
|
my $fhem_url = "/" . $cgi_key ;
|
||||||
# $data{FWEXT}{$fhem_url} = "priv_cgi_callback";
|
|
||||||
$data{FWEXT}{$fhem_url}{FUNC} = "priv_cgi_callback";
|
$data{FWEXT}{$fhem_url}{FUNC} = "priv_cgi_callback";
|
||||||
$data{FWEXT}{$fhem_url}{LINK} = "privcgi";
|
$data{FWEXT}{$fhem_url}{LINK} = "privcgi";
|
||||||
$data{FWEXT}{$fhem_url}{NAME} = "MyFHEM";
|
$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}{FHT} = "priv_cgi_print_fht";
|
||||||
$data{$cgi_key}{TASK_LIST}{TYPE}{FS20} = "priv_cgi_print_fs20";
|
$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}{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";
|
# $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
|
sub
|
||||||
@@ -111,12 +105,13 @@ sub
|
|||||||
priv_cgi_get_start($)
|
priv_cgi_get_start($)
|
||||||
{
|
{
|
||||||
my $in = shift;
|
my $in = shift;
|
||||||
|
print "CGI_START: " . Dumper(@_) . "\n";
|
||||||
my (@tmp,$n,$v,$cgikey,$param);
|
my (@tmp,$n,$v,$cgikey,$param);
|
||||||
# Aufruf mit oder ohne Argumente
|
# Aufruf mit oder ohne Argumente
|
||||||
# /privcgi oder /privcgi?ToDo=List&What=FHT
|
# /privcgi oder /privcgi??Type=FHT&Task=List
|
||||||
if($in =~ /\?/)
|
if($in =~ /\?/)
|
||||||
{
|
{
|
||||||
# Aufruf mit Argumenten: /privcgi?ToDo=List&What=FHT
|
# Aufruf mit Argumenten: /privcgi?Type=FHT&Task=List
|
||||||
@tmp = split(/\?/, $in);
|
@tmp = split(/\?/, $in);
|
||||||
$cgikey = shift(@tmp);
|
$cgikey = shift(@tmp);
|
||||||
$cgikey =~ s/\///;
|
$cgikey =~ s/\///;
|
||||||
@@ -343,7 +338,6 @@ sub priv_cgi_print_th()
|
|||||||
foreach my $d (sort keys %defs) {
|
foreach my $d (sort keys %defs) {
|
||||||
$type = $defs{$d}{TYPE};
|
$type = $defs{$d}{TYPE};
|
||||||
next if(!($type =~ m/^(FHT|HMS|KS300|CUL_WS)/));
|
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 = "";
|
$t = "";
|
||||||
$h = "";
|
$h = "";
|
||||||
$i = "";
|
$i = "";
|
||||||
@@ -382,4 +376,113 @@ sub priv_cgi_print_all()
|
|||||||
$str .= "<\/table>\n";
|
$str .= "<\/table>\n";
|
||||||
return ($str);
|
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 = "<table>";
|
||||||
|
$str .= "<tr ALIGN=LEFT><th>Raum</th><th>Device</th><th>Type</th><th>Model</th><th>State</th></tr>";
|
||||||
|
foreach $r (sort keys %rooms)
|
||||||
|
{
|
||||||
|
$ri = 0;
|
||||||
|
# $str .= "<tr><td>" . $r . "</td><td></td><td></td><td></td><td></td></tr>\n";
|
||||||
|
foreach $d (sort keys %{$rooms{$r}}){
|
||||||
|
if($ri eq 0) {$str .= "<tr bgcolor=\"#CCCCCC\"><td>" . $r . "</td>";}
|
||||||
|
else {$str .= "<tr><td></td>"}
|
||||||
|
# $str .= "<tr><td></td><td>" . $d . "</td>";
|
||||||
|
$str .= "<td>" . $d . "</td>";
|
||||||
|
$str .= "<td>" . $defs{$d}{TYPE} . "</td>";
|
||||||
|
$str .= "<td>" . $attr{$d}{model} . "</td>";
|
||||||
|
$str .= "<td>" . $defs{$d}{STATE} . "</td></tr>\n";
|
||||||
|
$ri++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$str .= "</table>";
|
||||||
|
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 = "<table>\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 .= "<tr bgcolor=\"#CCCCCC\"><td>" . $r . "</td>";}
|
||||||
|
else{$str .= "<tr><td></td>";}
|
||||||
|
if($di eq 0) {$str .= "<td>" . $d . "</td>";}
|
||||||
|
else {$str .= "<td></td>"}
|
||||||
|
$str .= "<td>" . $d1 . "</td><td>" . $reads{$r}{$d}{$d1}{$d}{VALUE} . "</td><td>" .$reads{$r}{$d}{$d1}{$d}{TIME} . "</td></tr>\n";
|
||||||
|
$di++;
|
||||||
|
}
|
||||||
|
$ri++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
$str .= "</table>\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;
|
1;
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ Currently implemented features:<br>
|
|||||||
<li>reading HMS data (HMS100-T,-TF,-WD,-MG,-TFK,-CO,-FIT and RM100-2)</li>
|
<li>reading HMS data (HMS100-T,-TF,-WD,-MG,-TFK,-CO,-FIT and RM100-2)</li>
|
||||||
<li>reading KS300 data</li>
|
<li>reading KS300 data</li>
|
||||||
</ul>
|
</ul>
|
||||||
Note: The FHZ1350 WLAN is probably not working due to a prorietary
|
Note: The FHZ1350 WLAN works with fhem if you replace the standard
|
||||||
encryption.
|
(AVISARIO) WLAN module with one that won't encrypt the data.
|
||||||
</li>
|
</li>
|
||||||
<li>Via the CM11 module (with access to a X10 computer interface):
|
<li>Via the CM11 module (with access to a X10 computer interface):
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ FW_Undef($$)
|
|||||||
|
|
||||||
if(defined($hash->{CD})) { # Clients
|
if(defined($hash->{CD})) { # Clients
|
||||||
close($hash->{CD});
|
close($hash->{CD});
|
||||||
delete($selectlist{$hash->{NAME}});
|
delete($selectlist{$name});
|
||||||
}
|
}
|
||||||
if(defined($hash->{SERVERSOCKET})) { # Server
|
if(defined($hash->{SERVERSOCKET})) { # Server
|
||||||
close($hash->{SERVERSOCKET});
|
close($hash->{SERVERSOCKET});
|
||||||
|
|||||||
Reference in New Issue
Block a user