Neu: 77_SMAEM - Modul für SMA Energie Meter. Alternative zum Sunny Home Manager.

Begonnen von Volker Kettenbach, 30 März 2016, 12:42:05

Vorheriges Thema - Nächstes Thema

MadMax

So könntest du mal anfangen.

Ein Dummy und zwei ATs, einer der kontinuirlich die Werte berechnet und einer beim Tageswechsel.
Achtung, der Code ist nicht getestet nur aus dem von mir verwendeten zusammengeschnitten.
Du musst deine Devices eintragen.
Hast du eine Batterie oder nicht?
Ich habe eine und die musste ich hier in dem Code für dich rausnehmen.


defmod Dum.Energy dummy



defmod SMAEM.at at *23:58:00 {\
my $EMSN = "SMAEMSNvomEM_";;\
my $Einspeisung_Wirkleistung_Zaehler = ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung_Zaehler", 0);;\
my $Bezug_Wirkleistung_Zaehler = ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung_Zaehler", 0);;\
my $Einspeisung_Wirkleistung_Zaehler_yesterday = ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung_Zaehler_yesterday", 0);;\
my $Bezug_Wirkleistung_Zaehler_yesterday = ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung_Zaehler_yesterday", 0);;\
\
fhem("setreading SMA_Energymeter ".$EMSN."Einspeisung_Wirkleistung_Zaehler_yesterday ".$Einspeisung_Wirkleistung_Zaehler);;\
fhem("setreading SMA_Energymeter ".$EMSN."Bezug_Wirkleistung_Zaehler_yesterday ".$Bezug_Wirkleistung_Zaehler);;\
\
$Einspeisung_Wirkleistung_Zaehler = $Einspeisung_Wirkleistung_Zaehler - $Einspeisung_Wirkleistung_Zaehler_yesterday;;\
$Bezug_Wirkleistung_Zaehler = $Bezug_Wirkleistung_Zaehler - $Bezug_Wirkleistung_Zaehler_yesterday;;\
\
fhem("setreading SMA_Energymeter ".$EMSN."Einspeisung_Wirkleistung_yesterday ".$Einspeisung_Wirkleistung_Zaehler);;\
fhem("setreading Dum.Energy GridFeedInYDay ".sprintf("%.3f",$Einspeisung_Wirkleistung_Zaehler));;\
\
fhem("setreading SMA_Energymeter ".$EMSN."Bezug_Wirkleistung_yesterday ".$Bezug_Wirkleistung_Zaehler);;\
fhem("setreading Dum.Energy GridConsumptionYDay ".sprintf("%.3f",$Bezug_Wirkleistung_Zaehler));;\
\
my $SPOT_ETODAY = ReadingsVal("STP_10", "SPOT_ETODAY", "0");;\
\
fhem("setreading Dum.Energy PVYDay ".$SPOT_ETODAY/1000);;\
fhem("setreading Dum.Energy DirectConsumptionYDay ".ReadingsVal("Dum.Energy", "DirectConsumptionDay", "0"));;\
\
my $Verbrauch = ReadingsVal("Dum.Energy", "TotalConsumptionDay", "0");;\
fhem("setreading Dum.Energy TotalConsumptionYDay ".sprintf("%.3f",$Verbrauch));;\
fhem("setreading Dum.Energy TotalConsumptionHomeYDay ".sprintf("%.3f",$Verbrauch-($WB_Energie_YD/1000)));;\
\
my $AutarkyQuoteDay = ($Verbrauch - $Bezug_Wirkleistung_Zaehler) / $Verbrauch * 100;;\
$AutarkyQuoteDay = sprintf("%.1f",$AutarkyQuoteDay);;\
fhem("setreading Dum.Energy AutarkyQuoteYDay ".$AutarkyQuoteDay);;\
\
my $SelfConsumptionQuoteDay = $Verbrauch / ($SPOT_ETODAY / 1000) * 100;;\
$SelfConsumptionQuoteDay = sprintf("%.1f",$SelfConsumptionQuoteDay);;\
$SelfConsumptionQuoteDay = 100 if($SelfConsumptionQuoteDay > 100);;\
fhem("setreading Dum.Energy SelfConsumptionQuoteYDay ".$SelfConsumptionQuoteDay);;\
}



defmod EV.at at +*00:01:00
{
my $EMSN = "SMAEMSNvomEM_";

my $SPOT_PACTOT = ReadingsVal("Inverters", "SPOT_PACTOT", "0");
my $SPOT_ETODAY = ReadingsVal("Inverters", "SPOT_ETODAY", "0");

my $Verbrauch = $SPOT_PACTOT - ReadingsVal("SMA_Energymeter", $EMSN."Saldo_Wirkleistung",0);

$Verbrauch = sprintf("%.1f",$Verbrauch);

#Now
fhem ("setreading Dum.Energy GridConsumption ".ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung",0));
fhem ("setreading Dum.Energy GridFeedIn ".ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung",0));

# Energieverbrauch
fhem "setreading Dum.Energy PV ".sprintf("%.1f",(ReadingsVal("Inverters","SPOT_PACTOT",0)));
my $tc = sprintf("%.1f",ReadingsVal("Dum.Energy","PV",0)+ReadingsVal("Dum.Energy","GridConsumption",0)-ReadingsVal("Dum.Energy","GridFeedIn",0));
if($tc >= 0) {
     fhem ("setreading Dum.Energy TotalConsumption ".sprintf("%.1f",$tc));
}

$tc = sprintf("%.1f",ReadingsVal("Dum.Energy","PV",0)-ReadingsVal("Dum.Energy","GridFeedIn",0));
if($tc >= 0) {
     fhem ("setreading Dum.Energy DirectConsumption ".sprintf("%.1f",$tc));
}

# Autarkiegrad
my $valA = (ReadingsVal("Inverters", "SPOT_PACTOT",0)) + ReadingsVal("STP8SE", "Batterieleistung", "0") - ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung",0);
if($valA > 0) {
   my $calcVal = $valA / ($valA + ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung",0))*100;
   fhem ("setreading Dum.Energy AutarkyQuote ".($calcVal?sprintf("%.1f",$calcVal):"0"));
}
else
{
    fhem ("setreading Dum.Energy AutarkyQuote -");
}
 
# Eigenverbrauchsquote
my $totalpac = ReadingsVal("Inverters", "SPOT_PACTOT",0);
if($totalpac > 0) {
     my $valSelf = $totalpac - ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung",0);
     my $calSelf = $valSelf / $totalpac * 100;
     $calSelf = 100 if ($calSelf > 100);
     fhem ("setreading Dum.Energy SelfConsumptionQuote ".sprintf("%.1f",$calSelf));
} else {
     fhem ("setreading Dum.Energy SelfConsumptionQuote -");
}


#Today
$Bezug = ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung_Zaehler", "0") - ReadingsVal("SMA_Energymeter", $EMSN."Bezug_Wirkleistung_Zaehler_yesterday", "0");
$Bezug = sprintf("%.3f",$Bezug);

#fhem("setreading SMA_Energymeter ".$EMSN."Bezug_Wirkleistung_today ".$Bezug);
#fhem("setreading Dum.Energy GridConsumptionDay ".$Bezug);

fhem("setreading Dum.Energy Grid ".ReadingsVal("SMA_Energymeter", $EMSN."Saldo_Wirkleistung",0));

my $EinspeisungD = ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung_Zaehler", "0") - ReadingsVal("SMA_Energymeter", $EMSN."Einspeisung_Wirkleistung_Zaehler_yesterday", "0");
my $Einspeisung = sprintf("%.3f",$EinspeisungD);
#fhem("setreading SMA_Energymeter ".$EMSN."Einspeisung_Wirkleistung_today ".$Einspeisung);
#fhem("setreading Dum.Energy GridFeedInDay ".$Einspeisung);

$Verbrauch = (($Bezug * 1000 + ($SPOT_ETODAY - $Einspeisung * 1000)) /1000);
#fhem("setreading Dum.Energy TotalConsumptionDay ".sprintf("%.3f",$Verbrauch));

my $tc = ReadingsVal("Dum.Energy","PVDay",0)-ReadingsVal("Dum.Energy","GridFeedInDay",0)-ReadingsVal("Dum.Energy","BatInDay",0);
#if($tc >= 0) {
    #fhem ("setreading Dum.Energy DirectConsumptionDay ".sprintf("%.3f",$tc));
#}


my $AutarkyQuote = 0;
my $SelfConsumptionQuote = 0;

if($Verbrauch > 0)
{
  $AutarkyQuote = ($Verbrauch - $Bezug) / $Verbrauch * 100;
  $AutarkyQuote = sprintf("%.1f",$AutarkyQuote);
  #fhem("setreading Dum.Energy AutarkyQuoteDay ".$AutarkyQuote);
}

if($SPOT_ETODAY > 0)
{
  $SelfConsumptionQuote = $Verbrauch / ($SPOT_ETODAY / 1000) * 100;
  $SelfConsumptionQuote = sprintf("%.1f",$SelfConsumptionQuote);
  #fhem("setreading Dum.Energy SelfConsumptionQuoteDay ".$SelfConsumptionQuote);
}
}


Gruß
Max

Raspberry Pi 4B 4GB mit FHEM 6.2, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

B.Stromberg

Zitat von: MadMax am 10 Januar 2023, 17:14:49
So könntest du mal anfangen.


Hallo und vielen Dank!

Nein, habe keinen Akku am WR.

Frage:

Die Readings Einspeisung_Wirkleistung_Zaehler_yesterday und Bezug_Wirkleistung_Zaehler_yesterday gibt es ja nicht beim 77_SMAEM.
Werden diese durch den Code, den du mir zur Verfügung stellst erzeugt?
Bin leider nicht so fit im Programmieren.

MadMax

Raspberry Pi 4B 4GB mit FHEM 6.2, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

B.Stromberg

Zitat von: MadMax am 10 Januar 2023, 18:45:53
Genau, die werden um 23:58 von dem AT erzäugt.

Gibt es irgendwie einen Trick, wie man den Code bei FHEM eingibt?
Kopiere ich die Code Tags und füge diese in die fhem.cfg ein, bekomme ich zig Fehlermeldungen.
Eingabe in die Befehlszeile von FHEM funktioniert auch nicht, weil ich gar nicht weiß wo ich anfangen soll zu kopieren.

Komme mir grad ziemlich dämlich vor, dass ich nicht mal den Code eingeben kann :(

@300P
Hast du nun deinen letzten Beitrag gelöscht, oder wurde dieser gelöscht?
Genau wegen sowas war ich hier lange bei FHEM nicht aktiv.
Nur, wenn ich irgendwo eine Zeit X angemeldet bin, heißt es nicht, dass ich die Materie dann perfekt beherrsche.
Weiß nicht warum Menschen immer auf anderen Menschen "herumhacken" müssen, nur weil es ihnen nicht in den Kram passt.
Dachte immer der Sinn und Zweck eines Forums ist es zu helfen?
Dann hat man exakt 2 Möglichkeiten.
Man hilft, oder ignoriert.
Alles andere ist dann Blockwart und macht ein Forum kaputt!
Sorry für OT

EDIT:
Keine Ahnung, denke das liegt an den Zeilenumbrüchen hier im Forum, egal was mache, oder wie ich den Code von oben eingebe, bekomme ich Fehlermeldungen (und ja, habe die Devices angepasst).
Ist jetzt auch egal!

Habe auch keine Lust mehr hier zu fragen, wenn man eh nur blöd angemacht wird...
Ist ja nicht das erste Mal!
Niedermachen scheint aktuell ein großer Trend im Land zu sein.
Also freue sich Derjenige, dem das alles hier leicht fällt und er sich über die, denen es nicht so leicht fällt abwertend und überheblich urteilen kann!

Bin hier dann erst mal wieder für länger raus und in Lernpause :)
Dann seit ihr Cracks wieder unter euch und eure Threads werden nicht von dummen Fragen von Newbies wie mir zugespamt!

Habe noch einen Job und Familie und keine Zeit 24/7 FHEM einzuatmen, wie es evtl. andere hier tun (können).

Vielen Dank noch einmal an Diejenigen, die helfen wollen!


Elektron

Hallo Stromberg,

Keine Ahnung was da genau Deine Erwartung ist, wie detailliert Dir hier im Forum beholfen wird.
FHEM ist eben keiner 100% ,,out of the Box" Lösung, das ist aber auch eine Chance, auf der anderen Seite muss man (Du) dann eben mehr Energie investieren.

Ich bin jetzt auch nicht der geborene Progrmmierer und mir fällt das auch nicht leicht aber mit etwas Ehrgeiz ist da vieles möglich.

Zum Thema Tonfall könntest Du ggf. auch über Deine Texte mal reflektieren...

Zum eigentlichen Thema:

Du hast verschiedene Möglichkeiten, ich hatte Dir das Modul Statistik vorgeschlagen. Damit kannst Du zumindest die Erzeugung bzw. den Verbrauch als Tagessumme berechnen.
Hier der Artikel im Wiki: https://wiki.fhem.de/wiki/Statistics

Alternativ die ,,Luxuslösung" von Max.
Über die Eingabezeile in FHEM kannst Du das at erzeugen und dann im nachgang verändern / erweitern...
Zum Thema At findest Du hier Details https://wiki.fhem.de/wiki/At

Wie geschrieben, ich bin kein echter Programmierer und habe mir das jetzt selber ,,mal schnell" zusammengesucht...

Viele Grüße Michael

isy

Moin zusammen,
eine tolle Entwicklung der SMA Module.

Nach der Einbindung meines neuen WR's STP10.0SE (mit HM 2.0, BYD HVS 10.2) per SMAInverter Modul, habe ich soeben dieses Modul in Betrieb genommen,
Lief nach Eingabe der Seriennummer sofort. Klasse!

Jetzt habe ich alle Werte ohne den Umweg über SolarView, die ich zur PV-Überschussladung benötige.

VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Moin zusammen,
in anderem Zusammenhang (Suche nach Datenfehler in einem sehr großen Logfile für 76_SMAInverter.pm:v2.21.6-s27233/2023-02-16) fiel mir die permanente CPU Last von 100% für den fhem/perl Prozess auf. Das System ist damit so wie immer bedienbar.

Die Ursache habe ich heute morgen durch genauere Analyse der apptime Daten gefunden.

Ich hatte das Modul SMAEM zur Überwachung des Sunny Home Managers installiert, jedoch auf disable 1 gesetzt, da ich die Daten direkt vom Wechselrichter bekomme.

In apptime maxDelay gibt es für SMAEM nur kleine Werte, aber eine sehr hohe Anzahl Counts, obwohl das Modul auf disable gesetzt ist.
Nach dem Delete des Devices ist die CPU Last wieder 1-stellig.

Könntet ihr das mal prüfen?
Ich dachte, bei disable 1 wird das Modul nicht mehr aufgerufen?

VG Helmut

Ein Weg wird erst zu einem Weg, wenn man ihn geht