Statusänderung bei einem SolarEdge Wechselrichter melden.

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

Moderator: Ulrich

Antworten
Benutzeravatar
Ulrich
Administrator
Beiträge: 5505
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 152 Mal
Danksagung erhalten: 877 Mal
Kontaktdaten:

Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Ulrich »

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 maximal einmal in der Stunde! 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. Wer möchte, kann seine Codeblocks hier auch anderen zur Verfügung stellen.
Bei einer Multi-Regler-Version muss eventuell noch die Abfrage begrenzt auf die Reglernummer oder die Gerätenummer werden.

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" )) and $GeraeteNummer == 1) {
    //  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 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.
      $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(".$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 1:
                   $StatusText = "  ausgeschaltet";
            break;
            case 2:
                   $StatusText = "  Nachtmodus";
            break;
            case 4:
                   $StatusText = "  in Betrieb";
            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 );
        }
      }
    }
  }
-----------------------------------------------------
Ulrich . . . . . . . . [Projekt Administrator]

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

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Bogeyof »

Ulrich hat geschrieben:
Do 23. Dez 2021, 17:54

Jeder der etwas PHP programmieren kann, kann die Meldungen auch noch an seine Bedürfnisse ändern. Wer möchte, kann seine Codeblocks hier auch anderen zur Verfügung stellen.
Ich kann es natürlich nicht testen, denn ich habe den Wechselrichter ja nicht, aber mein Kostal macht im Prinzip das Gleiche. Nachdem vorher getestet wird, ob in der letzten Stunde schon eine Meldung verschickt wurde und erst wenn das nicht der Fall war die Meldung generiert wird, habe ich meine Zweifel, dass die Abfrage "select difference(".$Feldname.") from ".$Measurement." where time > now() -2m " ein Ergebnis liefert, wenn die Statusänderung länger als 2 Minuten zurückliegt (aber kürzer als 1 Stunde nach der letzten Meldung).
Ich habe daher die Abfrage für mich geändert in "select sum(Diff) from (select difference(".$Feldname.") as Diff from ".$Measurement." where time > now() - 60m )", das sollte auch nach einer Stunde noch eine Statusänderung innerhalb der letzten Stunde erkennen können. Damit würde z.B. die erste Änderung um 8:00 (mit daraus resultierender Meldung) und die nächste Änderung von z.B. 8:50 noch um 9:00 gemeldet, in der alten Version denke ich würde da nichts mehr gemeldet.

TeamO
Beiträge: 1138
Registriert: Mo 22. Jun 2020, 08:58
Wohnort: Ulm / Neu-Ulm
Hat sich bedankt: 23 Mal
Danksagung erhalten: 225 Mal

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von TeamO »

Bei mir läuft gerade dieser Code zum testen und heute morgen kam auch entsprechend eine Benachrichtigung bei der Statusänderung. Und zwar nur einmal.
Weiterhin wird die Abfrage ja jede Minute ausgeführt. Somit spielt es keine Rolle, ob die Änderung > 2 Minuten her ist, da ja jede Minute geprüft wird.
Jedenfalls verstehe ich es so.
Und da es ja interessant ist, innerhalb kürzester Zeit eine Statusänderung gemeldet zu bekommen, ist es doch unnötig Änderungen zu erkennen, welche älter als 2 Minuten sind. Diese wurden ja bereits gemeldet. ;)
Oder habe ich hier mal wieder einen Denkfehler bzw. verstehe ich Deinen Kommentar falsch?
Gruß Timo

Auflistung Geräte/Dashboards/Anschlussart
Datenbankfelder der einzelnen Geräte
GANZ WICHTIG: Überblick der vorhandenen Anleitungen

Fertige Komplett-Systeme gibt es hier anfragen[AT]bauer-timo[.]de

Tibber Invite (100% Öko-Strom + 50€ Bonus)

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

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Bogeyof »

Laut dem Code wird nicht minütlich geprüft, sondern es wird zuerst geprüft, ob die letzte Meldung länger als eine Stunde zurückliegt. Ist dies nicht der Fall, dann wird nicht geprüft ob eine Änderung stattgefunden hat. Daher wird eine weitere Änderung innerhalb einer Stunde nach der letzten Meldung dann gar nicht mehr mitgeteilt, außer sie war in der 59. Minute. Klar kann man fragen, ob eine nachträgliche Meldung nach bis zu einer Stunde sinnvoll wäre, aber besser als nichts.
Korrekt wäre das Abstellen der Stundenprüfung, dann wird sofort gemeldet, wenn sich etwas ändert, evtl. dann auch recht häufig, oder eben eine Prüfung auf den gesamten Zeitbereich für den ich (noch) nicht gemeldet habe (hier 60 min wegen Stunden-Prüfung).
Ich habe bei mir das ganze in 10 Minuten Schritten implementiert, ich melde nach spätestens 10 Minuten, wenn sich in den letzten 10 Minuten etwas geändert hat. Diese Prüfung reagiert sofort bei einer Änderung, wenn die letzte Meldung mehr als 10 Minuten her war und eben spätestens 9 Minuten später, wenn sich sehr schnell wieder etwas geändert hat...

Benutzeravatar
Ulrich
Administrator
Beiträge: 5505
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 152 Mal
Danksagung erhalten: 877 Mal
Kontaktdaten:

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Ulrich »

Das mit der einen Stunde möchte ich hier einmal klarstellen.
Nachdem vorher getestet wird, ob in der letzten Stunde schon eine Meldung verschickt wurde und erst wenn das nicht der Fall war die Meldung generiert wird, habe ich meine Zweifel, dass die Abfrage "select difference(".$Feldname.") from ".$Measurement." where time > now() -2m " ein Ergebnis liefert, wenn die Statusänderung länger als 2 Minuten zurückliegt (aber kürzer als 1 Stunde nach der letzten Meldung).
Das ist nicht ganz richtig.

Die if Abfrage ist wahr, wenn noch nie eine Statusmeldung gesendet wurde und wenn in der aktuellen Stunde noch keine gesendet wurde.

Im Normalfall ändert sich der Status ja nicht jede Stunde, also wird eine Änderung direkt gesendet. Ändert sich der Status jedoch innerhalb einer Stunde, was meist nur dann passiert, wenn man an dem Gerät herumfummelt, dann würde nicht ständig eine Änderung gemeldet werden. Wem jetzt eine Stunde "Ruhe" zu lange ist, der kann auch jede Meldung sich schicken lassen. Dann muss es heißen:

Code: Alles auswählen

if ($rc === false or date( "YmdHi", $rc[0] ) <> date( "YmdHi" )) { 
Wer nur eine Meldung pro Tag bekommen möchte, dann muss es heißen:

Code: Alles auswählen

if ($rc === false or date( "Ymd", $rc[0] ) <> date( "Ymd" )) { 
Mit dieser Zeile wird einfach die Menge der Folgenachrichten begrenzt. Die 1. Meldung wird aber in jedem Fall gesendet. Nur Folgemeldungen innerhalb einer Stunde nicht! Das ist ein großer Unterschied. Mit etwas Programmierkenntnisse kann man auch jeden Zwischenwert hier abfragen.
-----------------------------------------------------
Ulrich . . . . . . . . [Projekt Administrator]

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

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Bogeyof »

Schon klar, nichts anderes habe ich ja behauptet. Allerdings gibt's auch Statuswechsel innerhalb einer Stunde (nicht so häufig, aber z.B. bei starken Schneefall, Gewitter usw) und die wären halt gar nicht mehr gemeldet worden. Wenn er ausschaltet wegen Schneefall und zu wenig Leistung und das meldet, dann innerhalb einer Stunde wieder eingeschaltet, bekomme ich das mit meiner Abfrage "nachgemeldet", mit der bestehenden Abfrage gar nicht mehr gemeldet. Das war meine Anmerkung, jeder wie er es mag...

Mein Kostal schaltet derzeit morgens bei schlechtem Wetter ständig zwischen "Aus", "Standby" und "Einspeisen" hin und her. Jede Änderung zu melden wäre zu anstrengend, allerdings würde ich schon gerne erfahren, dass er jetzt endlich eingeschaltet hat und einspeist. Deswegen habe ich ein 10 Minuten Intervall mit dieser Technik des "Nachmeldens"..

TeamO
Beiträge: 1138
Registriert: Mo 22. Jun 2020, 08:58
Wohnort: Ulm / Neu-Ulm
Hat sich bedankt: 23 Mal
Danksagung erhalten: 225 Mal

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von TeamO »

Ok. Da sieht man, das ich kein Programmierer bin. Ich bin davon ausgegangen, dass jede Änderung geschickt wird.
Wollte hier keinen "Streit"verursachen.
Ich werde bei mir jedenfalls die Änderung vornehmen, damit ich jeden Statuswechsel immer bekomme.
Gruß Timo

Auflistung Geräte/Dashboards/Anschlussart
Datenbankfelder der einzelnen Geräte
GANZ WICHTIG: Überblick der vorhandenen Anleitungen

Fertige Komplett-Systeme gibt es hier anfragen[AT]bauer-timo[.]de

Tibber Invite (100% Öko-Strom + 50€ Bonus)

Benutzeravatar
Ulrich
Administrator
Beiträge: 5505
Registriert: Sa 7. Nov 2015, 10:33
Wohnort: Essen
Hat sich bedankt: 152 Mal
Danksagung erhalten: 877 Mal
Kontaktdaten:

Re: Statusänderung bei einem SolarEdge Wechselrichter melden.

Beitrag von Ulrich »

Die Meldeblöcke, die ich hier veröffentliche sollen ja nur Vorlagen sein, damit jeder "seinen persönlichen Meldeblock" abändern, bzw. erstellen kann. Jeder möchte es ja anders haben.
-----------------------------------------------------
Ulrich . . . . . . . . [Projekt Administrator]

Antworten

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