diff --git a/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm b/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm
index ae96f2b90..f88e64de7 100644
--- a/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm
+++ b/fhem/contrib/DS_Starter/76_SMAPortal_V3.0.0.pm
@@ -219,18 +219,20 @@ my %statkeys = ( # Statistikdaten auszulesende Schlüs
my %subs; # Arbeitskopie von %stpl
my %stpl = ( # Ausgangstemplate Subfunktionen der Datenprovider
- consumerMasterdata => { doit => 1, level => 'L00', func => '_getConsumerMasterdata'}, # mandatory
- plantData => { doit => 1, level => 'L00', func => '_getPlantData' }, # mandatory
- liveData => { doit => 0, level => 'L01', func => '_getLiveData' },
- weatherData => { doit => 0, level => 'L02', func => '_getWeatherData' },
- balanceDayData => { doit => 0, level => 'L03', func => '_getBalanceDayData' },
- forecastData => { doit => 0, level => 'L04', func => '_getForecastData' },
- consumerDayData => { doit => 0, level => 'L05', func => '_getConsumerDayData' },
- consumerMonthData => { doit => 0, level => 'L06', func => '_getConsumerMonthData' },
- consumerYearData => { doit => 0, level => 'L07', func => '_getConsumerYearData' },
+ consumerMasterdata => { doit => 1, level => 'L00', func => '_getConsumerMasterdata'}, # mandatory
+ plantData => { doit => 1, level => 'L00', func => '_getPlantData' }, # mandatory
+ liveData => { doit => 0, level => 'L01', func => '_getLiveData' },
+ weatherData => { doit => 0, level => 'L02', func => '_getWeatherData' },
+ balanceDayData => { doit => 0, level => 'L03', func => '_getBalanceDayData' },
+ forecastData => { doit => 0, level => 'L04', func => '_getForecastData' },
+ consumerCurrentdata => { doit => 0, level => 'L05', func => '_getConsumerCurrData' },
+ consumerDayData => { doit => 0, level => 'L06', func => '_getConsumerDayData' },
+ consumerMonthData => { doit => 0, level => 'L07', func => '_getConsumerMonthData' },
+ consumerYearData => { doit => 0, level => 'L08', func => '_getConsumerYearData' },
);
# Tags der verfügbaren Datenquellen
my @pd = qw( balanceDayData
+ consumerCurrentdata
consumerMasterdata
consumerDayData
consumerMonthData
@@ -1147,6 +1149,31 @@ sub _getConsumerMasterdata { ## no critic "not used"
return ($errstate,$state,$reread,$retry);
}
+################################################################
+# Abruf Consumer current Data
+################################################################
+sub _getConsumerCurrData { ## no critic "not used"
+ my $paref = shift;
+ my $name = $paref->{name};
+ my $ua = $paref->{ua}; # LWP Useragent
+ my $state = $paref->{state};
+ my $daref = $paref->{daref}; # Referenz zum Datenarray
+
+ my ($reread,$retry,$errstate) = (0,0,0);
+
+ ($errstate,$state) = __dispatchGet ({ name => $name,
+ ua => $ua,
+ call => 'https://www.sunnyportal.com/Homan/ConsumerBalance/GetLiveProxyValues',
+ tag => "consumerCurrentdata",
+ state => $state,
+ fnaref => [ qw( extractConsumerCurrentdata ) ],
+ addon => "",
+ daref => $daref
+ });
+
+return ($errstate,$state,$reread,$retry);
+}
+
################################################################
# Abruf Consumer Tagesdaten
################################################################
@@ -1677,7 +1704,7 @@ sub ParseData { ## no critic
readingsEndUpdate($hash, 1);
my $ldlv = $stpl{liveData}{level};
- my $cmlv = $stpl{consumerMasterdata}{level};
+ my $cclv = $stpl{consumerCurrentdata}{level};
my $lddo = $subs{$name}{liveData}{doit};
my $pv = ReadingsNum($name, "${ldlv}_PV" , 0);
@@ -1697,7 +1724,7 @@ sub ParseData { ## no critic
if($setp ne "none") {
my ($d,$op) = split(":",$setp);
$op = ($op eq "auto") ? "off (automatic)" : $op;
- readingsBulkUpdate($hash, "${cmlv}_${d}_Switch", $op);
+ readingsBulkUpdate($hash, "${cclv}_${d}_Switch", $op);
}
readingsBulkUpdate($hash, "lastCycleTime", $ctime ) if($ctime > 0);
readingsBulkUpdate($hash, "summary" , $sum." W") if($subs{$name}{liveData}{doit});
@@ -2184,7 +2211,57 @@ sub extractConsumerMasterdata {
};
my $lv = $stpl{consumerMasterdata}{level};
- # allen Consumer Objekte die ID zuordnen
+ # allen Consumer Objekten die ID zuordnen
+ $i = 0;
+ for my $c (@{$clivedata->{'MeasurementData'}}) {
+ $consumers{"${i}_ConsumerName"} = encode("utf8", $c->{'DeviceName'} );
+ $consumers{"${i}_ConsumerOid"} = $c->{'Consume'}{'ConsumerOid'};
+ $consumers{"${i}_ConsumerLfd"} = $i;
+ my $cn = $consumers{"${i}_ConsumerName"}; # Verbrauchername
+ next if(!$cn);
+ $cn = replaceJunkSigns($cn);
+
+ $hash->{HELPER}{CONSUMER}{$i}{DeviceName} = $cn;
+ $hash->{HELPER}{CONSUMER}{$i}{ConsumerOid} = $consumers{"${i}_ConsumerOid"};
+ $hash->{HELPER}{CONSUMER}{$i}{SerialNumber} = $c->{'SerialNumber'};
+ $hash->{HELPER}{CONSUMER}{$i}{SUSyID} = $c->{'SUSyID'};
+
+ $i++;
+ }
+
+ if($hash->{HELPER}{CONSUMER}) {
+ for my $key (keys %{$hash->{HELPER}{CONSUMER}}) {
+ for my $parname (keys %{$hash->{HELPER}{CONSUMER}{$key}}) {
+ my $val = $hash->{HELPER}{CONSUMER}{$key}{$parname};
+ next if(!defined $val);
+ Log3 ($name, 4, "$name - CONSUMER master data: $key -> $parname = $val");
+ BlockingInformParent("FHEM::SMAPortal::setFromBlocking", [$name, "NULL", "CONSUMER:$key:$parname:$val"], 1);
+ }
+ }
+ }
+
+return;
+}
+
+################################################################
+## Auswertung Consumer Current Data
+################################################################
+sub extractConsumerCurrentdata {
+ my $hash = shift;
+ my $daref = shift;
+ my $clivedata = shift;
+ my $name = $hash->{NAME};
+ my %consumers;
+ my ($i,$res);
+
+ Log3 ($name, 4, "$name - ##### extracting consumer current data #### ");
+
+ $clivedata = eval{decode_json($clivedata)} or do { Log3 ($name, 2, "$name - ERROR - can't decode JSON Data");
+ return;
+ };
+ my $lv = $stpl{consumerCurrentdata}{level};
+
+ # allen Consumer Objekten die ID zuordnen
$i = 0;
for my $c (@{$clivedata->{'MeasurementData'}}) {
$consumers{"${i}_ConsumerName"} = encode("utf8", $c->{'DeviceName'} );
@@ -2194,11 +2271,6 @@ sub extractConsumerMasterdata {
my $cn = $consumers{"${i}_ConsumerName"}; # Verbrauchername
next if(!$cn);
$cn = replaceJunkSigns($cn);
-
- $hash->{HELPER}{CONSUMER}{$i}{DeviceName} = $cn;
- $hash->{HELPER}{CONSUMER}{$i}{ConsumerOid} = $consumers{"${i}_ConsumerOid"};
- $hash->{HELPER}{CONSUMER}{$i}{SerialNumber} = $c->{'SerialNumber'};
- $hash->{HELPER}{CONSUMER}{$i}{SUSyID} = $c->{'SUSyID'};
push @$daref, "${lv}_${cn}_Power:".$cpower." W" if(defined $cpower);
@@ -2236,16 +2308,6 @@ sub extractConsumerMasterdata {
}
}
- if($hash->{HELPER}{CONSUMER}) {
- for my $key (keys %{$hash->{HELPER}{CONSUMER}}) {
- for my $parname (keys %{$hash->{HELPER}{CONSUMER}{$key}}) {
- my $val = $hash->{HELPER}{CONSUMER}{$key}{$parname};
- next if(!defined $val);
- BlockingInformParent("FHEM::SMAPortal::setFromBlocking", [$name, "NULL", "CONSUMER:$key:$parname:$val"], 1);
- }
- }
- }
-
return;
}
@@ -3422,12 +3484,14 @@ return;
- - set <name> createPortalGraphic <Generation | Consumption | Generation_Consumption | Differential>
+
+ - set <name> createPortalGraphic <Generation | Consumption | Generation_Consumption | Differential>
Creates graphical devices to show the SMA Sunny Portal forecast data in several layouts.
The attribute "providerLevel" must contain "forecastData".
With the "attributes of the graphic device" the appearance and coloration of the forecast
data in the created graphic device can be adjusted.
+
@@ -3437,9 +3501,11 @@ return;
- - set <name> <consumer name> <on | off | auto>
+
+ - set <name> <consumer name> <on | off | auto>
Once consumer data are available, the consumer are shown in the Set and can be switched to on, off or the automatic mode (auto)
- that means the consumer are controlled by the Sunny Home Manager.
+ that means the consumer are controlled by the Sunny Home Manager.
+
@@ -3449,16 +3515,21 @@ return;
Get
+
- - get <name> data
+
+ - get <name> data
This command fetch the data from the SMA Sunny Portal manually.
+
- - get <name> storedCredentials
+
+ - get <name> storedCredentials
The saved credentials are displayed in a popup window.
+
@@ -3502,13 +3573,14 @@ return;
- | liveData | - generates readings of the current generation and consumption data |
- | weatherData | - Weather data offered by SMA are retrieved |
- | balanceDayData | - Statistics data of the day are retrieved |
- | forecastData | - Forecast data of generation/consumption and consumer planning data are generated |
- | consumerDayData | - consumer data day are generated |
- | consumerMonthData | - consumer data month are generated |
- | consumerYearData | - consumer data year are generated |
+ | liveData | - generates readings of the current generation and consumption data |
+ | weatherData | - Weather data offered by SMA are retrieved |
+ | balanceDayData | - Statistics data of the day are retrieved |
+ | forecastData | - Forecast data of generation/consumption and consumer planning data are generated |
+ | consumerCurrentdata | - current consumer data are generated |
+ | consumerDayData | - consumer data day are generated |
+ | consumerMonthData | - consumer data month are generated |
+ | consumerYearData | - consumer data year are generated |
@@ -3619,26 +3691,32 @@ return;
- - set <name> createPortalGraphic <Generation | Consumption | Generation_Consumption | Differential>
+
+ - set <name> createPortalGraphic <Generation | Consumption | Generation_Consumption | Differential>
Erstellt Devices zur grafischen Anzeige der SMA Sunny Portal Prognosedaten in verschiedenen Layouts.
Das Attribut "providerLevel" muss auf den Level "forecastData" enthalten.
Mit den "Attributen des Grafikdevices" können Erscheinungsbild und
Farbgebung der Prognosedaten in den erstellten Grafik-Devices angepasst werden.
+
- - set <name> credentials <username> <password>
+
+ - set <name> credentials <username> <password>
Setzt Username / Passwort zum Login in das SMA Sunny Portal.
+
- - set <name> <Verbrauchername> <on | off | auto>
+
+ - set <name> <Verbrauchername> <on | off | auto>
Es werden die an den SMA Sunny Homemanager angeschlossene Verbraucher (Bluetooth Steckdosen) angeboten sobald sie vom
Modul erkannt wurden.
Sobald diese Daten vorliegen, werden die vorhandenen Verbraucher im Set angezeigt und können eingeschaltet, ausgeschaltet
- bzw. auf die Steuerung durch den Sunny Home Manager umgeschaltet werden (auto).
+ bzw. auf die Steuerung durch den Sunny Home Manager umgeschaltet werden (auto).
+
@@ -3649,15 +3727,21 @@ return;
- - get <name> data
+
+
+ - get <name> data
Mit diesem Befehl werden die Daten aus dem SMA Sunny Portal manuell abgerufen.
+
- - get <name> storedCredentials
+
+ - get <name> storedCredentials
Die gespeicherten Anmeldeinformationen (Credentials) werden in einem Popup als Klartext angezeigt.
+
+
@@ -3701,13 +3785,14 @@ return;
- | liveData | - erzeugt Readings der aktuellen Erzeugungs- und Verbrauchsdaten |
- | weatherData | - von SMA angebotene Wetterdaten werden abgerufen |
- | balanceDayData | - Statistikdaten des Tages werden abgerufen |
- | forecastData | - Vorhersagedaten der Erzeugung / Verbrauch und Verbraucherplanungsdaten werden erzeugt |
- | consumerDayData | - Verbraucherdaten Tag werden erzeugt |
- | consumerMonthData | - Verbraucherdaten Monat werden erzeugt |
- | consumerYearData | - Verbraucherdaten Jahr werden erzeugt |
+ | liveData | - erzeugt Readings der aktuellen Erzeugungs- und Verbrauchsdaten |
+ | weatherData | - von SMA angebotene Wetterdaten werden abgerufen |
+ | balanceDayData | - Statistikdaten des Tages werden abgerufen |
+ | forecastData | - Vorhersagedaten der Erzeugung / Verbrauch und Verbraucherplanungsdaten werden erzeugt |
+ | consumerCurrentdata | - aktuelle Verbraucherdaten werden erzeugt |
+ | consumerDayData | - Verbraucherdaten Tag werden erzeugt |
+ | consumerMonthData | - Verbraucherdaten Monat werden erzeugt |
+ | consumerYearData | - Verbraucherdaten Jahr werden erzeugt |