Danke für die Skripte!
Ich hänge mich hier mal mit meinen gesammelten Infos dran. Das ist eher die „zu Fuß“ Methode. Das Auslesen mit den Skripten aus dem ersten Beitrag ist natürlich eleganter
Hier sind z.B. auch die Infos für einen LG Chem Resu 10H Speicher enthalten:
Meine Anlagenkonfiguration:
Wechselrichter: Solaredge SE5000H
Speicher: LG Chem Resu 10H
6,5 kWp
Hier die Adressen die ich verwende mit ein paar Zusatzinfos zum Umrechnen. Die Skripte sind wohl etwas stümperhaft… funktionieren aber.
Zum Ablauf der Umrechnung:
Zu fast jedem Wert gibt es einen Skalierungsfaktor der ebenfalls über Modbus ausgelesen wird. Mit diesem Skalierungsfaktor muss der eigentliche Wert umgerechnet werden. Hierzu habe ich unter jedem Modbus Device eine neue Float Variable erstellt und mit entsprechendem Profil versehen. Dann noch ein Script für das jeweilige Modbus Device erstellt das mit einem Ereignis aufgerufen wird. (Immer wenn der Skalierungsfaktor aktualisiert wird -> Script ausführen) Wichtig ist das nur die Modbus Devices für den Skalierungsfaktor zyklisch abgerufen werden. Also z. B. alle 30 Sekunden. Die Modbus Devices mit den eigentlichen Werten werden nur beim ausführen des Skripts ausgelesen. Werden beide zyklisch gelesen kommt es teilweise zu falschen Ergebnissen weil dann der Skalierungsfaktor z.B. nicht zum Wert passt. Man erhält dann z.B. nicht 450 Watt sondern 4500 Watt…
Die unten aufgeführten Adressen sind nicht komplett sondern enthalten nur die Werte die für mich relevant sind. Wenn was fehlt müsst ihr euch die Werte aus der Sunspec Dokumentation ziehen!
Falls hier jetzt jemand, angesichts meiner Skripte, die Hände über dem Kopf zusammenschlägt bin ich natürlich für elegantere Lösungen offen
Die IDs in den Skripten müssen natürlich entsprechend angepasst werden!
Solaredge Modbus Adressen:
Name: AC - Netzfrequenz (Herz)
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 85[/li][li]Factor: Dividiere durch 1000[/li][/ul]
[HR][/HR]
Name: AC - Gesamte Produktion (kWh)
[ul]
[li]Einheit: DWord (32Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 93[/li][li]Factor: keinen[/li][/ul]
Name: AC - Gesamte Produktion (kWh) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 95[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(11487); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(30961);
$scalefactor = GetValueInteger(49750);
$data = $original * 1 ** $scalefactor;
$data2 = $data / 1000;
SetValueFloat(42127, $data2);
?>
[HR][/HR]
Name: AC - Leistung (Watt)
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 83[/li][li]Factor: keinen[/li][/ul]
Name: AC - Leistung (Watt) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 84[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(21222); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(53191);
$scalefactor = GetValueInteger(52040);
$data = $original * 10 ** $scalefactor;
SetValueFloat(27462, $data);
?>
[HR][/HR]
Name: AC - Strom (Ampere)
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 71[/li][li]Factor: keinen[/li][/ul]
Name: AC - Strom (Ampere) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 75[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(27901); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(32725);
$scalefactor = GetValueInteger(24015);
$data = $original * 10 ** $scalefactor;
SetValueFloat(51954, $data);
?>
[HR][/HR]
Name: DC - Leistung (Watt) die vom Wechselrichter in AC umgewandelt wird
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 100[/li][li]Factor: keinen[/li][/ul]
Name: DC - Leistung (Watt) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 101[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(43139); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(22196);
$scalefactor = GetValueInteger(48284);
$data = $original * 10 ** $scalefactor;
SetValueFloat(21176, $data);
?>
[HR][/HR]
Name: DC - Spannung (Volt)
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 98[/li][li]Factor: keinen[/li][/ul]
Name: DC - Spannung (Volt) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 99[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(53508); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(10607);
$scalefactor = GetValueInteger(20091);
$data = $original * 10 ** $scalefactor;
SetValueFloat(11695, $data);
?>
[HR][/HR]
Name: DC - Strom (Ampere)
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 96[/li][li]Factor: keinen[/li][/ul]
Name: DC - Strom (Ampere) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 97[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(55900); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(46616);
$scalefactor = GetValueInteger(38686);
$data = $original * 10 ** $scalefactor;
SetValueFloat(44619, $data);
?>
[HR][/HR]
Name: Eingespeiste kWh
[ul]
[li]Einheit: DWord (32Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 226[/li][li]Factor: keinen[/li][/ul]
Name: Eingespeiste kWh SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 242[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(41873); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(22211);
$scalefactor = GetValueInteger(43041);
$data = $original * 10 ** $scalefactor;
$data2 = $data / 1000;
SetValueFloat(58001, $data2);
?>
[HR][/HR]
Name: Bezogene kWh
[ul]
[li]Einheit: DWord (32Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 234[/li][li]Factor: keinen[/li][/ul]
Name: Bezogene kWh SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 242[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(36015); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(39392);
$scalefactor = GetValueInteger(12867);
$data = $original * 10 ** $scalefactor;
$data2 = $data / 1000;
SetValueFloat(52819, $data2);
?>
[HR][/HR]
Name: Status Wechselrichter
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 107[/li][li]Factor: keinen[/li][/ul]
Variablenprofil:
1 = Off
2 = Sleeping
3 = Grid Monitoring
4 = On
5 = Produktion
6 = Shutting Down
7 = Fault
8 = Setup
[HR][/HR]
Name: Einspeisung/Bezug (kW)
Minuswerte = Strombezug aus dem Netz, Pluswerte = Einspeisung in das Netz)
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 206[/li][li]Factor: keinen[/li][/ul]
Name: Einspeisung/Bezug (kW) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 210[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(12237); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(44899);
$scalefactor = GetValueInteger(54001);
$data = $original * 10 ** $scalefactor;
$data2 = $data / 1000;
SetValueFloat(29957, $data2);
?>
[HR][/HR]
Name: Temperatur Wechselrichter (°C)
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 103[/li][li]Factor: keinen[/li][/ul]
Name: Temperatur Wechselrichter (°C) SKALIERUNGSFAKTOR
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 106[/li][li]Factor: keinen[/li][/ul]
<?
ModBus_RequestRead(58998); //ID des Modbus Device welches ausgelesen werden soll
$original = GetValueInteger(10287);
$scalefactor = GetValueInteger(32574);
$data = $original * 10 ** $scalefactor;
SetValueFloat(23899, $data);
?>
[HR][/HR]
Name: Wechselrichter Typ
[ul]
[li]Einheit: Word (16Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 69[/li][li]Factor: keinen[/li][/ul]
Variablenprofil:
101 = single phase
102 = split phase
103 = three phase
[HR][/HR]
Speicher (LG Chem Resu 10H)
Name: Ladezustand in Prozent
[ul]
[li]Einheit: DWord (32Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 62852[/li][li]Factor: keinen[/li][/ul]
<?
$ips_data = GetValueInteger(40344);
$ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16);
$float_value = u32ToFloat($ips_data_WordSwapped);
SetValueFloat(54116, $float_value);
function u32ToFloat($u32)
{
$sign = ($u32&0x80000000)? -1:1;
$exponent = (($u32&0x7F800000)>>23) - 127;
$base = (float)(($u32 & 0x007FFFFF)|0x00800000)/0x00800000 ;
return ((float) $sign * pow(2, $exponent) * $base);
}
?>
[HR][/HR]
Name: Speicherleistung in Watt (Negative Werte = Speicher Entladen, Positiv = Speicher laden…)
[ul]
[li]Einheit: DWord (32Bit - vorzeichenlos)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 62836[/li][li]Factor: keinen[/li][/ul]
<?
$ips_data = GetValueInteger(52988);
$ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16);
$float_value = u32ToFloat($ips_data_WordSwapped);
SetValueFloat(16893, $float_value);
function u32ToFloat($u32)
{
$sign = ($u32&0x80000000)? -1:1;
$exponent = (($u32&0x7F800000)>>23) - 127;
$base = (float)(($u32 & 0x007FFFFF)|0x00800000)/0x00800000 ;
return ((float) $sign * pow(2, $exponent) * $base);
}
?>
[HR][/HR]
Name: Speicherstatus
[ul]
[li]Einheit: Short (16Bit - vorzeichenbehaftet)[/li][li]Funktion (Lesen): Holding Register auslesen (03)[/li][li]Modbus Adresse: 62854[/li][li]Factor: keinen[/li][/ul]
Variablenprofil:
1 = Aus
3 = Laden
4 = Entladen
6 = Erhaltungsladung
Und so sieht die Struktur bei mir aus:
Sonnige Grüße
Stephan