From 53f79bdbfe518d2d4e66950ba90438a606755c5a Mon Sep 17 00:00:00 2001 From: DS_Starter Date: Thu, 18 Jun 2020 19:58:17 +0000 Subject: [PATCH] 76_SMAPortal: contrib 3.0.0 git-svn-id: https://svn.fhem.de/fhem/trunk@22196 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- .../contrib/DS_Starter/76_SMAPortal_V3.0.0.pm | 189 +++++++++++++----- 1 file changed, 137 insertions(+), 52 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm b/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm index ae96f2b90..f88e64de7 100644 --- a/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm +++ b/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm @@ -219,18 +219,20 @@ my %statkeys = ( # Statistikdaten auszulesende Schlüs my %subs; # Arbeitskopie von %stpl my %stpl = ( # Ausgangstemplate Subfunktionen der Datenprovider - consumerMasterdata => { doit => 1, level => 'L00', func => '_getConsumerMasterdata'}, # mandatory - plantData => { doit => 1, level => 'L00', func => '_getPlantData' }, # mandatory - liveData => { doit => 0, level => 'L01', func => '_getLiveData' }, - weatherData => { doit => 0, level => 'L02', func => '_getWeatherData' }, - balanceDayData => { doit => 0, level => 'L03', func => '_getBalanceDayData' }, - forecastData => { doit => 0, level => 'L04', func => '_getForecastData' }, - consumerDayData => { doit => 0, level => 'L05', func => '_getConsumerDayData' }, - consumerMonthData => { doit => 0, level => 'L06', func => '_getConsumerMonthData' }, - consumerYearData => { doit => 0, level => 'L07', func => '_getConsumerYearData' }, + consumerMasterdata => { doit => 1, level => 'L00', func => '_getConsumerMasterdata'}, # mandatory + plantData => { doit => 1, level => 'L00', func => '_getPlantData' }, # mandatory + liveData => { doit => 0, level => 'L01', func => '_getLiveData' }, + weatherData => { doit => 0, level => 'L02', func => '_getWeatherData' }, + balanceDayData => { doit => 0, level => 'L03', func => '_getBalanceDayData' }, + forecastData => { doit => 0, level => 'L04', func => '_getForecastData' }, + consumerCurrentdata => { doit => 0, level => 'L05', func => '_getConsumerCurrData' }, + consumerDayData => { doit => 0, level => 'L06', func => '_getConsumerDayData' }, + consumerMonthData => { doit => 0, level => 'L07', func => '_getConsumerMonthData' }, + consumerYearData => { doit => 0, level => 'L08', func => '_getConsumerYearData' }, ); # Tags der verfügbaren Datenquellen my @pd = qw( balanceDayData + consumerCurrentdata consumerMasterdata consumerDayData consumerMonthData @@ -1147,6 +1149,31 @@ sub _getConsumerMasterdata { ## no critic "not used" return ($errstate,$state,$reread,$retry); } +################################################################ +# Abruf Consumer current Data +################################################################ +sub _getConsumerCurrData { ## no critic "not used" + my $paref = shift; + my $name = $paref->{name}; + my $ua = $paref->{ua}; # LWP Useragent + my $state = $paref->{state}; + my $daref = $paref->{daref}; # Referenz zum Datenarray + + my ($reread,$retry,$errstate) = (0,0,0); + + ($errstate,$state) = __dispatchGet ({ name => $name, + ua => $ua, + call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues', + tag => "consumerCurrentdata", + state => $state, + fnaref => [ qw( extractConsumerCurrentdata ) ], + addon => "", + daref => $daref + }); + +return ($errstate,$state,$reread,$retry); +} + ################################################################ # Abruf Consumer Tagesdaten ################################################################ @@ -1677,7 +1704,7 @@ sub ParseData { ## no critic readingsEndUpdate($hash, 1); my $ldlv = $stpl{liveData}{level}; - my $cmlv = $stpl{consumerMasterdata}{level}; + my $cclv = $stpl{consumerCurrentdata}{level}; my $lddo = $subs{$name}{liveData}{doit}; my $pv = ReadingsNum($name, "${ldlv}_PV" , 0); @@ -1697,7 +1724,7 @@ sub ParseData { ## no critic if($setp ne "none") { my ($d,$op) = split(":",$setp); $op = ($op eq "auto") ? "off (automatic)" : $op; - readingsBulkUpdate($hash, "${cmlv}_${d}_Switch", $op); + readingsBulkUpdate($hash, "${cclv}_${d}_Switch", $op); } readingsBulkUpdate($hash, "lastCycleTime", $ctime ) if($ctime > 0); readingsBulkUpdate($hash, "summary" , $sum." W") if($subs{$name}{liveData}{doit}); @@ -2184,7 +2211,57 @@ sub extractConsumerMasterdata { }; my $lv = $stpl{consumerMasterdata}{level}; - # allen Consumer Objekte die ID zuordnen + # allen Consumer Objekten die ID zuordnen + $i = 0; + for my $c (@{$clivedata->{'MeasurementData'}}) { + $consumers{"${i}_ConsumerName"} = encode("utf8", $c->{'DeviceName'} ); + $consumers{"${i}_ConsumerOid"} = $c->{'Consume'}{'ConsumerOid'}; + $consumers{"${i}_ConsumerLfd"} = $i; + my $cn = $consumers{"${i}_ConsumerName"}; # Verbrauchername + next if(!$cn); + $cn = replaceJunkSigns($cn); + + $hash->{HELPER}{CONSUMER}{$i}{DeviceName} = $cn; + $hash->{HELPER}{CONSUMER}{$i}{ConsumerOid} = $consumers{"${i}_ConsumerOid"}; + $hash->{HELPER}{CONSUMER}{$i}{SerialNumber} = $c->{'SerialNumber'}; + $hash->{HELPER}{CONSUMER}{$i}{SUSyID} = $c->{'SUSyID'}; + + $i++; + } + + if($hash->{HELPER}{CONSUMER}) { + for my $key (keys %{$hash->{HELPER}{CONSUMER}}) { + for my $parname (keys %{$hash->{HELPER}{CONSUMER}{$key}}) { + my $val = $hash->{HELPER}{CONSUMER}{$key}{$parname}; + next if(!defined $val); + Log3 ($name, 4, "$name - CONSUMER master data: $key -> $parname = $val"); + BlockingInformParent("FHEM::SMAPortal::setFromBlocking", [$name, "NULL", "CONSUMER:$key:$parname:$val"], 1); + } + } + } + +return; +} + +################################################################ +## Auswertung Consumer Current Data +################################################################ +sub extractConsumerCurrentdata { + my $hash = shift; + my $daref = shift; + my $clivedata = shift; + my $name = $hash->{NAME}; + my %consumers; + my ($i,$res); + + Log3 ($name, 4, "$name - ##### extracting consumer current data #### "); + + $clivedata = eval{decode_json($clivedata)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + my $lv = $stpl{consumerCurrentdata}{level}; + + # allen Consumer Objekten die ID zuordnen $i = 0; for my $c (@{$clivedata->{'MeasurementData'}}) { $consumers{"${i}_ConsumerName"} = encode("utf8", $c->{'DeviceName'} ); @@ -2194,11 +2271,6 @@ sub extractConsumerMasterdata { my $cn = $consumers{"${i}_ConsumerName"}; # Verbrauchername next if(!$cn); $cn = replaceJunkSigns($cn); - - $hash->{HELPER}{CONSUMER}{$i}{DeviceName} = $cn; - $hash->{HELPER}{CONSUMER}{$i}{ConsumerOid} = $consumers{"${i}_ConsumerOid"}; - $hash->{HELPER}{CONSUMER}{$i}{SerialNumber} = $c->{'SerialNumber'}; - $hash->{HELPER}{CONSUMER}{$i}{SUSyID} = $c->{'SUSyID'}; push @$daref, "${lv}_${cn}_Power:".$cpower." W" if(defined $cpower); @@ -2236,16 +2308,6 @@ sub extractConsumerMasterdata { } } - if($hash->{HELPER}{CONSUMER}) { - for my $key (keys %{$hash->{HELPER}{CONSUMER}}) { - for my $parname (keys %{$hash->{HELPER}{CONSUMER}{$key}}) { - my $val = $hash->{HELPER}{CONSUMER}{$key}{$parname}; - next if(!defined $val); - BlockingInformParent("FHEM::SMAPortal::setFromBlocking", [$name, "NULL", "CONSUMER:$key:$parname:$val"], 1); - } - } - } - return; } @@ -3422,12 +3484,14 @@ return;