ModbusAttr an Wechselrichter SolarEdge SE10k [gelöst]

Begonnen von BenMarloe, 09 Dezember 2017, 00:14:24

Vorheriges Thema - Nächstes Thema

pejonp

Hi Matthias versuche mal bitte nocheinmal ein update.
Und starte auch fhem neu. Eigentlich sollte es gehen wenn nicht hänge mal einen log mit verbose=4 an
Danke
Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

beejayf

@matkoh

Wenn du die Möglichkeit hast FHEM irgendwo frisch zu installieren, könntest du (wenn die neue Installation funktioniert) einzelne Module deiner Original-Installation ersetzen (nach einem vollen Backup)

matkoh

Hallo Jörg, hallo beejayf,

alle Updates helfen nicht, es bleibt bei dem Fehler, dass das Modul nicht geladen werden kann.

Ich mache allerdings täglich ein Backup von FHEM und ich habe nun aus dem Backup vom 22.10. die Module
98_Modbus.pm
98_ModbusAttr.pm
in die produktive FHEM-Installation kopiert und FHEM neu gestartet. Das hat geholfen, nun wird das SolarEdge-Modul wieder geladen und mein Device ist normal vorhanden und sogar in der letzten Version. Derzeit also alles wieder gut.

Danke für Eure Hilfe

Matthias

pejonp

Hallo Björn,

ich habe diese hier. Ich hänge sie mal an.

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

beejayf

Bin die absolute Perl Null also wenn ich falsch liege nicht böse sein

Das Register ist ja dezimal angegeben. Steht das 'h' davor nicht für Hex?
In der Doku steht dass ein float abgelegt wird. Dein Unpack steht doch für long integer

Ich probier mal durch, ob es daran liegt

Grüße,

Björn

pejonp

Hi Björn,

ich habe ja schon verschieden Sachen probiert. Du kannst es gerne versuchen. Da du ja eine Batterie hast bekomst du auch gleich eine Rückmeldung.

ZitatDas Register ist ja dezimal angegeben. Steht das 'h' davor nicht für Hex?
Stimmt wo du es schreibst, sehe ich es auch.

Ich bau mal die richtigen Register ein und hänge das dann hier an. Wird aber bischen dauern.

Jörg
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

beejayf

Wobei - die ganzen Strings wie z.B. Battery_1_Firmware werden bei mir richtig ausgelesen.

Es muss also im unpack liegen

Ich schaue mir dabei gerade den Wert Battery 1 Max Discharge Continues Power an - in der Doku steht:

E146 (F546) 2 R Battery 1 Max Discharge Continues Power Float32 W

Meine Batterie sollte 5000W (ggf. auch 7000W) dort eingetragen haben. Warum so ein Wert als Float32 gespeichert sein soll weiß ich nicht - aber sei's drum.

Habe diverse Kombinationen durchprobiert - aber leider ohne Erfolg.

beejayf

Hallo @pejonp,

Hab ein wenig im Netz herumgesucht / gefragt und eine Antwort bekommen, dass der Wert für z.B. Battery_1_Max_Discharge_Peak_Power_W, der laut meiner Doku 5000 sein sollte aus den abgelegten Daten nicht mit einem einzigen unpack herausgelesen werden kann, da die Daten offenbar byteweise verdreht abgelegt sind. Folgende Operation soll wohl zum Ziel führen, und wann es stimmt, dann sollte das für alle FLOAT32 Werte funktionieren

unpack "f<", pack "vv", unpack "nn", $s

Wobei ich glaube, dass $s ledliglich die Zielvariable ist - aber ich habe keine Ahnung, wie man das in Dein Modul packen muss.

Grüße,

BJ

cocojambo

@pejonp

ich möchte mich auch mal hier melden. Ich habe eine 10kw Sunpower Solaranlage, zwei Sunpower/Fronius Wechselrichter, einen SE5000 Inverter, eine Store Edge Schnittstelle, eine 10kw LG Batterie und ein Solarlog 1000 im Einsatz.
Bei mir werden jedoch durch Stromsensoren die Leitungsströme gemessen und im Se5000 mir Store Edge Schnittstelle ausgewertet und damit die Lade- Eigenverbrauch-, Einspeise- und Entladeströme gesteuert.
Ich habe mich seit längeren schon mit dem ModbusAttr Modul beschäftigt und auch alle Werte die mich interessieren aus der Batterie ausgelesen und tabellarisch und grafisch dargestellt.
Jetzt habe ich mit den Inverter Werten angefangen und gibt es einige Werte die ich nicht auslesen kann, deuten bzw. verstehen kann, da der SE5000 ja nur einphasig betrieben, als wechselseitiger AC/DC Wandler mit einer SESTI StorEdge Schnittstelle betrieben wird und an den beiden Modbus Zählern hängt.
Jetzt wollte ich gerne die neuste Version deines 98_SolarEdge Moduls mal zum Vergleich betreiben um die Daten mal zu vergleichen. Dazu habe ich das Modbus Attr Modul auf disable=1 gesetzt um dein SolarEdge Modul zu laden.
Leider bekomme ich immer die Meldung "cannot load SolarEdge......" obwohl ich "define SE SolarEdge 1 60 192.168.115.3:502 TCP" richtig definiert habe und das Modbus Attr Modul ja auch mit dieser Definition läuft.

Ist da sonst noch was zu beachten?

Gruß aus Köln
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

pejonp

@cocojambo

was steht den im log ? Hast du alle notwendigen perl Module geladen ??
So ohne irgend welche Daten kann ich da wenig machen ?

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

cocojambo

Du hattest recht es fehlte ein notwendiges Perl Modul. Nachdem ich es geladen hatte wurden auch alle Readings angezeigt.
Was mich nur wundert, die Batterie Werte entsprechen nicht den tatsächlichen, es sei denn sie müßen noch umgerechnet werden. Die statischen Werte (Typ,Nr,Software,usw) stimmen, aber fast alles andere liegt mit den angezeigten Werte weit daneben. z.b.Batt-Spannung=Battery_1_Instantaneous_Voltage_V=1932739533, Batt-Leistung=Battery_1_Instantaneous_Power_W=2147533740 oder Batt-Strom=Battery_1_Instantaneous_Current_A=4049387350.
Die Batt-Spannung liegt normalerweise zwischen 400-430 Volt, aber da habe ich auch kein Bezug zu den tatsächlichen Werten gefunden. Wie sollen diese umgerechnet werden?

Mit den Inverterwerten habe ich mich noch nicht beschäftigt.

Gruß aus Köln
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

beejayf

Hallo @cocojambo, hallo @pejonp,

bei mir das Gleiche. Die Werte sind auch nicht linear abhängig vom zu erwartenden Wert - offenbar sind die Werte in einer eher unüblichen Form im Register gespeichert.

Geholfen hat mir der Wert "Battery 1 Max Discharge Continues Power", der bei meiner Batterie 5000 W sein muss - daraus ergibt sich foldendes:

abgelegt ist 40.00.45.9C
5000 als BE float ist 45.9C.40.00
5000 als LE float ist 00.40.9C.45


beejayf

@pejonp - ich hab's! Alle Batterie-Werte passen! Wie bekommen wir das in Dein Modul?

pejonp

@beejayf

häng doch mal bitte deinen Programmcode an. Ich schaumal wie wir es einbinden könnten.

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

beejayf

#209
Hallo Jörg @pejonp,

ich habe die unpacks der Float32 für die Batterie angepasst und die HTML Tabelle umgemodelt, da sie z.B. auf dem Telefon u.U. nur zur Hälfte angezeigt wurde. Den Rest habe ich vollkommen in Frieden gelassen. Den Register-Output am Ende (details) hattest Du vielleicht nur zum Debuggen reingenommen - hab ihn aber trotzdem drin gelassen. Wenn Du den löschen möchtest, wäre das cool.

Sonst kannst Du den Code hier aus meiner SIcht 1:1 übernehmen. Gruß und Danke!!

Code ist zu lang für einen Post -

Teil 1v2

##############################################
# $Id: 98_SolarEdge.pm 0037 2020-24-10 17:54:00Z pejonp $
#
# fhem Modul für Wechselrichter SolarEdge SE5K
# verwendet Modbus.pm als Basismodul für die eigentliche Implementation des Protokolls.
#
# This file is part of fhem.
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Changelog:
# 2015-04-16 Vorlage 98_ModbusSDM220M.pm / 98_Pluggit.pm
# 2018-10-15  weiter ... pejonp
# 2018-10-29  X_PV_Energy X_PV_EnergyToday X_PV_EnergyCurrentWeek pv_energytomont ...
# 2020-03-08  Anpassungen von CaptainRoot (https://github.com/CaptainRoot/FHEM---SolarEdge) FHEM-Forum (https://forum.fhem.de/index.php/topic,80767.msg947778.html#msg947778) übernommen
# 2020-04-20  PBP  :pejonp
# 2020-05-03  Undefined subroutine &SolarEdge::ExprMppt (PBP) :pejonp
# 2020-11-10  Anpassung X-Meter
# 2020-13-10  Auslesen X_Meter_C_Model usw.  Fehlerbehebung
# 2020-15-10  kleine Anpassungen
# 2020-21-10  ModBus-Register für Batterie eingetragen
# 2020-22-10  Bat Register hinzugefügt
# 2020-22-10  Apparent Power, Reactive Power, Power Factor, Reg Apparent Energy wieder mit aufgenommen
# 2020-24-10  unpack angepasst
# 2020-20-11  unpack Batterie repariert, Tabelle angepasst (mobile Ansicht verbessert) - beejayf


use strict;
use warnings;

sub ExprMppt {
    my ( $hash, $DevName, $ReadingName, $vval_0 , $vval_1 , $vval_2 , $vval_3 , $vval_4 ) = @_;
    return SolarEdge_ExprMppt( $hash, $DevName, $ReadingName, $vval_0 , $vval_1 , $vval_2 , $vval_3 , $vval_4 );
}

sub ExprMeter {
    my ( $hash, $DevName, $ReadingName, $vval_0 , $vval_1 , $vval_2 , $vval_3 , $vval_4 , $vval_5 , $vval_6 , $vval_7 , $vval_8 ) = @_;
    return SolarEdge_ExprMeter( $hash, $DevName, $ReadingName, $vval_0 , $vval_1 , $vval_2 , $vval_3 , $vval_4, $vval_5 , $vval_6 , $vval_7 , $vval_8 );
}

package FHEM::SolarEdge;


no if $] >= 5.017011, warnings => 'experimental::smartmatch';
#no warnings 'portable';    # Support for 64-bit ints required
use Time::Local;
use Time::HiRes qw(gettimeofday usleep);
use Device::SerialPort;
use GPUtils qw(GP_Import GP_Export);
use Scalar::Util qw(looks_like_number);
use feature qw/say switch/;
use SetExtensions;
use Math::Round qw/nearest/;

use FHEM::Meta;
main::LoadModule( 'Modbus');
main::LoadModule( 'ModbusAttr');



## Import der FHEM Funktionen
#-- Run before package compilation
BEGIN {

    # Import from main context
    GP_Import(
        qw(
          readingsBulkUpdate
          readingsBeginUpdate
          readingsEndUpdate
          defs
          modules
          Log3
          attr
          readingFnAttributes
          AttrVal
          ReadingsVal
          Value
          FmtDateTime
          strftime
          GetTimeSpec
          InternalTimer
          AssignIoPort
          DevIo_CloseDev
          DevIo_OpenDev
          DevIo_SimpleWrite
          DevIo_SimpleRead
          RemoveInternalTimer
          getUniqueId
          getKeyValue
          TimeNow
          Dispatch
          Initialize
          ModbusLD_Initialize
          InitializeLD
          ReadingsTimestamp
           )
    );
}

#-- Export to main context with different name
GP_Export(
    qw(
      Initialize
      ExprMppt
      ExprMeter
      )
);


my $SolarEdge_Version = '0023 - 08.03.2020';

my %SolarEdgedeviceInfo = (
    "h" => {
        'combine' => '40',
        'defPoll' => '1',
    },
    "type-VT_String" => {
        'decode'  => 'cp850',
        'encode'  => 'utf8',
        'expr'    => '$val =~ s/[\00]+//gr',
        'len'     => '8',
        'revRegs' => '0',
        'unpack'  => 'a16',
        'poll'    => 'once',                   # only poll once after define (or after a set)
    },
    "type-VT_String4" => {
        'decode'  => 'cp850',
        'encode'  => 'utf8',
        'expr'    => '$val =~ s/[\00]+//gr',
        'len'     => '5',
        'revRegs' => '0',
        'unpack'  => 'a8',
    },
   
);

my %SolarEdgeparseInfo = (
###############################################################################################################
    # Holding Register
###############################################################################################################
    "h40000" => {    # 40001 2 C_SunSpec_ID uint32 Wert = "SunS" (0x53756e53). Identifiziert dies eindeutig als eine SunSpec Modbus-Karte
        'len'     => '2',
        'reading' => 'C_SunSpec_ID',
        'revRegs' => '0',
        'unpack'  => 'a4',
        'poll'    => 'once',
    },
    "h40004" => {    # 40005 16 C_Hersteller String(32) Bei SunSpec eingetragener Wert = " SolarEdge "
        'reading' => 'C_Manufacturer',
        'type'    => 'VT_String',
    },
    "h40020" => {
        'reading' => 'Block_C_Model',
        'type'    => 'VT_String',
        'expr'    => 'ExprMppt($hash,$name,"C_Model",$val[0],0,0,0,0)',     # Model wird gesetzt
    },
    "h40044" => {
        'reading' => 'C_Version',
        'type'    => 'VT_String',
    },
    "h40052" => {
        'reading' => 'C_SerialNumber',
        'type'    => 'VT_String',
    },
    "h40068" => {                                                          # MODBUS Unit ID
        'reading' => 'C_DeviceAddress',
        'defPoll' => '0',
        'poll'    => 'once',
    },
    "h40069" => {    # 40070 1 C_SunSpec_DID uint16 101 = Einphasig 102 = Spaltphase1 103 = Dreiphasig
        'reading' => 'C_SunSpec_DID',                                        # name of the reading for this value
        'len'     => '1',
        'map'     => '101:single phase, 102:split phase, 103:three phase',
        'poll'    => 'once',
    },

    #  "h40071" => { # 40072 1 I_AC_Strom uint16 Ampere AC-Gesamtstromwert
    # 'reading' => 'I_AC_Current', # name of the reading for this value
    #         'format' => '%.2f A',
    #        },
    #  "h40072" => { # 40073 1 I_AC_StromA uint16 Ampere AC-Phase A (L1) Stromwert
    # 'reading' => 'I_AC_CurrentL1', # name of the reading for this value
    #        'format' => '%.2f A',
    #        },
    #  "h40073" => { # 40074 1 I_AC_StromB uint16 Ampere AC-Phase B (L2) Stromwert
    # 'reading' => 'I_AC_CurrentL2', # name of the reading for this value
    #        'format' => '%.2f A',
    #        },
    #  "h40074" => { # 40075 1 I_AC_StromC uint16 Ampere AC-Phase C (L3) Stromwert
    # 'reading' => 'I_AC_CurrentL3', # name of the reading for this value
    #        'format' => '%.2f A',
    #        },
    #  "h40075" => { # 40076 1 I_AC_Strom_SF uint16 AC-Strom Skalierungsfaktor
    # 'reading' => 'I_AC_Current_SF', # name of the reading for this value
    #        },

    "h40071" => {    # 40072 (Len 5) 40072 to 40076
        'len'     => '5',                  #I_AC_Current, I_AC_CurrentA, I_AC_CurrentB, I_AC_CurrentC, I_AC_Current_SF
        'reading' => 'Block_AC_Current',
        'unpack'  => 'nnnns>',
        'expr' => 'ExprMppt($hash,$name,"I_AC_Current",$val[0],$val[1],$val[2],$val[3],$val[4])',    # conversion of raw value to visible value
    },
    "h40076" => {                                                                                    #AC Voltage Phase AB value
        'reading' => 'I_AC_VoltageAB',
    },
    "h40077" => {                                                                                    #AC Voltage Phase BC value
        'reading' => 'I_AC_VoltageBC',
    },
    "h40078" => {                                                                                    #AC Voltage Phase CA value
        'reading' => 'I_AC_VoltageCA',
    },
    "h40079" => {                                                                                    #AC Voltage Phase AN value
        'reading' => 'I_AC_VoltageAN',
    },
    "h40080" => {                                                                                    #AC Voltage Phase BN value
        'reading' => 'I_AC_VoltageBN',
    },
    "h40081" => {                                                                                    #AC Voltage Phase CN value
        'reading' => 'I_AC_VoltageCN',
    },
    "h40082" => {                                                                                    #
        'reading' => 'I_AC_Voltage_SF',
       # 'unpack'  => 's>',
    },

    #  "h40083" => { # 40084 1 I_AC_Leistung int16 Watt AC-Leistungswert
    # 'reading' => 'I_AC_Power',
    #        },
    #  "h40084" => { #
    # 'reading' => 'I_AC_Power_SF',
    #       },

    "h40083" => {    # 40084 (Len 2) 40084 to 40085 AC Power
        'len'     => '2',                                                           #  I_AC_Power, I_AC_Power_SF
        'reading' => 'Block_AC_Power',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_Power",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #    "h40085" => { # 40086 1 I_AC_Frequenz uint16 Hertz Frequenzwert
    # 'reading' => 'I_AC_Frequency',
    #          'format' => '%.f Hz', # format string for sprintf
    # 'expr' => '$val/100',
    #          'setexpr' => '$val',
    # },
    #     "h40086" => { # 40086 1 I_AC_Frequency_SF uint16 Frequenz Skalierungsfaktor
    # 'reading' => 'I_AC_Frequency_SF',
    # },

    "h40085" => {    # 40086 (Len 2) 40086 to 40087 AC Frequency
        'len'     => '2',                                                               # I_AC_Frequency, I_AC_Frequency_SF
        'reading' => 'Block_AC_Frequency',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_Frequency",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h40087" => { #
    # 'reading' => 'I_AC_VA',
    # },
    #    "h40088" => { #
    # 'reading' => 'I_AC_VA_SF',
    # },

    "h40087" => {    # 40088 (Len 2) 40088 to 40089 Apparent Power (Scheinleistung)
        'len'     => '2',                                                        # I_AC_VA,  I_AC_VA_SF
        'reading' => 'Block_AC_VA',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_VA",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h40089" => { #
    # 'reading' => 'I_AC_VAR',
    # },
    #     "h40090" => { #
    # 'reading' => 'I_AC_VAR_SF',
    # },

    "h40089" => {    # 40090 (Len 2) 40090 to 40091 Reactive Power (Blindleistung)
        'len'     => '2',                                                         # I_AC_VAR, I_AC_VAR_SF
        'reading' => 'Block_AC_VAR',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_VAR",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h40091" => { #
    # 'reading' => 'I_AC_PF',
    # },
    #    "h40092" => { #
    # 'reading' => 'I_AC_PF_SF',
    # },

    "h40091" => {    # 40090 (Len 2) 40090 to 40091 Power Factor (Leistungsfaktor)
        'len'     => '2',                                                        #I_AC_PF, I_AC_PF_SF
        'reading' => 'Block_AC_PF',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_PF",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #    "h40093" =>  {
    #               'expr' => '$val / 1000',
    #             'format' => '%.2f kWh',
    #                'len' => '2',
    #            'reading' => 'I_AC_Energie_WH_kWh',
    #             'unpack' => 'l>',
    #                },
    #    "h40095" => { #
    # 'reading' => 'I_AC_Energy_WH_SF',
    # },

    "h40093" => {    # 40094 (Len 3) 40094 to 40096 AC Lifetime Energy production
        'len'     => '3',                                                               #I_AC_Energy_WH (2), I_AC_Energy_WH_SF
        'reading' => 'Block_AC_Energy_WH',
        'unpack'  => 'l>s>',
        'expr'    => 'ExprMppt($hash,$name,"I_AC_Energy_WH",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h40096" => { #
    # 'reading' => 'I_DC_Current',
    #          'format' => '%.2f A',
    # },
    #     "h40097" => { #
    # 'reading' => 'I_DC_Current_SF',
    # },

    "h40096" => {    # 40097 (Len 2) 40097 to 40098 DC Current
        'len'     => '2',                                                             # I_DC_Current, I_DC_Current_SF
        'reading' => 'Block_DC_Current',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_DC_Current",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h40098" => { #
    # 'reading' => 'I_DC_Voltage',
    #          'format' => '%.2f V',
    # },
    #     "h40099" => { #
    # 'reading' => 'I_DC_Voltage_SF',
    # },

    "h40098" => {    # 40099(Len 2) 40099 to 40100 DC Voltage
        'len'     => '2',                                                             # I_DC_Voltage, I_DC_Voltage_SF
        'reading' => 'Block_DC_Voltage',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_DC_Voltage",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },

    #     "h100" => { #
    # 'reading' => 'I_DC_Power',
    #          'format' => '%.2f W',
    # },
    #     "h40101" => { #
    # 'reading' => 'I_DC_Power_SF',
    # },

    "h40100" => {    # 400101(Len 2) 400101 to 40102 DC Power
        'len'     => '2',                                                           # I_DC_Power, I_DC_Power_SF
        'reading' => 'Block_DC_Power',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMppt($hash,$name,"I_DC_Power",$val[0],$val[1],0,0,0)',    # conversion of raw value to visible value
    },
    "h40103" => {                                                                   # 40104 1 I_Temp_Sink int16 Grad Celsius Kühlkörpertemperatur
        'reading' => 'I_Temp_HeatSink',                                             # name of the reading for this value
        'format'  => '%.f °C',                                                     # format string for sprintf
        'expr'    => '$val/100',
        'setexpr' => '$val',
    },
    "h40107" => {                                                                   # 40108 1 I_Status uint16 Betriebszustand
        'reading' => 'I_Status',                                                    # name of the reading for this value
        'expr'    => '$val',
        'map' =>
'1:Off, 2:Sleeping Night mode, 3:Grid Monitoring, 4:Inverter is ON and producing power, 5:Production(curtailed), 6:Shutting down, 7:Fault, 8:Maintenance',
        'setexpr' => '$val',
    },

    # Ende parseInfo
);

my %SolarEdgeMeter1parseInfo = (
###############################################################################################################
    # Holding Register
###############################################################################################################
    #C_SunSpec_ID ignored
    "h40121" => {    # 40121 Value = 0x0001. Uniquely identifies this as a SunSpec Common Model Block
        'reading' => 'X_Meter_1_C_SunSpec_DID_0',
        'type'    => 'VT_String',
    },
    "h40122" => {    # 40122 65 = Length of block in 16-bit registers
        'reading' => 'X_Meter_1_C_SunSpec_Length',
        'type'    => 'VT_String',
    },
    "h40123" => {    # 40123 16 C_Manufacturer String(32) Meter manufacturer
        'reading' => 'X_Meter_1_C_Manufacturer',
        'type'    => 'VT_String',
    },
    "h40139" => {    # 40139 16 C_Model String(32) Meter model
        'reading' => 'X_Meter_1_Block_C_Model',
        'type'    => 'VT_String',
        'expr'    => 'ExprMeter($hash,$name,"X_Meter_1_C_Model",$val[0],0,0,0,0,0,0,0,0)',    # conversion of raw value to visible value
    },
    "h40155" => {    # 40155 16 C_Option String(16) Meter Option  Export + Import, Production, consumption,
        'reading' => 'X_Meter_1_C_Option',
        'type'    => 'VT_String',
    },
    "h40163" => {    # 40163 16 C_Version String(16) Meter version
        'reading' => 'X_Meter_1_C_Version',
        'type'    => 'VT_String',
    },
    "h40171" => {    # 40171 16 C_Version String(16) Meter SN
        'reading' => 'X_Meter_1_C_SerialNumber',
        'type'    => 'VT_String',
    },
    "h40187" => {    # 40187 16 C_Version String(16) Inverter Modbus ID ?
        'reading' => 'X_Meter_1_C_DeviceAddress',
        'defPoll' => '0',
        'poll'    => 'once',
    },
    "h40188" => {    # 40188 1 C_SunSpec_DID uint16 SunSpecMODBUS
                     # Map:
                     #  Single Phase (AN or AB) Meter (201)
                     #  Split Single Phase (ABN) Meter (202)
                     #  Wye-Connect Three Phase (ABCN) Meter (203)
                     #  Delta-Connect Three Phase (ABC) Meter(204)
        'reading' => 'X_Meter_1_C_SunSpec_DID',    # name of the reading for this value
        'len'     => '1',
        'map'  => '201:single phase, 202:split single phase, 203:wye-connect three phase, 204:delta-connect three phase meter',
        'poll' => 'once',
    },
    "h40190" => {                                  # 40190 (Len 5) 40190 to 40194
        'len'     => '5',                            #M_AC_Current, M_AC_Current_A(L1), M_AC_Current_B(L2), M_AC_Current_C(L3), M_AC_Current_SF
        'reading' => 'X_Meter_1_Block_AC_Current',
        'unpack'  => 'nnnns>', # 's>s>s>s>n!', # 's>s>s>s>s>'
        'expr' => 'ExprMeter($hash,$name,"X_Meter_1_M_AC_Current",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)'
        ,                                            # conversion of raw value to visible value
    },
   
     "h40195" => {    #  #Line to Neutral AC Voltage (average of activephases) 40195 to 40203
        'len' => '9',    #M_AC_Voltage_LN, M_AC_Voltage_AN, M_AC_Voltage_BN, M_AC_Voltage_CN, M_AC_Voltage_LL, M_AC_Voltage_AB, M_AC_Voltage_BC, M_AC_Voltage_CA, M_AC_Voltage_SF 
        'reading' => 'X_Meter_1_Block_AC_Voltage',
        'unpack'  => 'nnnnnnnns>', # 'NNNNNNNNs>',
        'expr'    => 'ExprMeter($hash,$name,"X_Meter_1_M_AC_Voltage",$val[0],$val[1],$val[2],$val[3],$val[4],$val[5],$val[6],$val[7],$val[8])'
        ,                 # conversion of raw value to visible value
    },
   
    #"h40195" => {                                    #Line to Neutral AC Voltage (average of activephases)
    #    'reading' => 'X_Meter_1_M_AC_Voltage_LN',
    #    'expr'    => '$val/100',
    #    'setexpr' => '$val',
    #},
    #"h40196" => {                                    #Phase A to Neutral AC Voltage
    #    'reading' => 'X_Meter_1_M_AC_Voltage_AN',
    #    'expr'    => '$val/100',
    #    'setexpr' => '$val',
    #},
    #"h40197" => {                                    #Phase B to Neutral AC Voltage
    #    'reading' => 'X_Meter_1_M_AC_Voltage_BN',
    #    'expr'    => '$val/100',
    #    'setexpr' => '$val',
    #},
    #"h40198" => {                                    #Phase C to Neutral AC Voltage
    #    'reading' => 'X_Meter_1_M_AC_Voltage_CN',
    #    'expr'    => '$val/100',
    #    'setexpr' => '$val',
    #},
    #"h40199" => {                                    # 40199 (Len 5) 40199 to 40202
    #    'len'     => '5',                               #M_AC_Voltage_LL, M_AC_Voltage_AB, M_AC_Voltage_BC, M_AC_Voltage_CA, M_AC_Voltage_SF,
    #    'reading' => 'X_Meter_1_Block_AC_Voltage_LL',
    #    'unpack'  => 'nnnns>',
    #    'expr' => 'ExprMeter($hash,$name,"X_Meter_1_M_AC_Voltage",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)'
    #    ,                                               # conversion of raw value to visible value
    #},
   
    "h40204" => {                                       # 40086 (Len 2) 40086 to 40087 AC Frequency
        'len'     => '2',                                                                                  # M_AC_Freq, M_AC_Freq_SF
        'reading' => 'X_Meter_1_Block_AC_Frequency',
        'unpack'  => 'ns>',
        'expr'    => 'ExprMeter($hash,$name,"X_Meter_1_M_AC_Frequency",$val[0],$val[1],0,0,0,0,0,0,0)',    # conversion of raw value to visible value
    },

    "h40206" => {                                                                                          #Real Power 40206 (Len 5) 40206 to 40210
        'len'     => '5',                          #M_AC_Power, M_AC_Power_A, M_AC_Power_B, M_AC_Power_C, M_AC_Power_SF,
        'reading' => 'X_Meter_1_Block_AC_Power',
        'unpack'  => 's>s>s>s>n!', # 'nnnns>', #'s>s>s>s>n!',  # 's>s>s>s>s>'
        'expr' =>
          'ExprMeter($hash,$name,"X_Meter_1_M_AC_Power",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)',  # conversion of raw value to visible value
    },

    "h40211" => {    #Apparent Power 40211 (Len 5) 40211 to 40215
        'len'     => '5',                       #M_AC_VA, M_AC_VA_A, M_AC_VA_B, M_AC_VA_C, M_AC_VA_SF,
        'reading' => 'X_Meter_1_Block_AC_VA',
        'unpack'  => 's>s>s>s>n!',
        'expr' =>
          'ExprMeter($hash,$name,"X_Meter_1_M_AC_VA",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)',    # conversion of raw value to visible value
    },
    "h40216" => {    #Reactive Power 40216 (Len 5) 40215 to 40220
        'len'     => '5',                        #M_AC_VAR, M_AC_VAR_A, M_AC_VAR_B, M_AC_VAR_C, M_AC_VAR_SF,
        'reading' => 'X_Meter_1_Block_AC_VAR',
        'unpack'  => 's>s>s>s>n!',
        'expr' =>
          'ExprMeter($hash,$name,"X_Meter_1_M_AC_VAR",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)',    # conversion of raw value to visible value
    },
    "h40221" => {    # Power Factor h40221 (Len 5)   40221 to 40225
        'len'     => '5',                       #M_AC_PF, M_AC_PF_A, M_AC_PF_B, M_AC_PF_C, M_AC_PF_SF,
        'reading' => 'X_Meter_1_Block_AC_PF',
        'unpack'  =>  's>s>s>s>n!',
        'expr' =>
          'ExprMeter($hash,$name,"X_Meter_1_M_AC_PF",$val[0],$val[1],$val[2],$val[3],$val[4],0,0,0,0)',    # conversion of raw value to visible value
    },

    "h40226" => {    #Accumulated Energy Real Energy 40226 to 40242
        'len' => '17',    #M_Exported, M_Exported_A, M_Exported_B, M_Exported_C, M_Imported, M_Imported_A, M_Imported_B, M_Imported_C, M_Energy_W_SF
        'reading' => 'X_Meter_1_Block_Energy_W',
        'unpack'  => 'L>L>L>L>L>L>L>L>s>', # 'l>l>l>l>l>l>l>l>s>' 
        'expr'    => 'ExprMeter($hash,$name,"X_Meter_1_M_Energy_W",$val[0],$val[1],$val[2],$val[3],$val[4],$val[5],$val[6],$val[7],$val[8])'
        ,               
    },

   "h40243" => {         #Apparent Energy Real Energy 40243 to 40259
       'len' => '17',    #M_Exported, M_Exported_A, M_Exported_B, M_Exported_C, M_Imported, M_Imported_A, M_Imported_B, M_Imported_C, M_Energy_W_SF
       'reading' => 'X_Meter_1_Block_Energy_VA',
       'unpack'  => 'L>L>L>L>L>L>L>L>s>',
       'expr'    => 'ExprMeter($hash,$name,"X_Meter_1_M_Energy_VA",$val[0],$val[1],$val[2],$val[3],$val[4],$val[5],$val[6],$val[7],$val[8])'
        ,               
    },
);
#####################################
my %SolarEdgeBat1parseInfo = (
###############################################################################################################
    # Holding Register
###############################################################################################################
    "h57600" => {    # E100(F500) 16R Battery 1 Manufacturer Name String[32]
        'reading' => 'Battery_1_Manufacturer_Name',
        'type'    => 'VT_String',
    },
    "h57616" => {    # E110(F510) 16R Battery 1 Model String[32]
        'reading' => 'Battery_1_Model',
        'type'    => 'VT_String',
    },
    "h57632" => {     # E120(F520) 16R Battery 1 Firmware Version String[32]
        'reading' => 'Battery_1_Firmware',
        'type'    => 'VT_String',
    },
    "h57648" => {     # E130(F530) 16R Battery 1 SerialNumber String[32]
        'reading' => 'Battery_1_SerialNumber',
        'type'    => 'VT_String',
    },
    "h57664" => {    # E140(F540) 1R Battery 1 DeviceID Uint16
        'len'     => '1',                                                           
        'reading' => 'Battery_1_DeviceID',
    },
    "h57666" => {    # E142 (F542) 2R Battery 1 Rated Energy Float32 W*H
'len'     => '2',
        'reading' => 'Battery_1_Rated_Energy_WH',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57668" => {    # E144 (F544) 2R Battery 1 Max Charge Continues Power Float32 W
'len'     => '4',
        'reading' => 'Battery_1_Max_Charge_Continues_Power_W',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57670" => {    # E146 (F546) 2R Battery 1 Max Discharge Continues Power Float32 W
'len'     => '2',
        'reading' => 'Battery_1_Max_Discharge_Continues_Power_W',
'unpack'  => 'aaaa',
'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57672" => {    # E148 (F548) 2R Battery 1 Max Charge Peak Power Float32 W
'len'     => '2',
        'reading' => 'Battery_1_Max_Charge_Peak_Power_W',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57674" => {    # E14A (F54A) 2R Battery 1 Max Discharge Peak Power Float32 W
'len'     => '2',
        'reading' => 'Battery_1_Max_Discharge_Peak_Power_W',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57712" => {     # E170(F570) 2R Battery 1 Instantaneous Voltage Float32 V
'len'     => '2',
        'reading' => 'Battery_1_Instantaneous_Voltage_V',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57714" => {     # E172(F572) 2R Battery 1 Instantaneous Current Float32 A
'len'     => '2',
        'reading' => 'Battery_1_Instantaneous_Current_A',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57716" => {     # E174(F574) 2R Battery 1 Instantaneous Power Float32  W
'len'     => '2',
        'reading' => 'Battery_1_Instantaneous_Power_W',
    'unpack'  => 'aaaa',
    'expr' => 'unpack("f>", $val[2].$val[3].$val[0].$val[1])',
    },
    "h57734" => {     # E186(F586) 2R Battery 1 Status Uint32 0-7
        'len'     => '2', 
        'reading' => 'Battery_1_Status',
        'expr'    => '$val',
        'map'     => '1:Aus, 3:Laden, 4:Entladen, 6:Erhaltungsladen',   # 1: Aus 3: Laden 4: Entladen 6: Erhaltungsladen
        'setexpr' => '$val',
    },
);
#####################################



#####################################