FileLog bug + CUR send

git-svn-id: https://svn.fhem.de/fhem/trunk@312 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2009-01-02 09:32:08 +00:00
parent 59f0955434
commit a059bbbd74
8 changed files with 110 additions and 24 deletions

View File

@ -471,4 +471,6 @@
- feature: getstate command from Martin (25.12) - feature: getstate command from Martin (25.12)
- bugfix: at drifts for relative timespecs - bugfix: at drifts for relative timespecs
- bugfix: Add IODev to CUL/EM/CUL_WS/HMS/KS300 - bugfix: Add IODev to CUL/EM/CUL_WS/HMS/KS300
- bugfix: support for second correction factor for EMWZ in 15_CUL_EM added - bugfix: FileLog get (pgm2 plots) wont find the first row in the file
- feature: 00_CUL: Answer CUR requests (status/time/fht)
- bugfix: support for second correction factor for EMWZ in 15_CUL_EM added

View File

@ -1,8 +1,4 @@
############################################## ##############################################
# TODO:
# - FHT xmit
# - HMS rcv
package main; package main;
@ -15,6 +11,7 @@ sub CUL_Write($$$);
sub CUL_Read($); sub CUL_Read($);
sub CUL_ReadAnswer($$); sub CUL_ReadAnswer($$);
sub CUL_Ready($); sub CUL_Ready($);
sub CUL_HandleCurRequest($$);
my $initstr = "X01"; # Only translated messages, no RSSI my $initstr = "X01"; # Only translated messages, no RSSI
my %msghist; # Used when more than one CUL is attached my %msghist; # Used when more than one CUL is attached
@ -50,7 +47,8 @@ CUL_Initialize($)
$hash->{SetFn} = "CUL_Set"; $hash->{SetFn} = "CUL_Set";
$hash->{StateFn} = "CUL_SetState"; $hash->{StateFn} = "CUL_SetState";
$hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 filtertimeout repeater:1,0 " . $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 filtertimeout repeater:1,0 " .
"showtime:1,0 model:CUL,CUR loglevel:0,1,2,3,4,5,6"; "showtime:1,0 model:CUL,CUR loglevel:0,1,2,3,4,5,6 " .
"CUR_id_list";
} }
##################################### #####################################
@ -201,7 +199,7 @@ GOTBW:
if((length($arg)&1) == 1 && $type ne "raw"); if((length($arg)&1) == 1 && $type ne "raw");
$initstr = "X$arg" if($type eq "verbose"); $initstr = "X$arg" if($type eq "verbose");
Log GetLogLevel($name,4), "set $name $type $arg"; Log GetLogLevel($name,4), "set $name $type $arg";
CUL_Write($hash, $sets{$type}, $arg); CUL_SimpleWrite($hash, $sets{$type} . $arg);
} }
return undef; return undef;
@ -239,7 +237,7 @@ CUL_Get($@)
} else { } else {
CUL_Write($hash, $gets{$a[1]}, $arg) if(!IsDummy($hash->{NAME})); CUL_SimpleWrite($hash, $gets{$a[1]} . $arg) if(!IsDummy($hash->{NAME}));
$msg = CUL_ReadAnswer($hash, $a[1]); $msg = CUL_ReadAnswer($hash, $a[1]);
$msg = "No answer" if(!defined($msg)); $msg = "No answer" if(!defined($msg));
$msg =~ s/[\r\n]//g; $msg =~ s/[\r\n]//g;
@ -519,7 +517,7 @@ CUL_Read($)
goto NEXTMSG if($dmsg eq ""); goto NEXTMSG if($dmsg eq "");
# Debug message, X05 # Debug message, X05
if($dmsg =~ m/^p /) { if($dmsg =~ m/p /) {
foreach my $m (split("p ", $dmsg)) { foreach my $m (split("p ", $dmsg)) {
Log GetLogLevel($name,4), "CUL: p $m"; Log GetLogLevel($name,4), "CUL: p $m";
} }
@ -553,7 +551,7 @@ CUL_Read($)
$msghist{$msgcount}{MSG} = $dmsg; $msghist{$msgcount}{MSG} = $dmsg;
$msgcount++; $msgcount++;
if($initstr =~ m/X2/) { # RSSI if($initstr =~ m/X2/ && $dmsg =~ m/[A-F0-9][A-F0-9]$/) { # RSSI
my $l = length($dmsg); my $l = length($dmsg);
my $rssi = hex(substr($dmsg, $l-2, 2)); my $rssi = hex(substr($dmsg, $l-2, 2));
$dmsg = substr($dmsg, 0, $l-2); $dmsg = substr($dmsg, 0, $l-2);
@ -571,6 +569,14 @@ CUL_Read($)
if($fn eq "F") { # Reformat for 10_FS20.pm if($fn eq "F") { # Reformat for 10_FS20.pm
if(defined($attr{$name}) && defined($attr{$name}{CUR_id_list})) {
my $id= substr($dmsg,1,4);
if($attr{$name}{CUR_id_list} =~ m/$id/) { # CUR Request
CUL_HandleCurRequest($hash,$dmsg);
goto NEXTMSG;
}
}
$dmsg = sprintf("81%02x04xx0101a001%s00%s", $dmsg = sprintf("81%02x04xx0101a001%s00%s",
$len/2+5, substr($dmsg,1,6), substr($dmsg,7)); $len/2+5, substr($dmsg,1,6), substr($dmsg,7));
$dmsg = lc($dmsg); $dmsg = lc($dmsg);
@ -683,4 +689,56 @@ CUL_Ready($) # Windows - only
return ($InBytes>0); return ($InBytes>0);
} }
sub
CUL_SendCurMsg($$$)
{
my ($hash,$id,$msg) = @_;
$msg = substr($msg, 0, 12) if(length($msg) > 12);
my $rmsg = "F" . $id . unpack('H*', $msg);
Log 1, "CUL_SendCurMsg: $id:$msg / $rmsg";
sleep(1); # Poor mans CSMA/CD
CUL_SimpleWrite($hash, $rmsg);
}
sub
CUL_HandleCurRequest($$)
{
my ($hash,$msg) = @_;
Log 1, "CUR Request: $msg";
my $l = length($msg);
return if($l < 9);
my $id = substr($msg,1,4);
my $cm = substr($msg,5,2);
my $a1 = substr($msg,7,2);
my $a2 = pack('H*', substr($msg,9)) if($l > 9);
if($cm eq "00") { # Get status
$msg = defined($defs{$a2}) ? $defs{$a2}{STATE} : "Undefined $a2";
$msg =~ s/: /:/g;
$msg =~ s/ / /g;
$msg =~ s/.*[a-z]-//g; # FHT desired-temp, but keep T:-1
$msg =~ s/\(.*//g; # FHT (Celsius)
$msg =~ s/.*5MIN:/5MIN:/g; # EM
$msg =~ s/\.$//;
$msg =~ s/ *//; # One letter seldom makes sense
CUL_SendCurMsg($hash,$id, "d" . $msg); # Display the message on the CUR
}
if($cm eq "01") { # Send time
my @a = localtime;
$msg = sprintf("c%02d%02d%02d", $a[2],$a[1],$a[0]);
CUL_SendCurMsg($hash,$id, $msg);
}
if($cm eq "02") { # FHT desired temp
$msg = sprintf("set %s desired-temp %.1f", $a2, $a1/2);
fhem( $msg );
}
}
1; 1;

View File

@ -228,6 +228,7 @@ FileLog_Get($@)
my %lastdate; my %lastdate;
my $d; # Used by eval functions my $d; # Used by eval functions
while(my $l = <$ifh>) { while(my $l = <$ifh>) {
next if($l lt $from);
last if($l gt $to); last if($l gt $to);
my @fld = split("[ \r\n]+", $l); # 40% my @fld = split("[ \r\n]+", $l); # 40%
@ -341,16 +342,28 @@ seekTo($$$$)
my $upper = $fh->tell; my $upper = $fh->tell;
my ($lower, $next, $last) = (0, $upper/2, 0); my ($lower, $next, $last) = (0, $upper/2, 0);
my $div = 2;
while() { # Binary search while() { # Binary search
$fh->seek($next, 0); $fh->seek($next, 0);
my $data = <$fh>; my $data = <$fh>;
if($data !~ m/^20\d\d-\d\d-\d\d_\d\d:\d\d:\d\d /) { if(!$data) {
$last = $next;
last;
}
if($data !~ m/^\d\d\d\d-\d\d-\d\d_\d\d:\d\d:\d\d /) {
$next = $fh->tell; $next = $fh->tell;
$data = <$fh>; $data = <$fh>;
if(!$data) { if(!$data) {
$last = $next; $last = $next;
last; last;
} }
# If the second line is longer then the first,
# binary search will never get it:
if($next eq $last && $data ge $ts && $div < 8192) {
$last = 0;
$div *= 2;
}
} }
if($next eq $last) { if($next eq $last) {
$fh->seek($next, 0); $fh->seek($next, 0);
@ -359,9 +372,9 @@ seekTo($$$$)
$last = $next; $last = $next;
if(!$data || $data lt $ts) { if(!$data || $data lt $ts) {
($lower, $next) = ($next, ($next+$upper)/2); ($lower, $next) = ($next, int(($next+$upper)/$div));
} else { } else {
($upper, $next) = ($next, ($lower+$next)/2); ($upper, $next) = ($next, int(($lower+$next)/$div));
} }
} }
$hash->{pos}{"$fname:$ts"} = $last; $hash->{pos}{"$fname:$ts"} = $last;

View File

@ -359,3 +359,11 @@
- Wed Dec 17 19:48 (Boris) - Wed Dec 17 19:48 (Boris)
- attribute rainadjustment for KS300 in 13_KS300.pm to account for random - attribute rainadjustment for KS300 in 13_KS300.pm to account for random
switches in the rain counter (see commandref.html) switches in the rain counter (see commandref.html)
- Fri Jan 2 10:29 2009 (Rudi)
- 00_CUL responds to CUR request. These are sent as long FS20 messages, with
a housecode stored in CUR_id_list attribute of the CUL device. If the ID
matches, the message is analyzed, and an FS20 message to the same address
is sent back. The CUR must have reception enabled.
Right now status/set time/set FHT desired temp are implemented.

View File

@ -27,8 +27,8 @@ set grid xtics y2tics
set y2label "Temperature in C" set y2label "Temperature in C"
set ylabel "Humidity (%)" set ylabel "Humidity (%)"
#FileLog 4:T:0:int #FileLog 4:T:0:
#FileLog 6:T:0:int #FileLog 6:T:0:
plot \ plot \
"< awk '/T:/ {print $1, $4}' <IN>"\ "< awk '/T:/ {print $1, $4}' <IN>"\

View File

@ -13,11 +13,11 @@ set y2tics
set title '<TL>' set title '<TL>'
set grid set grid
set ylabel "Temperature in C" set y2label "Temperature in C"
set y2label "Rain (l/m2)" set ylabel "Rain (l/m2)"
#FileLog 5:avg_day:0: #FileLog 5:avg_day:0:
#FileLog 11:avg_day:0: #FileLog 11:avg_day:0:
plot "<grep avg_day <IN>" using 1:5 axes x1y1 title 'Temperature' with lines,\ plot "<grep avg_day <IN>" using 1:5 axes x1y2 title 'Temperature' with lines,\
"<grep avg_day <IN>" using 1:11 axes x1y2 title 'Rain' with histeps "<grep avg_day <IN>" using 1:11 axes x1y1 title 'Rain' with histeps

View File

@ -13,11 +13,11 @@ set y2tics
set title '<TL>' set title '<TL>'
set grid set grid
set ylabel "Temperature in C" set y2label "Temperature in C"
set y2label "Rain (l/m2)" set ylabel "Rain (l/m2)"
#FileLog 5:avg_month:0: #FileLog 5:avg_month:0:
#FileLog 11:avg_month:0: #FileLog 11:avg_month:0:
plot "<grep avg_month <IN>" using 1:5 axes x1y1 title 'Temperature' with lines,\ plot "<grep avg_month <IN>" using 1:5 axes x1y2 title 'Temperature' with lines,\
"<grep avg_month <IN>" using 1:11 axes x1y2 title 'Rain' with fsteps "<grep avg_month <IN>" using 1:11 axes x1y1 title 'Rain' with fsteps

View File

@ -8,6 +8,9 @@ table.room tr.sel { background: #A0FFFF; }
table.at { border:thin solid; width: 100%; background: #FFFFC0; } table.at { border:thin solid; width: 100%; background: #FFFFC0; }
table.at tr.odd { background: #FFFFD7; } table.at tr.odd { background: #FFFFD7; }
table.watchdog { border:thin solid; width: 100%; background: #FFFFC0; }
table.watchdog tr.odd { background: #FFFFD7; }
table.notify { border:thin solid; width: 100%; background: #D7D7A0; } table.notify { border:thin solid; width: 100%; background: #D7D7A0; }
table.notify tr.odd { background: #FFFFC0; } table.notify tr.odd { background: #FFFFC0; }
@ -26,6 +29,9 @@ table.FHT tr.odd { background: #FFD7D7; }
table.KS300 { border:thin solid; width: 100%; background: #C0FFC0; } table.KS300 { border:thin solid; width: 100%; background: #C0FFC0; }
table.KS300 tr.odd { background: #A7FFA7; } table.KS300 tr.odd { background: #A7FFA7; }
table.HMS { border:thin solid; width: 100%; background: #C0FFC0; }
table.HMS tr.odd { background: #A7FFA7; }
table.FHZ { border:thin solid; width: 100%; background: #C0C0C0; } table.FHZ { border:thin solid; width: 100%; background: #C0C0C0; }
table.FHZ tr.odd { background: #D7D7D7; } table.FHZ tr.odd { background: #D7D7D7; }
@ -41,7 +47,6 @@ table.CUL_EM tr.odd { background: #F0F0F0; }
table.CUL_WS { border:thin solid; width: 100%; background: #FFC0C0; } table.CUL_WS { border:thin solid; width: 100%; background: #FFC0C0; }
table.CUL_WS tr.odd { background: #FFD7D7; } table.CUL_WS tr.odd { background: #FFD7D7; }
table.FHEMWEB { border:thin solid; width: 100%; background: #E0E0E0; } table.FHEMWEB { border:thin solid; width: 100%; background: #E0E0E0; }
table.FHEMWEB tr.odd { background: #F0F0F0; } table.FHEMWEB tr.odd { background: #F0F0F0; }