2
0
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:
nasseeder1 2020-06-10 21:43:56 +00:00
parent cadf54d938
commit 08c9914d9a
2 changed files with 394 additions and 312 deletions
fhem
FHEM
contrib/DS_Starter

@ -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
################################################################ ################################################################