From 14d7e106399fc71a8fdfb6d2c95fc5de2da9c96d Mon Sep 17 00:00:00 2001 From: bentele <> Date: Thu, 26 Jul 2012 19:10:14 +0000 Subject: [PATCH] add day/month/year/total counter git-svn-id: https://svn.fhem.de/fhem/trunk@1763 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/70_SML.pm | 153 +++++++++++++++++++++++++++++++++-------- 1 file changed, 126 insertions(+), 27 deletions(-) diff --git a/fhem/contrib/70_SML.pm b/fhem/contrib/70_SML.pm index e72091bb5..0b7f4441a 100644 --- a/fhem/contrib/70_SML.pm +++ b/fhem/contrib/70_SML.pm @@ -20,7 +20,7 @@ # # get # -# where is one of minPower, maxPower, lastPower, avgPower +# where is one of minPower, maxPower, lastPower, avgPower, DAYPOWER, MONTHPOWER, YEARPOWER, TOTALPOWER ############################################################################## @@ -30,7 +30,11 @@ use IO::Socket::INET; my @gets = ('minPower', # min value 'maxPower', # max value 'lastPower', # last value - 'avgPower'); # avagare value in interval + 'avgPower', # avagare value in interval + 'DAYPOWER', + 'MONTHPOWER', + 'YEARPOWER', + 'TOTALPOWER'); sub SML_Initialize($) @@ -40,9 +44,36 @@ my ($hash) = @_; $hash->{DefFn} = "energy_Define"; $hash->{UndefFn} = "energy_Undef"; $hash->{GetFn} = "energy_Get"; + $hash->{StateFn} = "energy_State"; + $hash->{SetFn} = "energy_Set"; $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 energy_Define($$) { @@ -62,17 +93,12 @@ energy_Define($$) $hash->{Timeout} = int(@args) >= 6 ? int($args[5]) : 4; Log 3, "$hash->{NAME} will read from SML at $hash->{Host}:$hash->{Port} " ; - # config variables $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->{STATE} = 'Initializing'; -# $hash->{DAYPOWER} = '0'; -# $hash->{WEEKPOWER} = '0'; -# $hash->{MONTHPOWER} = '0'; -# $hash->{YEARPOWER} = '0'; - + my $timenow = TimeNow(); for my $get (@gets) @@ -119,8 +145,9 @@ energy_Update($) my $avg; my $min = 20000; my $max = 0; + my $log = ""; -Log 4, "$url"; +Log 4, "$hash->{NAME} $url"; $socket = new IO::Socket::INET ( PeerAddr => $ip, @@ -130,10 +157,10 @@ $socket = new IO::Socket::INET ( Timeout => $timeout ); -Log 4, "socket new"; +Log 4, "$hash->{NAME} socket new"; 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"; $socket->autoflush(1); while ((read $socket, $buf, 1024) > 0) @@ -142,7 +169,7 @@ if (defined ($socket) and $socket and $socket->connected()) $message .= $buf; } $socket->close(); - Log 4, "Socket closed"; + Log 4, "$hash->{NAME} Socket closed"; @array = split(/\n/,$message); foreach (@array){ @@ -164,8 +191,8 @@ if (defined ($socket) and $socket and $socket->connected()) } } } -}else{ - Log 3, "Cannot open socket ..."; +}else{ + Log 3, "$hash->{NAME} Cannot open socket ..."; $success = 1; return 0; } @@ -175,18 +202,88 @@ if ( $success == 0 and $summary > 0 and $counts > 0) { $avg = $summary/$counts; $avg =sprintf("%.2f",$avg); - $hash->{READINGS}{$gets[0]}{VAL} = $min; - $hash->{READINGS}{$gets[0]}{TIME} = $timenow; - $hash->{READINGS}{$gets[1]}{VAL} = $max; - $hash->{READINGS}{$gets[1]}{TIME} = $timenow; - $hash->{READINGS}{$gets[2]}{VAL} = $last; - $hash->{READINGS}{$gets[2]}{TIME} = $timenow; - $hash->{READINGS}{$gets[3]}{VAL} = $avg; - $hash->{READINGS}{$gets[3]}{TIME} = $timenow; - push @{$hash->{CHANGED}}, "min: $min max: $max last: $last avg: $avg"; + $hash->{READINGS}{minPower}{VAL} = $min; + $hash->{READINGS}{minPower}{TIME} = $timenow; + $hash->{READINGS}{maxPower}{VAL} = $max; + $hash->{READINGS}{maxPower}{TIME} = $timenow; + $hash->{READINGS}{lastPower}{VAL} = $last; + $hash->{READINGS}{lastPower}{TIME} = $timenow; + $hash->{READINGS}{avgPower}{VAL} = $avg; + $hash->{READINGS}{avgPower}{TIME} = $timenow; + $log = "min: $min max: $max last: $last avg: $avg"; 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{ 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})) { $val = $hash->{READINGS}{$get}{VAL}; } 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";