Hi,
ich habe hier das SMA Energymeter - dort ist ein Zähler für Bezug und einer für Einspeisung drin.
Meine Lösung dafür sieht so aus (Sma_Energy_math.php):
Code: Alles auswählen
// Info: Hier wird der Strompreis gepflegt (siehe unten)
#!/usr/bin/php
<?php
//Wenn der Wert auch in die LOG Datei geschrieben werden soll.
//$funktionen->log_schreiben("Rasperry Temperatur: ".round($RaspiTemp,1)." °C",">",5); //wenn RaspiTemp in solaranzeige.log angezeigt werden soll
//vor $funktionen entfernen
$Datenbank[1] = "solaranzeige";
$Measurements[1][1] = "AC";
$Measurements[1][2] = "Service";
$Measurements[1][3] = "Summen";
//06.06.2022 Strompreis von 0,282 auf 0,3045 angepasst
// $Strompreis ="0.3045"; // Euro pro Kilowatt
// $PreisperiodeWhEigenverbrauchAnfang ="988575"; //Startpunkt eigenverbrauchszähler für aktuelle PReisperiode in Wh
// $PreisperiodeEigenverbrauchEuAnfang ="202.76"; //Startpunkt Eigenverbrauchszähler für aktuelle Preisperiode in EURO
//01.07.2022 Strompreis von 0,3045 auf 0,2673 angepasst (EEG Umlage entfallen)
$Strompreis ="0.2673"; // Euro pro Kilowatt
$PreisperiodeWhEigenverbrauchAnfang ="1111807"; //Startpunkt eigenverbrauchszähler für aktuelle PReisperiode in Wh
$PreisperiodeEigenverbrauchEuAnfang ="231.00"; //Startpunkt Eigenverbrauchszähler für aktuelle Preisperiode in EURO
$Einspeiseverguetung ="0.0769"; // Euro pro Kilowatt
//$Datenbank[2] = "energymeter";
// Verbrauchsberechnung abhängig entweder Energymeterdaten oder Wechselrichterdaten verwenden. Tags -> Wechselrichter -> nachts -> Energymeter. Grund: Wechselrichter und Energymeter werden nie zeitgleich ausgelesen, das führt bei Wolkenflug macnhmal zu neagtiven Werten für Verbrauch.
// Verbrauchsberechnung Anfang
for ($i=1; $i <= count($Datenbank); $i++) {
for($j=1; $j <= count($Measurements[$i]); $j++){
$ch[$i][$j] = curl_init('http://localhost/query?db='.$Datenbank[$i].'&precision=s&q='.urlencode('select * from '.$Measurements[$i][$j].' order by time desc limit 1'));
include "mathe.php";
}
}
if($DB[1][2]["Betriebszustand"] != 0){ //Tagsüber Werte aus dem Wechselrichter verwenden
log_schreiben(" Leistung WR : ".$DB[1][1]["Leistung"],"",8);
log_schreiben(" Betriebszustand WR : ".$DB[1][2]["Betriebszustand"],"",8);
log_schreiben(" Einspeisung WR : ".$DB[1][1]["Einspeisung"],"",8);
log_schreiben(" Bezug WR : ".$DB[1][1]["Bezug"],"",8);
log_schreiben(" Verbrauch WR : ".($DB[1][1]["Leistung"] + $DB[1][1]["Bezug"] - $DB[1][1]["Einspeisung"]),"",8);
$aktuelleDaten["ZusatzQuery"] = "Dashboard Gesamt_Leistung=".($DB[1][1]["Leistung"] + $DB[1][1]["Bezug"] - $DB[1][1]["Einspeisung"]);
}
else // Nachts Werte aus dem Energymeter verwenden
{
log_schreiben(" Import/Export (EM): ".$aktuelleDaten["AC_Leistung"],"",8); // nehme aus der zuletzt verwendenten PHP = hier ist das Energymeter den Wert aus der Tabelle 'AC' für 'Leistung'
log_schreiben(" Verbrauch (EM): ".($aktuelleDaten["AC_Leistung"] + $DB[1][1]["Leistung"]),"",8);
$aktuelleDaten["ZusatzQuery"] = "Dashboard Gesamt_Leistung=".($DB[1][1]["Leistung"] + $aktuelleDaten["AC_Leistung"]);
}
// Verbrauchsberechnung Ende
// Wh Zähler Bezug Anfang
/*****************************************************************************
// Die Status Datei wird dazu benutzt, um den Bezug in Wh Pro Tag zu berechnen
// Um 00:00 wird der aktuelle Zählerstand des Energymeters in der Datei hinterlegt.
// In jedem Auslesezyklus wird der aktuelle Zählerstand vom Energymeter gelesen
// und der Wert aus der Datei subtrahiert. Das Ergebnis wird in die Datenbank gespeichert.
*****************************************************************************/
$StatusFile = $Pfad."/database/".$GeraeteNummer.".WattstundenZaehlerBezugAnfangswert.txt";
if (file_exists($StatusFile)) {
/***************************************************************************
// Wenn Statusdatei existiert, dann Datei einlesen ...
***************************************************************************/
$WattstundenZaehlerBezugAnfangswert = file_get_contents($StatusFile);
if (empty($WattstundenZaehlerBezugAnfangswert)){ // Ist die gelesene Datei leer, dann ...
$WattstundenZaehlerBezugAnfangswert = $aktuelleDaten["Wh_Bezug"]; //...schreibe den aktuellen Zählerstand in die Datei
}
if (date("H:i") == "00:00") { // Jede Nacht 0 Uhr
$WattstundenZaehlerBezugAnfangswert = $aktuelleDaten["Wh_Bezug"]; // Zäherstand am Anfang des Tages merken
$rc = file_put_contents($StatusFile,$aktuelleDaten["Wh_Bezug"]); // und in die statusdatei schreiben
$funktionen->log_schreiben("WattstundenZaehlerBezugAnfangswert gesetzt".$aktuelleDaten["Wh_Bezug"],8);
}
}
else {
/***************************************************************************
// Inhalt der Status Datei anlegen, wenn Datei noch nicht vorhanden ist.
***************************************************************************/
$rc = file_put_contents($StatusFile,$aktuelleDaten["Wh_Bezug"]);
if ($rc === false) {
$funktionen->log_schreiben("Konnte die Datei WattstundenZaehlerBezugAnfangswert.txt. nicht anlegen"," ",5);
}
}
/*****************************************************************************
// Die Status Datei wird dazu benutzt, um den Bezug in Wh Pro Tag zu berechnen
// In jedem Auslesezyklus wird der aktuelle Zählerstand vom Energymeter gelesen
// und der Wert aus der Datei subtrahiert. Das Ergebnis wird in die Datenbank gespeichert.
*****************************************************************************/
if (file_exists($StatusFile) and isset($aktuelleDaten["Wh_Bezug"])) {
/***************************************************************************
// Daten einlesen ...
***************************************************************************/
$WattstundenZaehlerBezugAnfangswert = file_get_contents($StatusFile);
$aktuelleDaten["whBezugHeute"] = $aktuelleDaten["Wh_Bezug"] - $WattstundenZaehlerBezugAnfangswert; // // Berechne aktuellen Bezugs - BezugAnfangswert von heute
$aktuelleDaten["whBezugHeute"] = round($aktuelleDaten["whBezugHeute"],0);
$funktionen->log_schreiben("Bezug Wh Heute ".$aktuelleDaten["whBezugHeute"]," Wh",8);
$aktuelleDaten["ZusatzQuery"] .= ",WhBezugHeute=".$aktuelleDaten["whBezugHeute"]; // Alle Werte der ZUsatzquarry landen in der Tabelle Dashboard WICHTIG: ,
}
// Wh Zähler Bezug Ende
// Wh Zähler Einspeisung Anfang
/*****************************************************************************
// Die Status Datei wird dazu benutzt, um den Einspeisung in Wh Pro Tag zu berechnen
// Um 00:00 wird der aktuelle Zählerstand des Energymeters in der Datei hinterlegt.
// In jedem Auslesezyklus wird der aktuelle Zählerstand vom Energymeter gelesen
// und der Wert aus der Datei subtrahiert. Das Ergebnis wird in die Datenbank gespeichert.
*****************************************************************************/
$StatusFile = $Pfad."/database/".$GeraeteNummer.".WattstundenZaehlerEinspeisungAnfangswert.txt";
if (file_exists($StatusFile)) {
/***************************************************************************
// Wenn Statusdatei existiert, dann Datei einlesen ...
***************************************************************************/
$WattstundenZaehlerEinspeisungAnfangswert = file_get_contents($StatusFile);
if (empty($WattstundenZaehlerEinspeisungAnfangswert)){ // Ist die gelesene Datei leer, dann ...
$WattstundenZaehlerEinspeisungAnfangswert = $aktuelleDaten["Wh_Einspeisung"]; //...schreibe den aktuellen Zählerstand in die Datei
}
if (date("H:i") == "00:00") { // Jede Nacht 0 Uhr
$WattstundenZaehlerEinspeisungAnfangswert = $aktuelleDaten["Wh_Einspeisung"]; // Zäherstand am Anfang des Tages merken
$rc = file_put_contents($StatusFile,$aktuelleDaten["Wh_Einspeisung"]); // und in die statusdatei schreiben
$funktionen->log_schreiben("WattstundenZaehlerEinspeisungAnfangswert gesetzt".$aktuelleDaten["Wh_Einspeisung"],8);
}
}
else {
/***************************************************************************
// Inhalt der Status Datei anlegen, wenn Datei noch nicht vorhanden ist.
***************************************************************************/
$rc = file_put_contents($StatusFile,$aktuelleDaten["Wh_Einspeisung"]);
if ($rc === false) {
$funktionen->log_schreiben("Konnte die Datei WattstundenZaehlerEinspeisungAnfangswert.txt. nicht anlegen"," ",8);
}
}
/*****************************************************************************
// Die Status Datei wird dazu benutzt, um den Einspeisung an kWh Pro Tag zu berechnen
// In jedem Auslesezyklus wird der aktuelle Zählerstand vom Energymeter gelesen und der Wert aus der Datei subtrahiert. Das Ergebnis wird in die Datenbank gespeichert.
*****************************************************************************/
if (file_exists($StatusFile) and isset($aktuelleDaten["Wh_Einspeisung"])) {
/***************************************************************************
// Daten einlesen ...
***************************************************************************/
$WattstundenZaehlerEinspeisungAnfangswert = file_get_contents($StatusFile);
$aktuelleDaten["whEinspeisungHeute"] = $aktuelleDaten["Wh_Einspeisung"] - $WattstundenZaehlerEinspeisungAnfangswert; // // Berechne aktuellen Einspeisungs - EinspeisungAnfangswert von heute
$aktuelleDaten["whEinspeisungHeute"] = round($aktuelleDaten["whEinspeisungHeute"],0);
$funktionen->log_schreiben("Einspeisung Wh Heute ".$aktuelleDaten["whEinspeisungHeute"]," Wh",8);
$aktuelleDaten["ZusatzQuery"] .= ",WhEinspeisungHeute=".$aktuelleDaten["whEinspeisungHeute"]; // Alle Werte der ZUsatzquarry landen in der Tabelle Dashboard WICHTIG: ,
}
// Wh Zähler Einspeisung Ende
if($DB[1][2]["Betriebszustand"] != 0){ //nur Tagsueber berechen. Sonst durch woechentlichen Wechselrichterneustart nachts falsche Werte.
/****************************************************************************
// Verkaufter Strom im Wert von xxx Euro
*****************************************************************************/
$aktuelleDaten["Eu_GesamtEinspeisung"] = ($aktuelleDaten["Wh_Einspeisung"] / 1000) * $Einspeiseverguetung;
$aktuelleDaten["Eu_GesamtEinspeisung"] = round($aktuelleDaten["Eu_GesamtEinspeisung"] ,2);
$funktionen->log_schreiben("Eingespeist Eu Gesamt ".$aktuelleDaten["Eu_GesamtEinspeisung"]," Euro",8);
$aktuelleDaten["ZusatzQuery"] .= ",Eu_GesamtEinspeisung=".$aktuelleDaten["Eu_GesamtEinspeisung"]; // Alle Werte der Zusatzquery landen in der Tabelle Dashboard WICHTIG ist hier $
/****************************************************************************/
/*****************************************************************************
// Eigenverbrauch Gesamt in Wh
// Wh (PV Ertrag Gesamt) - Wh (Eingespeist) ergibt den selbst verbrauchten PV Strom aus Gesamtzähler Energymeter und Wechselrichter
*****************************************************************************/
$aktuelleDaten["Wh_GesamtEigenverbrauch"] = $DB[1][3]["Wh_Gesamt"] - $aktuelleDaten["Wh_Einspeisung"];
$aktuelleDaten["Wh_GesamtEigenverbrauch"] = round($aktuelleDaten["Wh_GesamtEigenverbrauch"],0);
$funktionen->log_schreiben("Eigenverbrauch Wh Gesamt ".$aktuelleDaten["Wh_GesamtEigenverbrauch"]," Wh",8);
// $aktuelleDaten["ZusatzQuery"] .= ",Wh_GesamtEigenverbrauch=".$aktuelleDaten["Wh_GesamtEigenverbrauch"]; // Alle Werte der Zusatzquery landen in der Tabelle Dashboard WICHTIG ist hier das Komma am Anfang ,
/****************************************************************************
/****************************************************************************
// Eigenverbrauchter Strom im Wert von xxx Euro (Strompreis Minus Einspeisevergütung) aus Gesamtzähler Energymeter
*****************************************************************************/
// $aktuelleDaten["Eu_GesamtEigenverbrauch"] = ($aktuelleDaten["Wh_GesamtEigenverbrauch"] / 1000) * ($Strompreis - $Einspeiseverguetung);
// $aktuelleDaten["Eu_GesamtEigenverbrauch"] = round($aktuelleDaten["Eu_GesamtEigenverbrauch"] ,2);
// $funktionen->log_schreiben("Eigenverbrauch Eu Gesamt ".$aktuelleDaten["Eu_GesamtEigenverbrauch"]," Euro",8);
// $aktuelleDaten["ZusatzQuery"] .= ",Eu_GesamtEigenverbrauch=".$aktuelleDaten["Eu_GesamtEigenverbrauch"]; // Alle Werte der Zusatzquery landen in der Tabelle Dashboard WICHTIG ist hier das Komma am Anfang
/****************************************************************************/
/****************************************************************************
// Eigenverbrauchter Strom im Wert von xxx Euro (Strompreis Minus Einspeisevergütung) aus Gesamtzähler Energymeter P
*****************************************************************************/
$aktuelleDaten["Eu_PreisperiodeEigenverbrauch"] = (($aktuelleDaten["Wh_GesamtEigenverbrauch"]- $PreisperiodeWhEigenverbrauchAnfang) / 1000) * ($Strompreis - $Einspeiseverguetung);
$aktuelleDaten["Eu_GesamtEigenverbrauch"] = $aktuelleDaten["Eu_PreisperiodeEigenverbrauch"] + $PreisperiodeEigenverbrauchEuAnfang ;
$aktuelleDaten["Eu_GesamtEigenverbrauch"] = round($aktuelleDaten["Eu_GesamtEigenverbrauch"] ,2);
$funktionen->log_schreiben("PreisperiodeEingenverbrauchsEuAnfang ".$PreisperiodeEigenverbrauchEuAnfang," Euro",8);
$funktionen->log_schreiben("Eu_PreisperiodeEigenverbrauch ".$aktuelleDaten["Eu_PreisperiodeEigenverbrauch"]," Euro",8);
$funktionen->log_schreiben("Eu_GesamtEigenverbrauch ".$aktuelleDaten["Eu_GesamtEigenverbrauch"]," Euro",8);
$aktuelleDaten["ZusatzQuery"] .= ",Eu_GesamtEigenverbrauch=".$aktuelleDaten["Eu_GesamtEigenverbrauch"]; // Alle Werte der Zusatzquery landen in der Tabelle Dashboard WICHTIG ist$
/****************************************************************************/
}
?>
Ich hoffe, der Code ist ausreichend kommentiert (-;
Weiterhin wird hier noch der Betriebszustand des Wechselrichters abgefragt und die Verbrauchsberechnung Tagsüber vom Wechselrichter und nachts vom Energymeter übernommen, da der Wexhselrichter nachts keine Werte liefert und Tagsüber die Werte von Energymeter / Wechselrichter nicht synchron abgefragt werden bei plötzlicher Änderung der Sonneneinstrahlung (Wolken) dann negative Verbauchswerte errechnet wurden.
Gruß
Oliver
SMA Tripower 5.0 STP - SMA Energymeter - Raspberrby Pi4 , Nodered für verschiedene Tasmotageräte, Akku und Anbindung der Heizung und Lüfter