Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Welche Geräte sollen noch implementiert werden?
Was sollte man ändern / verbessern / ergänzen an der Solaranzeige? Hier kann Jeder seine Ideen einbringen.
Außerdem steht hier, woran gerade gerbeitet wird.

Moderator: Ulrich

Forumsregeln
Wenn neue Geräte implementiert werden sollen ist die Protokollbeschreibung der Schnittstelle vom Hersteller Voraussetzung.

Bitte nur konkrete Ideen hier eintragen und in jedem Beitrag bitte nur eine Erweiterung / Änderung, damit das Ganze noch überschaubar bleibt. Ein ganzes Sammelsorium von Ideen in einem Thread ist zu unübersichtlich. Nicht alles kann und wird auch verwirklicht werden.
mbastian
Beiträge: 25
Registriert: Di 28. Jul 2020, 21:04
Danksagung erhalten: 5 Mal

Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von mbastian »

Hallo,

habe seit neuem einen Sungrow SG10KTL-M Wechselrichter im Einsatz. Der Wechselrichter lässt sich leider nur über RS485 Auslesen da er keine LAN Schnittstelle hat. Gibt es da eine Möglichkeit?

Lieben Gruß,

Michael

and777
Beiträge: 4
Registriert: Mo 13. Jun 2022, 13:22

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von and777 »

Guten Tag!
Bin ebenfalls ein Besitzer von SG10KTL-M OHNE einen WiFi(LAN)-Dongle von Sungrow. Habe mir dazu einen günstigen RS485>LAN Adapter aus China geholt "ELFIN EE11A" (ca.14€ incl. Versand, Juni 2022)
Angeschlossen an die "Com." Buchse vom Wechselrichter (4 Drähte: +5VDC; GND;TX;RX)
Elfin Adapter hat einen eingebauten WEB-Server, dort muss noch die Serielle Schnittstelle eingestellt werden:
Protocol - Modbus
BaudRate,Data Bit, StopBit und Parity muss mit der Einstellung von Sungrow passen (habe ich mit SolarCloud App abgeglichen).
Somit werden die Daten von Modbus RTU nach Modbus TCP "übersetzt" und stehen nun im LAN zur Verfügung.
Ich kann die Daten mit Modbus Monitor sehen und die Anzeige in einer anderer ViSu (Loxone) klappt auch.
Nun versuche ich (leider) erfolglos mir eine Installation von Solaranzeige.de im Docker auf Synology NAS einzurichten.
Als Regler habe ich 70=Sungrow ausgewählt.
Dies führte sofort zur Fehler, der WR konnte nicht ausgelesen werden, weil es kein Hybrid-WR ist, und beim Versuch die Register auszulesen, die Batterie, Verbrauch usw. (hat mein Wechselrichter nicht), kam dann ein "Timeout" und der Script wurde beendet.
Ein Versuch, die "Sungrow.PHP" zu "manipulieren" hat leider nicht geklappt.
Ich habe Versucht die Register, die mein WR nicht hat, durch andere passende Register auszutauschen, die lesbar sind.
Jetzt werden zwar die Daten ausgelesen, können aber nicht nach INFLUX.DB geschrieben werden.
Hat noch jemand eine Idee, was man noch machen kann?
Kann es sein, das ein reiner String-Wechselrichter von Sungrow (kein Hybrid) nur mit einem WiFi-Stick von Sungrow von der Solaranzeige.de ausgelesen werden kann?

Code: Alles auswählen

10.07. 20:26:01 |----------------   Start  sungrow.php    -------------------------- 
10.07. 20:26:01 +  -Die Daten werden ausgelesen...
10.07. 20:26:02    -Firmware: LCD_MOONSTONE_V01_A_M
10.07. 20:26:15    -InfluxDB  => [ AC Spannung_R=227.2,Spannung_S=230.4,Spannung_T=225.6,Frequenz=49.9,Leistung=-5,Einspeisung=639,Bezug=0,Hausverbrauch=639  1657477571
PV Leistung=181,Spannung1=357.3,Strom1=0.3,Leistung1=107.19,Spannung2=364.3,Strom2=0.2,Leistung2=72.86  1657477571
Batterie LadeLeistung=200,EntladeLeistung=200,Status=100,SOC=0.2  1657477571
Service Temperatur=36.6,WR_Fehler=1147096131,Status=4c43,Anz_MPPT=2,Modell_ID=318,Modell="LCD_MOONSTONE_V01_A_M",Effizienz=0  1657477571
Summen Wh_GesamtHeute=10000,Wh_Gesamt=63900,Wh_Heute=10000  1657477571
 ]
10.07. 20:26:15    -Daten nicht zur lokalen InfluxDB gesendet! info: array (
  'url' => 'http://localhost/write?db=solaranzeige&precision=s',
  'content_type' => 'application/json',
  'http_code' => 400,
  'header_size' => 485,
  'request_size' => 691,
  'filetime' => -1,
  'ssl_verify_result' => 0,
  'redirect_count' => 0,
  'total_time' => 0.299446,
  'namelookup_time' => 0.000817,
  'connect_time' => 0.001097,
  'pretransfer_time' => 0.001648,
  'size_upload' => 534.0,
  'size_download' => 210.0,
  'speed_download' => 702.0,
  'speed_upload' => 1785.0,
  'download_content_length' => 210.0,
  'upload_content_length' => 534.0,
  'starttransfer_time' => 0.299388,
  'redirect_time' => 0.0,
  'redirect_url' => '',
  'primary_ip' => '127.0.0.1',
  'certinfo' => 
  array (
  ),
  'primary_port' => 8086,
  'local_ip' => '127.0.0.1',
  'local_port' => 54668,
  'http_version' => 2,
  'protocol' => 1,
  'ssl_verifyresult' => 0,
  'scheme' => 'HTTP',
  'appconnect_time_us' => 0,
  'connect_time_us' => 1097,
  'namelookup_time_us' => 817,
  'pretransfer_time_us' => 1648,
  'redirect_time_us' => 0,
  'starttransfer_time_us' => 299388,
  'total_time_us' => 299446,
)
10.07. 20:26:20    -InfluxDB  => [ AC Spannung_R=227.2,Spannung_S=230.4,Spannung_T=225.6,Frequenz=49.9,Leistung=-5,Einspeisung=639,Bezug=0,Hausverbrauch=639  1657477571
PV Leistung=181,Spannung1=357.3,Strom1=0.3,Leistung1=107.19,Spannung2=364.3,Strom2=0.2,Leistung2=72.86  1657477571
Batterie LadeLeistung=200,EntladeLeistung=200,Status=100,SOC=0.2  1657477571
Service Temperatur=36.6,WR_Fehler=1147096131,Status=4c43,Anz_MPPT=2,Modell_ID=318,Modell="LCD_MOONSTONE_V01_A_M",Effizienz=0  1657477571
Summen Wh_GesamtHeute=10000,Wh_Gesamt=63900,Wh_Heute=10000  1657477571
 ]
10.07. 20:26:20    -Daten nicht zur lokalen InfluxDB gesendet! info: array (
  'url' => 'http://localhost/write?db=solaranzeige&precision=s',
  'content_type' => 'application/json',
  'http_code' => 400,
  'header_size' => 485,
  'request_size' => 691,
  'filetime' => -1,
  'ssl_verify_result' => 0,
  'redirect_count' => 0,
  'total_time' => 0.06986,
  'namelookup_time' => 5.6E-5,
  'connect_time' => 5.8E-5,
  'pretransfer_time' => 0.000141,
  'size_upload' => 534.0,
  'size_download' => 210.0,
  'speed_download' => 3043.0,
  'speed_upload' => 7739.0,
  'download_content_length' => 210.0,
  'upload_content_length' => 534.0,
  'starttransfer_time' => 0.069806,
  'redirect_time' => 0.0,
  'redirect_url' => '',
  'primary_ip' => '127.0.0.1',
  'certinfo' => 
  array (
  ),
  'primary_port' => 8086,
  'local_ip' => '127.0.0.1',
  'local_port' => 54668,
  'http_version' => 2,
  'protocol' => 1,
  'ssl_verifyresult' => 0,
  'scheme' => 'HTTP',
  'appconnect_time_us' => 0,
  'connect_time_us' => 58,
  'namelookup_time_us' => 56,
  'pretransfer_time_us' => 141,
  'redirect_time_us' => 0,
  'starttransfer_time_us' => 69806,
  'total_time_us' => 69860,
)
10.07. 20:26:57    -Schleife 1 Ausgang...
10.07. 20:26:57    -OK. Datenübertragung erfolgreich.
10.07. 20:26:57 |----------------   Stop   sungrow.php    -------------------------- 

ba0547
Beiträge: 50
Registriert: Do 23. Jan 2020, 21:03
Wohnort: Baunach
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von ba0547 »

Hallo,

habe auch so einen Wechselrichter den ich versuche an die Solaranzeige, Raspi anzuschließen. Dein Versuch scheint erstmal garnicht so schlecht auszuschauen. Es werden Daten gesendet/empfangen. in leider auch nicht so tief in der Solaranzeigen Software um beurteilen zu können was noch fehlt um es komplett zum laufen zu bekommen. Habe einen RS485 nach USB Konverter. Werde in den nächsten Tagen mal versuchen den Wechselrichter an den Raspi anzuschließen. Hatte heute ein Telefongespräch mit Sungrow in München, die wissen nicht welcher Wifi/ehernet Dongle für den alten SG10KTL-M passt. Wollten mir per Email eine Info senden. Die Dongles sind schwer zu bekommen und scheissteuer. Hoffe wir finden eine Lösung ohne den Sungrow Dongle.

Viele Grüße, Harald.

and777
Beiträge: 4
Registriert: Mo 13. Jun 2022, 13:22

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von and777 »

Bin ein Schritt weiter gekommen: die Daten werden nun ausgelesen und nach INFLUX geschrieben. Kann es über vorbereiteter Sungrow-Dashboard auch anzeigen lassen. Dafür müsste ich die Datei SUNGROW.PHP anpassen und Auto-Update ausschalten, sonst wird die Datei bei jedem Update-Vorgang überschrieben. Es gibt bestimmt auch ein anderes Weg, hoffe hier kann mir jemand ein Tip geben, wie man trotzdem die Update-Funktion behalten kann.
Nun muss ich mich noch mit Grafana beschäftigen und nicht vorhandene Anzeigen entfernen bzw. durch sinnvolle ersetzen. Habe bei mir noch am Zähler ein IR-Lesekopf an einem ESP-8266 hängen, den ich ebenfalls in Dashboard einbinden möchte.
Also als Fazit: mit einem günstigem RS485-LAN Umsetzer ist es möglich den Wechselrichter SGxKTL-M auszulesen.

ba0547
Beiträge: 50
Registriert: Do 23. Jan 2020, 21:03
Wohnort: Baunach
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von ba0547 »

Bin dir sehr dankbar das du es hinbekommen hast den Wechselrichter unter Solaranzeige angezeigt zu bekommen. Wäre natürlich auch für mich interessant was du in der sungrow.php geändert hast. Vielleicht könntes du die Datei hier hochladen oder mir per PM zukommen lassen?
Hatte kontakt mit Sungrow support. Der Mitarbeiter hat mir mitgeteilt das es keinen Dongle für diesen Wechselrichter mehr gibt um Kabel Ethernet Anschluß nutzen zu können. Nur über irgendwelche Webserver:
"
nach Überprüfung der Datenbank können wir feststellen, dass der Wechselrichter SG10KTL-M mit der SN A1710121441 die Produktversion V11 hat und daher nicht mit dem WiNet-S-Kommunikationsmodul kompatibel ist.
Die einzige Möglichkeit zur Überwachung mit einem LAN-Kabel ist über RS485 zum Sungrow Logger 1000B (Datenlogger) oder mit COM100E (das den Datenlogger mit Anschlussbox und Schutz enthält). Für ein klares Beispiel einer Überwachungsverbindung über RS485 befolgen Sie bitte die Schritte in Abschnitt (5.6 RS485-Kommunikationssystem) des Benutzerhandbuchs, das dieser E-Mail beigefügt ist."

Umso besser das es mit der Solaranzeige dann doch auch über RS485 funktioniert. Welchen der beiden Anschlüsse hast du genutzt?
Deine Modifikationen solltest du an den Projektadmin melden. Vielleicht nimmt er deine Änderungen auf und sie werden bei den Updates auch an alle verteilt die Solaranzeige benutzen.

and777
Beiträge: 4
Registriert: Mo 13. Jun 2022, 13:22

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von and777 »

ba0547 hat geschrieben:
Do 14. Jul 2022, 22:12
Umso besser das es mit der Solaranzeige dann doch auch über RS485 funktioniert. Welchen der beiden Anschlüsse hast du genutzt?
Angeschlossen an die "Com." Buchse vom Wechselrichter (4 Drähte: +5VDC; GND;TX;RX)

Was die Sungrow.PHP betrifft:
Habe einfach unter "Register_Adresse" die Register, die nur ein Hybrid-WR hat und bei unserem Wechselrichter ja logischerweise nicht vorhanden sind, ersetzt durch vorhandene Register. Ist eigentlich so erstmal nur provisorische Lösung, da jetzt in die Datenbank teilweise Müll geschrieben wird.
Bin leider kein Programmierer, um es richtig zu machen.

@Ulrich : kann gerne helfen und die Register für die Variante "Sungrow-SG über RS485-Adapter" eintragen.
Oder ist es möglich den Script so anzupassen, das es erkannt wird anhand von Modell_Nr, um welchen WR es sich handelt, und so auch nur vorhanden Register ausgelesen werden?

Momentan sieht mein Sungrow.PHP so aus: (Bitte nur als Muster verwenden, ist keine endgültige Lösung!!!):

Code: Alles auswählen

#!/usr/bin/php
<?php

/*****************************************************************************
//  Solaranzeige Projekt             Copyright (C) [2016 - 2021] [Ulrich Kunz]
//
//  Dieses Programm ist freie Software. Sie können es unter den Bedingungen
//  der GNU General Public License, wie von der Free Software Foundation
//  veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
//  Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
//
//  Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es
//  Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
//  die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
//  BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
//
//  Ein original Exemplar der GNU General Public License finden Sie hier:
//  http://www.gnu.org/licenses/
//
//  Dies ist ein Programmteil des Programms "Solaranzeige"
//
//  Es dient dem Auslesen der VARTA Storage Modelle wie z.B.
//  VARTA element, VARTA pulse, VARTA link, VARTA flex storage usw.
//  mit LAN Schnittstelle.
//  Das Auslesen wird hier mit einer Schleife durchgeführt. Wie oft die Daten
//  ausgelesen und gespeichert werden steht in der user.config.php
//
//
//
*****************************************************************************/
$path_parts = pathinfo( $argv[0] );
$Pfad = $path_parts['dirname'];
if (!is_file( $Pfad."/1.user.config.php" )) {
  // Handelt es sich um ein Multi Regler System?
  require ($Pfad."/user.config.php");
}
require_once ($Pfad."/phpinc/funktionen.inc.php");
if (!isset($funktionen)) {
  $funktionen = new funktionen( );
}
// Im Fall, dass man die Device manuell eingeben muss
if (isset($USBDevice) and !empty($USBDevice)) {
  $USBRegler = $USBDevice;
}
$Tracelevel = 7; //  1 bis 10  10 = Debug
$RemoteDaten = true;
$Device = "WR"; // WR = Wechselrichter
$Version = "";
$Start = time( ); // Timestamp festhalten
$funktionen->log_schreiben( "-------------   Start  sungrow.php    -------------------------- ", "|--", 6 );
$funktionen->log_schreiben( "Zentraler Timestamp: ".$zentralerTimestamp, "   ", 8 );
$aktuelleDaten = array();
$aktuelleDaten["zentralerTimestamp"] = $zentralerTimestamp;
setlocale( LC_TIME, "de_DE.utf8" );
//  Hardware Version ermitteln.
$Teile = explode( " ", $Platine );
if ($Teile[1] == "Pi") {
  $funktionen->log_schreiben( "Hardware Version: ".$Platine, "o  ", 8 );
  $Version = trim( $Teile[2] );
  if ($Teile[3] == "Model") {
    $Version .= trim( $Teile[4] );
    if ($Teile[5] == "Plus") {
      $Version .= trim( $Teile[5] );
    }
  }
}
switch ($Version) {

  case "2B":
    break;

  case "3B":
    break;

  case "3BPlus":
    break;

  case "4B":
    break;

  default:
    break;
}

if (empty($WR_Adresse)) {
  $WR_ID = "FF";
}
elseif(strlen($WR_Adresse) == 1)  {
  $WR_ID = str_pad(dechex($WR_Adresse),2,"0",STR_PAD_LEFT);
}
else {
  $WR_ID = str_pad(dechex($WR_Adresse),2,"0",STR_PAD_LEFT);
}

$funktionen->log_schreiben("WR_ID: ".$WR_ID,"+  ",8);


$COM1 = fsockopen( $WR_IP, $WR_Port, $errno, $errstr, 10 ); // 10 = Timeout in Sekunden
if (!is_resource( $COM1 )) {
  $funktionen->log_schreiben( "Kein Kontakt zum Wechselrichter ".$WR_IP."  Port: ".$WR_Port, "XX ", 3 );
  $funktionen->log_schreiben( "Exit.... ", "XX ", 9 );
  goto Ausgang;
}

$i = 1;
do {
  $funktionen->log_schreiben( "Die Daten werden ausgelesen...", "+  ", 7 );

  /****************************************************************************
  //  Ab hier wird der Wechselrichter ausgelesen.
  //
  //    $aktuelleDaten["Firmware"]
  //    $aktuelleDaten["Seriennummer"]
  //    $aktuelleDaten["Produkt"]
  //    $aktuelleDaten["Leistungsklasse"]
  //    $aktuelleDaten["Phasen"]
  //    $aktuelleDaten["Temperatur"]
  //    $aktuelleDaten["PV1_Spannung"]
  //    $aktuelleDaten["PV2_Spannung"]
  //    $aktuelleDaten["PV1_Strom"]
  //    $aktuelleDaten["PV2_Strom"]
  //    $aktuelleDaten["DC_Leistung"]
  //    $aktuelleDaten["AC_Spannung_R"]
  //    $aktuelleDaten["AC_Spannung_S"]
  //    $aktuelleDaten["AC_Spannung_T"]
  //    $aktuelleDaten["Frequenz"]
  //    $aktuelleDaten["PV_Power_Heute"]
  //    $aktuelleDaten["PV_Energie_Monat"]
  //    $aktuelleDaten["System_Status"]
  //    $aktuelleDaten["Status"]
  //    $aktuelleDaten["WattstundenGesamtHeute"]
  //    $aktuelleDaten["WattstundenGesamt"]
  //    $aktuelleDaten["Bezug"]
  //    $aktuelleDaten["Einspeisung"]
  //    $aktuelleDaten["Batterie_Spannung"]
  //    $aktuelleDaten["PV1_Leistung"]
  //    $aktuelleDaten["PV2_Leistung"]
  //
  //  function modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp )
  //
  //
  ****************************************************************************/
  $aktuelleDaten["Anz_PV_Strings"] = "2";
  $aktuelleDaten["Anz_MPP_Trackers"] = "2";
  $aktuelleDaten["Effizienz"] = 0;
  $GeraeteAdresse = $WR_ID;
  $FunktionsCode = "04";
  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "000F";   // Hex
  $DatenTyp = "String";
  $Timebase = 3000; //  Wie lange soll auf eine Antwort gewartet werden?
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Firmware"] = $Ergebnis["Wert"];
    $funktionen->log_schreiben( "Firmware: ".$aktuelleDaten["Firmware"], "   ", 5 );

  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (4990 -1);  // Dezimal
  $RegisterAnzahl = "000A";   // Hex
  $DatenTyp = "String";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Seriennummer"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

 

  $RegisterAdresse = (5000 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "Hex";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Produkt"] = $Ergebnis["Wert"];
    $aktuelleDaten["ModellID"] = hexdec($Ergebnis["Wert"]);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Leistungsklasse"] = ($Ergebnis["Wert"]*100);  // in Watt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5002 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Phasen"] = $Ergebnis["Wert"];  // 0 = 1 Phase,   1 = 3 Phasen mit Nullleiter,    2 = 3 Phasen Drehstrom
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Energie_Heute"] = $Ergebnis["Wert"];  // 0 = 1 Phase,   1 = 3 Phasen mit Nullleiter,    2 = 3 Phasen Drehstrom
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5008 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Temperatur"] = ($Ergebnis["Wert"]/10);  // in °C
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5011 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV1_Spannung"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5013 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV2_Spannung"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5012 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV1_Strom"] = ($Ergebnis["Wert"]/10);  // in Ampere
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV2_Strom"] = ($Ergebnis["Wert"]/10);  // in Ampere
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5017 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Leistung"] = $Ergebnis["Wert"];  // in Watt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5019 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_R"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5020 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_S"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5021 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_T"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5036 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Frequenz"] = ($Ergebnis["Wert"]/10);  // in Hertz
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Energie_Heute"] = ($Ergebnis["Wert"]*100);  // in Watt/Stunden
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Energie_Monat"] = ($Ergebnis["Wert"]*100);  // in Wh
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "Hex";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["DeviceStatus"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Status"] = $Ergebnis["Wert"];
    $aktuelleDaten["StatusBit"] = $funktionen->d2b($Ergebnis["Wert"]);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["WattstundenGesamtHeute"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5004-1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["WattstundenGesamt"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5004 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Hausverbrauch"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5004 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    if ($Ergebnis["Wert"] > 0) {
      $aktuelleDaten["Einspeisung"] = $Ergebnis["Wert"];
      $aktuelleDaten["Bezug"] = 0;
    } 
    else {
      $aktuelleDaten["Bezug"] = abs($Ergebnis["Wert"]);
      $aktuelleDaten["Einspeisung"] = 0;
    }

  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5011 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Spannung"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5012 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Strom"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Leistung"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";       // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["SOC"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5033 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Leistung"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Entladung"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Ladung"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["FehlerCode"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  /****************************************************************************
  //  ENDE REGLER AUSLESEN      ENDE REGLER AUSLESEN      ENDE REGLER AUSLESEN
  ****************************************************************************/

  if ($aktuelleDaten["Produkt"] == "0d09") {
    $aktuelleDaten["Modell"] = "SH5K-20";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d06") {
    $aktuelleDaten["Modell"] = "SH3K6";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d07") {
    $aktuelleDaten["Modell"] = "SH4K6";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d03") {
    $aktuelleDaten["Modell"] = "SH5K-V13";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0c") {
    $aktuelleDaten["Modell"] = "SH5K-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0a") {
    $aktuelleDaten["Modell"] = "SH3K6-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0b") {
    $aktuelleDaten["Modell"] = "SH4K6-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0f") {
    $aktuelleDaten["Modell"] = "SH5.0RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0d") {
    $aktuelleDaten["Modell"] = "SH3.6RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0e") {
    $aktuelleDaten["Modell"] = "SH4.6RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d10") {
    $aktuelleDaten["Modell"] = "SH6.0RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e03") {
    $aktuelleDaten["Modell"] = "SH10RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e02") {
    $aktuelleDaten["Modell"] = "SH8.0RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e01") {
    $aktuelleDaten["Modell"] = "SH6.0RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e00") {
    $aktuelleDaten["Modell"] = "SH5.0RT";
  }
  else {
    $aktuelleDaten["Modell"] = "unbekannt";
  }

  $aktuelleDaten["PV1_Leistung"] = ($aktuelleDaten["PV1_Spannung"] * $aktuelleDaten["PV1_Strom"]);
  $aktuelleDaten["PV2_Leistung"] = ($aktuelleDaten["PV2_Spannung"] * $aktuelleDaten["PV2_Strom"]);


  /***************************************************************************
  //  Falls ein ErrorCode vorliegt, wird er hier in einen lesbaren
  //  Text umgewandelt, sodass er als Fehlermeldung gesendet werden kann.
  //  Die Funktion ist noch nicht überall implementiert.
  ***************************************************************************/
  $FehlermeldungText = "";

  /****************************************************************************
  //  Die Daten werden für die Speicherung vorbereitet.
  ****************************************************************************/
  $aktuelleDaten["Regler"] = $Regler;
  $aktuelleDaten["Objekt"] = $Objekt;
  $aktuelleDaten["Produkt"] = $aktuelleDaten["Modell"];
  $aktuelleDaten["zentralerTimestamp"] = ($aktuelleDaten["zentralerTimestamp"] + 10);
  $funktionen->log_schreiben( var_export( $aktuelleDaten, 1 ), "   ", 8 );


  /****************************************************************************
  //  User PHP Script, falls gewünscht oder nötig
  ****************************************************************************/
  if (file_exists( "/var/www/html/rct_wr_math.php" )) {
    include 'rct_wr_math.php'; // Falls etwas neu berechnet werden muss.
  }

  /**************************************************************************
  //  Alle ausgelesenen Daten werden hier bei Bedarf als mqtt Messages
  //  an den mqtt-Broker Mosquitto gesendet.
  //  Achtung! Die Übertragung dauert ca. 30 Sekunden!
  **************************************************************************/
  if ($MQTT and $i == 1) {
    $funktionen->log_schreiben( "MQTT Daten zum [ $MQTTBroker ] senden.", "   ", 1 );
    require ($Pfad."/mqtt_senden.php");
  }

  /****************************************************************************
  //  Zeit und Datum
  ****************************************************************************/
  $aktuelleDaten["Timestamp"] = time( );
  $aktuelleDaten["Monat"] = date( "n" );
  $aktuelleDaten["Woche"] = date( "W" );
  $aktuelleDaten["Wochentag"] = strftime( "%A", time( ));
  $aktuelleDaten["Datum"] = date( "d.m.Y" );
  $aktuelleDaten["Uhrzeit"] = date( "H:i:s" );

  /****************************************************************************
  //  InfluxDB  Zugangsdaten ...stehen in der user.config.php
  //  falls nicht, sind das hier die default Werte.
  ****************************************************************************/
  $aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
  $aktuelleDaten["InfluxPort"] = $InfluxPort;
  $aktuelleDaten["InfluxUser"] = $InfluxUser;
  $aktuelleDaten["InfluxPassword"] = $InfluxPassword;
  $aktuelleDaten["InfluxDBName"] = $InfluxDBName;
  $aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
  $aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
  $aktuelleDaten["InfluxSSL"] = $InfluxSSL;
  $aktuelleDaten["Demodaten"] = false;

  /*********************************************************************
  //  Daten werden in die Influx Datenbank gespeichert.
  //  Lokal und Remote bei Bedarf.
  *********************************************************************/
  if ($InfluxDB_remote) {
    // Test ob die Remote Verbindung zur Verfügung steht.
    if ($RemoteDaten) {
      $rc = $funktionen->influx_remote_test( );
      if ($rc) {
        $rc = $funktionen->influx_remote( $aktuelleDaten );
        if ($rc) {
          $RemoteDaten = false;
        }
      }
      else {
        $RemoteDaten = false;
      }
    }
    if ($InfluxDB_local) {
      $rc = $funktionen->influx_local( $aktuelleDaten );
    }
  }
  else {
    $rc = $funktionen->influx_local( $aktuelleDaten );
  }
  if (is_file( $Pfad."/1.user.config.php" )) {
    // Ausgang Multi-Regler-Version
    $Zeitspanne = (7 - (time( ) - $Start));
    $funktionen->log_schreiben( "Multi-Regler-Ausgang. ".$Zeitspanne, "   ", 2 );
    if ($Zeitspanne > 0) {
      sleep( $Zeitspanne );
    }
    break;
  }
  else {
    $funktionen->log_schreiben( "Schleife: ".($i)." Zeitspanne: ".(floor( (56 - (time( ) - $Start)) / ($Wiederholungen - $i + 1))), "   ", 9 );
    sleep( floor( (56 - (time( ) - $Start)) / ($Wiederholungen - $i + 1)));
  }
  if ($Wiederholungen <= $i or $i >= 1) {
    //  Die RCT Wechselrichter dürfen nur einmal pro Minute ausgelesen werden!
    $funktionen->log_schreiben( "Schleife ".$i." Ausgang...", "   ", 5 );
    break;
  }
  $i++;
} while (($Start + 54) > time( ));

/*********************************************************************
//  Jede Minute werden bei Bedarf einige Werte zur Homematic Zentrale
//  übertragen.
*********************************************************************/
if (isset($Homematic) and $Homematic == true) {
  $funktionen->log_schreiben( "Daten werden zur HomeMatic übertragen...", "   ", 8 );
  require ($Pfad."/homematic.php");
}

/*********************************************************************
//  Sollen Nachrichten an einen Messenger gesendet werden?
//  Bei einer Multi-Regler-Version sollte diese Funktion nur bei einem
//  Gerät aktiviert sein.
*********************************************************************/
if (isset($Messenger) and $Messenger == true) {
  $funktionen->log_schreiben( "Nachrichten versenden...", "   ", 8 );
  require ($Pfad."/meldungen_senden.php");
}
$funktionen->log_schreiben( "OK. Datenübertragung erfolgreich.", "   ", 7 );

Ausgang:fclose( $COM1 );
$funktionen->log_schreiben( "-------------   Stop   sungrow.php    -------------------------- ", "|--", 6 );
return;
?>

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

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von Ulrich »

and777 hat geschrieben:
So 17. Jul 2022, 16:23
ba0547 hat geschrieben:
Do 14. Jul 2022, 22:12
Umso besser das es mit der Solaranzeige dann doch auch über RS485 funktioniert. Welchen der beiden Anschlüsse hast du genutzt?
Angeschlossen an die "Com." Buchse vom Wechselrichter (4 Drähte: +5VDC; GND;TX;RX)

Was die Sungrow.PHP betrifft:
Habe einfach unter "Register_Adresse" die Register, die nur ein Hybrid-WR hat und bei unserem Wechselrichter ja logischerweise nicht vorhanden sind, ersetzt durch vorhandene Register. Ist eigentlich so erstmal nur provisorische Lösung, da jetzt in die Datenbank teilweise Müll geschrieben wird.
Bin leider kein Programmierer, um es richtig zu machen.

@Ulrich : kann gerne helfen und die Register für die Variante "Sungrow-SG über RS485-Adapter" eintragen.
Oder ist es möglich den Script so anzupassen, das es erkannt wird anhand von Modell_Nr, um welchen WR es sich handelt, und so auch nur vorhanden Register ausgelesen werden?

Momentan sieht mein Sungrow.PHP so aus: (Bitte nur als Muster verwenden, ist keine endgültige Lösung!!!):

Code: Alles auswählen

#!/usr/bin/php
<?php

/*****************************************************************************
//  Solaranzeige Projekt             Copyright (C) [2016 - 2021] [Ulrich Kunz]
//
//  Dieses Programm ist freie Software. Sie können es unter den Bedingungen
//  der GNU General Public License, wie von der Free Software Foundation
//  veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß
//  Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
//
//  Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es
//  Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
//  die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
//  BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
//
//  Ein original Exemplar der GNU General Public License finden Sie hier:
//  http://www.gnu.org/licenses/
//
//  Dies ist ein Programmteil des Programms "Solaranzeige"
//
//  Es dient dem Auslesen der VARTA Storage Modelle wie z.B.
//  VARTA element, VARTA pulse, VARTA link, VARTA flex storage usw.
//  mit LAN Schnittstelle.
//  Das Auslesen wird hier mit einer Schleife durchgeführt. Wie oft die Daten
//  ausgelesen und gespeichert werden steht in der user.config.php
//
//
//
*****************************************************************************/
$path_parts = pathinfo( $argv[0] );
$Pfad = $path_parts['dirname'];
if (!is_file( $Pfad."/1.user.config.php" )) {
  // Handelt es sich um ein Multi Regler System?
  require ($Pfad."/user.config.php");
}
require_once ($Pfad."/phpinc/funktionen.inc.php");
if (!isset($funktionen)) {
  $funktionen = new funktionen( );
}
// Im Fall, dass man die Device manuell eingeben muss
if (isset($USBDevice) and !empty($USBDevice)) {
  $USBRegler = $USBDevice;
}
$Tracelevel = 7; //  1 bis 10  10 = Debug
$RemoteDaten = true;
$Device = "WR"; // WR = Wechselrichter
$Version = "";
$Start = time( ); // Timestamp festhalten
$funktionen->log_schreiben( "-------------   Start  sungrow.php    -------------------------- ", "|--", 6 );
$funktionen->log_schreiben( "Zentraler Timestamp: ".$zentralerTimestamp, "   ", 8 );
$aktuelleDaten = array();
$aktuelleDaten["zentralerTimestamp"] = $zentralerTimestamp;
setlocale( LC_TIME, "de_DE.utf8" );
//  Hardware Version ermitteln.
$Teile = explode( " ", $Platine );
if ($Teile[1] == "Pi") {
  $funktionen->log_schreiben( "Hardware Version: ".$Platine, "o  ", 8 );
  $Version = trim( $Teile[2] );
  if ($Teile[3] == "Model") {
    $Version .= trim( $Teile[4] );
    if ($Teile[5] == "Plus") {
      $Version .= trim( $Teile[5] );
    }
  }
}
switch ($Version) {

  case "2B":
    break;

  case "3B":
    break;

  case "3BPlus":
    break;

  case "4B":
    break;

  default:
    break;
}

if (empty($WR_Adresse)) {
  $WR_ID = "FF";
}
elseif(strlen($WR_Adresse) == 1)  {
  $WR_ID = str_pad(dechex($WR_Adresse),2,"0",STR_PAD_LEFT);
}
else {
  $WR_ID = str_pad(dechex($WR_Adresse),2,"0",STR_PAD_LEFT);
}

$funktionen->log_schreiben("WR_ID: ".$WR_ID,"+  ",8);


$COM1 = fsockopen( $WR_IP, $WR_Port, $errno, $errstr, 10 ); // 10 = Timeout in Sekunden
if (!is_resource( $COM1 )) {
  $funktionen->log_schreiben( "Kein Kontakt zum Wechselrichter ".$WR_IP."  Port: ".$WR_Port, "XX ", 3 );
  $funktionen->log_schreiben( "Exit.... ", "XX ", 9 );
  goto Ausgang;
}

$i = 1;
do {
  $funktionen->log_schreiben( "Die Daten werden ausgelesen...", "+  ", 7 );

  /****************************************************************************
  //  Ab hier wird der Wechselrichter ausgelesen.
  //
  //    $aktuelleDaten["Firmware"]
  //    $aktuelleDaten["Seriennummer"]
  //    $aktuelleDaten["Produkt"]
  //    $aktuelleDaten["Leistungsklasse"]
  //    $aktuelleDaten["Phasen"]
  //    $aktuelleDaten["Temperatur"]
  //    $aktuelleDaten["PV1_Spannung"]
  //    $aktuelleDaten["PV2_Spannung"]
  //    $aktuelleDaten["PV1_Strom"]
  //    $aktuelleDaten["PV2_Strom"]
  //    $aktuelleDaten["DC_Leistung"]
  //    $aktuelleDaten["AC_Spannung_R"]
  //    $aktuelleDaten["AC_Spannung_S"]
  //    $aktuelleDaten["AC_Spannung_T"]
  //    $aktuelleDaten["Frequenz"]
  //    $aktuelleDaten["PV_Power_Heute"]
  //    $aktuelleDaten["PV_Energie_Monat"]
  //    $aktuelleDaten["System_Status"]
  //    $aktuelleDaten["Status"]
  //    $aktuelleDaten["WattstundenGesamtHeute"]
  //    $aktuelleDaten["WattstundenGesamt"]
  //    $aktuelleDaten["Bezug"]
  //    $aktuelleDaten["Einspeisung"]
  //    $aktuelleDaten["Batterie_Spannung"]
  //    $aktuelleDaten["PV1_Leistung"]
  //    $aktuelleDaten["PV2_Leistung"]
  //
  //  function modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp )
  //
  //
  ****************************************************************************/
  $aktuelleDaten["Anz_PV_Strings"] = "2";
  $aktuelleDaten["Anz_MPP_Trackers"] = "2";
  $aktuelleDaten["Effizienz"] = 0;
  $GeraeteAdresse = $WR_ID;
  $FunktionsCode = "04";
  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "000F";   // Hex
  $DatenTyp = "String";
  $Timebase = 3000; //  Wie lange soll auf eine Antwort gewartet werden?
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Firmware"] = $Ergebnis["Wert"];
    $funktionen->log_schreiben( "Firmware: ".$aktuelleDaten["Firmware"], "   ", 5 );

  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (4990 -1);  // Dezimal
  $RegisterAnzahl = "000A";   // Hex
  $DatenTyp = "String";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Seriennummer"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

 

  $RegisterAdresse = (5000 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "Hex";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Produkt"] = $Ergebnis["Wert"];
    $aktuelleDaten["ModellID"] = hexdec($Ergebnis["Wert"]);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Leistungsklasse"] = ($Ergebnis["Wert"]*100);  // in Watt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5002 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Phasen"] = $Ergebnis["Wert"];  // 0 = 1 Phase,   1 = 3 Phasen mit Nullleiter,    2 = 3 Phasen Drehstrom
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Energie_Heute"] = $Ergebnis["Wert"];  // 0 = 1 Phase,   1 = 3 Phasen mit Nullleiter,    2 = 3 Phasen Drehstrom
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5008 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Temperatur"] = ($Ergebnis["Wert"]/10);  // in °C
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5011 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV1_Spannung"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5013 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV2_Spannung"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5012 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV1_Strom"] = ($Ergebnis["Wert"]/10);  // in Ampere
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "I16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV2_Strom"] = ($Ergebnis["Wert"]/10);  // in Ampere
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5017 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Leistung"] = $Ergebnis["Wert"];  // in Watt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5019 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_R"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5020 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_S"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5021 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Spannung_T"] = ($Ergebnis["Wert"]/10);  // in Volt
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5036 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Frequenz"] = ($Ergebnis["Wert"]/10);  // in Hertz
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Energie_Heute"] = ($Ergebnis["Wert"]*100);  // in Watt/Stunden
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5003 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["PV_Energie_Monat"] = ($Ergebnis["Wert"]*100);  // in Wh
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "Hex";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["DeviceStatus"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Status"] = $Ergebnis["Wert"];
    $aktuelleDaten["StatusBit"] = $funktionen->d2b($Ergebnis["Wert"]);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5001 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["WattstundenGesamtHeute"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5004-1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["WattstundenGesamt"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5004 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Hausverbrauch"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5004 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    if ($Ergebnis["Wert"] > 0) {
      $aktuelleDaten["Einspeisung"] = $Ergebnis["Wert"];
      $aktuelleDaten["Bezug"] = 0;
    } 
    else {
      $aktuelleDaten["Bezug"] = abs($Ergebnis["Wert"]);
      $aktuelleDaten["Einspeisung"] = 0;
    }

  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5011 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Spannung"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5012 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Strom"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Leistung"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";       // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["SOC"] = ($Ergebnis["Wert"]/10);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5033 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "I32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["AC_Leistung"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Entladung"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  $RegisterAdresse = (5014 -1);  // Dezimal
  $RegisterAnzahl = "0001";      // HEX
  $DatenTyp = "U16";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["Batterie_Ladung"] = ($Ergebnis["Wert"]*100);
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }

  $RegisterAdresse = (4954 -1);  // Dezimal
  $RegisterAnzahl = "0002";      // HEX
  $DatenTyp = "U32S";
  $Ergebnis = $funktionen->modbus_tcp_lesen( $COM1, $GeraeteAdresse, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase );
  if (is_array( $Ergebnis )) {
    $aktuelleDaten["FehlerCode"] = $Ergebnis["Wert"];
  }
  else {
    $funktionen->log_schreiben( "Lesefehler => Ausgang.", "   ", 5 );
    goto Ausgang;
  }


  /****************************************************************************
  //  ENDE REGLER AUSLESEN      ENDE REGLER AUSLESEN      ENDE REGLER AUSLESEN
  ****************************************************************************/

  if ($aktuelleDaten["Produkt"] == "0d09") {
    $aktuelleDaten["Modell"] = "SH5K-20";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d06") {
    $aktuelleDaten["Modell"] = "SH3K6";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d07") {
    $aktuelleDaten["Modell"] = "SH4K6";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d03") {
    $aktuelleDaten["Modell"] = "SH5K-V13";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0c") {
    $aktuelleDaten["Modell"] = "SH5K-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0a") {
    $aktuelleDaten["Modell"] = "SH3K6-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0b") {
    $aktuelleDaten["Modell"] = "SH4K6-30";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0f") {
    $aktuelleDaten["Modell"] = "SH5.0RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0d") {
    $aktuelleDaten["Modell"] = "SH3.6RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d0e") {
    $aktuelleDaten["Modell"] = "SH4.6RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0d10") {
    $aktuelleDaten["Modell"] = "SH6.0RS";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e03") {
    $aktuelleDaten["Modell"] = "SH10RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e02") {
    $aktuelleDaten["Modell"] = "SH8.0RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e01") {
    $aktuelleDaten["Modell"] = "SH6.0RT";
  }
  elseif ($aktuelleDaten["Produkt"] == "0e00") {
    $aktuelleDaten["Modell"] = "SH5.0RT";
  }
  else {
    $aktuelleDaten["Modell"] = "unbekannt";
  }

  $aktuelleDaten["PV1_Leistung"] = ($aktuelleDaten["PV1_Spannung"] * $aktuelleDaten["PV1_Strom"]);
  $aktuelleDaten["PV2_Leistung"] = ($aktuelleDaten["PV2_Spannung"] * $aktuelleDaten["PV2_Strom"]);


  /***************************************************************************
  //  Falls ein ErrorCode vorliegt, wird er hier in einen lesbaren
  //  Text umgewandelt, sodass er als Fehlermeldung gesendet werden kann.
  //  Die Funktion ist noch nicht überall implementiert.
  ***************************************************************************/
  $FehlermeldungText = "";

  /****************************************************************************
  //  Die Daten werden für die Speicherung vorbereitet.
  ****************************************************************************/
  $aktuelleDaten["Regler"] = $Regler;
  $aktuelleDaten["Objekt"] = $Objekt;
  $aktuelleDaten["Produkt"] = $aktuelleDaten["Modell"];
  $aktuelleDaten["zentralerTimestamp"] = ($aktuelleDaten["zentralerTimestamp"] + 10);
  $funktionen->log_schreiben( var_export( $aktuelleDaten, 1 ), "   ", 8 );


  /****************************************************************************
  //  User PHP Script, falls gewünscht oder nötig
  ****************************************************************************/
  if (file_exists( "/var/www/html/rct_wr_math.php" )) {
    include 'rct_wr_math.php'; // Falls etwas neu berechnet werden muss.
  }

  /**************************************************************************
  //  Alle ausgelesenen Daten werden hier bei Bedarf als mqtt Messages
  //  an den mqtt-Broker Mosquitto gesendet.
  //  Achtung! Die Übertragung dauert ca. 30 Sekunden!
  **************************************************************************/
  if ($MQTT and $i == 1) {
    $funktionen->log_schreiben( "MQTT Daten zum [ $MQTTBroker ] senden.", "   ", 1 );
    require ($Pfad."/mqtt_senden.php");
  }

  /****************************************************************************
  //  Zeit und Datum
  ****************************************************************************/
  $aktuelleDaten["Timestamp"] = time( );
  $aktuelleDaten["Monat"] = date( "n" );
  $aktuelleDaten["Woche"] = date( "W" );
  $aktuelleDaten["Wochentag"] = strftime( "%A", time( ));
  $aktuelleDaten["Datum"] = date( "d.m.Y" );
  $aktuelleDaten["Uhrzeit"] = date( "H:i:s" );

  /****************************************************************************
  //  InfluxDB  Zugangsdaten ...stehen in der user.config.php
  //  falls nicht, sind das hier die default Werte.
  ****************************************************************************/
  $aktuelleDaten["InfluxAdresse"] = $InfluxAdresse;
  $aktuelleDaten["InfluxPort"] = $InfluxPort;
  $aktuelleDaten["InfluxUser"] = $InfluxUser;
  $aktuelleDaten["InfluxPassword"] = $InfluxPassword;
  $aktuelleDaten["InfluxDBName"] = $InfluxDBName;
  $aktuelleDaten["InfluxDaylight"] = $InfluxDaylight;
  $aktuelleDaten["InfluxDBLokal"] = $InfluxDBLokal;
  $aktuelleDaten["InfluxSSL"] = $InfluxSSL;
  $aktuelleDaten["Demodaten"] = false;

  /*********************************************************************
  //  Daten werden in die Influx Datenbank gespeichert.
  //  Lokal und Remote bei Bedarf.
  *********************************************************************/
  if ($InfluxDB_remote) {
    // Test ob die Remote Verbindung zur Verfügung steht.
    if ($RemoteDaten) {
      $rc = $funktionen->influx_remote_test( );
      if ($rc) {
        $rc = $funktionen->influx_remote( $aktuelleDaten );
        if ($rc) {
          $RemoteDaten = false;
        }
      }
      else {
        $RemoteDaten = false;
      }
    }
    if ($InfluxDB_local) {
      $rc = $funktionen->influx_local( $aktuelleDaten );
    }
  }
  else {
    $rc = $funktionen->influx_local( $aktuelleDaten );
  }
  if (is_file( $Pfad."/1.user.config.php" )) {
    // Ausgang Multi-Regler-Version
    $Zeitspanne = (7 - (time( ) - $Start));
    $funktionen->log_schreiben( "Multi-Regler-Ausgang. ".$Zeitspanne, "   ", 2 );
    if ($Zeitspanne > 0) {
      sleep( $Zeitspanne );
    }
    break;
  }
  else {
    $funktionen->log_schreiben( "Schleife: ".($i)." Zeitspanne: ".(floor( (56 - (time( ) - $Start)) / ($Wiederholungen - $i + 1))), "   ", 9 );
    sleep( floor( (56 - (time( ) - $Start)) / ($Wiederholungen - $i + 1)));
  }
  if ($Wiederholungen <= $i or $i >= 1) {
    //  Die RCT Wechselrichter dürfen nur einmal pro Minute ausgelesen werden!
    $funktionen->log_schreiben( "Schleife ".$i." Ausgang...", "   ", 5 );
    break;
  }
  $i++;
} while (($Start + 54) > time( ));

/*********************************************************************
//  Jede Minute werden bei Bedarf einige Werte zur Homematic Zentrale
//  übertragen.
*********************************************************************/
if (isset($Homematic) and $Homematic == true) {
  $funktionen->log_schreiben( "Daten werden zur HomeMatic übertragen...", "   ", 8 );
  require ($Pfad."/homematic.php");
}

/*********************************************************************
//  Sollen Nachrichten an einen Messenger gesendet werden?
//  Bei einer Multi-Regler-Version sollte diese Funktion nur bei einem
//  Gerät aktiviert sein.
*********************************************************************/
if (isset($Messenger) and $Messenger == true) {
  $funktionen->log_schreiben( "Nachrichten versenden...", "   ", 8 );
  require ($Pfad."/meldungen_senden.php");
}
$funktionen->log_schreiben( "OK. Datenübertragung erfolgreich.", "   ", 7 );

Ausgang:fclose( $COM1 );
$funktionen->log_schreiben( "-------------   Stop   sungrow.php    -------------------------- ", "|--", 6 );
return;
?>

Bitte melde dich einmal per eMail. hilfe@....

Wir schauen dann einmal was machbar ist.
--------------------------------------
Ulrich [Admin]

ba0547
Beiträge: 50
Registriert: Do 23. Jan 2020, 21:03
Wohnort: Baunach
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von ba0547 »

Ich habe gestern mein ELFIN EE11A bekommen, werde in den nächsten Tagen mal versuchen den Raspi mit dem Wechselichter zu verbinden. Hoffe das dann auch die Überschussteuerung der phoenix Wallbox eingermassen funktionieren wird.

ba0547
Beiträge: 50
Registriert: Do 23. Jan 2020, 21:03
Wohnort: Baunach
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von ba0547 »

Hallo,
habe jetzt die Einbindung meines Sungrow Wechselrichters vollzogen. Mit der Anleitung von and777 hat es nach ein bisschen probieren geklappt. Mußte die sungrow.php nicht ändern. Der Wechselrichter wurde sofort erkannt und ausgelesen nachdem ich die entsprechenden config daten erzeugt hatte und eine weitere datenbank angelegt hatte. Die Einrichtung des serial/ethernet adapters hat erst nicht so gut geklappt. Vielleicht müßte man dazu eine kleine Anleitung schreiben?

ba0547
Beiträge: 50
Registriert: Do 23. Jan 2020, 21:03
Wohnort: Baunach
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: Sungrow SG10KTL-M keine LAN Schnittstelle, RS485 Möglich?

Beitrag von ba0547 »

Mit Hilfe des modifizierten Scripts kann ich meinen Wechselrichter zwar auslesen, aber nicht alle Werte machen einen Sinn. Frage mich wie man Werte die offensichtlich einen Hybrid Wechselrichter betreffen ausblenden oder auf 0 setzen kann. Werte für Batterie, Eigenverbrauch...

08.09. 11:37:52 -Firmware: LCD_MOONSTONE_V01_A_M
08.09. 11:37:52 MQT-MQTT Daten zum Broker gesendet bzw. vom Broker empfangen. Adresse: localhost Port: 1883
08.09. 11:38:01 -Zu viele PHP Scripte: multi_regler_auslesen.php
08.09. 11:38:01 !! -|---> Stop PHP Script: multi_regler_auslesen.php **************
08.09. 11:38:05 -array (
'zentralerTimestamp' => 1662629831,
'Anz_PV_Strings' => '2',
'Anz_MPP_Trackers' => '2',
'Effizienz' => 0,
'Firmware' => 'LCD_MOONSTONE_V01_A_M',
'Seriennummer' => 'A1710243783',
'Produkt' => 'unbekannt',
'ModellID' => 318,
'Leistungsklasse' => 10000,
'Phasen' => 1,
'WattstundenGesamtHeute' => 10000,
'WattstundenGesamt' => 25300,
'Temperatur' => 34.4,
'PV1_Spannung' => 604.9,
'PV2_Spannung' => 601,
'PV1_Strom' => 1.2,
'PV2_Strom' => 1.2,
'PV_Leistung' => 1449,
'AC_Spannung_R' => 234.2,
'AC_Spannung_S' => 232.4,
'AC_Spannung_T' => 233.6,
'AC_Frequenz' => 49.9,
'PV_Energie_Heute' => 2100,
'PV_Energie_Monat' => 2100,
'DeviceStatus' => '4c43',
'Batterie_Status' => 100,
'StatusBit' => '0000000001100100',
'Hausverbrauch' => 253,
'Einspeisung' => 253,
'Bezug' => 0,
'Batterie_Spannung' => 605.6,
'Batterie_Strom' => 1.2,
'Batterie_Leistung' => 12,
'SOC' => 1.2,
'AC_Leistung' => -5.0,
'Batterie_Entladung' => 1300,
'Batterie_Ladung' => 1200,
'FehlerCode' => 1147096131,
'Modell' => 'unbekannt',
'PV1_Leistung' => 725.88,
'PV2_Leistung' => 721.1999999999999,
'Regler' => '70',
'Objekt' => '',
)
08.09. 11:38:05 -MQTT Daten zum [ localhost ] senden.
08.09. 11:38:05 -InfluxDB => [ AC Spannung_R=234.2,Spannung_S=232.4,Spannung_T=233.6,Frequenz=49.9,Leistung=-5,Einspeisung=253,Bezug=0,Hausverbrauch=253 1662629831
PV Leistung=1449,Spannung1=604.9,Strom1=1.2,Leistung1=725.88,Spannung2=601,Strom2=1.2,Leistung2=721.2 1662629831
Batterie LadeLeistung=1200,EntladeLeistung=1300,Status=100,SOC=1.2 1662629831
Service Temperatur=34.4,WR_Fehler=1147096131,Status=4c43,Anz_MPPT=2,Modell_ID=318,Modell="LCD_MOONSTONE_V01_A_M",Effizienz=0 1662629831
Summen Wh_GesamtHeute=10000,Wh_Gesamt=25300,Wh_Heute=10000 1662629831
]

Antworten