mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 16:56:54 +00:00
add day/month/year/total counter
git-svn-id: https://svn.fhem.de/fhem/trunk@1763 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
a0c21c4647
commit
14d7e10639
@ -20,7 +20,7 @@
|
|||||||
#
|
#
|
||||||
# get <name> <key>
|
# get <name> <key>
|
||||||
#
|
#
|
||||||
# where <key> is one of minPower, maxPower, lastPower, avgPower
|
# where <key> is one of minPower, maxPower, lastPower, avgPower, DAYPOWER, MONTHPOWER, YEARPOWER, TOTALPOWER
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
@ -30,7 +30,11 @@ use IO::Socket::INET;
|
|||||||
my @gets = ('minPower', # min value
|
my @gets = ('minPower', # min value
|
||||||
'maxPower', # max value
|
'maxPower', # max value
|
||||||
'lastPower', # last value
|
'lastPower', # last value
|
||||||
'avgPower'); # avagare value in interval
|
'avgPower', # avagare value in interval
|
||||||
|
'DAYPOWER',
|
||||||
|
'MONTHPOWER',
|
||||||
|
'YEARPOWER',
|
||||||
|
'TOTALPOWER');
|
||||||
|
|
||||||
sub
|
sub
|
||||||
SML_Initialize($)
|
SML_Initialize($)
|
||||||
@ -40,9 +44,36 @@ my ($hash) = @_;
|
|||||||
$hash->{DefFn} = "energy_Define";
|
$hash->{DefFn} = "energy_Define";
|
||||||
$hash->{UndefFn} = "energy_Undef";
|
$hash->{UndefFn} = "energy_Undef";
|
||||||
$hash->{GetFn} = "energy_Get";
|
$hash->{GetFn} = "energy_Get";
|
||||||
|
$hash->{StateFn} = "energy_State";
|
||||||
|
$hash->{SetFn} = "energy_Set";
|
||||||
$hash->{AttrList} = "loglevel:0,1,2,3,4,5";
|
$hash->{AttrList} = "loglevel:0,1,2,3,4,5";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub
|
||||||
|
energy_State($$$$)
|
||||||
|
{
|
||||||
|
my ($hash, $tim, $vt, $val) = @_;
|
||||||
|
# Log 4, "time: $tim";
|
||||||
|
# Log 4, "name: $vt";
|
||||||
|
# Log 4, "value: $val";
|
||||||
|
$hash->{READINGS}{$vt}{VAL} = $val;
|
||||||
|
$hash->{READINGS}{$vt}{TIME} = TimeNow();
|
||||||
|
# Log 4, "$hash->{NAME} VAL: $hash->{READINGS}{$vt}{VAL}";
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
sub
|
||||||
|
energy_Set($$$$)
|
||||||
|
{
|
||||||
|
my ($hash, $tim, $vt, $val) = @_;
|
||||||
|
# Log 4, "time: $tim";
|
||||||
|
# Log 4, "name: $vt";
|
||||||
|
# Log 4, "value: $val";
|
||||||
|
$hash->{READINGS}{$vt}{VAL} = $val;
|
||||||
|
$hash->{READINGS}{$vt}{TIME} = TimeNow();
|
||||||
|
# Log 4, "$hash->{NAME} VAL: $hash->{READINGS}{$vt}{VAL}";
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
sub
|
sub
|
||||||
energy_Define($$)
|
energy_Define($$)
|
||||||
{
|
{
|
||||||
@ -62,17 +93,12 @@ energy_Define($$)
|
|||||||
$hash->{Timeout} = int(@args) >= 6 ? int($args[5]) : 4;
|
$hash->{Timeout} = int(@args) >= 6 ? int($args[5]) : 4;
|
||||||
|
|
||||||
Log 3, "$hash->{NAME} will read from SML at $hash->{Host}:$hash->{Port} " ;
|
Log 3, "$hash->{NAME} will read from SML at $hash->{Host}:$hash->{Port} " ;
|
||||||
# config variables
|
|
||||||
$hash->{Invalid} = -1; # default value for invalid readings
|
$hash->{Invalid} = -1; # default value for invalid readings
|
||||||
$hash->{Rereads} = 2; # number of retries when reading curPwr of 0
|
$hash->{Rereads} = 2; # number of retries when reading curPwr of 0
|
||||||
$hash->{UseSVTime} = ''; # use the SV time as timestamp (else: TimeNow())
|
$hash->{UseSVTime} = ''; # use the SV time as timestamp (else: TimeNow())
|
||||||
|
|
||||||
$hash->{STATE} = 'Initializing';
|
$hash->{STATE} = 'Initializing';
|
||||||
# $hash->{DAYPOWER} = '0';
|
|
||||||
# $hash->{WEEKPOWER} = '0';
|
|
||||||
# $hash->{MONTHPOWER} = '0';
|
|
||||||
# $hash->{YEARPOWER} = '0';
|
|
||||||
|
|
||||||
my $timenow = TimeNow();
|
my $timenow = TimeNow();
|
||||||
|
|
||||||
for my $get (@gets)
|
for my $get (@gets)
|
||||||
@ -119,8 +145,9 @@ energy_Update($)
|
|||||||
my $avg;
|
my $avg;
|
||||||
my $min = 20000;
|
my $min = 20000;
|
||||||
my $max = 0;
|
my $max = 0;
|
||||||
|
my $log = "";
|
||||||
|
|
||||||
Log 4, "$url";
|
Log 4, "$hash->{NAME} $url";
|
||||||
|
|
||||||
$socket = new IO::Socket::INET (
|
$socket = new IO::Socket::INET (
|
||||||
PeerAddr => $ip,
|
PeerAddr => $ip,
|
||||||
@ -130,10 +157,10 @@ $socket = new IO::Socket::INET (
|
|||||||
Timeout => $timeout
|
Timeout => $timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
Log 4, "socket new";
|
Log 4, "$hash->{NAME} socket new";
|
||||||
if (defined ($socket) and $socket and $socket->connected())
|
if (defined ($socket) and $socket and $socket->connected())
|
||||||
{
|
{
|
||||||
Log 4, "Connected ...";
|
Log 4, "$hash->{NAME} Connected ...";
|
||||||
print $socket "GET $url HTTP/1.0\r\n\r\n";
|
print $socket "GET $url HTTP/1.0\r\n\r\n";
|
||||||
$socket->autoflush(1);
|
$socket->autoflush(1);
|
||||||
while ((read $socket, $buf, 1024) > 0)
|
while ((read $socket, $buf, 1024) > 0)
|
||||||
@ -142,7 +169,7 @@ if (defined ($socket) and $socket and $socket->connected())
|
|||||||
$message .= $buf;
|
$message .= $buf;
|
||||||
}
|
}
|
||||||
$socket->close();
|
$socket->close();
|
||||||
Log 4, "Socket closed";
|
Log 4, "$hash->{NAME} Socket closed";
|
||||||
|
|
||||||
@array = split(/\n/,$message);
|
@array = split(/\n/,$message);
|
||||||
foreach (@array){
|
foreach (@array){
|
||||||
@ -164,8 +191,8 @@ if (defined ($socket) and $socket and $socket->connected())
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
Log 3, "Cannot open socket ...";
|
Log 3, "$hash->{NAME} Cannot open socket ...";
|
||||||
$success = 1;
|
$success = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -175,18 +202,88 @@ if ( $success == 0 and $summary > 0 and $counts > 0)
|
|||||||
{
|
{
|
||||||
$avg = $summary/$counts;
|
$avg = $summary/$counts;
|
||||||
$avg =sprintf("%.2f",$avg);
|
$avg =sprintf("%.2f",$avg);
|
||||||
$hash->{READINGS}{$gets[0]}{VAL} = $min;
|
$hash->{READINGS}{minPower}{VAL} = $min;
|
||||||
$hash->{READINGS}{$gets[0]}{TIME} = $timenow;
|
$hash->{READINGS}{minPower}{TIME} = $timenow;
|
||||||
$hash->{READINGS}{$gets[1]}{VAL} = $max;
|
$hash->{READINGS}{maxPower}{VAL} = $max;
|
||||||
$hash->{READINGS}{$gets[1]}{TIME} = $timenow;
|
$hash->{READINGS}{maxPower}{TIME} = $timenow;
|
||||||
$hash->{READINGS}{$gets[2]}{VAL} = $last;
|
$hash->{READINGS}{lastPower}{VAL} = $last;
|
||||||
$hash->{READINGS}{$gets[2]}{TIME} = $timenow;
|
$hash->{READINGS}{lastPower}{TIME} = $timenow;
|
||||||
$hash->{READINGS}{$gets[3]}{VAL} = $avg;
|
$hash->{READINGS}{avgPower}{VAL} = $avg;
|
||||||
$hash->{READINGS}{$gets[3]}{TIME} = $timenow;
|
$hash->{READINGS}{avgPower}{TIME} = $timenow;
|
||||||
push @{$hash->{CHANGED}}, "min: $min max: $max last: $last avg: $avg";
|
$log = "min: $min max: $max last: $last avg: $avg";
|
||||||
DoTrigger($hash->{NAME}, undef) if ($init_done);
|
DoTrigger($hash->{NAME}, undef) if ($init_done);
|
||||||
$hash->{STATE} = $hash->{READINGS}{minPower}{VAL}.' W, '.$hash->{READINGS}{maxPower}{VAL}.' W ' .$hash->{READINGS}{lastPower}{VAL}.' W '.$hash->{READINGS}{avgPower}{VAL}.' W';
|
$hash->{STATE} = "min: $min max: $max last: $last avg: $avg";
|
||||||
|
my $newpower = $avg/(3600/$interval);
|
||||||
|
$newpower = $newpower/1000;
|
||||||
|
$newpower =sprintf("%.6f",$newpower);
|
||||||
|
my ($date, $month, $day, $hour, $min, $sec) = $timenow =~ /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
|
||||||
|
# ######### DAYPOWER
|
||||||
|
if ( $hash->{READINGS}{DAYPOWER}{VAL} eq "-1" ){
|
||||||
|
$hash->{READINGS}{DAYPOWER}{VAL} = $newpower;
|
||||||
|
}else{
|
||||||
|
my ($dateLast, $monthLast, $dayLast, $hourLast, $minLast, $secLast) = $hash->{READINGS}{DAYPOWER}{TIME} =~ /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
|
||||||
|
my ($powLast) = $hash->{READINGS}{DAYPOWER}{VAL} =~ /^(.*)$/;
|
||||||
|
Log 4, "$hash->{NAME} myhour: $dateLast $monthLast $dayLast $hourLast $minLast $secLast $powLast";
|
||||||
|
$hash->{READINGS}{DAYPOWER}{TIME} = $timenow;
|
||||||
|
if ( $dayLast eq $day ){ # es ist der gleiche Tag
|
||||||
|
$powLast += $newpower ;
|
||||||
|
$hash->{READINGS}{DAYPOWER}{VAL} = $powLast;
|
||||||
|
Log 4, "$hash->{NAME} same day timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
$log .= " day: $powLast";
|
||||||
|
}else{ # es ist eine Tag vergangen
|
||||||
|
$hash->{READINGS}{DAYPOWER}{VAL} = $newpower;
|
||||||
|
Log 4, "$hash->{NAME} new day timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# ######### MONTH
|
||||||
|
if ( $hash->{READINGS}{MONTHPOWER}{VAL} eq "-1" ){
|
||||||
|
$hash->{READINGS}{MONTHPOWER}{VAL} = $newpower;
|
||||||
|
}else{
|
||||||
|
my ($dateLast, $monthLast, $dayLast, $hourLast, $minLast, $secLast) = $hash->{READINGS}{MONTHPOWER}{TIME} =~ /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
|
||||||
|
my ($powLast) = $hash->{READINGS}{MONTHPOWER}{VAL} =~ /^(.*)$/;
|
||||||
|
Log 4, "$hash->{NAME} myhour: $dateLast $monthLast $dayLast $hourLast $minLast $secLast $powLast";
|
||||||
|
$hash->{READINGS}{MONTHPOWER}{TIME} = $timenow;
|
||||||
|
if ( $monthLast eq $month ){ # es ist der gleiche Monat
|
||||||
|
$powLast += $newpower ;
|
||||||
|
$hash->{READINGS}{MONTHPOWER}{VAL} = $powLast;
|
||||||
|
Log 4, "$hash->{NAME} Gleicher Monat timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
$log .= " month: $powLast";
|
||||||
|
}else{ # es ist eine Monat vergangen
|
||||||
|
$hash->{READINGS}{MONTHPOWER}{VAL} = $newpower;
|
||||||
|
Log 4, "$hash->{NAME} Neuer Monat timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# ######### YEARPOWER
|
||||||
|
if ( $hash->{READINGS}{YEARPOWER}{VAL} eq "-1" ){
|
||||||
|
$hash->{READINGS}{YEARPOWER}{VAL} = $newpower;
|
||||||
|
}else{
|
||||||
|
my ($dateLast, $monthLast, $dayLast, $hourLast, $minLast, $secLast) = $hash->{READINGS}{YEARPOWER}{TIME} =~ /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
|
||||||
|
my ($powLast) = $hash->{READINGS}{YEARPOWER}{VAL} =~ /^(.*)$/;
|
||||||
|
Log 4, "$hash->{NAME} myhour: $dateLast $monthLast $dayLast $hourLast $minLast $secLast $powLast";
|
||||||
|
$hash->{READINGS}{YEARPOWER}{TIME} = $timenow;
|
||||||
|
if ( $yearhLast eq $year ){ # es ist das gleiche Jahr
|
||||||
|
$powLast += $newpower ;
|
||||||
|
$hash->{READINGS}{YEARPOWER}{VAL} = $powLast;
|
||||||
|
Log 4, "$hash->{NAME} Gleiches Jahr timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
$log .= " year: $powLast";
|
||||||
|
}else{ # es ist eine Jahr vergangen
|
||||||
|
$hash->{READINGS}{YEARPOWER}{VAL} = $newpower;
|
||||||
|
Log 4, "$hash->{NAME} Neues Jahr timenow: $timenow newpower $newpower powlast $powLast";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# ######### TOTALPOWER
|
||||||
|
$hash->{READINGS}{TOTALPOWER}{TIME} = $timenow;
|
||||||
|
if ( $hash->{READINGS}{TOTALPOWER}{VAL} eq "-1" ){
|
||||||
|
$hash->{READINGS}{TOTALPOWER}{VAL} = $newpower;
|
||||||
|
}else{
|
||||||
|
my ($dateLast, $monthLast, $dayLast, $hourLast, $minLast, $secLast) = $hash->{READINGS}{TOTALPOWER}{TIME} =~ /^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
|
||||||
|
my ($powLast) = $hash->{READINGS}{TOTALPOWER}{VAL} =~ /^(.*)$/;
|
||||||
|
Log 4, "$hash->{NAME} total: $dateLast $monthLast $dayLast $hourLast $minLast $secLast $powLast";
|
||||||
|
$powLast += $newpower ;
|
||||||
|
$hash->{READINGS}{TOTALPOWER}{VAL} = $powLast;
|
||||||
|
$log .= " total: $powLast";
|
||||||
|
}
|
||||||
|
push @{$hash->{CHANGED}}, $log;
|
||||||
}else{
|
}else{
|
||||||
Log 3, "$hash->{NAME} can't update - device send a error";
|
Log 3, "$hash->{NAME} can't update - device send a error";
|
||||||
}
|
}
|
||||||
@ -210,7 +307,9 @@ energy_Update($hash) unless $hash->{Interval};
|
|||||||
if (defined($hash->{READINGS}{$get})) {
|
if (defined($hash->{READINGS}{$get})) {
|
||||||
$val = $hash->{READINGS}{$get}{VAL};
|
$val = $hash->{READINGS}{$get}{VAL};
|
||||||
} else {
|
} else {
|
||||||
return "energy_Get: no such reading: $get";
|
#return "energy_Get: no such reading: $get";
|
||||||
|
#minPower, maxPower, lastPower, avgPower, DAYPOWER, MONTHPOWER, YEARPOWER, TOTALPOWER
|
||||||
|
return "energy_Get: no such reading: $get";
|
||||||
}
|
}
|
||||||
|
|
||||||
Log 3, "$args[0] $get => $val";
|
Log 3, "$args[0] $get => $val";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user