Statusänderung bei einem Senec Speicher/Wechselrichter melden

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

Moderator: Ulrich

Antworten
TeamO
Beiträge: 602
Registriert: Mo 22. Jun 2020, 08:58
Hat sich bedankt: 6 Mal
Danksagung erhalten: 98 Mal

Statusänderung bei einem Senec Speicher/Wechselrichter melden

Beitrag von TeamO »

Immer wenn sich der Status des Speichers/Wechselrichters ändert wird eine Nachricht an SIGNAL, WhatsApp oder Pushover gesendet. Bitte den Codeblock in die Datei "meldungen_senden.php" kopieren, so wie in dem Dokument "Messenger Meldungen" beschrieben.
Die Datenbank muss hier nicht angegeben werden, da sie aus der passenden user.config.php verwendet wird. Somit ist dieser Block eigentlich mit copy'n'paste verwendbar.
Es kommt jede Statusänderung! Also im Extremfall einige Zeit lang jede Minute eine Meldung.
Der Codeblock ist ausführlich beschrieben und kann als Vorlage für weitere Gerätetypen benutzt werden.

Jeder der etwas PHP programmieren kann, kann die Meldungen auch noch an seine Bedürfnisse ändern.

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
  //  Hier kann Ihre Abfrage stehen. Diese Datei wird bei einem
  //  Update nicht ueberschrieben.
  ****************************************************************************/
  
if ($Regler == "43"){

  /***************************************************************************/
  //  Statusmeldung senden, wenn der Status sich ändert.
  $Datenbankname = $InfluxDBLokal;
  $Measurement = "Service";
  $Feldname1 = "Status";
  $Feldname2 = "Statusmeldung";
  
  //***************************************************************************
  //  Die Rückgabe ist:
  //  -------------------
  //  $rc[0] = Timestamp an dem die Meldung gesendet wurde.
  //  $rc[1] = Anzahl der gesendeten Meldungen.
  //  $rc[2] = Meldungsname. In diesem Fall "Statusmeldung"
  $rc = $funktionen->po_messageControl( "Statusmeldung", 0, $GeraeteNummer, $Messengerdienst[1] );
  //  Abfrage, ist die Statusmeldung schon einmal gesendet?
  if ($rc <> false) {
    $funktionen->log_schreiben( "Statusmeldung letzte Nachricht gesendet: ".date( "d.m.Y H:i", $rc[0] ), "   ", 7 );
  }
  if ($rc === false or date( "YmdHi", $rc[0] ) <> date( "YmdHi" )) {
    //  Entweder es wurde noch nie die Statusänderung gesendet oder es wird geprüft
    //  ob diese bereits gesendet wurde.
    //
    //  Step 2
    //  Hier wird die Meldung generiert!
    $aktuelleDaten["Query"] = "db=".$Datenbankname."&q=".urlencode( "select difference(".$Feldname1.") from ".$Measurement." where time > now() -2m " );
    // Die Influx Datenbank abfragen, ob ein bestimmtes Ereignis passiert ist.
    $rc = $funktionen->po_influxdb_lesen( $aktuelleDaten );
    $funktionen->log_schreiben( print_r($rc,1), "*  ", 9 );
    if (isset($rc["results"][0]["series"][0]) or isset($rc["results"][0]["statement_id"])) {
      //  Die Query liefert ein Ergebnis, das wird an dieser JSON Variable erkannt.
      $TimestampOn = $rc["results"][0]["series"][0]["values"][0][0];
      if ($rc["results"][0]["series"][0]["values"][0][1] != 0) {
        //  Ja, der Status hat sich geändert.
        //  Zahl ist Statusänderung  0 = keine Änderung
        //  +1, +2, +3, -3, -2
        //  Neuen Status erfragen:
        $aktuelleDaten["Query"] = "db=".$Datenbankname."&q=".urlencode( "select last(".$Feldname1.") from ".$Measurement." where time > now() -2m " );
        $rc = $funktionen->po_influxdb_lesen( $aktuelleDaten );
        $funktionen->log_schreiben( print_r($rc,1), "*  ", 9 );
        if (isset($rc["results"][0]["series"][0])) {

          //  Step 3
          //  Die Nachricht, die gesendet werden soll, wird hier zusammen
          //  gebaut.
		  $AktuellerStatus["Query"] = "db=".$Datenbankname."&q=".urlencode( "select last(".$Feldname2.") from ".$Measurement." " );
		  $rc = $funktionen->po_influxdb_lesen( $AktuellerStatus );
		  $AktuellerStatus["Statusmeldung"] = $rc["results"][0]["series"][0]["values"][0][1];
		  $funktionen->log_schreiben( print_r($rc,1), "*  ", 9 );

          $Nachricht = "Der Status hat sich geändert. Neuer Status: ".$AktuellerStatus["Statusmeldung"]." ";
        //
        //  Step 4
        //  Wann soll die Nachricht gesendet werden? Hier kann man noch eine bestimmte Uhrzeit einbauen oder eine Zeitspanne.
        //  In unserem Fall: sofort senden ...
        $funktionen->log_schreiben( $Nachricht, "*  ", 6 );
        //  Step 5
        //  Soll die Nachricht an mehrere Empfänger gesendet werden?
        for ($Ui = 1; $Ui <= count( $User_Key ); $Ui++) {
          //  Die Nachricht wird an alle Empfänger gesendet, die in der
          //  user.config.php stehen.
          $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 );
          }
        }
        //  Step 6
        //  Es wird festgehalten, wann die Nachricht gesendet wurde und eventuell
        //  das wievielte mal. (2. Parameter) In dem Beispiel gibt es nur eine
        //  Meldung pro Ereignis.
        $rc = $funktionen->po_messageControl( "Statusmeldung", 1, $GeraeteNummer, $Messengerdienst[1] );
        }
        else {
          $funktionen->log_schreiben( "Fehler! Status nicht in der Datenbank.", "   ", 2 );
        }
      }
    }
  }
} 
  
  
  /****************************************************************************
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  //  NACHRICHTEN BLOCK  STOP      NACHRICHTEN BLOCK  STOP      BLOCK  STOP
  ****************************************************************************/ 

Antworten