Seite 1 von 1

Statusänderung bei einem Kostal Plenticore WR

Verfasst: Fr 24. Dez 2021, 12:04
von Bogeyof
Immer wenn sich der Status des 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.
Am Anfang bitte noch den Datenbanknamen ändern, falls man einen anderen vergeben hat. (Multi-Regler-Version) Die Meldung kommt max. alle 10 Minuten! 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

  /***************************************************************************/
  //  Statusmeldung senden, wenn der Status sich ändert.
  $Datenbankname = "solaranzeige";
  $Measurement = "Service";
  $Feldname = "Status";
  //***************************************************************************
  //  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( "YmdH", $rc[0] ) <> date( "YmdH" )) {
    //  Entweder es wurde noch nie der Ertrag gesendet oder es wird geprüft
    //  ob Heute schon in dieser Stunde gesendet wurde.
    //
    //  Meldung wird nur pro Stunde einmal versendet.
    //  Step 2
    //  Hier wird die Meldung generiert!
    $aktuelleDaten["Query"] = "db=".$Datenbankname."&q=".urlencode( "select sum(Diff) from (select difference(".$Feldname.") as Diff from ".$Measurement." where time > now() - 60m )" );
    // 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
        //  Neuen Status erfragen:
        $aktuelleDaten["Query"] = "db=".$Datenbankname."&q=".urlencode( "select last(".$Feldname.") 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 = $rc["results"][0]["series"][0]["values"][0][1];

        switch($AktuellerStatus) {
            case 0:
                   $StatusText = "Ausgeschaltet";
                   Break;
            case 6:
                   $StatusText = "Einspeisen";
                   Break;
            case 7:
                   $StatusText = "Gedrosselt";
                   Break;
            case 10:
                   $StatusText = "StandBy";
                   Break;
            case 14:
                   $StatusText = "Überhitzt";
                   Break;
            case 15:
                   $StatusText = "ShutDown";
                   Break;
            default:
                   $StatusText = $WRStatus;
                   Break;
        }

        $Nachricht = "Der Status hat sich geändert. Neuer Status: ".$StatusText." ";
        //
        //  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 );
        }
      }
    }
  }