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:
parent
c64cdf21da
commit
2eee5d4bab
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user