Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Überwachung der Solaranlage per eMail oder Pushover und Steuerung von Geräten mit Smart Home Zentralen. PV-Überschuss Steuerung verbunden mit Geräten und Tasmota Firmware. Wallbox Steuerungen und API Schnittstelle, über die Daten in die Solaranzeigen Datenbanken geschrieben und gelesen werden können. Alles, was man für Steuerungsaufgaben benötigt.

Moderator: Ulrich

Ruhz69
Beiträge: 67
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 7 Mal
Danksagung erhalten: 4 Mal

Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Beitrag von Ruhz69 »

Hallo,
ich habe mich mit der Automation beschäftigt. Meine Wärmepumpe (Solvis Ben/Lea mit SolvisControl) kann über einen Rundsteuerempfänger in den verstärkten Betrieb gehen. Das möchte ich über eine Relais ansteuern. Noch hängt an meinem Relais eine Glühbirne zur Begeisterung meiner "Mitbewohner", wenn die immer mal an und ausgeht.
Herausforderungen die ich gelöst habe
-Summen AC und PV bilden dank viewtopic.php?t=2308&hilit=automation+addieren
-Meine negative Einspeisung in einen positiven Wert ändern
-Dafür sorgen, dass die Wärmepumpe nur am Nachmittag warmes Wasser macht (morgens lädt der Speicher und das warme Wasser würde über den Tag nur auskühlen.
automation_math.rtf
automation_math
(2.78 KiB) 74-mal heruntergeladen
Das geht so, dass von 0 bis 13 Uhr und von 16 bis 24 Uhr der Wert für die Einspeisung, den die Automation nutz gleich "42" gesetzt wird (42 und nicht "0" damit ich es im log immer sehen kann, ob es klappt.

Was mir noch fehlt.
Ich habe versucht, das nur für den Sommer gelten zu lassen:

//Im Sommer soll die Wärempumpe nur Nachmittags anspringen.
*********************************************************/
if (date("M") > "4" ) and date("M") < "10" ) {
log_schreiben( "es ist nach April", 3);
if (date("H") < "13" or date("H") > "16" ) {
log_schreiben( " Sommer---nur Nachmittags Waermepumpe starten ", 3 );
$Einspeisung = 42;

go to Ausgang;
}
}
Ich nehme mal an das "M" nicht die Variable für Monat ist, welche ist das?

Dann würde ich noch gerne dafür sorgen, dass die Wärmepumpe nur einmal oder zweimal zusätzlich anspringt. Hat da jemand eine Idee? kann man die Relaisschaltung zählen lassen?

viele Grüsse
Rüdiger

Bogeyof
Beiträge: 1116
Registriert: Mi 13. Mai 2020, 10:04
Hat sich bedankt: 23 Mal
Danksagung erhalten: 137 Mal

Re: Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Beitrag von Bogeyof »

https://www.php.net/manual/de/datetime.format.php

"n" für Monat
"G" für Stunde im 24er Format

Ruhz69
Beiträge: 67
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 7 Mal
Danksagung erhalten: 4 Mal

Re: Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Beitrag von Ruhz69 »

Hallo,

ich habe meine Lösung gefunden, hier:
mir fehlte der Speicher für die Laufvariable.

viewtopic.php?t=2414&hilit=Auto+Math.ph ... 8&start=10

Ich stelle am Wochenende mal meine Lösung rein,
Viele Grüße
Rüdiger

Ruhz69
Beiträge: 67
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 7 Mal
Danksagung erhalten: 4 Mal

Re: Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Beitrag von Ruhz69 »

Hallo,

hier meine Wärempumpenautomatisierung. Die Wärmepumpe hat einen Anschluss für einen Rundsteuerempfänger, der nur einen Schalter schliesst und damit die Wärmepumpe in den verstärkten Betrieb stellt, das kann auch ein Relais übernehmen wie bei mir ein Shelly 1. Den verstärkten Betrieb kann man an der WP selber einstellen (Zieltemperatur Wasserspeicher und Erhöhung der Vorlauftemperatur im Heizkreis).
Jetzt will ich aber, das die Wärmepumpe im Sommer nur Nachmittags ein bisschen mehr Strom einsammelt, damit mein Wasserspeicher warm ist und die Pumpe nicht Nachts anspringt. Im Winter möchte viel PV Überschuss einsammeln, bevor er eingespeist wird. Die minimale Laufzeit stelle ich in der Automation ein z.B. 15 min, damit die Pumpe nicht zuviel taktet.

über den Anfang des Codes kann man eingeben, wann man möchte, dass die Wärmepumpe in den verstärkten Betrieb geht.

$LFZMaxSommer = 30; // Hier die Maximale Laufzeit im Sommer Eintragen z.B. 30 min
$LFZMaxWinter = 120; // Hier die Maximale Laufzeit im Winter Eintragen z.B. 120 min
$Sommeranfang = 5; // Wann wird die Heizung ausgestellt und die Wärmepume macht nur noch Warmes Wasser? (Mai 5)
$Winteranfang = 11; // Wann wird die Heizung wieder angestellt? ( November 11)
$StartNachmittag = 13; // Wann soll die Wärmepumpe im Sommer frühestens in den verstärkten Betrieb gehen z.B. 13 Uhr
$EndeNachmittag =16; // Wann soll die Wärmepumpe im Sommer nicht mehr in den verstärkten Betrieb gehen z.B. 16 Uhr.

Dann muss man noch die Datenbanken eingeben. Ich habe meine Daten drin gelassen. 1 und 2 sind Wechselrichter, 3 ist der Stromzähler (heist nur vzlogger ist der Hitchi mit Regler 23)

$Datenbank1 = "solaranzeige2";
$Datenbank2 = "solaranzeige3";
$Datenbank3 = "vzlogger";

Meine Glühbirne schaltet der code schön, für die Wärmepumpe suche ich noch nach einer Möglichkeit den Mittelwert für die Einspeisung über ein paar Minuten zu bilden. Wenn z.B. der Herd ausgeht, dann speist die Batterie einen Moment ein, dann möchte ich nicht schalten.
Wer dazu eine Idee hat, hier habe ich die Frage gestellt gzi hat das ja für sich gelöst: viewtopic.php?t=3512
auto_math_php.rtf
meine auto_math_php
(7.44 KiB) 63-mal heruntergeladen
viel Spass damit, wer es ausprobieren möchte

Rüdiger

Ruhz69
Beiträge: 67
Registriert: Fr 28. Jan 2022, 19:41
Hat sich bedankt: 7 Mal
Danksagung erhalten: 4 Mal

Re: Automation_Math.php Summen bilden mit negativen Werten umgehen und Wärmepumpe steuern.

Beitrag von Ruhz69 »

Hallo,

nach viel Mühe und Hilfe von gzi (viewtopic.php?p=32742#p32742) für die Mittelwertbildung hier ein code der für die Automation die Summe der PV Leistung und einen Mittelwert über die Einspeisung angibt.

Zusätzlich kann nach Sommer und Winter die tägliche maximale Laufzeit, bzw. die Nutzung des Stromüberschusses begrenzt werden.

Für eine Wärmepumpe möchte man nicht, dass sie dauernd tacktet und im Sommer muss auch nicht unbegrenzt der Warmwasserspeicher nachgeheizt werden. Wie das bei mir funktioniert kann ich noch berichten. Ich wollte es erst testen, bevor ich das Relais einbaue. Das Relais würde die Wärmepumpe in den "verstärkten Betrieb schalten"
Wer es ausprobieren möchte, muss den code in die auto-math.php kopieren. ich mache das mit "sudo mcedit /var/www/html/auto-math.php".
Dann muss man noch am Anfang ein paar Angaben machen:

$LFZMaxSommer = 15; // Hier die Maximale Laufzeit im Sommer Eintragen
$LFZMaxWinter = 120; // Hier die Maximale Laufzeit im Winter Eintragen
$Sommeranfang = 5; // Wann wird die Heizung ausgestellt und die Wärmepume macht nur noch Warmes Wasser? (Mai == 5)
$Winteranfang = 11; // Wann wird die Heizung wieder angestellt? ( November == 11)
$StartNachmittag = 13; // Wann soll die Wärmepumpe im Sommer frühestens in den verstärkten Betrieb gehen
$EndeNachmittag =16; // Wann soll die Wärmepumpe im Sommer nicht mehr in den verstärkten Betrieb gehen
$Verzoegerung = 5; // Gibt die Anzahl der Minuten über die ein Mittelwert gebildet wird
$Zaehlerleistung = "Leistung";
$Zaehlermeasurement = "AC";

weiter unten noch die Namen der eigenen Datenbanken eingeben.

wahrscheinlich werden nicht alle Daten gleich ausgelesen, also muss man eventuell die Felder und Measurements im code noch anpassen. Da die Daten aus der Influx Datenbank kommen, sind das die gleichen Angaben, die man benötigt, um in Grafana einen Wert anzuzeigen.

Code: Alles auswählen

<?php
/******************************************************************************
//  Hie können eigene Berechnungen gemacht werden, wenn das nötig ist.
//  Es stehen alle Felder folgender Measurements zur Verfügung:
//  Laderegler ==>  Measurement 'PV'      ->  Array  $LRVar
//  Wechselrichter ==> Measurement 'AC'   ->  Array  $WRVar
//  SmartMeter ==> Measurement 'AC'       ->  Array  $MeterVar
//  BMS ==>  Measurement 'Batterie'       ->  Array  $BMSVar
//
//  Die Steuerung benötigt folgende Variablen, die man hier noch beeinflussen.
//  kann. Bitte hier nur benutzen, wenn man sie auch anders berechnen möchte..
//  Ansonsten hier nicht benutzen.
//
//
//  $PVLeistung      = erzeugte Solarleistung in Watt
//  $ACLeistung      = erzeugte Wechselstrom Leistung in Watt.
//  $Bezug           = aktuell bezogene Gesamtleistung in Watt
//  $Einspeissung    = aktuelle Einspeisung in Watt
//  $SOC             = aktuelle Kapazität in Prozent. 0 - 100%
//
//  $aWATTar["Preis_kWh"]  = Preis positiv oder negativ
//  $aWATTar["Sortierung"] = Sortireung der aktuellen 12 Stunden  1 - 12
//                           1 = schlechtester und 12 = bester Preis
//
//  Beschreibung dieses Array's ist in dem Dokument Automation.pdf
//  $UserKontaktAuswertung["Relais1"]["Kontakt1"] = 0 / 1  0 = OFF / AUS.
//  $UserKontaktAuswertung["Relais2"]["Kontakt2"] = 0 / 1  1 = ON / EIN
//  usw.
******************************************************************************/

 $LFZMaxSommer = 15;          // Hier die Maximale Laufzeit im Sommer Eintragen
 $LFZMaxWinter = 120;          // Hier die Maximale Laufzeit im Winter Eintragen
 $Sommeranfang = 5;            // Wann wird die Heizung ausgestellt und die Wärmepume macht nur noch Warmes Wasser? (Mai  == 5)
 $Winteranfang = 11;           // Wann wird die Heizung wieder angestellt? ( November  == 11)
 $StartNachmittag = 13;        // Wann soll die Wärmepumpe im Sommer frühestensin den verstärkten Betrieb gehenn
 $EndeNachmittag =16;          // Wann soll die Wärmepumpe im Sommer nicht mehr in den verstärkten Betrieb gehen
 $Verzoegerung = 5;            // Gibt die Anzahl der Minuten über die ein Mittelwert gebildet wird
 $Zaehlerleistung = "Leistung";
 $Zaehlermeasurement = "AC";

//Auslesen Status Relais//
  
if (isset ($Relais1Kontakte[1]))
  goto Max_Laufzeit;
    
  
if ($var["Relais1aktiv"] == 1) {
  log_schreiben( "Relais enabled", "", 4 );
  
  if ($var ["Relais1TopicFormat"] == 0) {
    $Relais1Kontakte = relais_abfragen( $db, $client, 1, $var ["Relais1Topic"]."/cmnd/status", null );
  }
  if ($var ["Relais1TopicFormat"] == 1) {
    $Relais1Kontakte = relais_abfragen( $db, $client, 1, "cmnd/".$var ["Relais1Topic"]."/status", null );
  }
  if (count( $Relais1Kontakte ) == 0) {
    log_schreiben( "math: Keine Antwort vom Relais 1", "", 2 );
  }
}



Max_Laufzeit:
//In diesem Bereich wird ermittelt wie lange die Wärmepumpe täglich gelaufen ist und bei maximaler Laufzeit wird das Relais ausgeschaltet

 $TagesLaufzeitWP = (int)file_get_contents("/tmp/cnt_1");
 log_schreiben( "TagesLaufzeitWP war: ".$TagesLaufzeitWP." min", "", 4 );


if (isset ($TagesLaufzeitWP) )  {
            $TagesLaufzeitWP = $TagesLaufzeitWP;
    }
else  {
      $TagesLaufzeitWP = 0;
      log_schreiben( "Tageslaufzeit nicht gesetzt", "", 3 );
    }
//Jede Nacht um 00:00 Uhr wird die Maximale Laufzeit der Wärmepumpe auf 0 gesetzt.//

if (date("H:i") > "00:00" and date("H:i") <"00:02" ) {
$TagesLaufzeitWP = 0;
log_schreiben( "Anzahl Minuten Waermepumpe auf 0 gesetzt: ", 3 );
}


if ($Relais1Kontakte[1] == 1) {
     $TagesLaufzeitWP++;
      log_schreiben( "Tageslaufzeit der Waermepumpe ist ".$TagesLaufzeitWP." min", "", 3 );
    }
 // log_schreiben( "Relaisstatus ist ausgeschaltet ", "", 3 );

if (date("n") > "$Sommeranfang" and date("n") < "$Winteranfang" )  {
   $LFZMax = $LFZMaxSommer;
   }
else {
   $LFZMax = $LFZMaxWinter;
   }

if ( $TagesLaufzeitWP == "$LFZMax" ) {
     $UserKontaktAuswertung["Relais1"]["Kontakt1"] = 0;
     log_schreiben( "Maximale Laufzeit im verstärkten Betrieb überschritten", "", 3 );

goto Ausgang;

}


/*********************
//Im Sommer soll die Wärempumpe nur Nachmittags anspringen.
  *********************************************************/
if (date("n") > "$Sommeranfang" and date("n") < "$Winteranfang"  ) {
log_schreiben( "es ist Sommer ", 4);

if (date("G") < "13" or date("G") > "16"  ) {
log_schreiben( " Sommer---nur Nachmittags Waermepumpe starten ",  3 );

$UserKontaktAuswertung["Relais1"]["Kontakt1"] = 0;


goto Ausgang;
}
}

// $Datenbank = Datenbankname des jeweiligen Wechselrichters
// Hier werden die neuesten Einträge aus den Datenbanken ausgelesen und anschließend kumuliert
// Datenbank 1 und 2 sind Wechselrichter, Datenbank 3 ist der Stromzähler
 
$Datenbank1 = "solaranzeige2";
$Datenbank2 = "solaranzeige3";
$Datenbank3 = "vzlogger";

// ------> Ab hier für jeweils weitere Werte duplizieren, falls benötigt, Select und Variablennamen anpassen (z.B. ACLeistung stat
// Abfrage der 2 ACLeistungswerte aus den jeweiligen Datenbanken

$ACSofar1 = influxDB_lesen( $Datenbank1, "AC");
$ACLeistung1 = $ACSofar1["Leistung"];
$ACKostalS = influxDB_lesen( $Datenbank2, "AC");
$ACLeistung2 = $ACKostalS["Leistung"];

// Hier wird die kumulierte ACLeistung in der Variablen $ACLeistung für die Automation zur Verfügung gestellt

$ACLeistung = $ACLeistung1 + $ACLeistung2;
log_schreiben( "AC Gesamt Leistung: ".$ACLeistung." W", "", 4 );

// Ende Ermitteln Gesamt-ACLeistung
// ------> Bis hier für jeweils weitere Werte duplizieren, falls benötigt

//Ab hier Summierung der PV-Werte//
$PVSofar1 = influxDB_lesen( $Datenbank1, "PV");
$PVLeistung1 = $PVSofar1["Leistung"];
$PVKostal1 = influxDB_lesen( $Datenbank2, "PV");
$PVLeistung2 = $PVKostal1["Leistung"];
// Hier wird die kumulierte ACLeistung in der Variablen $ACLeistung für die Automation zur Verfügung gestellt
$PVLeistung = $PVLeistung1 + $PVLeistung2;
log_schreiben( "PV Gesamt Leistung: ".$PVLeistung." W", "", 4 );
// Ende Ermitteln Gesamt-PV Leistung
// ------> Bis hier für jeweils weitere Werte duplizieren, falls benötigt

//*****************
//Wenn die Einsspeisung negativ angegeben wird (und nicht ein Mittelwert verwendet werden soll)
//*****************

//$Einspeisungvz = influxDB_lesen( $Datenbank3, "AC");
//$Einspeisung = ($Einspeisungvz["Einspeisung"] * (-1));


//Ab hier Mittelwertbildung der Einspeisung


$query = "SELECT%20moving_average(".$Zaehlerleistung.",".$Verzoegerung.")%20from%20".$Datenbank3."..".$Zaehlermeasurement."%20order%20by%20time%20desc%20limit%201";
    log_schreiben( "Datenbank-Query: ".$query, " ", 3 );
if(false === ($data = file_get_contents("http://localhost:8086/query?db=".$Datenbank3."&q=".$query))){
    log_schreiben( "Fehler! Kann InfluxDB nicht abfragen:Kein Mittelwert: ".$query, "   ", 3 );
    $Einspeisungvz = influxDB_lesen( $Datenbank3, "AC");
    $Einspeisung = ($Einspeisungvz["Einspeisung"] * (-1));
} else {        // daten gelesen
    $ergebnis = json_decode( $data, true );
    log_schreiben(print_r($data,true), "   ", 4 );
    log_schreiben(print_r($ergebnis,true), "   ", 4 );
    $Einspeisung_mittel = $ergebnis["results"][0]["series"][0]["values"][0][1];
    $Einspeisung = ($Einspeisung_mittel * (-1));
}



//$Einspeisung = 1500; // nur zu Testzwecken



Ausgang:
log_schreiben( "Einspeisung Mittel: ".$Einspeisung." W", "", 3 );
//log_schreiben( "Einspeisung einfach: ".$EinspeisungZ." W", "", 3 );
log_schreiben( "Tageslaufzeit Wärmepumpe : ".$TagesLaufzeitWP." min", "", 4 );

file_put_contents( "/tmp/cnt_1", $TagesLaufzeitWP);
return $TagesLaufzeitWP;

return;

?>
hab noch 2 Fehler gefunden und heute (14.1.2024) geändert.
viel Spass damit
Rüdiger

Zurück zu „Überschuss Steuerung, Anlagenüberwachung, Anbindung an die Heizung, API Schnittstelle und vieles Andere mehr.“

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast