Vorstellung Script Optimierung Wärmepumpe mit PV und Tibber

Hallo,

ich würde gerne Wissen, was ihr von meinem Script haltet und der Überlegung dahinter.

Das php scripten habe ich mir erst für Symcon beigebracht, wenn also nicht alles super optimiert ist, dann nehme ich auch gerne grundsätzliche Programmier- Tipps an.

Kurz zum Hardware Aufbau:

Solvis Max Heizung mit Gas und Wärmepumpe. Daher kann ich über die Einstellung des Bivalenzpunktes sagen, ab wann die Heizung mit Gas und wann mit der WP arbeitet.

Der Solvis Max ist ein 900Liter Puffer, aus dem mittels Frischwasserstation auch das Warmwasser erzeugt wird. Daher der Grundgedanke, dass hier auch Energie gespeichert werden kann, wenn diese mittels WP erzeugt wird, sogar noch mit der Arbeitszahl als Hebel.

Die Wärmepumpe kann ich leider nur über die SG ready Schnittstelle beeinflussen. Die Leistungsaufnahme der WP wird mit einem extra Zähler direkt in KNX ermittelt.

Was macht das Script:

Das Script wird alle 10min aufgerufen, oder, wenn es von Tibber einen neuen Preis gibt.

Dann berechne ich mir meinen eigenen Strompreis, alle 10 min.

Dazu nutze ich den mittleren Verbrauch der letzten 10 min (ohne WP) und die mittlere Erzeugung der PV.

PV nehme ich als kostenlos an, auch wenn dass natürlich nicht ganz stimmt.

Dann gehe ich davon aus, dass die nächsten 10min der Verbrauch gleich bleiben wird. Addiere dazu die zu erwartende Leistung der WP oder ebenfalls das letzte Mittel, falls es darüber lag.
Nun berechne ich wie teuer der Strom in den letzten 10min gewesen wäre, mit WP und Hausverbrauch. Erzeuge ich mehr PV Strom ist dieser 0, sonst anteilig vom aktuellen Tibber preis. Das ist mein angenommener Strompreis in den nächsten 10min.

Abhängig vom Strompreis kann ich jetzt die SmartGrid Modi schalten.

Sperre → Nutzt immer den Gasbrenner

Normal

Verstärkter Betrieb → höhere Vorlauftemperatur

Max → Feste Temperatur und niedrigere Bivalenztemperatur

Um zu häufiges Schalten zu verhindern, habe ich noch eine Preis Hytherese dazwischen.

In der Visu habe ich die Möglichkeit die Grenzen zu setzten.

Eine gute Lösung, wie ich mit dem PV Akku umgehe habe ich noch nicht. Bisher greift die Reglung nur, wenn der Akku leer ist. Sonst bleibt die WP im Normalbetrieb, es sei den die Produktion übersteigt den Bedarf, dann gehe ich in den Max Betrieb.

Was denkt ihr, machen meine Überlegungen Sinn, was würdet ihr anders machen?

Grüße

Basti

<?php
define("Sperre", 1);
define("NormalBetrieb", 2);
define("VerstBetrieb", 3);
define("MaxBetrieb", 4);
define("maxBateriestand",5); //in Prozent
define("LEDoff",0);
define("roteLED",2);
define("grueneLED",3);
define("Winter",false);
//define("sperrBereich",0.2); //20% der höchsten Preise von heute werden für die WP gesperrt.
//TODO ggf voraus gucken, wann wird es günstig, dann ggf laänger sperren.


$SmardGridVar = 35305;
$WPerwarteterVerbrauch = GetValue(15483);
$SperrGrenze = GetValue(25769); //Sperrgrenze setzen
$VerstGrenze = GetValue(50215);
$MaxGrenze = GetValue(54177);
$Batteriestand = GetValue(13376);
$PreisLevel = GetValue(43773);

$PVErtrag = 0; //GetValue(27262);

$aktPreis = GetValue(47677);
$letzterPreis = GetValue(55927);
$PreisHysterese = GetValue(13686);
$PVarchiv =  AC_GetLoggedValues(45722,27262,time()-900,time(),0);
$PVmittel =0 ;
$VerbrArchiv = AC_GetLoggedValues(45722,21321,time()-900,time(),0);
$VerbrMittel=0;
$BetriebsModus = NormalBetrieb;
$bisherigerSGModus = GetValue($SmardGridVar);
$WPArchiv = AC_GetLoggedValues(45722,45077,time()-900,time(),0); // Die letzten Leistungswerte der WP holen;
$WPmittel = 0;




foreach($PVarchiv as $PVErtrag)
{
    //print_r($PVErtrag);
    $PVmittel += $PVErtrag['Value'];
}
if (count($PVarchiv) > 0)
    $PVmittel = $PVmittel / count($PVarchiv);
//print_r($PVmittel);
//echo ' Verbr:';

foreach($VerbrArchiv as $Verbr)
{
    //print_r($Verbr);
    $VerbrMittel += $Verbr['Value'];
}
if (count($VerbrArchiv) > 0)
    $VerbrMittel = $VerbrMittel / count($VerbrArchiv);
$VerbrMittel = $VerbrMittel *1000; //Umrechnung in Watt

foreach($WPArchiv as $WPVerbr)
{
    //print_r($PVErtrag);
    $WPmittel += $WPVerbr['Value'];
}
if (count($WPArchiv) > 0)
{
    $WPmittel = $WPmittel / count($WPArchiv);       
}
    
//print_r($WPmittel);
//print_r($VerbrMittel);


//$VerbrMittel = $VerbrMittel - $WPmittel; //Nur Hausverbrauch ohne WP
SetValue(31869,$WPmittel);
SetValue(34398,$VerbrMittel);


//print_r($VerbrMittel);
if ($WPmittel < $WPerwarteterVerbrauch) //Immer mindesten den erwatrteten Wert für den Verbrauch nutzen
{
    $WPmittel = $WPerwarteterVerbrauch; 
}

$VerbrMittel = $VerbrMittel + $WPmittel; //Gesamtverbrauch mit WP Leistung

//print_r($VerbrMittel);
if ($PVmittel <= $VerbrMittel) //Weniger PV erzeugt als Energie verbraucht
{
    $aktPreis = $aktPreis -( ($PVmittel / $VerbrMittel) * $aktPreis);
}
else
{
    $aktPreis = 0; //Strom wird als kostenlos angenommen.
    $BetriebsModus = MaxBetrieb;
}
//echo 'Preis:';
print_r($aktPreis);

//$SperrGrenze = GetValue(38585) - (GetValue(18317)*sperrBereich); //Maximaler Preis minus 20% der Range


//echo 'SperrGrenze:';
//print_r($SperrGrenze);




if ($Batteriestand < maxBateriestand)  //Anzeige auf an den Tastern und Smart Grid Umschaltung, nur wenn Netzstrom genutzt wird Sonst ist die Batterie gleich leer 
{
    if (GetValue(47831)== Winter) //Nur im Winter, sonst reicht der Energieoptimierer und möglichst nur PV Strom
    {
        if (abs($letzterPreis - $aktPreis) > $PreisHysterese)
        {
            //SmartGrid
            if ($aktPreis <= $MaxGrenze) //Preis ist so gering, dass bitte in den Max Betrieb geschalten werden soll
            {
                
                $BetriebsModus = MaxBetrieb;
            }
            else if ($aktPreis <= $VerstGrenze)
            {
                $BetriebsModus = VerstBetrieb;
            }
            else if ($aktPreis > $SperrGrenze) // Viel zu teuer!
            {
                $BetriebsModus = Sperre;
            }
            else //Alles Normal
            {
                $BetriebsModus = NormalBetrieb;
            }
        }
        else
        {
                        //SmartGrid
            if ($letzterPreis <= $MaxGrenze) //Preis ist so gering, dass bitte in den Max Betrieb geschalten werden soll
            {
                
                $BetriebsModus = MaxBetrieb;
            }
            else if ($letzterPreis <= $VerstGrenze)
            {
                $BetriebsModus = VerstBetrieb;
            }
            else if ($letzterPreis > $SperrGrenze) // Viel zu teuer!
            {
                $BetriebsModus = Sperre;
            }
            else //Alles Normal
            {
                $BetriebsModus = NormalBetrieb;
            }
           // $BetriebsModus = $bisherigerSGModus;
        }
        

    }
    

    //Medlung auf KNX Taster über Strompreis in Küche und Waschkeller
    if ($PreisLevel >= 4) //teuer oder sehr teuer
    {
        RequestAction(59113,true);
        RequestAction(32511,roteLED);
    }
    else if ($PreisLevel <= 2) //Günstig oder sehr günstig
    {
        RequestAction(32511,grueneLED);
        RequestAction(59113,false);
    }
    else
    {
        RequestAction(32511,LEDoff);
        RequestAction(59113,false);
    }

}
else //Batterie ist noch geladen
{
    RequestAction(32511,LEDoff);
    RequestAction(59113,false); 
      
}
//echo($BetriebsModus);
if (GetValue(53052) == true) //Es ist schon max durch den Opimierer, dann setzt Ihn hier auch
{
    $BetriebsModus = MaxBetrieb;
} 

SetValue($SmardGridVar, $BetriebsModus);
//SetValue(25769,$SperrGrenze);
SetValue(55927,$aktPreis);
SetValue(53494,$PVmittel);
//echo("Modus");
//print_r($BetriebsModus);