2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

76_SMAPortal: contrib 2.10.1

git-svn-id: https://svn.fhem.de/fhem/trunk@22146 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-06-09 13:37:45 +00:00
parent c64cdf21da
commit 2eee5d4bab

View File

@ -762,9 +762,6 @@ sub GetSetData { ## no cri
my ($exceed,$newcycle) = (0,0); my ($exceed,$newcycle) = (0,0);
my ($balancedataday_content,$ccdaydata_content,$ccmonthdata_content) = ("","",""); my ($balancedataday_content,$ccdaydata_content,$ccmonthdata_content) = ("","","");
my ($st,$lc) = ("",""); my ($st,$lc) = ("","");
my ($livedata,$livedata_content) = ("","");
my ($weatherdata,$weatherdata_content) = ("","");
my ($consumerlivedata,$consumerlivedata_content) = ("","");
my ($d,$op,$paref); my ($d,$op,$paref);
my @da = (); my @da = ();
@ -855,11 +852,11 @@ sub GetSetData { ## no cri
### Live-Daten ### Live-Daten
################ ################
($livedata,$livedata_content) = _getData ({ name => $name, my ($livedata,$livedata_content) = _getData ({ name => $name,
ua => $ua, ua => $ua,
call => 'https://www.sunnyportal.com/homemanager?t='.$time, call => 'https://www.sunnyportal.com/homemanager?t='.$time,
tag => "liveData" tag => "liveData"
}); });
$paref = [ $hash,$errstate,$state,$livedata ]; $paref = [ $hash,$errstate,$state,$livedata ];
($reread,$retry,$errstate,$state) = analyzeData($paref); ($reread,$retry,$errstate,$state) = analyzeData($paref);
@ -897,15 +894,23 @@ sub GetSetData { ## no cri
return "$name|$exceed|$newcycle|$errstate|$getp|$setp"; return "$name|$exceed|$newcycle|$errstate|$getp|$setp";
} }
if ($livedata_content && $livedata_content !~ m/undefined/ix) {
extractLiveData ({ hash => $hash,
live => $livedata_content,
daref => \@da
});
}
### Wetterdaten ### Wetterdaten
##################### #####################
($weatherdata,$weatherdata_content) = _getData ({ name => $name, my ($weatherdata,$weatherdata_content) = _getData ({ name => $name,
ua => $ua, ua => $ua,
call => 'https://www.sunnyportal.com/Dashboard/Weather', call => 'https://www.sunnyportal.com/Dashboard/Weather',
tag => "weatherData" tag => "weatherData"
}); });
$paref = [ $hash,$errstate,$state,$weatherdata ]; $paref = [ $hash,$errstate,$state,$weatherdata ];
($reread,$retry,$errstate,$state) = analyzeData($paref); ($reread,$retry,$errstate,$state) = analyzeData($paref);
@ -915,11 +920,15 @@ sub GetSetData { ## no cri
return "$name|0|0|$errstate|$getp|$setp|$st"; 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"); Log3 ($name, 4, "$name - Getting statistic day data");
my $req = HTTP::Request->new( 'POST', 'https://www.sunnyportal.com/FixedPages/HoManEnergyRedesign.aspx/GetLegendWithValues' ); 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->header ( "Content-Length" => 39 );
$req->content ( "{$cont}" ); $req->content ( "{$cont}" );
my $res = $ua->request( $req ); my $res = $ua->request( $req );
$balancedataday_content = $res->content; my $balancedataday_content = $res->content;
if($v5d eq "balanceData") { if($v5d eq "balanceData") {
Log3 ($name, 5, "$name - Return Code: ".$res->code); Log3 ($name, 5, "$name - Return Code: ".$res->code);
Log3 ($name, 5, "$name - Statistic data received:\n".Dumper decode_json($balancedataday_content)); 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 ### Forecast Daten abrufen
@ -961,7 +973,6 @@ sub GetSetData { ## no cri
} }
if ($forecastdata_content && $forecastdata_content !~ m/undefined/ix) { if ($forecastdata_content && $forecastdata_content !~ m/undefined/ix) {
$forecastdata_content = decode_json ($forecastdata_content);
extractPlantData ($hash,\@da,$forecastdata_content); extractPlantData ($hash,\@da,$forecastdata_content);
extractForecastData ($hash,\@da,$forecastdata_content); extractForecastData ($hash,\@da,$forecastdata_content);
extractConsumerData ($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) { if($dl > 2) {
($consumerlivedata,$consumerlivedata_content) = _getData ({ name => $name, my ($consumerlivedata,$consumerlivedata_content) = _getData ({ name => $name,
ua => $ua, ua => $ua,
call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues', call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues',
tag => "consumerLiveData" tag => "consumerLiveData"
}); });
$paref = [ $hash,$errstate,$state,$consumerlivedata ]; $paref = [ $hash,$errstate,$state,$consumerlivedata ];
($reread,$retry,$errstate,$state) = analyzeData($paref); ($reread,$retry,$errstate,$state) = analyzeData($paref);
@ -988,6 +999,10 @@ sub GetSetData { ## no cri
return "$name|0|0|$errstate|$getp|$setp|$st"; 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}) { if($hash->{HELPER}{PLANTOID}) {
my $PlantOid = $hash->{HELPER}{PLANTOID}; my $PlantOid = $hash->{HELPER}{PLANTOID};
@ -1021,6 +1036,10 @@ sub GetSetData { ## no cri
$ccdaydata_content = $ccdaydata->content; $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"); 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 # Energiedaten aktueller Monat
Log3 ($name, 4, "$name - Getting consumer energy data of current month"); 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) { if ($ccmonthdata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
$ccmonthdata_content = $ccmonthdata->content; $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"); 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 # Energiedaten aktuelles Jahr
Log3 ($name, 4, "$name - Getting consumer energy data of current year"); 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) { if ($ccyeardata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
$ccyeardata_content = $ccyeardata->content; $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"); 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 # Daten müssen als Einzeiler zurückgegeben werden
$st = encode_base64 ( $state, ""); $st = encode_base64 ( $state, "");
@ -1158,7 +1143,7 @@ sub _checkLogin {
Log3 ($name, 5, "$name - Redirect Page content: ".encode("utf8", $loginp->decoded_content)); 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"); Log3 ($name, 3, "$name - Login into SMA-Portal successfully done");
handleCounter ($name, "dailyIssueCookieCounter"); # Cookie Ausstellungszähler setzen handleCounter ($name, "dailyIssueCookieCounter"); # Cookie Ausstellungszähler setzen
@ -1374,12 +1359,14 @@ sub extractLiveData {
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $val = ""; my $val = "";
my ($errMsg,$warnMsg,$infoMsg) = (0,0,0);
readingsBeginUpdate($hash);
Log3 ($name, 4, "$name - ##### extracting live data #### "); 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") { if (ref $live eq "HASH") {
push @$daref, "L1_FeedIn:" .($live->{FeedIn} // 0)." W"; push @$daref, "L1_FeedIn:" .($live->{FeedIn} // 0)." W";
push @$daref, "L1_GridConsumption:" .($live->{GridConsumption} // 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); my $dl = AttrVal($name, "detailLevel", 1);
Log3 ($name, 4, "$name - ##### extracting forecast data #### "); 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); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; $year += 1900;
@ -1578,6 +1569,10 @@ sub extractWeatherData {
Log3 ($name, 4, "$name - ##### extracting weather data #### "); 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) { for my $k (keys %$weather) {
next if(!$k); next if(!$k);
@ -1615,6 +1610,10 @@ sub extractStatisticData {
Log3 ($name, 4, "$name - ##### extracting statistic data #### "); 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") { if(ref $statistic eq "HASH") {
$sd = decode_json ($statistic->{d}); $sd = decode_json ($statistic->{d});
} }
@ -1642,6 +1641,10 @@ sub extractPlantData {
Log3 ($name, 4, "$name - ##### extracting plant data #### "); 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'}; my $plantOid = $forecast->{'ForecastTimeframes'}->{'PlantOid'};
if ($plantOid) { # wichtig für erweiterte Selektionen if ($plantOid) { # wichtig für erweiterte Selektionen
Log3 ($name, 4, "$name - Plant ID: ".$plantOid); Log3 ($name, 4, "$name - Plant ID: ".$plantOid);
@ -1679,6 +1682,10 @@ sub extractConsumerData {
Log3 ($name, 4, "$name - ##### extracting consumer data #### "); 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 # Schleife über alle Consumer Objekte
my $i = 0; my $i = 0;
for my $c (@{$forecast->{'Consumers'}}) { for my $c (@{$forecast->{'Consumers'}}) {
@ -1752,6 +1759,10 @@ sub extractConsumerLiveData {
Log3 ($name, 4, "$name - ##### extracting consumer live data #### "); 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 # allen Consumer Objekte die ID zuordnen
$i = 0; $i = 0;
for my $c (@{$clivedata->{'MeasurementData'}}) { for my $c (@{$clivedata->{'MeasurementData'}}) {
@ -1822,6 +1833,10 @@ sub extractConsumerHistData { #
Log3 ($name, 4, "$name - ##### extracting consumer history data #### "); 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 ? 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 # allen Consumer Objekte die ID zuordnen