diff --git a/fhem/FHEM/00_CUL.pm b/fhem/FHEM/00_CUL.pm index 665194a80..6407849dc 100755 --- a/fhem/FHEM/00_CUL.pm +++ b/fhem/FHEM/00_CUL.pm @@ -236,7 +236,7 @@ GOTBW: } else { return "Expecting a 0-padded hex number" - if((length($arg)&1) == 0 && $type ne "raw"); + if((length($arg)&1) == 1 && $type ne "raw"); $initstr = "X$arg" if($type eq "verbose"); Log GetLogLevel($name,4), "set $name $type $arg"; CUL_SimpleWrite($hash, $sets{$type} . $arg); diff --git a/fhem/FHEM/87_WS2000.pm b/fhem/FHEM/87_WS2000.pm index 879aa2791..947664b66 100644 --- a/fhem/FHEM/87_WS2000.pm +++ b/fhem/FHEM/87_WS2000.pm @@ -4,7 +4,7 @@ package main; # Modul for FHEM # # contributed by thomas dressler 2008 -# $Id: 87_WS2000.pm,v 1.5 2008-09-21 17:55:28 rudolfkoenig Exp $ +# $Id: 87_WS2000.pm,v 1.6 2009-04-10 09:54:37 rudolfkoenig Exp $ # corr. negativ temps / peterp ########################### use strict; @@ -82,7 +82,7 @@ WS2000_Define($$) return "Can't open Device $PortName: $^E\n"; } #$hash->{FD}=$PortObj->{_HANDLE}; -# $readyfnlist{"$a[0].$a[2]"} = $hash; + $readyfnlist{"$a[0].$a[2]"} = $hash; } else { eval ("use Device::SerialPort;"); if ($@) { @@ -97,7 +97,7 @@ WS2000_Define($$) return "Can't open Device $PortName: $^E\n"; } $hash->{FD}=$PortObj->FILENO; -# $selectlist{"$a[0].$a[2]"} = $hash; + $selectlist{"$a[0].$a[2]"} = $hash; } #Parameter 19200,8,2,Odd,None $PortObj->baudrate(19200); @@ -128,7 +128,7 @@ WS2000_Define($$) } $xport->autoflush(1); $hash->{FD}=$xport->fileno; -# $selectlist{"$a[0].$a[2]"} = $hash; + $selectlist{"$a[0].$a[2]"} = $hash; $hash->{socket}=$xport; diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm index da915d3a7..aad3c9b85 100755 --- a/fhem/FHEM/92_FileLog.pm +++ b/fhem/FHEM/92_FileLog.pm @@ -151,6 +151,10 @@ FileLog_Set($@) # Up till now following functions are impemented: # - int (to cut off % from a number, as for the actuator) # - delta-h / delta-d to get rain/h and rain/d values from continuous data. +# +# It will set the %data values +# min, max, avg, cnt, lastd, lastv +# for each requested column, beggining with = 1 sub FileLog_Get($@) @@ -194,6 +198,8 @@ FileLog_Get($@) # last2: last delta value recorded (for the very last entry) # last3: last delta timestamp (d or h) my (@d, @fname); + my (@min, @max, @sum, @cnt, @lastv, @lastd); + for(my $i = 0; $i < int(@a); $i++) { my @fld = split(":", $a[$i], 4); @@ -202,11 +208,10 @@ FileLog_Get($@) $fname[$i] = "$outf.$i"; $h{fh} = new IO::File "> $fname[$i]"; } - $h{re} = $fld[1]; - - $h{df} = defined($fld[2]) ? $fld[2] : ""; - $h{fn} = $fld[3]; - $h{didx} = 10 if($fld[3] && $fld[3] eq "delta-d"); + $h{re} = $fld[1]; # Filter: regexp + $h{df} = defined($fld[2]) ? $fld[2] : ""; # default value + $h{fn} = $fld[3]; # function + $h{didx} = 10 if($fld[3] && $fld[3] eq "delta-d"); # delta idx, substr len $h{didx} = 13 if($fld[3] && $fld[3] eq "delta-h"); if($fld[0] =~ m/"(.*)"/) { @@ -223,6 +228,12 @@ FileLog_Get($@) } $h{ret} = ""; $d[$i] = \%h; + $min[$i] = 999999; + $max[$i] = -999999; + $sum[$i] = 0; + $cnt[$i] = 0; + $lastv[$i] = 0; + $lastd[$i] = "undef"; } my %lastdate; @@ -238,14 +249,16 @@ FileLog_Get($@) my $col = $h->{col}; my $t = $h->{type}; - my $line; + my $val = undef; + my $dte = $fld[0]; + if($t == 0) { # Fixed text - $line = "$fld[0] $col\n"; + $val = $col; } elsif($t == 1) { # The column - $line = "$fld[0] $fld[$col]\n" if(defined($fld[$col])); + $val = $fld[$col] if(defined($fld[$col])); } elsif($t == 2) { # delta-h or delta-d @@ -258,7 +271,8 @@ FileLog_Get($@) $ts = "$lda[1]:30:00" if($hd == 13); my $v = $fld[$col]-$h->{last1}; $v = 0 if($v < 0); # Skip negative delta - $line = sprintf("%s_%s %0.1f\n", $lda[0],$ts, $v); + $dte = "$lda[0]_$ts"; + $val = sprintf("%0.1f", $v); } $h->{last1} = $fld[$col]; $h->{last3} = $ld; @@ -267,19 +281,26 @@ FileLog_Get($@) $lastdate{$hd} = $fld[0]; } elsif($t == 3) { # int function - my $val = $fld[$col]; - $line = "$fld[0] $1\n" if($val =~ m/^([0-9]+).*/); + $val = $1 if($fld[$col] =~ m/^([0-9]+).*/); } else { # evaluate - $line = "$fld[0] " . eval($h->{fn}) . "\n"; + $val = eval($h->{fn}); + } - next if(!$line); + + next if(!defined($val)); + $min[$i] = $val if($val < $min[$i]); + $max[$i] = $val if($val > $max[$i]); + $sum[$i] += $val; + $cnt[$i]++; + $lastv[$i] = $val; + $lastd[$i] = $dte; if($outf eq "-") { - $h->{ret} .= $line; + $h->{ret} .= "$dte $val\n"; } else { - my $fh = $h->{fh}; - print $fh $line; + my $fh = $h->{fh}; # cannot use $h->{fh} in print directly + print $fh "$dte $val\n"; $h->{count}++; } } @@ -317,6 +338,15 @@ FileLog_Get($@) } $fh->close(); } + + my $j = $i+1; + $data{"min$j"} = $min[$i] == 999999 ? "undef" : $min[$i]; + $data{"max$j"} = $max[$i] == -999999 ? "undef" : $max[$i]; + $data{"avg$j"} = $cnt[$i] ? sprintf("%0.1f", $sum[$i]/$cnt[$i]) : "undef"; + $data{"cnt$j"} = $cnt[$i] ? $cnt[$i] : "undef"; + $data{"currval$j"} = $lastv[$i]; + $data{"currdate$j"} = $lastd[$i]; + } if($internal) { $internal_data = \$ret; diff --git a/fhem/FHEM/98_structure.pm b/fhem/FHEM/98_structure.pm index df3b9bee5..303c5adca 100755 --- a/fhem/FHEM/98_structure.pm +++ b/fhem/FHEM/98_structure.pm @@ -138,7 +138,12 @@ structure_Set($@) Log 1, "ERROR: endless loop detected for $d in " . $hash->{NAME}; next; } - next if($attr{$d} && $attr{$d}{structexclude}); + + if($attr{$d} && $attr{$d}{structexclude}) { + my $se = $attr{$d}{structexclude}; + next if($hash->{NAME} =~ m/$se/); + } + $list[0] = $d; my $sret .= CommandSet(undef, join(" ", @list)); if($sret) {