2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-07 23:09:26 +00:00

76_SMAPortal: contrib 1.2.0

git-svn-id: https://svn.fhem.de/fhem/trunk@18835 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2019-03-09 18:58:54 +00:00
parent 8c9e153686
commit 290f1a7c72

View File

@ -49,6 +49,7 @@ use JSON qw(decode_json);
# Versions History intern # Versions History intern
our %SMAPortal_vNotesIntern = ( our %SMAPortal_vNotesIntern = (
"1.2.0" => "09.03.2019 integrate weather data ",
"1.1.0" => "09.03.2019 make get data more stable, new attribute \"getDataRetries\" ", "1.1.0" => "09.03.2019 make get data more stable, new attribute \"getDataRetries\" ",
"1.0.0" => "03.03.2019 initial " "1.0.0" => "03.03.2019 initial "
); );
@ -479,10 +480,11 @@ sub SMAPortal_GetData($) {
my ($reread,$retry) = SMAPortal_analivedat($hash,$livedata_content); my ($reread,$retry) = SMAPortal_analivedat($hash,$livedata_content);
# Daten müssen als Einzeiler zurückgegeben werden # Daten müssen als Einzeiler zurückgegeben werden
$livedata_content = encode_base64($livedata_content,""); $livedata_content = encode_base64($livedata_content,"");
$forecast_content = encode_base64($forecast_content,"") if($forecast_content); $forecast_content = encode_base64($forecast_content,"") if($forecast_content);
$weatherdata_content = encode_base64($weatherdata_content,"") if($weatherdata_content);
return "$name|$livedata_content|$forecast_content|$login_state|$reread|$retry"; return "$name|$livedata_content|$forecast_content|$weatherdata_content|$login_state|$reread|$retry";
} }
################################################################ ################################################################
@ -491,15 +493,18 @@ return "$name|$livedata_content|$forecast_content|$login_state|$reread|$retry";
sub SMAPortal_ParseData($) { sub SMAPortal_ParseData($) {
my ($string) = @_; my ($string) = @_;
my @a = split("\\|",$string); my @a = split("\\|",$string);
my $hash = $defs{$a[0]}; my $hash = $defs{$a[0]};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $ld_response = decode_base64($a[1]); my $ld_response = decode_base64($a[1]);
my $fd_response = decode_base64($a[2]) if($a[2]); my $fd_response = decode_base64($a[2]) if($a[2]);
my $login_state = $a[3]; my $wd_response = decode_base64($a[3]) if($a[3]);
my $reread = $a[4]; my $login_state = $a[4];
my $retry = $a[5]; my $reread = $a[5];
my $livedata_content = decode_json($ld_response); my $retry = $a[6];
my $forecast_content = decode_json($fd_response) if($fd_response);
my $livedata_content = decode_json($ld_response);
my $forecast_content = decode_json($fd_response) if($fd_response);
my $weatherdata_content = decode_json($wd_response) if($wd_response);
my $timeout = AttrVal($name, "timeout", 30); my $timeout = AttrVal($name, "timeout", 30);
if($reread) { if($reread) {
@ -528,7 +533,7 @@ sub SMAPortal_ParseData($) {
for my $k (keys %$livedata_content) { for my $k (keys %$livedata_content) {
my $new_val = ""; my $new_val = "";
if (defined $livedata_content->{$k}) { if (defined $livedata_content->{$k}) {
Log3 $name, 4, "$name - livedata content \"$k\": ".($livedata_content->{$k}); Log3 $name, 4, "$name - Livedata content \"$k\": ".($livedata_content->{$k});
if (($livedata_content->{$k} =~ m/ARRAY/i) || ($livedata_content->{$k} =~ m/HASH/i)) { if (($livedata_content->{$k} =~ m/ARRAY/i) || ($livedata_content->{$k} =~ m/HASH/i)) {
if($livedata_content->{$k} =~ m/ARRAY/i) { if($livedata_content->{$k} =~ m/ARRAY/i) {
my $hd0 = Dumper($livedata_content->{$k}[0]); my $hd0 = Dumper($livedata_content->{$k}[0]);
@ -538,7 +543,7 @@ sub SMAPortal_ParseData($) {
chomp $hd0; chomp $hd0;
$hd0 =~ s/[;']//g; $hd0 =~ s/[;']//g;
$hd0 = ($hd0 =~ /^undef$/)?"none":$hd0; $hd0 = ($hd0 =~ /^undef$/)?"none":$hd0;
Log3 $name, 4, "$name - livedata ARRAY content \"$k\": $hd0"; Log3 $name, 4, "$name - Livedata ARRAY content \"$k\": $hd0";
$new_val = $hd0; $new_val = $hd0;
} }
} else { } else {
@ -566,6 +571,11 @@ sub SMAPortal_ParseData($) {
SMAPortal_extractForecastData($hash,$forecast_content); SMAPortal_extractForecastData($hash,$forecast_content);
} }
if ($weatherdata_content && $weatherdata_content !~ m/undefined/i) {
# Auswertung Wetterdaten
SMAPortal_extractWeatherData($hash,$weatherdata_content);
}
my $pv = ReadingsVal($name, "L1_PV", 0); my $pv = ReadingsVal($name, "L1_PV", 0);
my $fi = ReadingsVal($name, "L1_FeedIn", 0); my $fi = ReadingsVal($name, "L1_FeedIn", 0);
my $gc = ReadingsVal($name, "L1_GridConsumption", 0); my $gc = ReadingsVal($name, "L1_GridConsumption", 0);
@ -762,6 +772,51 @@ sub SMAPortal_extractForecastData($$) {
return; return;
} }
################################################################
## Auswertung Wetterdaten
################################################################
sub SMAPortal_extractWeatherData($$) {
my ($hash,$weather) = @_;
my $name = $hash->{NAME};
my $dl = AttrVal($name, "detailLevel", 1);
readingsBeginUpdate($hash);
for my $k (keys %$weather) {
my $new_val = "";
if (defined $weather->{$k}) {
Log3 $name, 4, "$name - Weatherdata content \"$k\": ".($weather->{$k});
if ($weather->{$k} =~ m/HASH/i) {
my $ih = $weather->{$k};
for my $i (keys %$ih) {
my $hd0 = Dumper($weather->{$k}{$i});
if(!$hd0) {
next;
}
chomp $hd0;
$hd0 =~ s/[;']//g;
$hd0 = ($hd0 =~ /^undef$/)?"none":$hd0;
Log3 $name, 4, "$name - Weatherdata HASH content \"$k $i\": $hd0";
next if($i =~ /^WeatherIcon$/);
$new_val = $hd0;
if ($new_val) {
$new_val =~ s/.*}([A-Z]).*/°$1/ if($i =~ /^TemperatureSymbol$/);
$new_val = sprintf("%.1f",$new_val) if($i =~ /^Temperature$/);
Log3 $name, 4, "$name -> ${k}_${i} - $new_val";
readingsBulkUpdate($hash, "L1_${k}_${i}", $new_val);
}
}
}
}
}
readingsEndUpdate($hash, 1);
return;
}
################################################################ ################################################################
# sortiert eine Liste von Versionsnummern x.x.x # sortiert eine Liste von Versionsnummern x.x.x
# Schwartzian Transform and the GRT transform # Schwartzian Transform and the GRT transform
@ -849,7 +904,7 @@ sub SMAPortal_analivedat($$) {
} }
if($k =~ /ErrorMessages/ && $new_val =~ /.*The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters.*/) { if($k =~ /ErrorMessages/ && $new_val =~ /.*The current data cannot be retrieved from the PV system. Check the cabling and configuration of the following energy meters.*/) {
# Energiedaten konnten nicht ermittelt werden, Daten neu lesen mit Zeitverzögerung # 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, get data again."; Log3 $name, 3, "$name - The current data cannot be retrieved from PV system, get data again.";
$retry = 1; $retry = 1;
} }
} }