From b95f196aed4fbda1eb42767f126e016428f1e7a6 Mon Sep 17 00:00:00 2001 From: bentele <> Date: Wed, 18 Dec 2013 09:19:09 +0000 Subject: [PATCH] =?UTF-8?q?new=20version=20because=20"Inteligenter=20Strom?= =?UTF-8?q?=20Z=C3=A4hler"=20and=20"Sparz=C3=A4hler"=20got=20a=20update=20?= =?UTF-8?q?from=20ENBW=20bzw.=20Yellow=20Strom.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.fhem.de/fhem/trunk@4412 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/70_SML.pm | 105 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/fhem/FHEM/70_SML.pm b/fhem/FHEM/70_SML.pm index b50f4911a..f5a6c1e4a 100644 --- a/fhem/FHEM/70_SML.pm +++ b/fhem/FHEM/70_SML.pm @@ -8,7 +8,7 @@ # # $Id$ # -# Version = 2.1 +# Version = 2.2 # ############################################################################## # @@ -16,7 +16,7 @@ # # If is positive, new values are read every seconds. # If is 0, new values are read whenever a get request is called -# on . The default for is 300 (i.e. 5 minutes). +# on . The default for is 60 (i.e. 1 minutes). # # get # @@ -34,7 +34,9 @@ my @gets = ('minPower', # min value 'DAYPOWER', 'MONTHPOWER', 'YEARPOWER', - 'TOTALPOWER'); + 'TOTALPOWER', + 'NT', + 'HT'); sub SML_Initialize($) @@ -93,7 +95,14 @@ energy_Define($$) $hash->{Host} = $args[2]; $hash->{Port} = $args[3]; - $hash->{Interval} = int(@args) >= 5 ? int($args[4]) : 300; + + if ( int(@args) >= 5 ){ + if ( int($args[4]) >= 100 ){ + $hash->{Interval} = 100; + }else{ + $hash->{Interval} = int($args[4]); + } + } $hash->{Timeout} = int(@args) >= 6 ? int($args[5]) : 4; #Log 4, "$hash->{NAME} will read from SML at $hash->{Host}:$hash->{Port} " ; @@ -120,6 +129,74 @@ Log3 $hash, 3, "$hash->{NAME} will read from SML at $hash->{Host}:$hash->{Port} return undef; } +sub +energy_Counter($) +{ + my ($hash) = @_; + my $ip = $hash->{Host}; + my $port = $hash->{Port}; + my $interval = $hash->{Interval}; + my $timeout = $hash->{Timeout}; + my $url = "/?action=20"; + my $socket ; + my $buf ; + my $message ; + my @array ; + my $counts = 0 ; + my $HT = 0; + my $NT = 0; + + Log3 $hash, 4, "$hash->{NAME} $ip : $port : $url"; + $socket = new IO::Socket::INET ( + PeerAddr => $ip, + PeerPort => $port, + Proto => 'tcp', + Reuse => 0, + Timeout => $timeout + ); + Log3 $hash, 4, "$hash->{NAME} socket new"; + if (defined ($socket) and $socket and $socket->connected()) + { + Log3 $hash, 4, "$hash->{NAME} Connected ..."; + print $socket "GET $url HTTP/1.0\r\n\r\n"; + $socket->autoflush(1); + while ((read $socket, $buf, 1024) > 0) + { + Log 5,"buf: $buf"; + $message .= $buf; + } + }else{ + Log3 $hash, 3, "$hash->{NAME} Cannot open socket ..."; + $success = 1; + return 0; + } + @array = split(/\n/,$message); + foreach (@array){ + if ( $_ =~ /^

(.*)HT:(.*)$/){ + $HT = 1; + } + if ( $HT == 1 ){ + if ( $_ =~ /^

(.*) kWh<\/h3>(.*)$/){ + $HT = $1; + $counts = 0; + } + } + if ( $_ =~ /^

(.*)NT:(.*)$/){ + $NT = 1; + } + if ( $NT == 1 ){ + if ( $_ =~ /^

(.*) kWh<\/h3>(.*)$/){ + $NT = $1; + $counts = 0; + } + } + } + $hash->{READINGS}{HT}{VAL} = $HT; + $hash->{READINGS}{NT}{VAL} = $NT; + Log3 $hash, 3, "$hash->{NAME} HT = $HT NT = $NT"; + return "HT: $HT kWh NT: $NT kWh"; +} + sub energy_Update($) { @@ -142,7 +219,8 @@ energy_Update($) my $timeout = $hash->{Timeout}; my $counts = 0 ; my $summary = 0 ; - my $url = "/InstantView/request/getPowerProfile.html?ts=0\&n=$interval\¶m=Wirkleistung\&format=1"; + #my $url = "/InstantView/request/getPowerProfile.html?ts=0\&n=$interval\¶m=Wirkleistung\&format=1"; + my $url = "/InstantView/request/getPowerProfile.html?ts=0\&n=$interval"; my $socket ; my $buf ; my $message ; @@ -316,15 +394,18 @@ energy_Update($hash) unless $hash->{Interval}; my $get = $args[1]; my $val = $hash->{Invalid}; + +if ( $get eq "counter"){ + $val = energy_Counter($hash); + } if (defined($hash->{READINGS}{$get})) { - $val = $hash->{READINGS}{$get}{VAL}; - } else { - return "energy_Get: no such reading: $get"; - } + $val = $hash->{READINGS}{$get}{VAL}; + } if ( $get eq "?"){ - return "Unknown argument ?, choose one of minPower maxPower lastPower avgPower DAYPOWER MONTHPOWER YEARPOWER TOTALPOWER"; + return "Unknown argument ?, choose one of counter minPower maxPower lastPower avgPower DAYPOWER MONTHPOWER YEARPOWER TOTALPOWER"; } + Log3 $hash, 3, "$args[0] $get => $val"; return $val; @@ -350,14 +431,14 @@ energy_Undef($$)

SML

    This module supports "Intelligenter Strom Zhler"(ENBW) and "Sparzhler" (Yellow Strom).
    -The electricity meter will be polled in a defined interval for new values. +The electricity meter will be polled in a defined interval (1-100) for new values.

    Define
    define <name> SML <host> <port> [<interval> <timeout>]

    Example:
    define StromZ1 SML 192.168.178.20
    - define StromZ2 SML 192.168.10.25 300 60
    + define StromZ2 SML 192.168.10.25 60 60

    Set