mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-13 17:26:34 +00:00
Reduced no. of Notifies from WS3600 (80+ -> 12)
git-svn-id: https://svn.fhem.de/fhem/trunk@570 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
222a9aa94b
commit
382f0f9d0f
@ -29,7 +29,7 @@ package main;
|
|||||||
#
|
#
|
||||||
# Contributed by Kai 'wusel' Siering <wusel+fhem@uu.org> in 2009/2010
|
# Contributed by Kai 'wusel' Siering <wusel+fhem@uu.org> in 2009/2010
|
||||||
# Based in part on work for FHEM by other authors ...
|
# Based in part on work for FHEM by other authors ...
|
||||||
# $Id: 70_WS3600.pm,v 1.2 2010-01-04 23:07:35 painseeker Exp $
|
# $Id: 70_WS3600.pm,v 1.3 2010-01-30 16:25:37 painseeker Exp $
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
@ -131,6 +131,21 @@ my %TranslatedCodes = (
|
|||||||
"Forecast" => "Forecast",
|
"Forecast" => "Forecast",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
my %WantedCodesForStatus = (
|
||||||
|
"Ti" => "Ti:",
|
||||||
|
"To" => "T:",
|
||||||
|
"DP" => "DP:",
|
||||||
|
"RHi" => "Hi:",
|
||||||
|
"RHo" => "H:",
|
||||||
|
"WS" => "W:",
|
||||||
|
"DIRtext" => "Dir:",
|
||||||
|
"WC" => "WC:",
|
||||||
|
"R1h" => "R:",
|
||||||
|
"RP" => "P:",
|
||||||
|
"Tendency" => "Tendency:",
|
||||||
|
"Forecast" => "Forecast:",
|
||||||
|
);
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
sub
|
sub
|
||||||
WS3600_Initialize($)
|
WS3600_Initialize($)
|
||||||
@ -197,6 +212,7 @@ WS3600_Define($$)
|
|||||||
Log 3, "WS3600 initialized";
|
Log 3, "WS3600 initialized";
|
||||||
|
|
||||||
$hash->{STATE} = "initialized";
|
$hash->{STATE} = "initialized";
|
||||||
|
$hash->{TMPSTATE} = "";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,7 +231,7 @@ WS3600_Undef($$)
|
|||||||
delete $selectlist{"$name.pipe"};
|
delete $selectlist{"$name.pipe"};
|
||||||
|
|
||||||
$hash->{STATE}='undefined';
|
$hash->{STATE}='undefined';
|
||||||
Log 3, "$name shutdown complete";
|
Log GetLogLevel($name,3), "$name shutdown complete";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +249,7 @@ WS3600_GetStatus($)
|
|||||||
# Call us in n seconds again.
|
# Call us in n seconds again.
|
||||||
# InternalTimer(gettimeofday()+ $hash->{Timer}, "WS3600_GetStatus", $hash, 1);
|
# InternalTimer(gettimeofday()+ $hash->{Timer}, "WS3600_GetStatus", $hash, 1);
|
||||||
|
|
||||||
Log 4, "WS3600 contacting station";
|
Log GetLogLevel($name,4), "WS3600 contacting station";
|
||||||
|
|
||||||
open($FH, $dev);
|
open($FH, $dev);
|
||||||
if(!$FH) {
|
if(!$FH) {
|
||||||
@ -242,8 +258,8 @@ WS3600_GetStatus($)
|
|||||||
|
|
||||||
$hash->{FD}=$FH;
|
$hash->{FD}=$FH;
|
||||||
$selectlist{"$name.pipe"} = $hash;
|
$selectlist{"$name.pipe"} = $hash;
|
||||||
Log 4, "WS3600 pipe opened";
|
Log GetLogLevel($name,4), "WS3600 pipe opened";
|
||||||
$hash->{STATE} = "running";
|
# $hash->{STATE} = "running";
|
||||||
$hash->{pipeopentime} = time();
|
$hash->{pipeopentime} = time();
|
||||||
# InternalTimer(gettimeofday() + 6, "WS3600_Read", $hash, 1);
|
# InternalTimer(gettimeofday() + 6, "WS3600_Read", $hash, 1);
|
||||||
return $hash->{STATE};
|
return $hash->{STATE};
|
||||||
@ -260,37 +276,38 @@ WS3600_Read($)
|
|||||||
my $FH;
|
my $FH;
|
||||||
my $inputline;
|
my $inputline;
|
||||||
|
|
||||||
Log 4, "WS3600 Read entered";
|
Log GetLogLevel($name,4), "WS3600 Read entered";
|
||||||
|
|
||||||
if(!defined($hash->{FD})) {
|
if(!defined($hash->{FD})) {
|
||||||
Log 3, "Oops, WS3600 FD undef'd";
|
Log GetLogLevel($name,3), "Oops, WS3600 FD undef'd";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
if(!$hash->{FD}) {
|
if(!$hash->{FD}) {
|
||||||
Log 3, "Oops, WS3600 FD empty";
|
Log GetLogLevel($name,3), "Oops, WS3600 FD empty";
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
$FH = $hash->{FD};
|
$FH = $hash->{FD};
|
||||||
|
|
||||||
Log 4, "WS3600 reading started";
|
Log GetLogLevel($name,4), "WS3600 reading started";
|
||||||
|
|
||||||
my @lines;
|
my @lines;
|
||||||
my $eof;
|
my $eof;
|
||||||
my $i=0;
|
my $i=0;
|
||||||
my $tn = TimeNow();
|
my $tn = TimeNow();
|
||||||
my $StateString="";
|
my $StateString=$hash->{TMPSTATE};
|
||||||
my $HumidString="";
|
my $HumidString="";
|
||||||
my $TempsString="";
|
my $TempsString="";
|
||||||
my $OtherString="";
|
my $OtherString="";
|
||||||
my $reading;
|
my $reading;
|
||||||
|
my $readingforstatus;
|
||||||
|
|
||||||
($eof, @lines) = nonblockGetLines($FH);
|
($eof, @lines) = nonblockGetLines($FH);
|
||||||
|
|
||||||
if(!defined($eof)) {
|
if(!defined($eof)) {
|
||||||
Log 4, "WS3600 FIXME: eof undefined?!";
|
Log GetLogLevel($name,4), "WS3600 FIXME: eof undefined?!";
|
||||||
$eof=0;
|
$eof=0;
|
||||||
}
|
}
|
||||||
Log 4, "WS3600 reading ended with eof==$eof";
|
Log GetLogLevel($name,4), "WS3600 reading ended with eof==$eof";
|
||||||
|
|
||||||
# FIXME! Current observed behaviour is "would block", then read of only EOF.
|
# FIXME! Current observed behaviour is "would block", then read of only EOF.
|
||||||
# Not sure if it's always that way; more correct would be checking
|
# Not sure if it's always that way; more correct would be checking
|
||||||
@ -299,7 +316,7 @@ WS3600_Read($)
|
|||||||
foreach my $inputline ( @lines ) {
|
foreach my $inputline ( @lines ) {
|
||||||
$inputline =~ s/\s+$//;
|
$inputline =~ s/\s+$//;
|
||||||
my ($rawreading, $val)=split(/ /, $inputline);
|
my ($rawreading, $val)=split(/ /, $inputline);
|
||||||
Log 5, "WS3600 read $inputline:$rawreading:$val";
|
Log GetLogLevel($name,5), "WS3600 read $inputline:$rawreading:$val";
|
||||||
if(defined($TranslatedCodes{$rawreading})) {
|
if(defined($TranslatedCodes{$rawreading})) {
|
||||||
|
|
||||||
# delete $defs{$name}{READINGS}{" $rawreading"};
|
# delete $defs{$name}{READINGS}{" $rawreading"};
|
||||||
@ -308,6 +325,22 @@ WS3600_Read($)
|
|||||||
|
|
||||||
$defs{$name}{READINGS}{$reading}{VAL} = $val;
|
$defs{$name}{READINGS}{$reading}{VAL} = $val;
|
||||||
$defs{$name}{READINGS}{$reading}{TIME} = $tn;
|
$defs{$name}{READINGS}{$reading}{TIME} = $tn;
|
||||||
|
#
|
||||||
|
# -wusel, 2010-01-30: BIG CHANGE: only put into CHANGED[] what will be in
|
||||||
|
# STATE as well; this is done to reduce the burden on
|
||||||
|
# the notification framework (each one currently leads
|
||||||
|
# to a separate notify which will in turn lead a call
|
||||||
|
# of EVERY NotifyFn()) and to improve FHEMs overall
|
||||||
|
# performance.
|
||||||
|
# Every value is still be stored in READINGS though.
|
||||||
|
#
|
||||||
|
# $hash->{CHANGED}[$i++] = "$reading: $val";
|
||||||
|
|
||||||
|
if(defined($WantedCodesForStatus{$rawreading})) {
|
||||||
|
$readingforstatus=$WantedCodesForStatus{$rawreading};
|
||||||
|
$StateString=sprintf("%s %s %s", $StateString, $readingforstatus, $val);
|
||||||
|
$hash->{CHANGED}[$i++] = "$reading: $val";
|
||||||
|
}
|
||||||
# if($rawreading =~ m/^(Tendency|Forecast)/) {
|
# if($rawreading =~ m/^(Tendency|Forecast)/) {
|
||||||
# $hash->{CHANGED}[$i++] = "$reading: $val";
|
# $hash->{CHANGED}[$i++] = "$reading: $val";
|
||||||
# $StateString=sprintf("%s %s: %s", $StateString, $reading, $val);
|
# $StateString=sprintf("%s %s: %s", $StateString, $reading, $val);
|
||||||
@ -330,6 +363,7 @@ WS3600_Read($)
|
|||||||
# }
|
# }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$hash->{TMPSTATE} = $StateString;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($eof) {
|
if($eof) {
|
||||||
@ -337,9 +371,9 @@ WS3600_Read($)
|
|||||||
delete $hash->{FD};
|
delete $hash->{FD};
|
||||||
delete $selectlist{"$name.pipe"};
|
delete $selectlist{"$name.pipe"};
|
||||||
InternalTimer(gettimeofday()+ $hash->{Timer}, "WS3600_GetStatus", $hash, 1);
|
InternalTimer(gettimeofday()+ $hash->{Timer}, "WS3600_GetStatus", $hash, 1);
|
||||||
Log 4, "WS3600 done reading pipe";
|
Log GetLogLevel($name,4), "WS3600 done reading pipe";
|
||||||
} else {
|
} else {
|
||||||
Log 4, "WS3600 (further) reading would block";
|
Log GetLogLevel($name,4), "WS3600 (further) reading would block";
|
||||||
}
|
}
|
||||||
|
|
||||||
# $OtherString =~ s/^\s+//;
|
# $OtherString =~ s/^\s+//;
|
||||||
@ -360,12 +394,16 @@ WS3600_Read($)
|
|||||||
# $defs{$name}{READINGS}{"Forecast"}{TIME} = $tn;
|
# $defs{$name}{READINGS}{"Forecast"}{TIME} = $tn;
|
||||||
# $hash->{CHANGED}[$i++] = $StateString;
|
# $hash->{CHANGED}[$i++] = $StateString;
|
||||||
|
|
||||||
|
# -wusel, 2010-01-06: FIXME: does this logic with STATE work?
|
||||||
|
# -wusel, 2010-01-30: Removed setting STATE to "reading".
|
||||||
|
|
||||||
if($eof) {
|
if($eof) {
|
||||||
$hash->{CHANGED}[$i++] = "Status: updated";
|
# $hash->{CHANGED}[$i++] = "Status: $StateString";
|
||||||
|
$hash->{STATE} = $hash->{TMPSTATE};
|
||||||
|
$hash->{TMPSTATE} = "";
|
||||||
DoTrigger($name, undef);
|
DoTrigger($name, undef);
|
||||||
$hash->{STATE} = "updated";
|
# } else {
|
||||||
} else {
|
# $hash->{STATE} = "reading";
|
||||||
$hash->{STATE} = "reading";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $hash->{STATE};
|
return $hash->{STATE};
|
||||||
@ -404,82 +442,4 @@ sub nonblockGetLines {
|
|||||||
$buf ? (0,split(/\n/,$buf)) : (0);
|
$buf ? (0,split(/\n/,$buf)) : (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#####################################
|
|
||||||
sub
|
|
||||||
WS3600_OldGetStatus($)
|
|
||||||
{
|
|
||||||
my ($hash) = @_;
|
|
||||||
my $dnr = $hash->{DEVNR};
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my $dev = $hash->{DeviceName};
|
|
||||||
|
|
||||||
# Call us in n seconds again.
|
|
||||||
InternalTimer(gettimeofday()+ $hash->{Timer}, "WS3600_GetStatus", $hash, 1);
|
|
||||||
|
|
||||||
my %vals;
|
|
||||||
#my $result = WS3600_GetLine($hash->{DeviceName}, $hash->{Cmd});
|
|
||||||
|
|
||||||
my $FH;
|
|
||||||
Log 3, "WS3600 contacting station";
|
|
||||||
|
|
||||||
open($FH, $dev);
|
|
||||||
if(!$FH) {
|
|
||||||
return "WS3600 Can't start $dev: $!";
|
|
||||||
}
|
|
||||||
local $_;
|
|
||||||
my $i=0;
|
|
||||||
my $tn = TimeNow();
|
|
||||||
my $StateString="";
|
|
||||||
my $HumidString="";
|
|
||||||
my $TempsString="";
|
|
||||||
my $OtherString="";
|
|
||||||
while (<$FH>) {
|
|
||||||
$_ =~ s/\s+$//;
|
|
||||||
my ($reading, $val)=split(/ /, $_);
|
|
||||||
$defs{$name}{READINGS}{$reading}{VAL} = $val;
|
|
||||||
$defs{$name}{READINGS}{$reading}{TIME} = $tn;
|
|
||||||
if($reading =~ m/^(Tendency|Forecast)/) {
|
|
||||||
$hash->{CHANGED}[$i++] = "$reading: $val";
|
|
||||||
$StateString=sprintf("%s %s: %s", $StateString, $reading, $val);
|
|
||||||
}
|
|
||||||
if($reading =~ m/^(Ti$|To$|WC$)/) {
|
|
||||||
$hash->{CHANGED}[$i++] = "$reading: $val";
|
|
||||||
$TempsString=sprintf("%s %s: %s °C", $TempsString, $reading, $val);
|
|
||||||
}
|
|
||||||
if($reading =~ m/^(RHi$|RHo$)/) {
|
|
||||||
$hash->{CHANGED}[$i++] = "$reading: $val";
|
|
||||||
$HumidString=sprintf("%s %s: %s %%", $HumidString, $reading, $val);
|
|
||||||
}
|
|
||||||
if($reading =~ m/^(R1h$|R24h$)/) {
|
|
||||||
$hash->{CHANGED}[$i++] = "$reading: $val";
|
|
||||||
$OtherString=sprintf("%s %s: %s mm", $OtherString, $reading, $val);
|
|
||||||
}
|
|
||||||
if($reading =~ m/^(RP$|AP$)/) {
|
|
||||||
$hash->{CHANGED}[$i++] = "$reading: $val";
|
|
||||||
$OtherString=sprintf("%s %s: %s hPa", $OtherString, $reading, $val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close($FH);
|
|
||||||
Log 3, "WS3600 fetched station's data";
|
|
||||||
|
|
||||||
$OtherString =~ s/^\s+//;
|
|
||||||
$HumidString =~ s/^\s+//;
|
|
||||||
$TempsString =~ s/^\s+//;
|
|
||||||
$StateString =~ s/^\s+//;
|
|
||||||
|
|
||||||
$defs{$name}{READINGS}{"Humidity"}{VAL} = $HumidString;
|
|
||||||
$defs{$name}{READINGS}{"Humidity"}{TIME} = $tn;
|
|
||||||
$defs{$name}{READINGS}{"Temperatures"}{VAL} = $TempsString;
|
|
||||||
$defs{$name}{READINGS}{"Temperatures"}{TIME} = $tn;
|
|
||||||
$defs{$name}{READINGS}{"Rain/Pressure"}{VAL} = $OtherString;
|
|
||||||
$defs{$name}{READINGS}{"Rain/Pressure"}{TIME} = $tn;
|
|
||||||
$defs{$name}{READINGS}{"Forecast"}{VAL} = $StateString;
|
|
||||||
$defs{$name}{READINGS}{"Forecast"}{TIME} = $tn;
|
|
||||||
|
|
||||||
DoTrigger($name, undef) if($init_done);
|
|
||||||
|
|
||||||
$hash->{STATE} = $StateString;
|
|
||||||
return $hash->{STATE};
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user