mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-04 17:36:39 +00:00
76_SMAPortal: bug fixes get/switch consumers
git-svn-id: https://svn.fhem.de/fhem/trunk@22155 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
cadf54d938
commit
08c9914d9a
fhem
@ -860,7 +860,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "liveData"
|
tag => "liveData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $livedata
|
data => $livedata
|
||||||
@ -900,10 +900,7 @@ sub GetSetData { ## no cri
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($livedata_content && $livedata_content !~ m/undefined/ix) {
|
if ($livedata_content && $livedata_content !~ m/undefined/ix) {
|
||||||
extractLiveData ({ hash => $hash,
|
extractLiveData ($hash,\@da,$livedata_content);
|
||||||
live => $livedata_content,
|
|
||||||
daref => \@da
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -917,7 +914,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "weatherData"
|
tag => "weatherData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $weatherdata
|
data => $weatherdata
|
||||||
@ -950,7 +947,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "balanceDayData"
|
tag => "balanceDayData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $balancedataday
|
data => $balancedataday
|
||||||
@ -976,7 +973,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "forecastData"
|
tag => "forecastData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $forecastdata
|
data => $forecastdata
|
||||||
@ -1006,7 +1003,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "consumerLiveData"
|
tag => "consumerLiveData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $consumerlivedata
|
data => $consumerlivedata
|
||||||
@ -1046,51 +1043,57 @@ sub GetSetData { ## no cri
|
|||||||
Log3 ($name, 4, "$name - Getting consumer energy data of current day");
|
Log3 ($name, 4, "$name - Getting consumer energy data of current day");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $dds, end: $dde");
|
Log3 ($name, 4, "$name - Request date -> start: $dds, end: $dde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current day data string ->\n$ccdd");
|
Log3 ($name, 5, "$name - Request consumer current day data string ->\n$ccdd");
|
||||||
my $ccdaydata = $ua->get($ccdd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccdaydata->code) if($v5d eq "consumerDayData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccdaydata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccdd,
|
||||||
$ccdaydata_content = $ccdaydata->content;
|
tag => "consumerDayData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current day received:\n".Dumper decode_json($ccdaydata_content)) if($v5d eq "consumerDayData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "day",
|
||||||
if ($ccdaydata_content && $ccdaydata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData($hash,\@da,$ccdaydata_content,"day");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $mds, end: $mde");
|
Log3 ($name, 4, "$name - Request date -> start: $mds, end: $mde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current month data string ->\n$ccmd");
|
Log3 ($name, 5, "$name - Request consumer current month data string ->\n$ccmd");
|
||||||
my $ccmonthdata = $ua->get($ccmd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccmonthdata->code) if($v5d eq "consumerMonthData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccmonthdata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccmd,
|
||||||
$ccmonthdata_content = $ccmonthdata->content;
|
tag => "consumerMonthData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current month received:\n".Dumper decode_json($ccmonthdata_content)) if($v5d eq "consumerMonthData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "month",
|
||||||
if ($ccmonthdata_content && $ccmonthdata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData ($hash,\@da,$ccmonthdata_content,"month");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $yds, end: $yde");
|
Log3 ($name, 4, "$name - Request date -> start: $yds, end: $yde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current year data string ->\n$ccyd");
|
Log3 ($name, 5, "$name - Request consumer current year data string ->\n$ccyd");
|
||||||
my $ccyeardata = $ua->get($ccyd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccyeardata->code) if($v5d eq "consumerMonthData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccyeardata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccyd,
|
||||||
$ccyeardata_content = $ccyeardata->content;
|
tag => "consumerYearData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current year received:\n".Dumper decode_json($ccyeardata_content)) if($v5d eq "consumerYearData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "year",
|
||||||
if ($ccyeardata_content && $ccyeardata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData ($hash,\@da,$ccyeardata_content,"year");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1194,6 +1197,46 @@ sub _checkLogin {
|
|||||||
return ($state, $errstate);
|
return ($state, $errstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Dispatcher
|
||||||
|
################################################################
|
||||||
|
sub _dispatch {
|
||||||
|
my $paref = shift;
|
||||||
|
my $name = $paref->{name};
|
||||||
|
my $ua = $paref->{ua}; # LWP Useragent
|
||||||
|
my $call = $paref->{call}; # Seitenaufruf zur Datenquelle
|
||||||
|
my $tag = $paref->{tag}; # Kennzeichen der abzurufenen Daten
|
||||||
|
my $state = $paref->{state};
|
||||||
|
my $fn = $paref->{function}; # aufzurufende Funktion zur Datenextraktion
|
||||||
|
my $fnaddon = $paref->{addon}; # optionales Addon für aufzurufende Funktion
|
||||||
|
my $daref = $paref->{daref}; # Referenz zum Datenarray
|
||||||
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
|
my ($reread,$retry,$errstate) = (0,0,0);
|
||||||
|
|
||||||
|
my ($data,$data_cont) = _getData ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
|
call => $call,
|
||||||
|
tag => $tag
|
||||||
|
});
|
||||||
|
|
||||||
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
|
errstate => $errstate,
|
||||||
|
state => $state,
|
||||||
|
data => $data
|
||||||
|
});
|
||||||
|
|
||||||
|
return ($errstate,$state) if($errstate);
|
||||||
|
|
||||||
|
if ($data_cont && $data_cont !~ m/undefined/ix) {
|
||||||
|
no strict "refs"; ## no critic 'NoStrict'
|
||||||
|
&{$fn} ($hash,$daref,$data_cont,$fnaddon);
|
||||||
|
use strict "refs";
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($errstate,$state);
|
||||||
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Standard Abruf Daten GET
|
# Standard Abruf Daten GET
|
||||||
################################################################
|
################################################################
|
||||||
@ -1206,10 +1249,9 @@ sub _getData {
|
|||||||
|
|
||||||
my $cont;
|
my $cont;
|
||||||
|
|
||||||
my $v5d = AttrVal($name, "verbose5Data", "none");
|
|
||||||
|
|
||||||
Log3 ($name, 4, "$name - Getting $tag");
|
Log3 ($name, 4, "$name - Getting $tag");
|
||||||
|
|
||||||
|
my $v5d = AttrVal($name, "verbose5Data", "none");
|
||||||
my $data = $ua->get( $call );
|
my $data = $ua->get( $call );
|
||||||
my $dcont = $data->content;
|
my $dcont = $data->content;
|
||||||
|
|
||||||
@ -1254,6 +1296,89 @@ sub _putData {
|
|||||||
return ($data,$dcont);
|
return ($data,$dcont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# analysiere abgerufene Daten
|
||||||
|
################################################################
|
||||||
|
sub _analyzeData { ## no critic 'complexity'
|
||||||
|
my $paref = shift;
|
||||||
|
my $name = $paref->{name};
|
||||||
|
my $errstate = $paref->{errstate};
|
||||||
|
my $state = $paref->{state};
|
||||||
|
my $ad = $paref->{data};
|
||||||
|
my $hash = $defs{$name};
|
||||||
|
my ($reread,$retry) = (0,0);
|
||||||
|
my $data = "";
|
||||||
|
my @da = ();
|
||||||
|
|
||||||
|
my $v5d = AttrVal($name, "verbose5Data", "none");
|
||||||
|
my $ad_content = encode("utf8", $ad->decoded_content);
|
||||||
|
my $act = $hash->{HELPER}{RETRIES}; # Index aktueller Wiederholungsversuch
|
||||||
|
my $attstr = "Attempts read data again ... ($act of $maxretries)"; # Log vorbereiten
|
||||||
|
|
||||||
|
$data = eval{decode_json($ad_content)} or do { $data = $ad_content };
|
||||||
|
|
||||||
|
if(ref $data eq "HASH") {
|
||||||
|
for my $k (keys %{$data}) {
|
||||||
|
my $val = $data->{$k};
|
||||||
|
next if(!defined $val);
|
||||||
|
|
||||||
|
if(ref $val eq "ARRAY") {
|
||||||
|
for my $a (@{$val}) {
|
||||||
|
push @da, $a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ref $val eq "HASH") {
|
||||||
|
for my $b (keys %{$val}) {
|
||||||
|
push @da, $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$val = join " ", @da if(@da);
|
||||||
|
|
||||||
|
if ($val && $k !~ /__type/ix) {
|
||||||
|
if($k =~ m/WarningMessages/x && $val =~ /Updating of the live data was interrupted/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
Log3 $name, 3, "$name - Updating of the live data was interrupted. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/WarningMessages/x && $val =~ /The current consumption could not be determined. The current purchased electricity is unknown/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
Log3 $name, 3, "$name - The current consumption could not be determined. The current purchased electricity is unknown. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/ErrorMessages/x && $val =~ /Communication with the Sunny Home Manager is currently not possible/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
||||||
|
Log3 $name, 3, "$name - Communication with the Sunny Home Manager currently impossible. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/ErrorMessages/x && $val =~ /The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
||||||
|
Log3 $name, 3, "$name - The current data cannot be retrieved from the PV system. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
my $njdat = $ad->as_string;
|
||||||
|
|
||||||
|
if($njdat =~ /401\s-\sUnauthorized/x) {
|
||||||
|
Log3 ($name, 2, "$name - ERROR - User logged in but unauthorized");
|
||||||
|
my($p1,$p2) = $njdat =~ /<h2>401\s-\sUnauthorized:.(.*)?<\/h2>.*?<h3>(.*)?<\/h3>/sx;
|
||||||
|
$state = ($p1 // "")." ".($p2 // "");
|
||||||
|
}
|
||||||
|
|
||||||
|
Log3 ($name, 5, "$name - No JSON Data received:\n ".$njdat);
|
||||||
|
|
||||||
|
$errstate = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
## Verarbeitung empfangene Daten, setzen Readings
|
## Verarbeitung empfangene Daten, setzen Readings
|
||||||
################################################################
|
################################################################
|
||||||
@ -1401,10 +1526,9 @@ return ($err);
|
|||||||
## Auswertung Live Daten
|
## Auswertung Live Daten
|
||||||
################################################################
|
################################################################
|
||||||
sub extractLiveData {
|
sub extractLiveData {
|
||||||
my $paref = shift;
|
my $hash = shift;
|
||||||
my $hash = $paref->{hash};
|
my $daref = shift;
|
||||||
my $live = $paref->{live};
|
my $live = shift;
|
||||||
my $daref = $paref->{daref};
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $val = "";
|
my $val = "";
|
||||||
|
|
||||||
@ -2097,89 +2221,6 @@ sub delReadingFromBlocking {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
|
||||||
# analysiere abgerufene Daten
|
|
||||||
################################################################
|
|
||||||
sub analyzeData { ## no critic 'complexity'
|
|
||||||
my $paref = shift;
|
|
||||||
my $hash = $paref->{hash};
|
|
||||||
my $errstate = $paref->{errstate};
|
|
||||||
my $state = $paref->{state};
|
|
||||||
my $ad = $paref->{data};
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my ($reread,$retry) = (0,0);
|
|
||||||
my $data = "";
|
|
||||||
my @da = ();
|
|
||||||
|
|
||||||
my $v5d = AttrVal($name, "verbose5Data", "none");
|
|
||||||
my $ad_content = encode("utf8", $ad->decoded_content);
|
|
||||||
my $act = $hash->{HELPER}{RETRIES}; # Index aktueller Wiederholungsversuch
|
|
||||||
my $attstr = "Attempts read data again ... ($act of $maxretries)"; # Log vorbereiten
|
|
||||||
|
|
||||||
$data = eval{decode_json($ad_content)} or do { $data = $ad_content };
|
|
||||||
|
|
||||||
if(ref $data eq "HASH") {
|
|
||||||
for my $k (keys %{$data}) {
|
|
||||||
my $val = $data->{$k};
|
|
||||||
next if(!defined $val);
|
|
||||||
|
|
||||||
if(ref $val eq "ARRAY") {
|
|
||||||
for my $a (@{$val}) {
|
|
||||||
push @da, $a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ref $val eq "HASH") {
|
|
||||||
for my $b (keys %{$val}) {
|
|
||||||
push @da, $b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$val = join " ", @da if(@da);
|
|
||||||
|
|
||||||
if ($val && $k !~ /__type/ix) {
|
|
||||||
if($k =~ m/WarningMessages/x && $val =~ /Updating of the live data was interrupted/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
Log3 $name, 3, "$name - Updating of the live data was interrupted. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/WarningMessages/x && $val =~ /The current consumption could not be determined. The current purchased electricity is unknown/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
Log3 $name, 3, "$name - The current consumption could not be determined. The current purchased electricity is unknown. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/ErrorMessages/x && $val =~ /Communication with the Sunny Home Manager is currently not possible/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
|
||||||
Log3 $name, 3, "$name - Communication with the Sunny Home Manager currently impossible. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/ErrorMessages/x && $val =~ /The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
|
||||||
Log3 $name, 3, "$name - The current data cannot be retrieved from the PV system. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
my $njdat = $ad->as_string;
|
|
||||||
|
|
||||||
if($njdat =~ /401\s-\sUnauthorized/x) {
|
|
||||||
Log3 ($name, 2, "$name - ERROR - User logged in but unauthorized");
|
|
||||||
my($p1,$p2) = $njdat =~ /<h2>401\s-\sUnauthorized:.(.*)?<\/h2>.*?<h3>(.*)?<\/h3>/sx;
|
|
||||||
$state = ($p1 // "")." ".($p2 // "");
|
|
||||||
}
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - No JSON Data received:\n ".$njdat);
|
|
||||||
|
|
||||||
$errstate = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Timestamp korrigieren
|
# Timestamp korrigieren
|
||||||
################################################################
|
################################################################
|
||||||
|
@ -860,7 +860,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "liveData"
|
tag => "liveData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $livedata
|
data => $livedata
|
||||||
@ -900,10 +900,7 @@ sub GetSetData { ## no cri
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($livedata_content && $livedata_content !~ m/undefined/ix) {
|
if ($livedata_content && $livedata_content !~ m/undefined/ix) {
|
||||||
extractLiveData ({ hash => $hash,
|
extractLiveData ($hash,\@da,$livedata_content);
|
||||||
live => $livedata_content,
|
|
||||||
daref => \@da
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -917,7 +914,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "weatherData"
|
tag => "weatherData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $weatherdata
|
data => $weatherdata
|
||||||
@ -950,7 +947,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "balanceDayData"
|
tag => "balanceDayData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $balancedataday
|
data => $balancedataday
|
||||||
@ -976,7 +973,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "forecastData"
|
tag => "forecastData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $forecastdata
|
data => $forecastdata
|
||||||
@ -1006,7 +1003,7 @@ sub GetSetData { ## no cri
|
|||||||
tag => "consumerLiveData"
|
tag => "consumerLiveData"
|
||||||
});
|
});
|
||||||
|
|
||||||
($reread,$retry,$errstate,$state) = analyzeData ({ hash => $hash,
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
errstate => $errstate,
|
errstate => $errstate,
|
||||||
state => $state,
|
state => $state,
|
||||||
data => $consumerlivedata
|
data => $consumerlivedata
|
||||||
@ -1046,51 +1043,57 @@ sub GetSetData { ## no cri
|
|||||||
Log3 ($name, 4, "$name - Getting consumer energy data of current day");
|
Log3 ($name, 4, "$name - Getting consumer energy data of current day");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $dds, end: $dde");
|
Log3 ($name, 4, "$name - Request date -> start: $dds, end: $dde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current day data string ->\n$ccdd");
|
Log3 ($name, 5, "$name - Request consumer current day data string ->\n$ccdd");
|
||||||
my $ccdaydata = $ua->get($ccdd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccdaydata->code) if($v5d eq "consumerDayData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccdaydata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccdd,
|
||||||
$ccdaydata_content = $ccdaydata->content;
|
tag => "consumerDayData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current day received:\n".Dumper decode_json($ccdaydata_content)) if($v5d eq "consumerDayData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "day",
|
||||||
if ($ccdaydata_content && $ccdaydata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData($hash,\@da,$ccdaydata_content,"day");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $mds, end: $mde");
|
Log3 ($name, 4, "$name - Request date -> start: $mds, end: $mde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current month data string ->\n$ccmd");
|
Log3 ($name, 5, "$name - Request consumer current month data string ->\n$ccmd");
|
||||||
my $ccmonthdata = $ua->get($ccmd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccmonthdata->code) if($v5d eq "consumerMonthData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccmonthdata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccmd,
|
||||||
$ccmonthdata_content = $ccmonthdata->content;
|
tag => "consumerMonthData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current month received:\n".Dumper decode_json($ccmonthdata_content)) if($v5d eq "consumerMonthData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "month",
|
||||||
if ($ccmonthdata_content && $ccmonthdata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData ($hash,\@da,$ccmonthdata_content,"month");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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");
|
||||||
Log3 ($name, 4, "$name - Request date -> start: $yds, end: $yde");
|
Log3 ($name, 4, "$name - Request date -> start: $yds, end: $yde");
|
||||||
Log3 ($name, 5, "$name - Request consumer current year data string ->\n$ccyd");
|
Log3 ($name, 5, "$name - Request consumer current year data string ->\n$ccyd");
|
||||||
my $ccyeardata = $ua->get($ccyd);
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Return Code: ".$ccyeardata->code) if($v5d eq "consumerMonthData");
|
($errstate,$state) = _dispatch ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
if ($ccyeardata->content =~ m/ConsumerBalanceDeviceInfo/ix) {
|
call => $ccyd,
|
||||||
$ccyeardata_content = $ccyeardata->content;
|
tag => "consumerYearData",
|
||||||
Log3 ($name, 5, "$name - Consumer energy data of current year received:\n".Dumper decode_json($ccyeardata_content)) if($v5d eq "consumerYearData");
|
state => $state,
|
||||||
}
|
function => "extractConsumerHistData",
|
||||||
|
addon => "year",
|
||||||
if ($ccyeardata_content && $ccyeardata_content !~ m/undefined/ix) {
|
daref => \@da
|
||||||
extractConsumerHistData ($hash,\@da,$ccyeardata_content,"year");
|
});
|
||||||
|
if($errstate) {
|
||||||
|
$st = encode_base64 ( $state,"");
|
||||||
|
return "$name|0|0|$errstate|$getp|$setp|$st";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1194,6 +1197,46 @@ sub _checkLogin {
|
|||||||
return ($state, $errstate);
|
return ($state, $errstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Dispatcher
|
||||||
|
################################################################
|
||||||
|
sub _dispatch {
|
||||||
|
my $paref = shift;
|
||||||
|
my $name = $paref->{name};
|
||||||
|
my $ua = $paref->{ua}; # LWP Useragent
|
||||||
|
my $call = $paref->{call}; # Seitenaufruf zur Datenquelle
|
||||||
|
my $tag = $paref->{tag}; # Kennzeichen der abzurufenen Daten
|
||||||
|
my $state = $paref->{state};
|
||||||
|
my $fn = $paref->{function}; # aufzurufende Funktion zur Datenextraktion
|
||||||
|
my $fnaddon = $paref->{addon}; # optionales Addon für aufzurufende Funktion
|
||||||
|
my $daref = $paref->{daref}; # Referenz zum Datenarray
|
||||||
|
my $hash = $defs{$name};
|
||||||
|
|
||||||
|
my ($reread,$retry,$errstate) = (0,0,0);
|
||||||
|
|
||||||
|
my ($data,$data_cont) = _getData ({ name => $name,
|
||||||
|
ua => $ua,
|
||||||
|
call => $call,
|
||||||
|
tag => $tag
|
||||||
|
});
|
||||||
|
|
||||||
|
($reread,$retry,$errstate,$state) = _analyzeData ({ name => $name,
|
||||||
|
errstate => $errstate,
|
||||||
|
state => $state,
|
||||||
|
data => $data
|
||||||
|
});
|
||||||
|
|
||||||
|
return ($errstate,$state) if($errstate);
|
||||||
|
|
||||||
|
if ($data_cont && $data_cont !~ m/undefined/ix) {
|
||||||
|
no strict "refs"; ## no critic 'NoStrict'
|
||||||
|
&{$fn} ($hash,$daref,$data_cont,$fnaddon);
|
||||||
|
use strict "refs";
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($errstate,$state);
|
||||||
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Standard Abruf Daten GET
|
# Standard Abruf Daten GET
|
||||||
################################################################
|
################################################################
|
||||||
@ -1206,10 +1249,9 @@ sub _getData {
|
|||||||
|
|
||||||
my $cont;
|
my $cont;
|
||||||
|
|
||||||
my $v5d = AttrVal($name, "verbose5Data", "none");
|
|
||||||
|
|
||||||
Log3 ($name, 4, "$name - Getting $tag");
|
Log3 ($name, 4, "$name - Getting $tag");
|
||||||
|
|
||||||
|
my $v5d = AttrVal($name, "verbose5Data", "none");
|
||||||
my $data = $ua->get( $call );
|
my $data = $ua->get( $call );
|
||||||
my $dcont = $data->content;
|
my $dcont = $data->content;
|
||||||
|
|
||||||
@ -1254,6 +1296,89 @@ sub _putData {
|
|||||||
return ($data,$dcont);
|
return ($data,$dcont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# analysiere abgerufene Daten
|
||||||
|
################################################################
|
||||||
|
sub _analyzeData { ## no critic 'complexity'
|
||||||
|
my $paref = shift;
|
||||||
|
my $name = $paref->{name};
|
||||||
|
my $errstate = $paref->{errstate};
|
||||||
|
my $state = $paref->{state};
|
||||||
|
my $ad = $paref->{data};
|
||||||
|
my $hash = $defs{$name};
|
||||||
|
my ($reread,$retry) = (0,0);
|
||||||
|
my $data = "";
|
||||||
|
my @da = ();
|
||||||
|
|
||||||
|
my $v5d = AttrVal($name, "verbose5Data", "none");
|
||||||
|
my $ad_content = encode("utf8", $ad->decoded_content);
|
||||||
|
my $act = $hash->{HELPER}{RETRIES}; # Index aktueller Wiederholungsversuch
|
||||||
|
my $attstr = "Attempts read data again ... ($act of $maxretries)"; # Log vorbereiten
|
||||||
|
|
||||||
|
$data = eval{decode_json($ad_content)} or do { $data = $ad_content };
|
||||||
|
|
||||||
|
if(ref $data eq "HASH") {
|
||||||
|
for my $k (keys %{$data}) {
|
||||||
|
my $val = $data->{$k};
|
||||||
|
next if(!defined $val);
|
||||||
|
|
||||||
|
if(ref $val eq "ARRAY") {
|
||||||
|
for my $a (@{$val}) {
|
||||||
|
push @da, $a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ref $val eq "HASH") {
|
||||||
|
for my $b (keys %{$val}) {
|
||||||
|
push @da, $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$val = join " ", @da if(@da);
|
||||||
|
|
||||||
|
if ($val && $k !~ /__type/ix) {
|
||||||
|
if($k =~ m/WarningMessages/x && $val =~ /Updating of the live data was interrupted/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
Log3 $name, 3, "$name - Updating of the live data was interrupted. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/WarningMessages/x && $val =~ /The current consumption could not be determined. The current purchased electricity is unknown/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
Log3 $name, 3, "$name - The current consumption could not be determined. The current purchased electricity is unknown. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/ErrorMessages/x && $val =~ /Communication with the Sunny Home Manager is currently not possible/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
||||||
|
Log3 $name, 3, "$name - Communication with the Sunny Home Manager currently impossible. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
if($k =~ m/ErrorMessages/x && $val =~ /The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
||||||
|
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
||||||
|
Log3 $name, 3, "$name - The current data cannot be retrieved from the PV system. $attstr";
|
||||||
|
$retry = 1;
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
my $njdat = $ad->as_string;
|
||||||
|
|
||||||
|
if($njdat =~ /401\s-\sUnauthorized/x) {
|
||||||
|
Log3 ($name, 2, "$name - ERROR - User logged in but unauthorized");
|
||||||
|
my($p1,$p2) = $njdat =~ /<h2>401\s-\sUnauthorized:.(.*)?<\/h2>.*?<h3>(.*)?<\/h3>/sx;
|
||||||
|
$state = ($p1 // "")." ".($p2 // "");
|
||||||
|
}
|
||||||
|
|
||||||
|
Log3 ($name, 5, "$name - No JSON Data received:\n ".$njdat);
|
||||||
|
|
||||||
|
$errstate = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($reread,$retry,$errstate,$state);
|
||||||
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
## Verarbeitung empfangene Daten, setzen Readings
|
## Verarbeitung empfangene Daten, setzen Readings
|
||||||
################################################################
|
################################################################
|
||||||
@ -1401,10 +1526,9 @@ return ($err);
|
|||||||
## Auswertung Live Daten
|
## Auswertung Live Daten
|
||||||
################################################################
|
################################################################
|
||||||
sub extractLiveData {
|
sub extractLiveData {
|
||||||
my $paref = shift;
|
my $hash = shift;
|
||||||
my $hash = $paref->{hash};
|
my $daref = shift;
|
||||||
my $live = $paref->{live};
|
my $live = shift;
|
||||||
my $daref = $paref->{daref};
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $val = "";
|
my $val = "";
|
||||||
|
|
||||||
@ -2097,89 +2221,6 @@ sub delReadingFromBlocking {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
|
||||||
# analysiere abgerufene Daten
|
|
||||||
################################################################
|
|
||||||
sub analyzeData { ## no critic 'complexity'
|
|
||||||
my $paref = shift;
|
|
||||||
my $hash = $paref->{hash};
|
|
||||||
my $errstate = $paref->{errstate};
|
|
||||||
my $state = $paref->{state};
|
|
||||||
my $ad = $paref->{data};
|
|
||||||
my $name = $hash->{NAME};
|
|
||||||
my ($reread,$retry) = (0,0);
|
|
||||||
my $data = "";
|
|
||||||
my @da = ();
|
|
||||||
|
|
||||||
my $v5d = AttrVal($name, "verbose5Data", "none");
|
|
||||||
my $ad_content = encode("utf8", $ad->decoded_content);
|
|
||||||
my $act = $hash->{HELPER}{RETRIES}; # Index aktueller Wiederholungsversuch
|
|
||||||
my $attstr = "Attempts read data again ... ($act of $maxretries)"; # Log vorbereiten
|
|
||||||
|
|
||||||
$data = eval{decode_json($ad_content)} or do { $data = $ad_content };
|
|
||||||
|
|
||||||
if(ref $data eq "HASH") {
|
|
||||||
for my $k (keys %{$data}) {
|
|
||||||
my $val = $data->{$k};
|
|
||||||
next if(!defined $val);
|
|
||||||
|
|
||||||
if(ref $val eq "ARRAY") {
|
|
||||||
for my $a (@{$val}) {
|
|
||||||
push @da, $a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ref $val eq "HASH") {
|
|
||||||
for my $b (keys %{$val}) {
|
|
||||||
push @da, $b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$val = join " ", @da if(@da);
|
|
||||||
|
|
||||||
if ($val && $k !~ /__type/ix) {
|
|
||||||
if($k =~ m/WarningMessages/x && $val =~ /Updating of the live data was interrupted/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
Log3 $name, 3, "$name - Updating of the live data was interrupted. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/WarningMessages/x && $val =~ /The current consumption could not be determined. The current purchased electricity is unknown/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
Log3 $name, 3, "$name - The current consumption could not be determined. The current purchased electricity is unknown. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/ErrorMessages/x && $val =~ /Communication with the Sunny Home Manager is currently not possible/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
|
||||||
Log3 $name, 3, "$name - Communication with the Sunny Home Manager currently impossible. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
if($k =~ m/ErrorMessages/x && $val =~ /The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters/) { ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!!
|
|
||||||
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung
|
|
||||||
Log3 $name, 3, "$name - The current data cannot be retrieved from the PV system. $attstr";
|
|
||||||
$retry = 1;
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
my $njdat = $ad->as_string;
|
|
||||||
|
|
||||||
if($njdat =~ /401\s-\sUnauthorized/x) {
|
|
||||||
Log3 ($name, 2, "$name - ERROR - User logged in but unauthorized");
|
|
||||||
my($p1,$p2) = $njdat =~ /<h2>401\s-\sUnauthorized:.(.*)?<\/h2>.*?<h3>(.*)?<\/h3>/sx;
|
|
||||||
$state = ($p1 // "")." ".($p2 // "");
|
|
||||||
}
|
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - No JSON Data received:\n ".$njdat);
|
|
||||||
|
|
||||||
$errstate = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ($reread,$retry,$errstate,$state);
|
|
||||||
}
|
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Timestamp korrigieren
|
# Timestamp korrigieren
|
||||||
################################################################
|
################################################################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user