diff --git a/contrib/DS_Starter/76_SMAPortal.pm b/contrib/DS_Starter/76_SMAPortal.pm
index a69fe45f5..5cca55746 100644
--- a/contrib/DS_Starter/76_SMAPortal.pm
+++ b/contrib/DS_Starter/76_SMAPortal.pm
@@ -103,6 +103,7 @@ BEGIN {
BlockingCall
BlockingKill
CommandAttr
+ CommandDefine
CommandDeleteAttr
CommandDeleteReading
CommandSet
@@ -130,6 +131,7 @@ BEGIN {
readingsBeginUpdate
readingsDelete
readingsEndUpdate
+ ReadingsNum
ReadingsVal
RemoveInternalTimer
setKeyValue
@@ -142,6 +144,7 @@ BEGIN {
# Versions History intern
our %vNotesIntern = (
+ "1.6.0" => "29.04.2019 function PortalAsHtml ",
"1.5.5" => "22.04.2019 fix readings for BattryOut and BatteryIn ",
"1.5.4" => "26.03.2019 delete L1_InfoMessages if no info occur ",
"1.5.3" => "26.03.2019 delete L1_ErrorMessages, L1_WarningMessages if no errors or warnings occur ",
@@ -227,7 +230,8 @@ sub Set($@) {
} else {
# erweiterte Setlist wenn Credentials gesetzt
$setlist = "Unknown argument $opt, choose one of ".
- "credentials "
+ "credentials ".
+ "createPortalGraphic:noArg "
;
}
@@ -242,6 +246,24 @@ sub Set($@) {
return "Error while saving Username / Password - see logfile for details";
}
+ } elsif ($opt eq "createPortalGraphic") {
+ if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
+ my ($htmldev,$ret);
+
+ $htmldev = "WL.$name";
+ $ret = CommandDefine($hash->{CL},"$htmldev weblink htmlCode {FHEM::SMAPortal::PortalAsHtml (\"$name\")}");
+ return $ret if($ret);
+ my $c = "This device provides a praphical output of SMA Portal values.\n".
+ "The device needs to set attribute \"detailLevel\" in device \"$name\" to level \"4\"";
+ CommandAttr($hash->{CL},"$htmldev comment $c");
+ $c = "SMA Portal Graphics";
+ CommandAttr($hash->{CL},"$htmldev alias $c");
+
+ my $room = AttrVal($name,"room","SMAPortal");
+ CommandAttr($hash->{CL},"$htmldev room $room");
+ CommandAttr($hash->{CL},"$name detailLevel 4");
+ return "SMA Portal Graphics device \"$htmldev\" created and assigned to room \"$room\".";
+
} else {
return "$setlist";
}
@@ -1289,6 +1311,454 @@ sub substUmlauts ($) {
return($txt);
}
+###############################################################################
+# Subroutine für WebLink-Device
+###############################################################################
+sub PortalAsHtml ($) {
+ my ($name) = @_;
+ my $hash = $defs{$name};
+ return "Device \"$name\" doesn't exist !" if(!$hash);
+
+ if(AttrVal($name, "detailLevel", 1) != 4) {
+ return "The attribute \"detailLevel\" of device \"$name\" has to be set to level \"4\" !";
+ }
+
+ my $pv4h = ReadingsNum($name,"L2_Next04Hours-PV", "");
+ my $pvRe = ReadingsNum($name,"L3_RestOfDay-PV", "");
+ my $pvTo = ReadingsNum($name,"L3_Tomorrow-PV", "");
+
+ my $pv00 = ReadingsNum($name,"L2_ThisHour_PvMeanPower", "");
+ my $pv01 = ReadingsNum($name,"L4_NextHour01_PvMeanPower", "");
+ my $pv02 = ReadingsNum($name,"L4_NextHour02_PvMeanPower", "");
+ my $pv03 = ReadingsNum($name,"L4_NextHour03_PvMeanPower", "");
+ my $pv04 = ReadingsNum($name,"L4_NextHour04_PvMeanPower", "");
+ my $pv05 = ReadingsNum($name,"L4_NextHour05_PvMeanPower", "");
+ my $pv06 = ReadingsNum($name,"L4_NextHour06_PvMeanPower", "");
+ my $pv07 = ReadingsNum($name,"L4_NextHour07_PvMeanPower", "");
+ my $pv08 = ReadingsNum($name,"L4_NextHour08_PvMeanPower", "");
+ my $pv09 = ReadingsNum($name,"L4_NextHour09_PvMeanPower", "");
+ my $pv10 = ReadingsNum($name,"L4_NextHour10_PvMeanPower", "");
+ my $pv11 = ReadingsNum($name,"L4_NextHour11_PvMeanPower", "");
+ my $pv12 = ReadingsNum($name,"L4_NextHour12_PvMeanPower", "");
+ my $pv13 = ReadingsNum($name,"L4_NextHour13_PvMeanPower", "");
+ my $pv14 = ReadingsNum($name,"L4_NextHour14_PvMeanPower", "");
+ my $pv15 = ReadingsNum($name,"L4_NextHour15_PvMeanPower", "");
+ my $pv16 = ReadingsNum($name,"L4_NextHour16_PvMeanPower", "");
+ my $pv17 = ReadingsNum($name,"L4_NextHour17_PvMeanPower", "");
+ my $pv18 = ReadingsNum($name,"L4_NextHour18_PvMeanPower", "");
+ my $pv19 = ReadingsNum($name,"L4_NextHour19_PvMeanPower", "");
+ my $pv20 = ReadingsNum($name,"L4_NextHour20_PvMeanPower", "");
+ my $pv21 = ReadingsNum($name,"L4_NextHour21_PvMeanPower", "");
+ my $pv22 = ReadingsNum($name,"L4_NextHour22_PvMeanPower", "");
+ my $pv23 = ReadingsNum($name,"L4_NextHour23_PvMeanPower", "");
+
+ my $is00 = ReadingsVal($name,"L2_ThisHour_IsConsumptionRecommended", "");
+ my $is01 = ReadingsVal($name,"L4_NextHour01_IsConsumptionRecommended", "");
+ my $is02 = ReadingsVal($name,"L4_NextHour02_IsConsumptionRecommended", "");
+ my $is03 = ReadingsVal($name,"L4_NextHour03_IsConsumptionRecommended", "");
+ my $is04 = ReadingsVal($name,"L4_NextHour04_IsConsumptionRecommended", "");
+ my $is05 = ReadingsVal($name,"L4_NextHour05_IsConsumptionRecommended", "");
+ my $is06 = ReadingsVal($name,"L4_NextHour06_IsConsumptionRecommended", "");
+ my $is07 = ReadingsVal($name,"L4_NextHour07_IsConsumptionRecommended", "");
+ my $is08 = ReadingsVal($name,"L4_NextHour08_IsConsumptionRecommended", "");
+ my $is09 = ReadingsVal($name,"L4_NextHour09_IsConsumptionRecommended", "");
+ my $is10 = ReadingsVal($name,"L4_NextHour10_IsConsumptionRecommended", "");
+ my $is11 = ReadingsVal($name,"L4_NextHour11_IsConsumptionRecommended", "");
+ my $is12 = ReadingsVal($name,"L4_NextHour12_IsConsumptionRecommended", "");
+ my $is13 = ReadingsVal($name,"L4_NextHour13_IsConsumptionRecommended", "");
+ my $is14 = ReadingsVal($name,"L4_NextHour14_IsConsumptionRecommended", "");
+ my $is15 = ReadingsVal($name,"L4_NextHour15_IsConsumptionRecommended", "");
+ my $is16 = ReadingsVal($name,"L4_NextHour16_IsConsumptionRecommended", "");
+ my $is17 = ReadingsVal($name,"L4_NextHour17_IsConsumptionRecommended", "");
+ my $is18 = ReadingsVal($name,"L4_NextHour18_IsConsumptionRecommended", "");
+ my $is19 = ReadingsVal($name,"L4_NextHour19_IsConsumptionRecommended", "");
+ my $is20 = ReadingsVal($name,"L4_NextHour20_IsConsumptionRecommended", "");
+ my $is21 = ReadingsVal($name,"L4_NextHour21_IsConsumptionRecommended", "");
+ my $is22 = ReadingsVal($name,"L4_NextHour22_IsConsumptionRecommended", "");
+ my $is23 = ReadingsVal($name,"L4_NextHour23_IsConsumptionRecommended", "");
+
+ my $time00 = strftime("%H",localtime);
+ my $time01 = strftime("%H",localtime(time+1*60*60));
+ my $time02 = strftime("%H",localtime(time+2*60*60));
+ my $time03 = strftime("%H",localtime(time+3*60*60));
+ my $time04 = strftime("%H",localtime(time+4*60*60));
+ my $time05 = strftime("%H",localtime(time+5*60*60));
+ my $time06 = strftime("%H",localtime(time+6*60*60));
+ my $time07 = strftime("%H",localtime(time+7*60*60));
+ my $time08 = strftime("%H",localtime(time+8*60*60));
+ my $time09 = strftime("%H",localtime(time+9*60*60));
+ my $time10 = strftime("%H",localtime(time+10*60*60));
+ my $time11 = strftime("%H",localtime(time+11*60*60));
+ my $time12 = strftime("%H",localtime(time+12*60*60));
+ my $time13 = strftime("%H",localtime(time+13*60*60));
+ my $time14 = strftime("%H",localtime(time+14*60*60));
+ my $time15 = strftime("%H",localtime(time+15*60*60));
+ my $time16 = strftime("%H",localtime(time+16*60*60));
+ my $time17 = strftime("%H",localtime(time+17*60*60));
+ my $time18 = strftime("%H",localtime(time+18*60*60));
+ my $time19 = strftime("%H",localtime(time+19*60*60));
+ my $time20 = strftime("%H",localtime(time+20*60*60));
+ my $time21 = strftime("%H",localtime(time+21*60*60));
+ my $time22 = strftime("%H",localtime(time+22*60*60));
+ my $time23 = strftime("%H",localtime(time+23*60*60));
+
+ # Konfiguration des maximal übergebenen Werts (hier wäre der höchste zu erwartende Wert = 8020)
+ my $maxValue = ReadingsNum($name,"L2_PlantPeakPower", 8020);
+ # Konfiguration den Platz zwischen den Balken (hier wäre der höchste zu erwartende Wert = 30)
+ my $space = 2;
+ # Konfiguration des breite der Balken (hier wäre der höchste zu erwartende Wert = 30)
+ my $width = 24;
+ # Konfiguration des höhe der Balken (hier wäre der höchste zu erwartende Wert = 160)
+ my $height = 160;
+ # Konfiguration der Farbe oben (hier wäre der höchste zu erwartende Wert = "FFFFFF")
+ my $color1 = "#FFFFFF";
+ # Konfiguration der Farbe des Wertes (hier wäre der höchste zu erwartende Wert = "4B9C8A")
+ my $color2 = "#4B9C8A";
+
+ #### Tabelle
+ my $ret = "";
+ $ret .= "
";
+ $ret .= "Prognose der nächsten 4 Stunden: ".($pv4h)." Wh / Rest des Tages: ".($pvRe)." Wh / Morgen: ".($pvTo)." Wh | ";
+ $ret .= "
";
+ $ret .= "";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time00." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is00." | ";
+ $ret .= " ";
+ $ret .= "".$pv00." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time01." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is01." | ";
+ $ret .= " ";
+ $ret .= "".$pv01." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time02." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is02." | ";
+ $ret .= " ";
+ $ret .= "".$pv02." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time03." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is03." | ";
+ $ret .= " ";
+ $ret .= "".$pv03." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time04." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is04." | ";
+ $ret .= " ";
+ $ret .= "".$pv04." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time05." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is05." | ";
+ $ret .= " ";
+ $ret .= "".$pv05." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time06." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is06." | ";
+ $ret .= " ";
+ $ret .= "".$pv06." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time07." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is07." | ";
+ $ret .= " ";
+ $ret .= "".$pv07." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time08." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is08." | ";
+ $ret .= " ";
+ $ret .= "".$pv08." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time09." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is09." | ";
+ $ret .= " ";
+ $ret .= "".$pv09." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time10." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is10." | ";
+ $ret .= " ";
+ $ret .= "".$pv10." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time11." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is11." | ";
+ $ret .= " ";
+ $ret .= "".$pv11." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time12." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is12." | ";
+ $ret .= " ";
+ $ret .= "".$pv12." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time13." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is13." | ";
+ $ret .= " ";
+ $ret .= "".$pv13." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time14." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is14." | ";
+ $ret .= " ";
+ $ret .= "".$pv14." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time15." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is15." | ";
+ $ret .= " ";
+ $ret .= "".$pv15." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time16." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is16." | ";
+ $ret .= " ";
+ $ret .= "".$pv16." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time17." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is17." | ";
+ $ret .= " ";
+ $ret .= "".$pv17." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time18." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is18." | ";
+ $ret .= " ";
+ $ret .= "".$pv18." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time19." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is19." | ";
+ $ret .= " ";
+ $ret .= "".$pv19." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time20." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is20." | ";
+ $ret .= " ";
+ $ret .= "".$pv20." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time21." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is21." | ";
+ $ret .= " ";
+ $ret .= "".$pv21." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time22." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is22." | ";
+ $ret .= " ";
+ $ret .= "".$pv22." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "";
+
+ $ret .= "";
+ $ret .= "";
+ $ret .= "".$time23." | ";
+ $ret .= " ";
+ $ret .= "";
+ $ret .= "".$is23." | ";
+ $ret .= " ";
+ $ret .= "".$pv23." | ";
+ $ret .= " | ";
+ $ret .= " ";
+
+ $ret .= " | ";
+ $ret .= "
";
+
+return($ret);
+}
+
1;
=pod
@@ -1321,8 +1791,10 @@ return($txt);
- Live-Daten (Verbrauch und PV-Erzeugung)
+ - Batteriedaten (In/Out)
- Wetter-Daten von SMA für den Anlagenstandort
- Prognosedaten (Verbrauch und PV-Erzeugung) inklusive Verbraucherempfehlung
+ - die durch den Sunny Home Manager geplanten Schaltzeiten von Verbrauchern (sofern vorhanden)
@@ -1380,6 +1852,13 @@ return($txt);
set <name> credentials <username> <password>
Setzt Username / Passwort für den Zugriff zum SMA-Portal.
+
+
+
+ - set <name> createPortalGraphic
+ Erstellt ein weblink-Device zur grafischen Anzeige der SMA Portaldaten. Das Attribut "detailLevel" muss auf den
+ Level 4 gesetzt sein. Der Befehl setzt dieses Attribut automatisch auf den benötigten Wert.
+