Seite 1 von 1

Ladestatus Änderung bei Victron Regler BlueSolar oder SmartSolar

Verfasst: Sa 25. Dez 2021, 16:04
von Ulrich
Die Änderung des Ladestatus von folgenden Victron Geräten kann hiermit gemeldet werden:
  • Laderegler BlueSolar
  • SmartSolar
Bitte den Codeblock in die Datei "meldungen_senden.php" kopieren, so wie in dem Dokument "Messenger Meldungen" beschrieben. Dort gibt es auch weitere Hinweise auf die Funktion der Codeblocks.

Code: Alles auswählen

  /***************************************************************************/
  //  Statusmeldung senden, wenn der Status sich ändert.
  $Datenbankname =  $InfluxDBLokal;
  $Measurement = "Service";
  $Feldname = "Ladestatus";
  //***************************************************************************
  //  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 ($Regler == 4) {
    //  Victron Laderegler, jede Änderung wird gemeldet.
    //  Hier kann die Anzahl der Meldungen zusätzlich begrenzt werden.
    //  
    //  Step 2
    //  Hier wird die Meldung generiert!
    $aktuelleDaten["Query"] = "db=".$Datenbankname."&q=".urlencode( "select difference(".$Feldname.") 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.
      if ($rc["results"][0]["series"][0]["values"][0][1] != 0) {
        $TimestampOn = $rc["results"][0]["series"][0]["values"][0][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(".$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 = "  Keine Ladung";
            break;
            case 2:
                   $StatusText = "  Fehler vorhanden!";
            break;
            case 3:
                   $StatusText = "  normale Ladung";
            break;
            case 4:
                   $StatusText = "  Nachladung";
            break;
            case 5:
                   $StatusText = "  Erhaltungsladung";
            break;
            case 7:
                   $StatusText = "  Ausgleichsladung";
            break;
            default:
                   $StatusText = "  unbekannt";
            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 );
        }
      }
    }
  }