From 2eee5d4babf0291ef208138710037a4fc7e6cd06 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Tue, 9 Jun 2020 13:37:45 +0000 Subject: [PATCH] 76_SMAPortal: contrib 2.10.1 git-svn-id: https://svn.fhem.de/fhem/trunk@22146 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SMAPortal.pm | 165 +++++++++++++----------- 1 file changed, 90 insertions(+), 75 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SMAPortal.pm b/fhem/contrib/DS_Starter/76_SMAPortal.pm index fc276f47f..9f5ea1acb 100644 --- a/fhem/contrib/DS_Starter/76_SMAPortal.pm +++ b/fhem/contrib/DS_Starter/76_SMAPortal.pm @@ -762,9 +762,6 @@ sub GetSetData { ## no cri my ($exceed,$newcycle) = (0,0); my ($balancedataday_content,$ccdaydata_content,$ccmonthdata_content) = ("","",""); my ($st,$lc) = ("",""); - my ($livedata,$livedata_content) = ("",""); - my ($weatherdata,$weatherdata_content) = ("",""); - my ($consumerlivedata,$consumerlivedata_content) = ("",""); my ($d,$op,$paref); my @da = (); @@ -855,11 +852,11 @@ sub GetSetData { ## no cri ### Live-Daten ################ - ($livedata,$livedata_content) = _getData ({ name => $name, - ua => $ua, - call => 'https://www.sunnyportal.com/homemanager?t='.$time, - tag => "liveData" - }); + my ($livedata,$livedata_content) = _getData ({ name => $name, + ua => $ua, + call => 'https://www.sunnyportal.com/homemanager?t='.$time, + tag => "liveData" + }); $paref = [ $hash,$errstate,$state,$livedata ]; ($reread,$retry,$errstate,$state) = analyzeData($paref); @@ -897,15 +894,23 @@ sub GetSetData { ## no cri return "$name|$exceed|$newcycle|$errstate|$getp|$setp"; } + if ($livedata_content && $livedata_content !~ m/undefined/ix) { + extractLiveData ({ hash => $hash, + live => $livedata_content, + daref => \@da + }); + } + + ### Wetterdaten ##################### - ($weatherdata,$weatherdata_content) = _getData ({ name => $name, - ua => $ua, - call => 'https://www.sunnyportal.com/Dashboard/Weather', - tag => "weatherData" - }); + my ($weatherdata,$weatherdata_content) = _getData ({ name => $name, + ua => $ua, + call => 'https://www.sunnyportal.com/Dashboard/Weather', + tag => "weatherData" + }); $paref = [ $hash,$errstate,$state,$weatherdata ]; ($reread,$retry,$errstate,$state) = analyzeData($paref); @@ -915,11 +920,15 @@ sub GetSetData { ## no cri return "$name|0|0|$errstate|$getp|$setp|$st"; } + if ($weatherdata_content && $weatherdata_content !~ m/undefined/ix) { + extractWeatherData ($hash,\@da,$weatherdata_content); + } - ### JSON Statistic Data Tag (anchorTime beachten !) - #################################################### + + ### Statistic Data Tag (anchorTime beachten !) + ################################################ Log3 ($name, 4, "$name - Getting statistic day data"); my $req = HTTP::Request->new( 'POST', 'https://www.sunnyportal.com/FixedPages/HoManEnergyRedesign.aspx/GetLegendWithValues' ); @@ -932,15 +941,18 @@ sub GetSetData { ## no cri $req->header ( "Content-Length" => 39 ); $req->content ( "{$cont}" ); - my $res = $ua->request( $req ); - $balancedataday_content = $res->content; + my $res = $ua->request( $req ); + my $balancedataday_content = $res->content; if($v5d eq "balanceData") { Log3 ($name, 5, "$name - Return Code: ".$res->code); Log3 ($name, 5, "$name - Statistic data received:\n".Dumper decode_json($balancedataday_content)); } - + if ($balancedataday_content && $balancedataday_content !~ m/undefined/ix) { + extractStatisticData ($hash,\@da,$balancedataday_content,"Day"); + } + ### Forecast Daten abrufen @@ -961,7 +973,6 @@ sub GetSetData { ## no cri } if ($forecastdata_content && $forecastdata_content !~ m/undefined/ix) { - $forecastdata_content = decode_json ($forecastdata_content); extractPlantData ($hash,\@da,$forecastdata_content); extractForecastData ($hash,\@da,$forecastdata_content); extractConsumerData ($hash,\@da,$forecastdata_content); @@ -971,14 +982,14 @@ sub GetSetData { ## no cri - ### JSON Consumer Livedaten und historische Energiedaten - ######################################################### + ### Consumer Livedaten und historische Energiedaten + ##################################################### if($dl > 2) { - ($consumerlivedata,$consumerlivedata_content) = _getData ({ name => $name, - ua => $ua, - call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues', - tag => "consumerLiveData" - }); + my ($consumerlivedata,$consumerlivedata_content) = _getData ({ name => $name, + ua => $ua, + call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues', + tag => "consumerLiveData" + }); $paref = [ $hash,$errstate,$state,$consumerlivedata ]; ($reread,$retry,$errstate,$state) = analyzeData($paref); @@ -988,6 +999,10 @@ sub GetSetData { ## no cri return "$name|0|0|$errstate|$getp|$setp|$st"; } + if ($consumerlivedata_content && $consumerlivedata_content !~ m/undefined/ix) { + extractConsumerLiveData ($hash,\@da,$consumerlivedata_content); + } + if($hash->{HELPER}{PLANTOID}) { my $PlantOid = $hash->{HELPER}{PLANTOID}; @@ -1021,6 +1036,10 @@ sub GetSetData { ## no cri $ccdaydata_content = $ccdaydata->content; Log3 ($name, 5, "$name - Consumer energy data of current day received:\n".Dumper decode_json($ccdaydata_content)) if($v5d eq "consumerDayData"); } + + if ($ccdaydata_content && $ccdaydata_content !~ m/undefined/ix) { + extractConsumerHistData($hash,\@da,$ccdaydata_content,"day"); + } # Energiedaten aktueller Monat Log3 ($name, 4, "$name - Getting consumer energy data of current month"); @@ -1033,7 +1052,11 @@ sub GetSetData { ## no cri if ($ccmonthdata->content =~ m/ConsumerBalanceDeviceInfo/ix) { $ccmonthdata_content = $ccmonthdata->content; Log3 ($name, 5, "$name - Consumer energy data of current month received:\n".Dumper decode_json($ccmonthdata_content)) if($v5d eq "consumerMonthData"); - } + } + + if ($ccmonthdata_content && $ccmonthdata_content !~ m/undefined/ix) { + extractConsumerHistData ($hash,\@da,$ccmonthdata_content,"month"); + } # Energiedaten aktuelles Jahr Log3 ($name, 4, "$name - Getting consumer energy data of current year"); @@ -1046,52 +1069,14 @@ sub GetSetData { ## no cri if ($ccyeardata->content =~ m/ConsumerBalanceDeviceInfo/ix) { $ccyeardata_content = $ccyeardata->content; Log3 ($name, 5, "$name - Consumer energy data of current year received:\n".Dumper decode_json($ccyeardata_content)) if($v5d eq "consumerYearData"); - } + } + + if ($ccyeardata_content && $ccyeardata_content !~ m/undefined/ix) { + extractConsumerHistData ($hash,\@da,$ccyeardata_content,"year"); + } } } } - - - # Extraktion der Daten - ######################## - - if ($livedata_content && $livedata_content !~ m/undefined/ix) { - $livedata_content = decode_json ($livedata_content); - extractLiveData ({ hash => $hash, - live => $livedata_content, - daref => \@da - }); - } - - if ($consumerlivedata_content && $consumerlivedata_content !~ m/undefined/ix) { - $consumerlivedata_content = decode_json ($consumerlivedata_content); - extractConsumerLiveData ($hash,\@da,$consumerlivedata_content); - } - - if ($ccdaydata_content && $ccdaydata_content !~ m/undefined/ix) { - $ccdaydata_content = decode_json ($ccdaydata_content); - extractConsumerHistData($hash,\@da,$ccdaydata_content,"day"); - } - - if ($ccmonthdata_content && $ccmonthdata_content !~ m/undefined/ix) { - $ccmonthdata_content = decode_json ($ccmonthdata_content); - extractConsumerHistData ($hash,\@da,$ccmonthdata_content,"month"); - } - - if ($ccyeardata_content && $ccyeardata_content !~ m/undefined/ix) { - $ccyeardata_content = decode_json ($ccyeardata_content); - extractConsumerHistData ($hash,\@da,$ccyeardata_content,"year"); - } - - if ($weatherdata_content && $weatherdata_content !~ m/undefined/ix) { - $weatherdata_content = decode_json ($weatherdata_content); - extractWeatherData ($hash,\@da,$weatherdata_content); - } - - if ($balancedataday_content && $balancedataday_content !~ m/undefined/ix) { - $balancedataday_content = decode_json ($balancedataday_content); - extractStatisticData ($hash,\@da,$balancedataday_content,"Day"); - } # Daten müssen als Einzeiler zurückgegeben werden $st = encode_base64 ( $state, ""); @@ -1158,7 +1143,7 @@ sub _checkLogin { Log3 ($name, 5, "$name - Redirect Page content: ".encode("utf8", $loginp->decoded_content)); } - if($location =~ /\/FixedPages\// && $retcode eq "302") { # Weiterleitung -> Login erfolgeich + if($location =~ /\/FixedPages\//x && $retcode eq "302") { # Weiterleitung -> Login erfolgeich(Landing Pages können im Portal eingestellt werden!) Log3 ($name, 3, "$name - Login into SMA-Portal successfully done"); handleCounter ($name, "dailyIssueCookieCounter"); # Cookie Ausstellungszähler setzen @@ -1374,12 +1359,14 @@ sub extractLiveData { my $name = $hash->{NAME}; my $val = ""; - my ($errMsg,$warnMsg,$infoMsg) = (0,0,0); - - readingsBeginUpdate($hash); - Log3 ($name, 4, "$name - ##### extracting live data #### "); + $live = eval{decode_json($live)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + + my ($errMsg,$warnMsg,$infoMsg) = (0,0,0); + if (ref $live eq "HASH") { push @$daref, "L1_FeedIn:" .($live->{FeedIn} // 0)." W"; push @$daref, "L1_GridConsumption:" .($live->{GridConsumption} // 0)." W"; @@ -1443,6 +1430,10 @@ sub extractForecastData { ## no critic 'complexity' my $dl = AttrVal($name, "detailLevel", 1); Log3 ($name, 4, "$name - ##### extracting forecast data #### "); + + $forecast = eval{decode_json($forecast)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; @@ -1578,6 +1569,10 @@ sub extractWeatherData { Log3 ($name, 4, "$name - ##### extracting weather data #### "); + $weather = eval{decode_json($weather)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + for my $k (keys %$weather) { next if(!$k); @@ -1615,6 +1610,10 @@ sub extractStatisticData { Log3 ($name, 4, "$name - ##### extracting statistic data #### "); + $statistic = eval{decode_json($statistic)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + if(ref $statistic eq "HASH") { $sd = decode_json ($statistic->{d}); } @@ -1642,6 +1641,10 @@ sub extractPlantData { Log3 ($name, 4, "$name - ##### extracting plant data #### "); + $forecast = eval{decode_json($forecast)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + my $plantOid = $forecast->{'ForecastTimeframes'}->{'PlantOid'}; if ($plantOid) { # wichtig für erweiterte Selektionen Log3 ($name, 4, "$name - Plant ID: ".$plantOid); @@ -1679,6 +1682,10 @@ sub extractConsumerData { Log3 ($name, 4, "$name - ##### extracting consumer data #### "); + $forecast = eval{decode_json($forecast)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + # Schleife über alle Consumer Objekte my $i = 0; for my $c (@{$forecast->{'Consumers'}}) { @@ -1752,6 +1759,10 @@ sub extractConsumerLiveData { Log3 ($name, 4, "$name - ##### extracting consumer live data #### "); + $clivedata = eval{decode_json($clivedata)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + # allen Consumer Objekte die ID zuordnen $i = 0; for my $c (@{$clivedata->{'MeasurementData'}}) { @@ -1822,6 +1833,10 @@ sub extractConsumerHistData { # Log3 ($name, 4, "$name - ##### extracting consumer history data #### "); + $chdata = eval{decode_json($chdata)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data"); + return; + }; + my $bataval = (defined(ReadingsNum($name,"L1_BatteryIn", undef)) || defined(ReadingsNum($name,"L1_BatteryOut", undef)))?1:0; # Identifikation ist Battery vorhanden ? # allen Consumer Objekte die ID zuordnen