Meldung wenn Akku voll

Hier werden Meldeblöcke, die man in die Datei "meldungen_senden.php" übernehmen kann, veröffentlicht.

Moderator: Ulrich

alwiz79
Beiträge: 3
Registriert: Mi 21. Sep 2022, 11:15
Hat sich bedankt: 1 Mal

Meldung wenn Akku voll

Beitrag von alwiz79 »

Hallo Zusammen!
Erst einmal vielen Dank für dieses tolle Projekt.
ich habe alles soweit aufgesetzt, stoße aber bei den Pushover Meldungen an meine Grenzen.

Ich würde gerne bei folgenden Szenario eine Pushmeldung erhalten und habe keine Idee was ich tun muss im Nachrichtenblock:

- Akku ist bei 100%
- die PV produziert Strom
- im Haus wird nicht genug Strom abgenommen, es "droht" Einspeisung

Kann mir da jemand auf die Sprünge helfen?

SVW2
Beiträge: 3
Registriert: So 19. Nov 2023, 23:31

Re: Meldung wenn Akku voll

Beitrag von SVW2 »

Hallo,

hier mal eine Umsetzung für den Status wenn der Accu leer oder 100% gefüllt ist. Die Meldung soll aber erst wieder gesendet werden wenn der Accu in der Zwischenzeit einmal auf mindestens 6% geladen wurde oder auf 90% Ladestand gesunken ist.

Code: Alles auswählen

  /****************************************************************************
  //  NACHRICHTEN BLOCK  START      NACHRICHTEN BLOCK  START      BLOCK  START
  //  NACHRICHTEN BLOCK  START      NACHRICHTEN BLOCK  START      BLOCK  START
  //  NACHRICHTEN BLOCK  START      NACHRICHTEN BLOCK  START      BLOCK  START
  //  Auswertung wenn die Batterie leer ist. Die Nachricht soll aber nur versendet werden wenn die Batterie 
  //  zwischendurch einmal mindestens 6 % Ladung hatte
  //  Hier kann Ihre Abfrage stehen. Diese Datei wird bei einem
  //  Update nicht ueberschrieben.
  ****************************************************************************/
  $rc = $funktionen->po_messageControl( "Batterie_Leer", 0, $GeraeteNummer, $Messengerdienst[1] );
  if ($rc === false or date( "YmdHi", $rc[0] ) <> date( "YmdHi" )) {

    // holen des aktuellen Baterieladezustandes
    $aktuelleDaten["Query"] = "db=".$InfluxDBLokal."&q=".urlencode( "select last(SOC) from Batterie");
    $rc = $funktionen->po_influxdb_lesen( $aktuelleDaten );
    $Meldungen["Batterie_Ladung"] = $rc["results"][0]["series"][0]["values"][0][1];
    $Meldungen["Batterie_Ladung_Time"] = $rc["results"][0]["series"][0]["values"][0][0];	

    // holen des letzten Baterieladezustands bevor leer
    if($Meldungen["Batterie_Ladung"] == 100){
       $letzteDaten["Query"] = "db=".$InfluxDBLokal."&q=".urlencode( "select last(SOC) from Batterie where SOC <= 90");
       $Nachricht = "Haus-Info: Batterie Ladezustand = ".$Meldungen["Batterie_Ladung"]."%. Batterie ist voll"; 	
    }else{
       $letzteDaten["Query"] = "db=".$InfluxDBLokal."&q=".urlencode( "select last(SOC) from Batterie where SOC >= 6");
       $Nachricht = "Haus-Info: Batterie Ladezustand = ".$Meldungen["Batterie_Ladung"]."%. Batterie ist leer";	
    }
    $rc_last = $funktionen->po_influxdb_lesen( $letzteDaten );
    $Meldungen["Batterie_Ladung_Last_Loaded"] = $rc_last["results"][0]["series"][0]["values"][0][1];
    $Meldungen["Batterie_Ladung_Time_Last_Loaded"] = $rc["results"][0]["series"][0]["values"][0][0];	
	
    if (isset($rc["results"][0]["series"][0])) {
        //  Die Query liefert ein Ergebnis, das wird an dieser JSON Variable erkannt.
      if(($Meldungen["Batterie_Ladung"] <=5 or $Meldungen["Batterie_Ladung"] == 100) and $Meldungen["Batterie_Ladung_Time_Last_Loaded"] > $Meldungen["Batterie_Ladung_Time"]){
	$funktionen->log_schreiben( "Batterie ".$Nachricht, "   ", 7 );
      	$funktionen->log_schreiben( strip_tags( $Nachricht ), "*  ", 6 );
  	    for ($Ui = 1; $Ui <= count( $User_Key ); $Ui++) {
        //  Die Nachricht wird an alle Empfänger gesendet, die in der
        //  user.config.php stehen.
               $funktionen->log_schreiben( "Nachricht wird bald versendet an User_Key[".$Ui."] ".$User_Key[$Ui], "*  ", 9 );
               $rc = $funktionen->po_send_message( $API_Token[$Ui], $User_Key[$Ui], $Nachricht, 0, "", $Messengerdienst[$Ui] );
               if ($rc) {
                 $funktionen->log_schreiben( "Nachricht wurde versendet an ".$Messengerdienst[$Ui]." mit Rufnummer: ".$User_Key[$Ui]." und Key: ".$API_Token[$Ui], "   ", 6 );
               }
            $funktionen->log_schreiben( $aktuelleDaten["Query"], "*  ", 9 );
            $rc = $funktionen->po_messageControl( "Batterie_Leer", 1, $GeraeteNummer, $Messengerdienst[1] );
	  }
        }
     }
  }
  /****************************************************************************
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  ****************************************************************************/
Wichig ist bei der DB Abfrage die Groß- und Kleinschreibung.

Seb01
Beiträge: 61
Registriert: Mo 20. Mär 2023, 11:11
Hat sich bedankt: 4 Mal
Danksagung erhalten: 6 Mal

Re: Meldung wenn Akku voll

Beitrag von Seb01 »

Hallo SV2,

kannst Du Dein Script ein wenig erklären?

Ich habe es installiert, aber bei mir scheint es nicht zu funktionieren.

Ich glaube zu lesen:
1) es wird der Batteriestand ausgelesen (% und Timestamp des Wertes) [$rc]
2a) Wenn 100% dann <=90% Wert
2b) Sonst wird <=6% wert genommen
3) Batteriestand aus 2) wird gelesen (% und Timestamp des Wertes) [$rc_last]
4) If-Schleife: wenn <5% oder ==100% und Timestamp(6/90)>Timestamp(jetzt) jetzt dann "Nachricht senden"

Liege ich falsch, das dann nie gesendet wird, da Timestamp(6/90)>Timestamp(jetzt) nie erfüllt wird? Die Vergangenheit ist immer kleiner als jetzt...

Und: muss in der Zeile

Code: Alles auswählen

$Meldungen["Batterie_Ladung_Time_Last_Loaded"] = $rc["results"][0]["series"][0]["values"][0][0];
nicht die "$rc_last" genommen werden(der Zeitpunkt, als es 90% oder 6% war)?

Gruss Seb

SVW2
Beiträge: 3
Registriert: So 19. Nov 2023, 23:31

Re: Meldung wenn Akku voll

Beitrag von SVW2 »

Hallo,

das ganze hatte dann doch nicht so funktioniert wie ich es mir gedacht hatte.. Ich hatte das irgendwie nicht in meine derzeitige Umsetzung via IOBroker einpassen können. Somit hatte ich mich entschieden das ganze via IOBroker-Skipt umzusetzen. Das Einspielen der entsprechenden Werte in den IOBroker war per mqtt kein Problem. Zur Zeit ist es so das ich immer eine Meldung erhalte wenn der Accu den Status 100% bzw 5% erreicht hat...

Ich bin mit dem jetzigen Stand der Umsetzung recht zufrieden.

Sorry das ich dir da nicht weiter helfen kann

Seb01
Beiträge: 61
Registriert: Mo 20. Mär 2023, 11:11
Hat sich bedankt: 4 Mal
Danksagung erhalten: 6 Mal

Re: Meldung wenn Akku voll

Beitrag von Seb01 »

Hallo,

ich habe meine eigene Version fertig. Ich poste sie hier, wenn es ein paar Tage richtig gelaufen ist.....

Sebastian

Seb01
Beiträge: 61
Registriert: Mo 20. Mär 2023, 11:11
Hat sich bedankt: 4 Mal
Danksagung erhalten: 6 Mal

Re: Meldung wenn Akku voll

Beitrag von Seb01 »

Zum Sneaken...

Code: Alles auswählen


/***************************************************************************/
  //  Batteriemeldung BLOCK START      
  //  Sendet bei bedarf Meldungen über Batterie leer / voll.
  //  Werte sind einstellbar. Wiederholungssendungen erst, Nachdem bestimmte
  //  Pegel überschritten/unterschritten sind.

  $Batterieleer = 6;        // % SOC, wenn Batteriemeldung "leer" kommt
  $Batterievoll = 100;      // % SOC, wenn Batteriemeldung "voll" kommt 
  $Batterieneuvoll = 90;    // pro Wert muss immer kleiner als "voll" sein
                            // Wenn unterschritten, dann bei "voll" neue Meldung
  $Batterieneuleer = 10;    // pro Wert muss immer größer als "leer" sein
                            // Wenn überschritten, dann bei "leer" neue Meldung
  // *************************************************************************

 /*****************************************************************************
 //  Die Status Datei wird dazu benutzt, um die Variablen
 //  speichern.
 //*****************************************************************************/
 $StatusFile = $Pfad."/database/".$GeraeteNummer.".Meldungen_var.txt";
 
 if (file_exists( $StatusFile )) {

  /***************************************************************************
  //  Daten einlesen ...
  ***************************************************************************/
  
  $variable = file( $StatusFile );
  $variable[0] = (trim($variable[0]));          // Das \n herausschmeissen
  
  if ($variable[0] == "false1") {              // Untere Grenze für "leer"
    $untenneu = false;                         // false = über $Batterineuleer
  }
  else {
    $untenneu = true;
  }
  
  if ($variable[1] =="true2") {               // Obere Grenze für "voll"
    $obenneu = true;                          // false = unter $Batterieneuvoll
  }
  else {
    $obenneu = false;
  }
 
   }
 else {
  /***************************************************************************
  //  Inhalt der Status Datei anlegen.
  ***************************************************************************/
  $rc = file_put_contents( $StatusFile, "false1\nfalse2" );
  if ($rc === false) {
    $funktionen->log_schreiben( "Konnte die Datei Meldungen_var.txt nicht anlegen.", "   ", 5 );
  }
 }
 //*****************************************************************************
 // Statusdatei fertig ausgelesen
 //*****************************************************************************/

  $rc = $funktionen->po_messageControl( "Batteriemeldung", 0, $GeraeteNummer, $Messengerdienst[1] );
  
  // holen des aktuellen Baterieladezustandes
  $aktuelleDaten["Query"] = "db=".$InfluxDBLokal."&q=".urlencode( "select last(SOC) from Batterie");
  $rc = $funktionen->po_influxdb_lesen( $aktuelleDaten );
  $Meldungen["SOC"] = $rc["results"][0]["series"][0]["values"][0][1];                          // $Meldungen[SOC] ist die Batterie %
  
  if (isset($rc["results"][0]["series"][0])) {                                                 //  Die Query liefert ein Ergebnis, das wird an dieser JSON Variable erkannt.
    
    if (($Meldungen[SOC] > $Batterieneuleer)and($Meldungen[SOC] < $Batterieneuvoll)) {         //  oberhalb $Batterieneuleer und unterhalb $Battrieneuvoll  
        $rc = file_put_contents( $StatusFile, "false1\nfalse2" );                              //beispielsweise mehr als 10% und weniger als 90%
                                                                                                                       // wird für das Neusetzen des Triggers benötigt (false1 und false2) 
    }
  
  }

    if ($Meldungen[SOC] <= $Batterieleer) {                                                     // Battrie ist leer
      if ($untenneu === false) {                                                                // wir kommen von oberhalb $Batterieneuleer
        $Nachricht = "Info: Batterie Ladezustand leer: ".$Meldungen["SOC"]."%.";
        $funktionen->log_schreiben( "Batteriemeldung ".$Nachricht, "*  ", 6 );
      	$funktionen->log_schreiben( strip_tags( $Nachricht ), "*  ", 6 );
  	    for ($Ui = 1; $Ui <= count( $User_Key ); $Ui++) {
        //  Die Nachricht wird an alle Empfänger gesendet, die in der
        //  user.config.php stehen.
               $funktionen->log_schreiben( "Nachricht wird bald versendet an User_Key[".$Ui."] ".$User_Key[$Ui], "*  ", 9 );
               $rc = $funktionen->po_send_message( $API_Token[$Ui], $User_Key[$Ui], $Nachricht, 0, "", $Messengerdienst[$Ui] );
               if ($rc) {
                 $funktionen->log_schreiben( "B-Nachricht wurde versendet an ".$Messengerdienst[$Ui]." mit Rufnummer: ".$User_Key[$Ui]." und Key: ".$API_Token[$Ui], "   ", 5 );
               }
            $funktionen->log_schreiben( $aktuelleDaten["Query"], "*  ", 9 );
            $rc = $funktionen->po_messageControl( "Batterie_Leer", 1, $GeraeteNummer, $Messengerdienst[1] );
	      }
        $rc = file_put_contents( $StatusFile, "true1\nfalse2" );                           //Meldung wurde gesendet, also true1, bis es wieder über $Batterieneuleer ist
      
      }
    }

    if ($Meldungen[SOC] == $Batterievoll) {                                                   // Batterie ist voll
      if ($obenneu === false) {                                                              // wir kommen von unterhalb $Batterieneuvoll
        $Nachricht = "Info: Batterie Ladezustand voll: ".$Meldungen["SOC"]."%.";
        $funktionen->log_schreiben( "Batteriemeldung ".$Nachricht, "*  ", 6 );
      	$funktionen->log_schreiben( strip_tags( $Nachricht ), "*  ", 6 );
  	    for ($Ui = 1; $Ui <= count( $User_Key ); $Ui++) {
        //  Die Nachricht wird an alle Empfänger gesendet, die in der
        //  user.config.php stehen.
               $funktionen->log_schreiben( "Nachricht wird bald versendet an User_Key[".$Ui."] ".$User_Key[$Ui], "*  ", 9 );
               $rc = $funktionen->po_send_message( $API_Token[$Ui], $User_Key[$Ui], $Nachricht, 0, "", $Messengerdienst[$Ui] );
               if ($rc) {
                 $funktionen->log_schreiben( "B-Nachricht wurde versendet an ".$Messengerdienst[$Ui]." mit Rufnummer: ".$User_Key[$Ui]." und Key: ".$API_Token[$Ui], "   ", 5 );
               }
            $funktionen->log_schreiben( $aktuelleDaten["Query"], "*  ", 9 );
            $rc = $funktionen->po_messageControl( "Batterie_Leer", 1, $GeraeteNummer, $Messengerdienst[1] );
	      }
        $rc = file_put_contents( $StatusFile, "false1\ntrue2" );                             //Meldung wurde gesendet, also true2, bis es wieder unter $Batterieneuvoll ist
        
      }
    }

    
  //  Batteriemeldung BLOCK ENDE     Batteriemeldung BLOCK ENDE  
  /***************************************************************************/
  
  

Stephan Helfers
Beiträge: 38
Registriert: Di 7. Mai 2019, 17:50
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Meldung wenn Akku voll

Beitrag von Stephan Helfers »

Hallo Seb01,

vielen Dank für die Version. Ich habe diese einmal getestet, habe aber das Problem, das mir ab 100% SOC minütlich eine Nachricht geschickt wird. Dieses geschieht solange, bis der SOC 100% verlassen hat, dann kommen auch keine Nachrichten mehr.

Muss ich noch irgendetwas anpassen? Was soll in der Meldungen_var.txt stehen? Bei mir steht eine Zahl mit Komma drin, ist aber nicht die SOC.

Danke und Gruß
Stephan

Seb01
Beiträge: 61
Registriert: Mo 20. Mär 2023, 11:11
Hat sich bedankt: 4 Mal
Danksagung erhalten: 6 Mal

Re: Meldung wenn Akku voll

Beitrag von Seb01 »

Update:

bei mir funktioniert es. Über Rückmeldungen hier (Funktioniert bei mir auch) würde ich mich freuen.

Gruss Sebastian

Seb01
Beiträge: 61
Registriert: Mo 20. Mär 2023, 11:11
Hat sich bedankt: 4 Mal
Danksagung erhalten: 6 Mal

Re: Meldung wenn Akku voll

Beitrag von Seb01 »

Stephan Helfers hat geschrieben:
Mo 29. Apr 2024, 09:56
Hallo Seb01,

vielen Dank für die Version. Ich habe diese einmal getestet, habe aber das Problem, das mir ab 100% SOC minütlich eine Nachricht geschickt wird. Dieses geschieht solange, bis der SOC 100% verlassen hat, dann kommen auch keine Nachrichten mehr.

Muss ich noch irgendetwas anpassen? Was soll in der Meldungen_var.txt stehen? Bei mir steht eine Zahl mit Komma drin, ist aber nicht die SOC.

Danke und Gruß
Stephan
Hallo Stephan,

bei mir sieht bei 100% ("Batterie voll"-Meldung gesendet) der Inhalt der "1.Meldungen_var.txt" so aus:

Code: Alles auswählen

false1
true2


bei (unter 90% UND über 10%) UND (Meldung "voll/leer" noch nicht gesendet) sieht sie so aus:

Code: Alles auswählen

false1
false2
Über 90% und unter 10% wird die Datei nicht neu geschrieben, bleibt also bei "false1/false2". Hier die Stelle im Code, die dafür verantwortlich ist:

Code: Alles auswählen

 if (($Meldungen[SOC] > $Batterieneuleer)and($Meldungen[SOC] < $Batterieneuvoll)) {         //  oberhalb $Batterieneuleer und unterhalb $Battrieneuvoll  
        $rc = file_put_contents( $StatusFile, "false1\nfalse2" );                              //beispielsweise mehr als 10% und weniger als 90%
                                                                                                                       // wird für das Neusetzen des Triggers benötigt (false1 und false2) 
    }
Erst beim Senden der Meldung wird die Datei geschrieben, dann steht jeweils "true1" oder "true2" drin (als Merkmal, das es gesendet wurde).



bei "Batterie leer"-Meldung gesendet sieht es so aus:

Code: Alles auswählen

true1
false2


Zurück zu "wann wird Battrievoll gesendet":
Beim "Battrie voll"-Block findest Du am Ende den Code, um die dauerhafte minütliche Sendung in dem File "1.Meldungen_var.txt" auszuschalten:

Code: Alles auswählen

    $rc = file_put_contents( $StatusFile, "false1\ntrue2" );                             //Meldung wurde gesendet, also true2, bis es wieder unter $Batterieneuvoll ist
Damit wird "true2" in der zweiten Zeile geschrieben. Beim nächsten Start des Scrips wir des ausgelesen, oben im Script

Code: Alles auswählen

if ($variable[1] =="true2") {               // Obere Grenze für "voll"
    $obenneu = true;                          // false = unter $Batterieneuvoll
  }
  else {
    $obenneu = false;
wird $obenneu auf "true" gesetzt. Dann im "Batterie voll" senden Block:

Code: Alles auswählen

if ($Meldungen[SOC] == $Batterievoll) {                                                   // Batterie ist voll
      if ($obenneu === false) {                  
und er kommt nicht wieder bis zu senden, bis es unter 90% ($Batterieneuvoll) gesunken ist


Ansonsten: bau doch mal in das Script folgende Zeile vor den 10%/90% Entscheidungsblock ein:

Code: Alles auswählen

$funktionen->log_schreiben("Batteriemeldung  Meldungen SOC ist ".$Meldungen[SOC]."  ENDE" ,"*  ", 1 );
Dann siehst Du im "solaranzeige.log" den SOC der Batterie und ob er korrekt ausgelesen wurde. Aber nicht vergessen hinterher die Zeile auszukommentieren oder den Loglevel hoch zu setzten, sonst bleibt es dauerhaft im Log....

Bei Fragen einfach weiter fragen. Ich könnte Dir auch noch eine Version senden, die je nach Log-Level auch noch Variablen und Entscheidungen mit ins Log schreibt...


Gruss Sebastian

Stephan Helfers
Beiträge: 38
Registriert: Di 7. Mai 2019, 17:50
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Meldung wenn Akku voll

Beitrag von Stephan Helfers »

Vielen Dank Sebastian,

da hast du mir ja eine super ausführliche Anleitung geschrieben. :o Ich werde mich dem noch einmal annehmen und ausgiebig testen.
Vielleicht noch wichtig, ich habe in den Meldungen auch die Sendung einer Nachricht bei Sonnenuntergang mit der Gesamtleistung kWh drin. Die funktionierte dann auch nicht mehr.

Echt toll.
Gruß
Stephan

Antworten

Zurück zu „Meldeblöcke für Messenger Meldungen“