mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-13 03:05:34 +00:00
- reworked 15_CUL_EM.pm to account for timer wraparounds, more readings added
- speed gain at startup through disabled refreshvalues query to all FHTs at definition; if you want it back at a "set myFHT report1 255 report2 255" command to the config file. git-svn-id: https://svn.fhem.de/fhem/trunk@282 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
3a8ed4c6ec
commit
1c265347ce
@ -442,7 +442,7 @@
|
||||
- bugfix: FHT short message warning
|
||||
- bugfix: rereadconfig crashes with active webpgm2 connections (2008-11-13)
|
||||
- bugfix: watchdog crash (2008-11-15)
|
||||
- bugfix: Strange call for nonexistent MyCUL: ReadFn
|
||||
- bugfix: Strange call for nonexistent MyCUL: ReadFn
|
||||
- feature: webpgm2: gplot output goes to /tmp/gnuplot.err
|
||||
- feature: devspec TYPE,DEF,STATE. e.g. list TYPE:FS20, set DEF:123 on
|
||||
- bugfix: at schedules 2 events after the DST change (fix not verified)
|
||||
@ -450,3 +450,9 @@
|
||||
- feature: CUL / CUL_EM / CUL_WS documentation
|
||||
- feature: do not block fhem when the CUR is disconnected
|
||||
- bugfix: correct correction factors for EMEM in 15_CUL_EM.pm
|
||||
- feature: reworked 15_CUL_EM.pm to account for timer wraparounds, more
|
||||
readings added
|
||||
- feature: speed gain through disabled refreshvalues query to all FHTs at
|
||||
definition; if you want it back at a "set myFHT report1 255
|
||||
report2 255" command to the config file.
|
||||
|
||||
|
@ -95,14 +95,14 @@ my %cantset = (
|
||||
|
||||
|
||||
my %priority = (
|
||||
"desired-temp"=> 1,
|
||||
"mode" => 2,
|
||||
"report1" => 3,
|
||||
"desired-temp"=> 1,
|
||||
"mode" => 2,
|
||||
"report1" => 3,
|
||||
"report2" => 3,
|
||||
"holiday1" => 4,
|
||||
"holiday2" => 5,
|
||||
"day-temp" => 6,
|
||||
"night-temp" => 7,
|
||||
"holiday1" => 4,
|
||||
"holiday2" => 5,
|
||||
"day-temp" => 6,
|
||||
"night-temp" => 7,
|
||||
);
|
||||
|
||||
my %c2m = (0 => "auto", 1 => "manual", 2 => "holiday", 3 => "holiday_short");
|
||||
@ -274,7 +274,7 @@ FHT_Define($$)
|
||||
$a[2] = lc($a[2]);
|
||||
return "Define $a[0]: wrong CODE format: specify a 4 digit hex value"
|
||||
if($a[2] !~ m/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/i);
|
||||
|
||||
|
||||
|
||||
$hash->{CODE} = $a[2];
|
||||
$hash->{CODE} = $a[2];
|
||||
@ -283,8 +283,8 @@ FHT_Define($$)
|
||||
|
||||
AssignIoPort($hash);
|
||||
|
||||
Log GetLogLevel($a[0],2),"Asking the FHT device $a[0]/$a[2] to send its data";
|
||||
FHT_Set($hash, ($a[0], "report1", "255", "report2", "255"));
|
||||
#Log GetLogLevel($a[0],2),"Asking the FHT device $a[0]/$a[2] to send its data";
|
||||
#FHT_Set($hash, ($a[0], "report1", "255", "report2", "255"));
|
||||
|
||||
return undef;
|
||||
}
|
||||
@ -299,7 +299,7 @@ FHT_Undef($$)
|
||||
}
|
||||
|
||||
#####################################
|
||||
sub
|
||||
sub
|
||||
FHT_Parse($$)
|
||||
{
|
||||
my ($hash, $msg) = @_;
|
||||
@ -368,7 +368,7 @@ FHT_Parse($$)
|
||||
if($sval =~ m/.6/) { $val = "$fv" }
|
||||
elsif($sval =~ m/.8/) { $val = "offset: $fv" }
|
||||
elsif($sval =~ m/.a/) { $val = "lime-protection" }
|
||||
elsif($sval =~ m/.c/) { $val = "synctime" }
|
||||
elsif($sval =~ m/.c/) { $val = "synctime" }
|
||||
elsif($sval =~ m/.e/) { $val = "test" }
|
||||
elsif($sval =~ m/.f/) { $val = "pair" }
|
||||
else { $val = "unknown_$sval: $fv" }
|
||||
@ -415,7 +415,7 @@ FHT_Parse($$)
|
||||
################################
|
||||
# Softbuffer: delete confirmed commands
|
||||
if($confirm) {
|
||||
my $found;
|
||||
my $found;
|
||||
my $io = $def->{IODev};
|
||||
foreach my $key (sort keys %{$io->{SOFTBUFFER}}) {
|
||||
my $h = $io->{SOFTBUFFER}{$key};
|
||||
@ -442,7 +442,7 @@ doSoftBuffer($)
|
||||
my ($io) = @_;
|
||||
|
||||
my $now = gettimeofday();
|
||||
|
||||
|
||||
my $count = 0;
|
||||
my $fhzbuflen = -999;
|
||||
foreach my $key (keys %{ $io->{SOFTBUFFER} }) {
|
||||
@ -517,7 +517,7 @@ getFhtBuffer($)
|
||||
my $msg = FHZ_ReadAnswer($io, "fhtbuf", 1.0);
|
||||
if(!defined($msg)) { $msg= ""; }
|
||||
Log 5, "getFhtBuffer: $count $msg";
|
||||
|
||||
|
||||
return hex(substr($msg, 16, 2)) if($msg && $msg =~ m/^[0-9A-F]+$/i);
|
||||
return 0 if($count++ >= 5);
|
||||
}
|
||||
|
@ -80,30 +80,105 @@ CUL_EM_Parse($$)
|
||||
my @a = split("", $msg);
|
||||
my $tpe = ($a[1].$a[2])+0;
|
||||
my $cde = ($a[3].$a[4])+0;
|
||||
my $cnt = hex($a[5].$a[6]);
|
||||
my $cum = hex($a[ 9].$a[10].$a[ 7].$a[ 8]);
|
||||
my $lst = hex($a[13].$a[14].$a[11].$a[12]);
|
||||
my $top = hex($a[17].$a[18].$a[15].$a[16]);
|
||||
my $seqno = hex($a[5].$a[6]);
|
||||
my $total_cnt = hex($a[ 9].$a[10].$a[ 7].$a[ 8]);
|
||||
my $current_cnt = hex($a[13].$a[14].$a[11].$a[12]);
|
||||
my $peak_cnt = hex($a[17].$a[18].$a[15].$a[16]);
|
||||
|
||||
# these are the raw readings from the device
|
||||
my $val = sprintf("CNT: %d CUM: %d 5MIN: %d TOP: %d",
|
||||
$cnt, $cum, $lst, $top);
|
||||
$seqno, $total_cnt, $current_cnt, $peak_cnt);
|
||||
|
||||
|
||||
# seqno = number of received datagram in sequence, runs from 2 to 255
|
||||
# total_cnt= total (cumulated) value in ticks as read from the device
|
||||
# basis_cnt= correction to total (cumulated) value in ticks to account for
|
||||
# counter wraparounds
|
||||
# total = total (cumulated) value in device units
|
||||
# current = current value (average over latest 5 minutes) in device units
|
||||
# peak = maximum value in device units
|
||||
|
||||
if($defptr{$cde}) {
|
||||
$hash = $defptr{$cde};
|
||||
my $corr1 = $hash->{corr1}; # EMEM power correction factor
|
||||
my $corr2 = $hash->{corr2}; # EMEM energy correction factor
|
||||
$cum *= $corr2;
|
||||
$lst *= $corr1;
|
||||
$top *= $corr1;
|
||||
$val = sprintf("CNT: %d CUM: %0.3f 5MIN: %0.3f TOP: %0.3f",
|
||||
$cnt, $cum, $lst, $top);
|
||||
|
||||
|
||||
# count changes
|
||||
my $c= 0;
|
||||
|
||||
# set state to raw readings
|
||||
my $n = $hash->{NAME};
|
||||
Log GetLogLevel($n,1), "CUL_EM $n: $val";
|
||||
$hash->{STATE} = $val;
|
||||
$hash->{CHANGED}[$c++] = $val;
|
||||
|
||||
$hash->{CHANGED}[0] = $val;
|
||||
$hash->{STATE} = $val;
|
||||
$hash->{READINGS}{state}{TIME} = TimeNow();
|
||||
|
||||
#
|
||||
# calculate readings
|
||||
#
|
||||
|
||||
# current time
|
||||
my $tn = TimeNow();
|
||||
|
||||
# update sequence number reading
|
||||
$hash->{READINGS}{seqno}{TIME} = $tn;
|
||||
$hash->{READINGS}{seqno}{VAL} = $seqno;
|
||||
$hash->{CHANGED}[$c++] = "seqno: $seqno";
|
||||
|
||||
# update raw readings
|
||||
$hash->{READINGS}{state}{TIME} = $tn;
|
||||
$hash->{READINGS}{state}{VAL} = $val;
|
||||
$hash->{CHANGED}[$c++] = "state: $val";
|
||||
|
||||
# initialize total_cnt_last
|
||||
my $total_cnt_last;
|
||||
if(defined($hash->{READINGS}{total_cnt})) {
|
||||
$total_cnt_last= $hash->{READINGS}{total_cnt}{VAL};
|
||||
} else {
|
||||
$total_cnt_last= 0;
|
||||
}
|
||||
|
||||
# update total_cnt reading
|
||||
$hash->{READINGS}{total_cnt}{TIME} = $tn;
|
||||
$hash->{READINGS}{total_cnt}{VAL} = $total_cnt;
|
||||
$hash->{CHANGED}[$c++] = "total_cnt: $total_cnt";
|
||||
|
||||
# initialize basis_cnt_last
|
||||
my $basis_cnt_last;
|
||||
if(defined($hash->{READINGS}{basis_cnt})) {
|
||||
$basis_cnt_last= $hash->{READINGS}{basis}{VAL};
|
||||
} else {
|
||||
$basis_cnt_last= 0;
|
||||
}
|
||||
|
||||
# correct counter wraparound
|
||||
my $basis_cnt= $basis_cnt_last;
|
||||
if($total_cnt< $total_cnt_last) {
|
||||
$basis_cnt+= 65536;
|
||||
# update basis_cnt
|
||||
$hash->{READINGS}{basis}{TIME}= $tn;
|
||||
$hash->{READINGS}{basis}{VAL} = $basis_cnt;
|
||||
$hash->{CHANGED}[$c++] = "basis: $basis_cnt";
|
||||
}
|
||||
|
||||
#
|
||||
# translate into device units
|
||||
#
|
||||
my $corr1 = $hash->{corr1}; # EMEM power correction factor
|
||||
my $corr2 = $hash->{corr2}; # EMEM energy correction factor
|
||||
|
||||
my $total = ($basis_cnt+$total_cnt)*$corr2;
|
||||
my $current = $current_cnt*$corr1;
|
||||
my $peak = $peak_cnt*$corr1;
|
||||
|
||||
$hash->{CHANGED}[$c++] = "total: $total";
|
||||
$hash->{READINGS}{total}{TIME} = $tn;
|
||||
$hash->{READINGS}{total}{VAL} = $total;
|
||||
$hash->{CHANGED}[$c++] = "current: $current";
|
||||
$hash->{READINGS}{current}{TIME} = $tn;
|
||||
$hash->{READINGS}{current}{VAL} = $current;
|
||||
$hash->{CHANGED}[$c++] = "peak: $peak";
|
||||
$hash->{READINGS}{peak}{TIME} = $tn;
|
||||
$hash->{READINGS}{peak}{VAL} = $peak;
|
||||
|
||||
return $hash->{NAME};
|
||||
|
||||
|
@ -343,3 +343,9 @@
|
||||
Note: we have to sleep after disconnect for 5 seconds, else the Linux
|
||||
kernel sends us a SIGSEGV, and the USB device is gone till the next reboot.
|
||||
- the fhem CUL part documented
|
||||
|
||||
- Sun Dec 7 21:09 (Boris)
|
||||
- reworked 15_CUL_EM.pm to account for timer wraparounds, more readings added
|
||||
- speed gain through disabled refreshvalues query to all FHTs at definition;
|
||||
if you want it back at a "set myFHT report1 255 report2 255" command to the
|
||||
config file.
|
||||
|
Loading…
x
Reference in New Issue
Block a user