mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-12 16:46:35 +00:00
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:
parent
2c12216c90
commit
8e32901b52
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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 = "<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;
|
||||
|
@ -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 KS300 data</li>
|
||||
</ul>
|
||||
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.
|
||||
</li>
|
||||
<li>Via the CM11 module (with access to a X10 computer interface):
|
||||
<ul>
|
||||
|
@ -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});
|
||||
|
Loading…
x
Reference in New Issue
Block a user