From 22f102f733b837d8a8e17268ef58cbe4028ef70d Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Fri, 3 Jul 2020 07:17:50 +0000 Subject: [PATCH] 76_SMAPortal: contrib 3.3.1 git-svn-id: https://svn.fhem.de/fhem/trunk@22336 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SMAPortal.pm | 81 +++++++++++++++---------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SMAPortal.pm b/fhem/contrib/DS_Starter/76_SMAPortal.pm index 1845d58cc..03e0f1cb9 100644 --- a/fhem/contrib/DS_Starter/76_SMAPortal.pm +++ b/fhem/contrib/DS_Starter/76_SMAPortal.pm @@ -1,5 +1,5 @@ ######################################################################################################################### -# $Id: 76_SMAPortal.pm 22312 2020-06-30 21:37:17Z DS_Starter $ +# $Id: 76_SMAPortal.pm 22332 2020-07-02 20:47:30Z DS_Starter $ ######################################################################################################################### # 76_SMAPortal.pm # @@ -136,6 +136,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "3.3.1" => "03.07.2020 change retry repetition and new cycle wait time ", "3.3.0" => "02.07.2020 fix typo, new attribute noHomeManager ", "3.2.0" => "30.06.2020 add data provider balanceCurrentData (experimental), balanceMonthData, balanceYearData ", "3.1.2" => "25.06.2020 don't delete cookie after every data retrieval, change login management ", @@ -205,8 +206,8 @@ my %vNotesIntern = ( # Voreinstellungen my $maxretries = 8; # max. Anzahl Wiederholungen in einem Abruf-Zyklus my $thold = int($maxretries/2); # Schwellenwert nicht erfolgreicher Leseversuche in einem Zyklus mit dem gleichen Cookie, Standard: int($maxretries/2) -my $sleepretry = 0.5; # Sleep zwischen Data Call Retries (ohne Threshold Überschreitung) -my $sleepexc = 2; # Sleep vor neuem Datencall nach Überschreitung Threshold (Data Calls mit gleichem Cookie) +my $sleepretry = 60; # Sleep zwischen Data Call Retries (ohne Threshold Überschreitung) +my $sleepexc = 90; # Sleep vor neuem Datencall nach Überschreitung Threshold (neues Cookie wird angelegt) my $defmaxcycles = 19; # Standard max. Anzahl Datenabrufzyklen abgeleitet von Interval 120 (wird bei Automatic berechnet) my %statkeys = ( # Statistikdaten auszulesende Schlüssel @@ -224,24 +225,24 @@ my %statkeys = ( # Statistikdaten auszulesende Schlüs AutarkyRate => 1, ); -my %mandatory; # Arbeitskopie von %stpl -> abzurufenden Datenprovider Stammdaten nach Login -my %subs; # Arbeitskopie von %stpl -> Festlegung abzurufenden Datenprovider -my %stpl = ( # Ausgangstemplate Subfunktionen der Datenprovider - consumerMasterdata => { doit => 1, nohm => 1, level => 'L00', func => '_getConsumerMasterdata' }, # mandatory (außer wenn kein SMA Home Manager vorhanden) - plantMasterData => { doit => 1, nohm => 1, level => 'L00', func => '_getPlantMasterData' }, # mandatory (außer wenn kein SMA Home Manager vorhanden) - liveData => { doit => 0, nohm => 0, level => 'L01', func => '_getLiveData' }, - weatherData => { doit => 0, nohm => 0, level => 'L02', func => '_getWeatherData' }, - forecastData => { doit => 0, nohm => 1, level => 'L04', func => '_getForecastData' }, - consumerCurrentdata => { doit => 0, nohm => 1, level => 'L05', func => '_getConsumerCurrData' }, - consumerDayData => { doit => 0, nohm => 1, level => 'L06', func => '_getConsumerDayData' }, - consumerMonthData => { doit => 0, nohm => 1, level => 'L07', func => '_getConsumerMonthData' }, - consumerYearData => { doit => 0, nohm => 1, level => 'L08', func => '_getConsumerYearData' }, - plantLogbook => { doit => 0, nohm => 0, level => 'L09', func => '_getPlantLogbook' }, - balanceCurrentData => { doit => 0, nohm => 0, level => 'L10', func => '_getBalanceCurrentData' }, - balanceDayData => { doit => 0, nohm => 0, level => 'L11', func => '_getBalanceDayData' }, - balanceMonthData => { doit => 0, nohm => 0, level => 'L12', func => '_getBalanceMonthData' }, - balanceYearData => { doit => 0, nohm => 0, level => 'L13', func => '_getBalanceYearData' }, - balanceTotalData => { doit => 0, nohm => 0, level => 'L14', func => '_getBalanceTotalData' }, +my %mandatory; # Arbeitskopie von %stpl -> abzurufenden Datenprovider Stammdaten nach Login +my %subs; # Arbeitskopie von %stpl -> Festlegung abzurufenden Datenprovider +my %stpl = ( # Ausgangstemplate Subfunktionen der Datenprovider + consumerMasterdata => { doit => 1, nohm => 1, level => 'L00', func => '_getConsumerMasterdata' }, # mandatory (außer wenn kein SMA Home Manager vorhanden) + plantMasterData => { doit => 1, nohm => 1, level => 'L00', func => '_getPlantMasterData' }, # mandatory (außer wenn kein SMA Home Manager vorhanden) + liveData => { doit => 0, nohm => 0, level => 'L01', func => '_getLiveData' }, + weatherData => { doit => 0, nohm => 0, level => 'L02', func => '_getWeatherData' }, + forecastData => { doit => 0, nohm => 1, level => 'L04', func => '_getForecastData' }, + consumerCurrentdata => { doit => 0, nohm => 1, level => 'L05', func => '_getConsumerCurrData' }, + consumerDayData => { doit => 0, nohm => 1, level => 'L06', func => '_getConsumerDayData' }, + consumerMonthData => { doit => 0, nohm => 1, level => 'L07', func => '_getConsumerMonthData' }, + consumerYearData => { doit => 0, nohm => 1, level => 'L08', func => '_getConsumerYearData' }, + plantLogbook => { doit => 0, nohm => 0, level => 'L09', func => '_getPlantLogbook' }, + balanceCurrentData => { doit => 0, nohm => 0, level => 'L10', func => '_getBalanceCurrentData' }, + balanceDayData => { doit => 0, nohm => 0, level => 'L11', func => '_getBalanceDayData' }, + balanceMonthData => { doit => 0, nohm => 0, level => 'L12', func => '_getBalanceMonthData' }, + balanceYearData => { doit => 0, nohm => 0, level => 'L13', func => '_getBalanceYearData' }, + balanceTotalData => { doit => 0, nohm => 0, level => 'L14', func => '_getBalanceTotalData' }, ); # Tags der verfügbaren Datenquellen my @pd = qw( plantMasterData @@ -752,8 +753,9 @@ sub CallInfo { } if ($hash->{HELPER}{RUNNING_PID}) { - BlockingKill($hash->{HELPER}{RUNNING_PID}); - delete($hash->{HELPER}{RUNNING_PID}); + Log3 ($name, 3, "$name - An old data cycle is still running, the new data cycle start is postponed."); + InternalTimer(gettimeofday()+5, "FHEM::SMAPortal::CallInfo", $hash, 0) if($interval); + return; } my $getp = $hash->{HELPER}{GETTER}; @@ -984,7 +986,7 @@ sub GetSetData { ## no cri if($retry && $retc < $maxretries) { # neuer Retry im gleichen Zyklus (nicht wenn Verbraucher schalten) $hash->{HELPER}{RETRIES}++; if($retc == $thold) { # Schwellenwert Leseversuche erreicht -> Cookie File löschen - Log3 ($name, 3, qq{$name - Threshold reached, delete cookie and retry ...}); + Log3 ($name, 3, qq{$name - Threshold reached, delete cookie and retry in $sleepretry seconds ...}); sleep $sleepexc; # Threshold exceed -> Retry mit Cookie löschen $exceed = 1; BlockingInformParent("FHEM::SMAPortal::setFromBlocking", [$name, "NULL", "RETRIES:".$hash->{HELPER}{RETRIES} ], 1); @@ -999,7 +1001,7 @@ sub GetSetData { ## no cri my $ac = $hash->{HELPER}{ACTCYCLE}; my $maxcycles = (controlParams $name)[1]; if($retry && $ac < $maxcycles) { # neuer Zyklus (nicht wenn Verbraucher schalten) - Log3 ($name, 3, qq{$name - Maximum retries reached, start new data get cycle ...}); + Log3 ($name, 3, qq{$name - Maximum retries reached, start new data get cycle in $sleepexc seconds ...}); $newcycle = 1; return "$name|$exceed|$newcycle|$errstate|$getp|$setp"; } @@ -2788,12 +2790,12 @@ sub setVersionInfo { if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}} - if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 76_SMAPortal.pm 22312 2020-06-30 21:37:17Z DS_Starter $ im Kopf komplett! vorhanden ) + if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 76_SMAPortal.pm 22332 2020-07-02 20:47:30Z DS_Starter $ im Kopf komplett! vorhanden ) $modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx; } else { $modules{$type}{META}{x_version} = $v; } - return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 76_SMAPortal.pm 22312 2020-06-30 21:37:17Z DS_Starter $ im Kopf komplett! vorhanden ) + return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 76_SMAPortal.pm 22332 2020-07-02 20:47:30Z DS_Starter $ im Kopf komplett! vorhanden ) if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen # mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden @@ -3862,7 +3864,8 @@ return; After a successful login, only the asset master data are retrieved. The attribute providerLevel is used to set the data suppliers its data - the device should retrieve. + the device should retrieve. If no Sunny Home Manager is installed, the attribute + noHomeManager must be set.

@@ -3946,7 +3949,7 @@ return; Time interval for continuous data retrieval from the aus dem SMA Sunny Portal (default: 300 seconds).
if the interval is set to "0", no continuous data retrieval is executed and has to be triggered manually by the "get <name> data" command.

- +
+ +
  • noHomeManager
    + Must be set if no Sunny Home Manager is installed. +

  • +
  • plantLogbookApprovalState
    With this attribute the entries are filtered according to their status.
    @@ -3986,7 +3994,7 @@ return; liveData - generates readings of the current generation and consumption data weatherData - Weather data offered by SMA are retrieved - forecastData - Forecast data of generation/consumption and consumer planning data are generated + forecastData - Forecast data of generation/consumption and consumer planning data are generated (an SMA Home Manager must be available) consumerCurrentdata - current consumer data are generated consumerDayData - consumer data day are generated consumerMonthData - consumer data month are generated @@ -4104,7 +4112,8 @@ return; Nach einem erfolgreichen Login werden nur die Anlagenstammdaten abgerufen. Mit dem Attribut providerLevel werden die Datenlieferanten eingestellt, die durch das - Device abgerufen werden sollen. + Device abgerufen werden sollen. Ist kein Sunny Home Manager installiert, muss das Attribut + noHomeManager gesetzt werden.

    @@ -4186,7 +4195,8 @@ return;
  • disable
    - Deaktiviert das Device.

  • + Deaktiviert das Device. +
  • interval <Sekunden>
    @@ -4201,6 +4211,11 @@ return;

  • + +
  • noHomeManager
    + Muss gesetzt werden wenn kein Sunny Home Manager installiert ist. +

  • +
  • plantLogbookApprovalState
    Mit diesem Attribut werden die Einträge entsprechend ihres Status gefiltert.
    @@ -4233,7 +4248,7 @@ return; liveData - erzeugt Readings der aktuellen Erzeugungs- und Verbrauchsdaten weatherData - von SMA angebotene Wetterdaten werden abgerufen - forecastData - Vorhersagedaten der Erzeugung / Verbrauch und Verbraucherplanungsdaten werden erzeugt + forecastData - Vorhersagedaten der Erzeugung / Verbrauch und Verbraucherplanungsdaten werden erzeugt (ein SMA Home Manager muss vorhanden sein) consumerCurrentdata - aktuelle Verbraucherdaten werden erzeugt consumerDayData - Verbraucherdaten Tag werden erzeugt consumerMonthData - Verbraucherdaten Monat werden erzeugt