Solaredge inverter via Modbus TCP 2

Hello Han,

Has there been any additional development since Dec 19th?

Today they installed the SE4000H and had a second ago my first successful reading.
Next step to tweak the rules file to adapt to my my electricity meter readings.

Wonder if you extended on rules and sitemaps to create visibility and integration with other HA parts.

PS. I have a list of Modbus things listed. Shouldn’t this be a single thing with channels?

Thanks for the binding (kudo’s),
Ferry

Hey @Ferry,

no changes so far but the software of the SE4000H itself. My installer did some work and upgraded my system (done before I knew). I have lost local access to the commissioning interface. Modbus still works though

kr

Han

Hello @havaak, thanks for your example, it’s working great :slight_smile:

One question however: I want to monitor the total production with the I_AC_Energy_WH thing, but I’m getting the following error:

Status: OFFLINE - CONFIGURATION_ERROR Thing modbus:data:SolarEdgeTCP:Registers:I_AC_Energy_WH readValueType=acc32 is invalid!

I used your configuration from above. Is it working for you?

Regards, Christian

Modbus binding doesn’t support an acc32 datatype.
I’d try int32 instead.
Note that small Thing edits like this probably won’t take effect until the binding is restarted.

1 Like

Perfect, it worked instantly :smiley::+1:

Thanks

1 Like

(Part 1/3)

Hi to all,

I have been using the information of this topic by @havaak and the previous one by @tkuehne.
Although the Modbus Sunspec Bundle is now available, I will keep this setup for the while.

I made some modifications to fit my needs and composed it to the following set of files, which I want to share with you.
I am living in Germany, so the most labels are in German.

  • I have a SolarEdge SE2200 inverter and a WattNode WNC-3Y-400-MB meter which is connected to the inverter via RS485 connection. The inverter is connected to the network via LAN.

  • I commented out all values which I do not use or which are not available on my inverter/meter.

  • I added a “scale all values”-rule trigger to prevent openhab from generating errors because of some NULL-values if you e.g. restart openHAB during the night where there is no change in the inverter values.

  • The “scale all values”-rule gets triggered after system start of openHAB automatically.

modbusSolaredge.things

Bridge modbus:tcp:SolarEdgeConverter [ host="192.168.115.164", port=502, id=1, timeBetweenTransactionsMilli=60, timeBetweenReconnectMillis=0, connectMaxTries=3, reconnectAfterMillis=0, connectTimeoutMillis=5000 ] {
    Bridge poller Registers [ start=69, length=50, refresh=5000, type="holding" ] {
        Thing data C_SunSpec_DID        [ readStart="69", readValueType="uint16" ]      // 101 = single phase, 102 = split phase, 103 = three phase 
        Thing data C_SunSpec_Length     [ readStart="70", readValueType="uint16" ]      // 50 = Length of model block
        Thing data I_AC_Current         [ readStart="71", readValueType="uint16" ]      // AC Total Current value
        Thing data I_AC_CurrentA        [ readStart="72", readValueType="uint16" ]      // AC Phase A Current value
        //Thing data I_AC_CurrentB        [ readStart="73", readValueType="uint16" ]      // AC Phase B Current value
        //Thing data I_AC_CurrentC        [ readStart="74", readValueType="uint16" ]      // AC Phase C Current value
        Thing data I_AC_Current_SF      [ readStart="75", readValueType="int16"  ]      // AC Current scale factor
        Thing data I_AC_VoltageAB       [ readStart="76", readValueType="uint16" ]      // AC Voltage Phase AB value
        //Thing data I_AC_VoltageBC       [ readStart="77", readValueType="uint16" ]      // AC Voltage Phase BC value
        //Thing data I_AC_VoltageCA       [ readStart="78", readValueType="uint16" ]      // AC Voltage Phase CA value
        //Thing data I_AC_VoltageAN       [ readStart="79", readValueType="uint16" ]      // AC Voltage Phase A to N value
        //Thing data I_AC_VoltageBN       [ readStart="80", readValueType="uint16" ]      // AC Voltage Phase B to N value
        //Thing data I_AC_VoltageCN       [ readStart="81", readValueType="uint16" ]      // AC Voltage Phase C to N value
        Thing data I_AC_Voltage_SF      [ readStart="82", readValueType="int16"  ]      // AC Voltage scale factor
        Thing data I_AC_Power           [ readStart="83", readValueType="int16"  ]      // AC Power value
        Thing data I_AC_Power_SF        [ readStart="84", readValueType="int16"  ]      // AC Power scale factor
        Thing data I_AC_Frequency       [ readStart="85", readValueType="uint16" ]      // AC Frequency value
        Thing data I_AC_Frequency_SF    [ readStart="86", readValueType="int16"  ]      // Scale factor
        Thing data I_AC_VA              [ readStart="87", readValueType="int16"  ]      // Apparent Power
        Thing data I_AC_VA_SF           [ readStart="88", readValueType="int16"  ]      // Scale factor
        Thing data I_AC_VAR             [ readStart="89", readValueType="int16"  ]      // Reactive Power
        Thing data I_AC_VAR_SF          [ readStart="90", readValueType="int16"  ]      // Scale factor
        Thing data I_AC_PF              [ readStart="91", readValueType="int16"  ]      // Power Factor
        Thing data I_AC_PF_SF           [ readStart="92", readValueType="int16"  ]      // Scale factor
        Thing data I_AC_Energy_WH       [ readStart="93", readValueType="uint32" ]      // AC Lifetime Energy Production
        Thing data I_AC_Energy_WH_SF    [ readStart="95", readValueType="uint16" ]      // Scale factor
        Thing data I_DC_Current         [ readStart="96", readValueType="uint16" ]      // DC Current value
        Thing data I_DC_Current_SF      [ readStart="97", readValueType="int16"  ]      // Scale factor
        Thing data I_DC_Voltage         [ readStart="98", readValueType="uint16" ]      // DC Voltage value
        Thing data I_DC_Voltage_SF      [ readStart="99", readValueType="int16"  ]      // Scale factor
        Thing data I_DC_Power           [ readStart="100", readValueType="int16" ]      // DC Power value
        Thing data I_DC_Power_SF        [ readStart="101", readValueType="int16" ]      // Scale factor
        Thing data I_Temp_Sink          [ readStart="103", readValueType="int16" ]      // Heat sink temperature
        Thing data I_Temp_SF            [ readStart="106", readValueType="int16" ]      // Scale factor
        Thing data I_Status             [ readStart="107", readValueType="uint16"]      // Operating state
        Thing data I_Status_Vendor      [ readStart="108", readValueType="uint16"]      // Vendor-defined operating state and error codes
    }

    Bridge poller RegistersMeter [ start=188, length=105, refresh=5000, type="holding" ] {
        Thing data M_C_SunSpec_DID      [ readStart="188", readValueType="uint16" ]     // 
        Thing data M_C_SunSpec_Length   [ readStart="189", readValueType="uint16" ]     // 50 = Length of model block
        Thing data M_AC_Current         [ readStart="190", readValueType="int16" ]      // AC Total Current value
        Thing data M_AC_Current_A       [ readStart="191", readValueType="int16" ]      // AC L1 Current value
        Thing data M_AC_Current_B       [ readStart="192", readValueType="int16" ]      // AC L2 Current value
        Thing data M_AC_Current_C       [ readStart="193", readValueType="int16" ]      // AC L3 Current value
        Thing data M_AC_Current_SF      [ readStart="194", readValueType="int16" ]      // AC Total Current scaling factor
        Thing data M_AC_Voltage_LN      [ readStart="195", readValueType="int16" ]      // Line to Neutral AC Voltage (average of active phases)
        Thing data M_AC_Voltage_AN      [ readStart="196", readValueType="int16" ]      // Phase A to Neutral AC Voltage
        Thing data M_AC_Voltage_BN      [ readStart="197", readValueType="int16" ]      // Phase B to Neutral AC Voltage
        Thing data M_AC_Voltage_CN      [ readStart="198", readValueType="int16" ]      // Phase C to Neutral AC Voltage
        //Thing data M_AC_Voltage_LL      [ readStart="199", readValueType="int16" ]      // Line to Line AC Voltage (average of active phases)
        //Thing data M_AC_Voltage_AB      [ readStart="200", readValueType="int16" ]      // Phase A to Phase B AC Voltage
        //Thing data M_AC_Voltage_BC      [ readStart="201", readValueType="int16" ]      // Phase B to Phase C AC Voltage
        //Thing data M_AC_Voltage_CA      [ readStart="202", readValueType="int16" ]      // Phase C to Phase A AC Voltage
        Thing data M_AC_Voltage_SF      [ readStart="203", readValueType="int16" ]      // AC Voltage Scale Factor
        Thing data M_AC_Freq            [ readStart="204", readValueType="int16" ]      // AC Frequency
        Thing data M_AC_Freq_SF         [ readStart="205", readValueType="int16" ]      // AC Frequency Scale Factor
        Thing data M_AC_Power           [ readStart="206", readValueType="int16" ]      // Total Real Power (sum of active phases)
        Thing data M_AC_Power_A         [ readStart="207", readValueType="int16" ]      // Phase A AC Real Power
        Thing data M_AC_Power_B         [ readStart="208", readValueType="int16" ]      // Phase B AC Real Power
        Thing data M_AC_Power_C         [ readStart="209", readValueType="int16" ]      // Phase C AC Real Power
        Thing data M_AC_Power_SF        [ readStart="210", readValueType="int16" ]      // AC Real Power Scale Factor
        Thing data M_AC_VA              [ readStart="211", readValueType="int16" ]      // Total AC Apparent Power (sum of active phases)
        Thing data M_AC_VA_A            [ readStart="212", readValueType="int16" ]      // Phase A AC Apparent Power
        Thing data M_AC_VA_B            [ readStart="213", readValueType="int16" ]      // Phase B AC Apparent Power
        Thing data M_AC_VA_C            [ readStart="214", readValueType="int16" ]      // Phase C AC Apparent Power
        Thing data M_AC_VA_SF           [ readStart="215", readValueType="int16" ]      // AC Apparent Power Scale Factor
        //Thing data M_AC_VAR             [ readStart="216", readValueType="int16" ]      // Total AC Reactive Power (sum of active phases)
        //Thing data M_AC_VAR_A           [ readStart="217", readValueType="int16" ]      // Phase A AC Reactive Power
        //Thing data M_AC_VAR_B           [ readStart="218", readValueType="int16" ]      // Phase B AC Reactive Power
        //Thing data M_AC_VAR_C           [ readStart="219", readValueType="int16" ]      // Phase C AC Reactive Power
        //Thing data M_AC_VAR_SF          [ readStart="220", readValueType="int16" ]      // AC Reactive Power Scale Factor
        Thing data M_AC_PF              [ readStart="221", readValueType="int16" ]      // Average Power Factor (average of active phases)
        Thing data M_AC_PF_A            [ readStart="222", readValueType="int16" ]      // Phase A Power Factor
        Thing data M_AC_PF_B            [ readStart="223", readValueType="int16" ]      // Phase B Power Factor
        Thing data M_AC_PF_C            [ readStart="224", readValueType="int16" ]      // Phase C Power Factor
        Thing data M_AC_PF_SF           [ readStart="225", readValueType="int16" ]      // AC Power Factor Scale Factor
        Thing data M_Exported           [ readStart="226", readValueType="uint32" ]     // Total Exported Real Energy
        Thing data M_Exported_A         [ readStart="228", readValueType="uint32" ]     // Phase A Exported Real Energy
        Thing data M_Exported_B         [ readStart="230", readValueType="uint32" ]     // Phase B Exported Real Energy
        Thing data M_Exported_C         [ readStart="232", readValueType="uint32" ]     // Phase C Exported Real Energy
        Thing data M_Imported           [ readStart="234", readValueType="uint32" ]     // Total Imported Real Energy
        Thing data M_Imported_A         [ readStart="236", readValueType="uint32" ]     // Phase A Imported Real Energy
        Thing data M_Imported_B         [ readStart="238", readValueType="uint32" ]     // Phase B Imported Real Energy
        Thing data M_Imported_C         [ readStart="240", readValueType="uint32" ]     // Phase C Imported Real Energy
        Thing data M_Energy_W_SF        [ readStart="242", readValueType="int16" ]      // Real Energy Scale Factor
        //Thing data M_Exported_VA        [ readStart="243", readValueType="uint32" ]     // Total Exported Apparent Energy
        //Thing data M_Exported_VA_A      [ readStart="245", readValueType="uint32" ]     // Phase A Exported Apparent Energy
        //Thing data M_Exported_VA_B      [ readStart="247", readValueType="uint32" ]     // Phase B Exported Apparent Energy
        //Thing data M_Exported_VA_C      [ readStart="249", readValueType="uint32" ]     // Phase C Exported Apparent Energy
        //Thing data M_Imported_VA        [ readStart="251", readValueType="uint32" ]     // Total Imported Apparent Energy
        //Thing data M_Imported_VA_A      [ readStart="253", readValueType="uint32" ]     // Phase A Imported Apparent Energy
        //Thing data M_Imported_VA_B      [ readStart="255", readValueType="uint32" ]     // Phase B Imported Apparent Energy
        //Thing data M_Imported_VA_C      [ readStart="257", readValueType="uint32" ]     // Phase C Imported Apparent Energy
        //Thing data M_Energy_VA_SF       [ readStart="259", readValueType="int16" ]      // Apparent Energy Scale Factor
        //Thing data M_Import_VARh_Q1     [ readStart="260", readValueType="uint32" ]     // Quadrant 1: Total Imported Reactive Energy
        //Thing data M_Import_VARh_Q1A    [ readStart="262", readValueType="uint32" ]     // Phase A - Quadrant 1: Imported Reactive Energy
        //Thing data M_Import_VARh_Q1B    [ readStart="264", readValueType="uint32" ]     // Phase B - Quadrant 1: Imported Reactive Energy
        //Thing data M_Import_VARh_Q1C    [ readStart="266", readValueType="uint32" ]     // Phase C - Quadrant 1: Imported Reactive Energy
        //Thing data M_Import_VARh_Q2     [ readStart="268", readValueType="uint32" ]     // Quadrant 2: Total Imported Reactive Energy
        //Thing data M_Import_VARh_Q2A    [ readStart="270", readValueType="uint32" ]     // Phase A - Quadrant 2: Imported Reactive Energy
        //Thing data M_Import_VARh_Q2B    [ readStart="272", readValueType="uint32" ]     // Phase B - Quadrant 2: Imported Reactive Energy
        //Thing data M_Import_VARh_Q2C    [ readStart="274", readValueType="uint32" ]     // Phase C - Quadrant 2: Imported Reactive Energy
        //Thing data M_Import_VARh_Q3     [ readStart="276", readValueType="uint32" ]     // Quadrant 3: Total Exported Reactive Energy
        //Thing data M_Import_VARh_Q3A    [ readStart="278", readValueType="uint32" ]     // Phase A - Quadrant 3: Exported Reactive Energy
        //Thing data M_Import_VARh_Q3B    [ readStart="280", readValueType="uint32" ]     // Phase B - Quadrant 3: Exported Reactive Energy
        //Thing data M_Import_VARh_Q3C    [ readStart="282", readValueType="uint32" ]     // Phase C - Quadrant 3: Exported Reactive Energy
        //Thing data M_Import_VARh_Q4     [ readStart="284", readValueType="uint32" ]     // Quadrant 4: Total Exported Reactive Energy
        //Thing data M_Import_VARh_Q4A    [ readStart="286", readValueType="uint32" ]     // Phase A - Quadrant 4: Exported Reactive Energy
        //Thing data M_Import_VARh_Q4B    [ readStart="288", readValueType="uint32" ]     // Phase B - Quadrant 4: Exported Reactive Energy
        //Thing data M_Import_VARh_Q4C    [ readStart="290", readValueType="uint32" ]     // Phase C - Quadrant 4: Exported Reactive Energy
        //Thing data M_Energy_VAR_SF      [ readStart="292", readValueType="int16" ]      // Reactive Energy Scale Factor
    }
}

solaredgeInverter.items

// ########## SolarEdge General Items ##########
Switch						SE2K_ScaleAll				"Alle SE2K-Skalierungsregeln ausführen"										(gSE2K)				{expire="10s,command=OFF"}

// ########## SolarEdge Wechselrichter Gruppen ##########
// SolarEdge Wechselrichter
Group						gSE2KStat					"Wechselrichter PV-Anlage (Status-Werte, nicht skalierbar)"					(GF_Hwr)
Group						gSE2KInt					"Wechselrichter PV-Anlage (int-Werte, skalierbar)"							(GF_Hwr)
Group						gSE2KSfInt					"Wechselrichter PV-Anlage Skalierungsfaktoren (int-Werte)"					(GF_Hwr)
Group						gSE2K						"Wechselrichter PV-Anlage (float-Werte, skaliert)"							(GF_Hwr)

// ########## ModBus Inverter Items (integer values) ##########
// PV WR ID / ModBus specific items
Number						SE2K_C_SunSpec_DID_int		"PV WR Typ [MAP(solaredgeInverterType.map):%s]"								(gSE2KStat)			{channel="modbus:data:SolarEdgeConverter:Registers:C_SunSpec_DID:number", autoupdate="false"}
Number						SE2K_C_SunSpec_Length_int	"PV WR Sunspec Datensatz Länge (int) [%d]"									(gSE2KStat)			{channel="modbus:data:SolarEdgeConverter:Registers:C_SunSpec_Length:number", autoupdate="false"}

// Current across all phases, Phases A,B,C and scaling factor
//Number SE2K_I_AC_Current_int "PV WR AC Strom gesamt (int) [%d A]" (gSE2Kint)     {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Current:number" }
Number						SE2K_I_AC_CurrentA_int		"PV WR AC Strom Ph.A (int) [%d A]"											(gSE2Kint)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_CurrentA:number"}
//Number SE2K_I_AC_CurrentB_int "PV WR AC Strom Ph.B (int) [%d A]" (gSE2Kint)           {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_CurrentB:number" }
//Number SE2K_I_AC_CurrentC_int "PV WR AC Strom Ph.C (int) [%d A]" (gSE2Kint)           {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_CurrentC:number" }
Number						SE2K_I_AC_Current_SF_int	"PV WR AC Strom Ph.A SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Current_SF:number"}

// Voltage for Phases A,B,C and scaling factor
Number						SE2K_I_AC_VoltageAB_int		"PV WR AC Spannung AB (int) [%d V]"											(gSE2Kint)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageAB:number"}
//Number SE2K_I_AC_VoltageBC_int "PV WR AC Spannung BC (int) [%d V]" (gSE2Kint) {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageBC:number" }
//Number SE2K_I_AC_VoltageCA_int "PV WR AC Spannung CA (int) [%d V]" (gSE2Kint) {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageCA:number" }
//Number SE2K_I_AC_VoltageAN_int "PV WR AC Spannung AN (int) [%d V]" (gSE2Kint) {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageAN:number" }
//Number SE2K_I_AC_VoltageBN_int "PV WR AC Spannung BN (int) [%d V]" (gSE2Kint) {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageBN:number" }
//Number SE2K_I_AC_VoltageCN_int "PV WR AC Spannung CN (int) [%d V]" (gSE2Kint) {channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VoltageCN:number" }
Number						SE2K_I_AC_Voltage_SF_int	"PV WR AC Spannung SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Voltage_SF:number"}

// Real Power and SF
Number						SE2K_I_AC_Power_int			"PV WR AC Leistung (int) [%d W]"											(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Power:number"}
Number						SE2K_I_AC_Power_SF_int		"PV WR AC Leistung SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Power_SF:number"}

// Frequency and SF
Number						SE2K_I_AC_Frequency_int		"PV WR AC Frequenz (int) [%d Hz]"											(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Frequency:number"}
Number						SE2K_I_AC_Frequency_SF_int	"PV WR AC Frequenz SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Frequency_SF:number"}

// Apparent Power and SF
Number						SE2K_I_AC_VA_int			"PV WR AC Scheinleistung (int) [%d VA]"										(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VA:number"}
Number						SE2K_I_AC_VA_SF_int			"PV WR AC Scheinleistung SF (int) [%d]"										(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VA_SF:number"}

// Reactive Power and SF
Number						SE2K_I_AC_VAR_int			"PV WR AC Blindleistung (int) [%d var]"										(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VAR:number"}
Number						SE2K_I_AC_VAR_SF_int		"PV WR AC Blindleistung SF (int) [%d]"										(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_VAR_SF:number"}

// Power factor
Number						SE2K_I_AC_PF_int			"PV WR AC Leistungsfaktor (int) [%d %%]"									(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_PF:number"}
Number						SE2K_I_AC_PF_SF_int			"PV WR AC Leistungsfaktor SF (int) [%d]"									(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_PF_SF:number"}

// Lifetime generated energy (acc32-Value / 32-Bit-Wert - im Gegensatz zu allen anderen!)
Number						SE2K_I_AC_Energy_WH_int		"PV WR AC Erzeugungszaehler (int) [%d Wh]"									(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Energy_WH:number"}
Number						SE2K_I_AC_Energy_WH_SF_int	"PV WR AC Erzeugungszaehler SF (int) [%d]"									(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_AC_Energy_WH_SF:number"}

// DC side current
Number						SE2K_I_DC_Current_int		"PV WR DC Strom (int) [%d A]"												(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Current:number"}
Number						SE2K_I_DC_Current_SF_int	"PV WR DC Strom SF (int) [%d]"												(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Current_SF:number"}

// DC side voltage
Number						SE2K_I_DC_Voltage_int		"PV WR DC Spannung (int) [%d V]"											(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Voltage:number"}
Number						SE2K_I_DC_Voltage_SF_int	"PV WR DC Spannung SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Voltage_SF:number"}

// DC side power
Number						SE2K_I_DC_Power_int			"PV WR DC Leistung (int) [%d W]"											(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Power:number"}
Number						SE2K_I_DC_Power_SF_int		"PV WR DC Leistung SF (int) [%d]"											(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_DC_Power_SF:number"}

// Temperature heat sink
Number						SE2K_I_TempSink_int			"PV WR Temperatur Kühlplatte (int) [%d °C]"									(gSE2KInt)			{channel="modbus:data:SolarEdgeConverter:Registers:I_Temp_Sink:number"}
Number						SE2K_I_TempSink_SF_int		"PV WR Temperatur Kühlplatte SF (int) [%d]"									(gSE2KSfInt)		{channel="modbus:data:SolarEdgeConverter:Registers:I_Temp_SF:number"}

// Operating state
Number						SE2K_I_Status_int			"PV WR Status [MAP(solaredgeStatus.map):%s]"								(gSE2KStat)			{channel="modbus:data:SolarEdgeConverter:Registers:I_Status:number", autoupdate="false"}
Number						SE2K_I_Status_Vendor_int	"PV WR Status (SE-spezifisch) [%d]"											(gSE2KStat)			{channel="modbus:data:SolarEdgeConverter:Registers:I_Status_Vendor:number", autoupdate="false"}


// ########## ModBus Inverter Items (float values) ##########
// AC Current across all phases
Number:ElectricCurrent		SE2K_I_AC_CurrentA			"PV WR AC Strom gesamt [%.2f A]"							<energy>		(gSE2K)

// AC Voltage for all phases
Number:ElectricPotential	SE2K_I_AC_VoltageAB			"PV WR AC Spannung [%.2f V]"								<energy>		(gSE2K)

// AC Real power
Number:Power				SE2K_I_AC_Power				"PV WR AC Wirkleistung [%.2f W]"							<energy>		(gSE2K)

// AC Frequency
Number:Frequency			SE2K_I_AC_Frequency			"PV WR Netzfrequenz [%.3f Hz]"								<line>			(gSE2K)

// AC Apparent power
Number:Power				SE2K_I_AC_VA				"PV WR AC Scheinleistung [%.2f VA]"							<energy>		(gSE2K)

// AC Reactive power
Number:Power				SE2K_I_AC_VAR				"PV WR AC Blindleistung [%.2f var]"							<energy>		(gSE2K)

// AC Power factor
Number:Dimensionless		SE2K_I_AC_PF				"PV WR AC Leistungsfaktor [%.2f %%]"						<line>			(gSE2K)

// Lifetime generated energy
Number:Energy				SE2K_I_AC_Energy_WH			"PV WR AC Erzeugungszaehler [%.2f Wh]"						<energy>		(gSE2K)

// DC Current
Number:ElectricCurrent		SE2K_I_DC_Current			"PV WR DC Strom [%.2f A]"									<energy>		(gSE2K)

// DC Voltage
Number:ElectricPotential	SE2K_I_DC_Voltage			"PV WR DC Spannung [%.2f V]"								<energy>		(gSE2K)

// DC Power
Number:Power				SE2K_I_DC_Power				"PV WR DC Leistung [%.2f W]"								<energy>		(gSE2K)

// Temperature heat sink
Number:Temperature			SE2K_I_TempSink				"PV WR Temperatur Kühlplatte [%.2f °C]"						<temperature>	(gSE2K)

solaredgeMeter.items

// ########## SolarEdge General Items ##########
Switch						SE2KM_ScaleAll					"Alle SE2KM-Skalierungsregeln ausführen"									(gSE2KM)					{expire="10s,command=OFF"}

// ########## SolarEdge Meter Gruppen ##########
// SolarEdge Meter
Group						gSE2KMStat						"Meter PV-Anlage (Status-Werte, nicht skalierbar)"							(GF_Hwr)
Group						gSE2KMInt						"Meter PV-Anlage (int-Werte, skalierbar)"									(GF_Hwr)
Group						gSE2KMSfInt						"Meter PV-Anlage Skalierungsfaktoren (int-Werte)"							(GF_Hwr)
Group						gSE2KM							"Meter PV-Anlage (float-Werte, skaliert)"									(GF_Hwr)
Group						gSE2KMMomentan					"Meter PV-Anlage (Momentan-Leistungen)"										(GF_Hwr)

// ########## ModBus Meter Items (integer values) ##########
// PV Meter ID / ModBus specific items
Number						SE2K_M_C_SunSpec_DID_int		"PV Meter Typ [MAP(solaredgeMeterType.map):%s]"								(gSE2KMStat)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_C_SunSpec_DID:number", autoupdate="false"}
Number						SE2K_M_C_SunSpec_Length_int		"PV Meter Sunspec Datensatz Länge (int) [%d]"								(gSE2KMStat)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_C_SunSpec_Length:number"}

// PV Meter Amps Across all phases, Phases A,B,C and scaling factor
Number						SE2K_M_AC_Current_int			"PV Meter AC Strom (Summe) (int) [%d A]"									(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Current:number"}
Number						SE2K_M_AC_Current_A_int			"PV Meter AC Strom Phase A (int) [%d A]"									(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Current_A:number"}
Number						SE2K_M_AC_Current_B_int			"PV Meter AC Strom Phase B (int) [%d A]"									(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Current_B:number"}
Number						SE2K_M_AC_Current_C_int			"PV Meter AC Strom Phase C (int) [%d A]"									(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Current_C:number"}
Number						SE2K_M_AC_Current_SF_int		"PV Meter AC Strom SF (int) [%d]"											(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Current_SF:number"}

// PV Meter Voltage for Phases A,B,C and scaling factor
Number						SE2K_M_AC_Voltage_LN_int		"PV Meter Spannung LN (Avg.) (int) [%d V]"									(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_LN:number"}
Number						SE2K_M_AC_Voltage_AN_int		"PV Meter Spannung AN (int) [%d V]"											(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_AN:number"}
Number						SE2K_M_AC_Voltage_BN_int		"PV Meter Spannung BN (int) [%d V]"											(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_BN:number"}
Number						SE2K_M_AC_Voltage_CN_int		"PV Meter Spannung CN (int) [%d V]"											(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_CN:number"}
//Number SE2K_M_AC_Voltage_LL_int "PV Meter Spannung LL (Avg.) (int) [%d V]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_LL:number" }
//Number SE2K_M_AC_Voltage_AB_int "PV Meter Spannung AB (int) [%d V]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_AB:number" }
//Number SE2K_M_AC_Voltage_BC_int "PV Meter Spannung BC (int) [%d V]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_BC:number" }
//Number SE2K_M_AC_Voltage_CA_int "PV Meter Spannung CA (int) [%d V]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_CA:number" }
Number						SE2K_M_AC_Voltage_SF_int		"PV Meter Spannung SF (int) [%d]"											(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Voltage_SF:number"}

// PV Meter Frequency and SF
Number						SE2K_M_AC_Freq_int				"PV Meter Frequenz (int) [%d Hz]"											(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Freq:number"}
Number						SE2K_M_AC_Freq_SF_int			"PV Meter Frequenz SF (int) [%d]"											(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Freq_SF:number"}

// Real Power and SF
Number						SE2K_M_AC_Power_int				"PV Meter Wirkleistung (Summe) (int) [%d W]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Power:number"}
Number						SE2K_M_AC_Power_A_int			"PV Meter Wirkleistung Phase A (int) [%d W]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Power_A:number"}
Number						SE2K_M_AC_Power_B_int			"PV Meter Wirkleistung Phase B (int) [%d W]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Power_B:number"}
Number						SE2K_M_AC_Power_C_int			"PV Meter Wirkleistung Phase C (int) [%d W]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Power_C:number"}
Number						SE2K_M_AC_Power_SF_int			"PV Meter Wirkleistung SF [%d]"												(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_Power_SF:number"}

// Apparent Power and SF
Number						SE2K_M_AC_VA_int				"PV Meter Scheinleistung (Summe) (int) [%d VA]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VA:number"}
Number						SE2K_M_AC_VA_A_int				"PV Meter Scheinleistung Phase A (int) [%d VA]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VA_A:number"}
Number						SE2K_M_AC_VA_B_int				"PV Meter Scheinleistung Phase B (int) [%d VA]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VA_B:number"}
Number						SE2K_M_AC_VA_C_int				"PV Meter Scheinleistung Phase C (int) [%d VA]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VA_C:number"}
Number						SE2K_M_AC_VA_SF_int				"PV Meter Scheinleistung SF (int) [%d]"										(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VA_SF:number"}

// Reactive Power and SF
//Number SE2K_M_AC_VAR_int "PV Meter Blindleistung (Summe) (int) [%d var]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VAR:number" }
//Number SE2K_M_AC_VAR_A_int "PV Meter Blindleistung Phase A (int) [%d var]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VAR_A:number" }
//Number SE2K_M_AC_VAR_B_int "PV Meter Blindleistung Phase B (int) [%d var]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VAR_B:number" }
//Number SE2K_M_AC_VAR_C_int "PV Meter Blindleistung Phase C (int) [%d var]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VAR_C:number" }
//Number SE2K_M_AC_VAR_SF_int "PV Meter Blindleistung SF (int) [%d]" (gSE2KMSfInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_VAR_SF:number" }

// Power factor
Number						SE2K_M_AC_PF_int				"PV Meter Leistungsfaktor (Avg.) (int) [%d %%]"								(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_PF:number"}
Number						SE2K_M_AC_PF_A_int				"PV Meter Leistungsfaktor Phase A (int) [%d %%]"							(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_PF_A:number"}
Number						SE2K_M_AC_PF_B_int				"PV Meter Leistungsfaktor Phase B (int) [%d %%]"							(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_PF_B:number"}
Number						SE2K_M_AC_PF_C_int				"PV Meter Leistungsfaktor Phase C (int) [%d %%]"							(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_PF_C:number"}
Number						SE2K_M_AC_PF_SF_int				"PV Meter Leistungsfaktor SF (int) [%d %%]"									(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_AC_PF_SF:number"}

// Accumulated Energy (Real Energy)
Number						SE2K_M_Exported_int				"PV Meter Einspeisezähler Wirkenergie (Summe) (int) [%d Wh]"				(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported:number"}
Number						SE2K_M_Exported_A_int			"PV Meter Einspeisezähler Wirkenergie Phase A (int) [%d Wh]"				(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_A:number"}
Number						SE2K_M_Exported_B_int			"PV Meter Einspeisezähler Wirkenergie Phase B (int) [%d Wh]"				(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_B:number"}
Number						SE2K_M_Exported_C_int			"PV Meter Einspeisezähler Wirkenergie Phase C (int) [%d Wh]"				(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_C:number"}
Number						SE2K_M_Imported_int				"PV Meter Bezugszähler Wirkenergie (Summe) (int) [%d Wh]"					(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported:number"}
Number						SE2K_M_Imported_A_int			"PV Meter Bezugszähler Wirkenergie Phase A (int) [%d Wh]"					(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_A:number"}
Number						SE2K_M_Imported_B_int			"PV Meter Bezugszähler Wirkenergie Phase B (int) [%d Wh]"					(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_B:number"}
Number						SE2K_M_Imported_C_int			"PV Meter Bezugszähler Wirkenergie Phase C (int) [%d Wh]"					(gSE2KMInt)					{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_C:number"}
Number						SE2K_M_Energy_W_SF_int			"PV Meter Zähler Wirkenergie SF (int) [%d]"									(gSE2KMSfInt)				{channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Energy_W_SF:number"}

// Accumulated Energy (Apparent Energy)
//Number SE2K_M_Exported_VA_int "PV Meter Einspeisezähler Scheinenergie (Summe) (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_VA:number" }
//Number SE2K_M_Exported_VA_A_int "PV Meter Einspeisezähler Scheinenergie Phase A (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_VA_A:number" }
//Number SE2K_M_Exported_VA_B_int "PV Meter Einspeisezähler Scheinenergie Phase B (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_VA_B:number" }
//Number SE2K_M_Exported_VA_C_int "PV Meter Einspeisezähler Scheinenergie Phase C (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Exported_VA_C:number" }
//Number SE2K_M_Imported_VA_int "PV Meter Bezugszähler Scheinenergie (Summe) (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_VA:number" }
//Number SE2K_M_Imported_VA_A_int "PV Meter Bezugszähler Scheinenergie Phase A (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_VA_A:number" }
//Number SE2K_M_Imported_VA_B_int "PV Meter Bezugszähler Scheinenergie Phase B (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_VA_B:number" }
//Number SE2K_M_Imported_VA_C_int "PV Meter Bezugszähler Scheinenergie Phase C (int) [%d VAh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Imported_VA_C:number" }
//Number SE2K_M_Energy_VA_SF_int "PV Meter Zähler Scheinenergie SF (int) [%d]" (gSE2KMSfInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Energy_VA_SF:number" }

// Accumulated Energy (Reactive Energy)
//Number SE2K_M_Import_VARh_Q1_int "PV Meter Bezugszähler Blindenergie Q1 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q1:number" }
//Number SE2K_M_Import_VARh_Q1A_int "PV Meter Bezugszähler Blindenergie Ph. A Q1 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q1A:number" }
//Number SE2K_M_Import_VARh_Q1B_int "PV Meter Bezugszähler Blindenergie Ph. B Q1 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q1B:number" }
//Number SE2K_M_Import_VARh_Q1C_int "PV Meter Bezugszähler Blindenergie Ph. C Q1 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q1C:number" }
//Number SE2K_M_Import_VARh_Q2_int "PV Meter Bezugszähler Blindenergie Q2 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q2:number" }
//Number SE2K_M_Import_VARh_Q2A_int "PV Meter Bezugszähler Blindenergie Ph. A Q2 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q2A:number" }
//Number SE2K_M_Import_VARh_Q2B_int "PV Meter Bezugszähler Blindenergie Ph. B Q2 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q2B:number" }
//Number SE2K_M_Import_VARh_Q2C_int "PV Meter Bezugszähler Blindenergie Ph. C Q2 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q2C:number" }
//Number SE2K_M_Import_VARh_Q3_int "PV Meter Bezugszähler Blindenergie Q3 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q3:number" }
//Number SE2K_M_Import_VARh_Q3A_int "PV Meter Bezugszähler Blindenergie Ph. A Q3 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q3A:number" }
//Number SE2K_M_Import_VARh_Q3B_int "PV Meter Bezugszähler Blindenergie Ph. B Q3 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q3B:number" }
//Number SE2K_M_Import_VARh_Q3C_int "PV Meter Bezugszähler Blindenergie Ph. C Q3 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q3C:number" }
//Number SE2K_M_Import_VARh_Q4_int "PV Meter Bezugszähler Blindenergie Q4 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q4:number" }
//Number SE2K_M_Import_VARh_Q4A_int "PV Meter Bezugszähler Blindenergie Ph. A Q4 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q4A:number" }
//Number SE2K_M_Import_VARh_Q4B_int "PV Meter Bezugszähler Blindenergie Ph. B Q4 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q4B:number" }
//Number SE2K_M_Import_VARh_Q4C_int "PV Meter Bezugszähler Blindenergie Ph. C Q4 (Summe) (int) [%d VARh]" (gSE2KMInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Import_VARh_Q4C:number" }
//Number SE2K_M_Energy_VAR_SF_int "PV Meter Zähler Blindenergie SF (int) [%d]" (gSE2KMSfInt) {channel="modbus:data:SolarEdgeConverter:RegistersMeter:M_Energy_VAR_SF:number" }

// PV Meter Events
Number						SE2K_M_Events_int				"PV Meter Events [%h]"														(gSE2KMStat)				{channel="modbus:data:SolarEdgeConverter:Registers:M_Events:number"}


// ########## ModBus Meter Items (float values) ##########
// PV Meter Amps Across all phases, Phases A,B,C and scaling factor
Number:ElectricCurrent		SE2K_M_AC_Current				"PV Meter AC Strom (Summe) [%.2f A]"							<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_A				"PV Meter AC Strom Phase A [%.2f A]"							<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_B				"PV Meter AC Strom Phase B [%.2f A]"							<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_C				"PV Meter AC Strom Phase C [%.2f A]"							<energy>	(gSE2KM)
// PV Amps calculated from Power and Voltage
Number:ElectricCurrent		SE2K_M_AC_Current_calc			"PV Meter AC Strom (Summe, berechnet) [%.2f A]"					<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_A_calc		"PV Meter AC Strom Phase A (berechnet) [%.2f A]"				<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_B_calc		"PV Meter AC Strom Phase B (berechnet) [%.2f A]"				<energy>	(gSE2KM)
Number:ElectricCurrent		SE2K_M_AC_Current_C_calc		"PV Meter AC Strom Phase C (berechnet) [%.2f A]"				<energy>	(gSE2KM)

// PV Meter Voltage for Phases A,B,C and scaling factor
Number:ElectricPotential	SE2K_M_AC_Voltage_LN			"PV Meter Spannung LN (Avg.) [%.2f V]"							<energy>	(gSE2KM)
Number:ElectricPotential	SE2K_M_AC_Voltage_AN			"PV Meter Spannung AN [%.2f V]"									<energy>	(gSE2KM)
Number:ElectricPotential	SE2K_M_AC_Voltage_BN			"PV Meter Spannung BN [%.2f V]"									<energy>	(gSE2KM)
Number:ElectricPotential	SE2K_M_AC_Voltage_CN			"PV Meter Spannung CN [%.2f V]"									<energy>	(gSE2KM)
//Number:ElectricPotential SE2K_M_AC_Voltage_LL "PV Meter Spannung LL (Avg.) [%.2f V]" <energy> (gSE2KM)
//Number:ElectricPotential SE2K_M_AC_Voltage_AB "PV Meter Spannung AB [%.2f V]" <energy> (gSE2KM)
//Number:ElectricPotential SE2K_M_AC_Voltage_BC "PV Meter Spannung BC [%.2f V]" <energy> (gSE2KM)
//Number:ElectricPotential SE2K_M_AC_Voltage_CA "PV Meter Spannung CA [%.2f V]" <energy> (gSE2KM)

// PV Meter Frequency and SF
Number:Frequency			SE2K_M_AC_Freq					"PV Meter Frequenz [%.3f Hz]"									<line>		(gSE2KM)

// Real Power and SF
Number:Power				SE2K_M_AC_Power					"PV Meter Wirkleistung (Summe) [%.2f W]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_Power_A				"PV Meter Wirkleistung Phase A [%.2f W]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_Power_B				"PV Meter Wirkleistung Phase B [%.2f W]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_Power_C				"PV Meter Wirkleistung Phase C [%.2f W]"						<energy>	(gSE2KM)

// Apparent Power and SF
Number:Power				SE2K_M_AC_VA					"PV Meter Scheinleistung (Summe) [%.2f VA]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_VA_A					"PV Meter Scheinleistung Phase A [%.2f VA]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_VA_B					"PV Meter Scheinleistung Phase B [%.2f VA]"						<energy>	(gSE2KM)
Number:Power				SE2K_M_AC_VA_C					"PV Meter Scheinleistung Phase C [%.2f VA]"						<energy>	(gSE2KM)

// Reactive Power and SF
//Number:Power SE2K_M_AC_VAR "PV Meter Blindleistung (Summe) [%.2f var]" <energy> (gSE2KM)
//Number:Power SE2K_M_AC_VAR_A "PV Meter Blindleistung Phase A [%.2f var]" <energy> (gSE2KM)
//Number:Power SE2K_M_AC_VAR_B "PV Meter Blindleistung Phase B [%.2f var]" <energy> (gSE2KM)
//Number:Power SE2K_M_AC_VAR_C "PV Meter Blindleistung Phase C [%.2f var]" <energy> (gSE2KM)

// Power factor
Number:Dimensionless		SE2K_M_AC_PF					"PV Meter Leistungsfaktor (Avg.) [%.2f %%]"						<line>		(gSE2KM)
Number:Dimensionless		SE2K_M_AC_PF_A					"PV Meter Leistungsfaktor Phase A [%.2f %%]"					<line>		(gSE2KM)
Number:Dimensionless		SE2K_M_AC_PF_B					"PV Meter Leistungsfaktor Phase B [%.2f %%]"					<line>		(gSE2KM)
Number:Dimensionless		SE2K_M_AC_PF_C					"PV Meter Leistungsfaktor Phase C [%.2f %%]"					<line>		(gSE2KM)

// Accumulated Energy (Real Energy)
Number:Energy				SE2K_M_Exported					"PV Meter Einspeisezähler Wirkenergie (Summe) [%.2f Wh]"		<energy>	(gSE2KM)
Number:Energy				SE2K_M_Exported_A				"PV Meter Einspeisezähler Wirkenergie Phase A [%.2f Wh]"		<energy>	(gSE2KM)
Number:Energy				SE2K_M_Exported_B				"PV Meter Einspeisezähler Wirkenergie Phase B [%.2f Wh]"		<energy>	(gSE2KM)
Number:Energy				SE2K_M_Exported_C				"PV Meter Einspeisezähler Wirkenergie Phase C [%.2f Wh]"		<energy>	(gSE2KM)
Number:Energy				SE2K_M_Imported					"PV Meter Bezugszähler Wirkenergie (Summe) [%.2f Wh]"			<energy>	(gSE2KM)
Number:Energy				SE2K_M_Imported_A				"PV Meter Bezugszähler Wirkenergie Phase A [%.2f Wh]"			<energy>	(gSE2KM)
Number:Energy				SE2K_M_Imported_B				"PV Meter Bezugszähler Wirkenergie Phase B [%.2f Wh]"			<energy>	(gSE2KM)
Number:Energy				SE2K_M_Imported_C				"PV Meter Bezugszähler Wirkenergie Phase C [%.2f Wh]"			<energy>	(gSE2KM)

// Accumulated Energy (Apparent Energy)
//Number:Energy SE2K_M_Exported_VA "PV Meter Einspeisezähler Scheinenergie (Summe) [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Exported_VA_A "PV Meter Einspeisezähler Scheinenergie Phase A [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Exported_VA_B "PV Meter Einspeisezähler Scheinenergie Phase B [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Exported_VA_C "PV Meter Einspeisezähler Scheinenergie Phase C [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Imported_VA "PV Meter Bezugszähler Scheinenergie (Summe) [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Imported_VA_A "PV Meter Bezugszähler Scheinenergie Phase A [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Imported_VA_B "PV Meter Bezugszähler Scheinenergie Phase B [%.2f VAh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Imported_VA_C "PV Meter Bezugszähler Scheinenergie Phase C [%.2f VAh]" <energy> (gSE2KM)

// Accumulated Energy (Reactive Energy)
//Number:Energy SE2K_M_Import_VARh_Q1 "PV Meter Bezugszähler Blindenergie Q1 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q1A "PV Meter Bezugszähler Blindenergie Ph. A Q1 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q1B "PV Meter Bezugszähler Blindenergie Ph. B Q1 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q1C "PV Meter Bezugszähler Blindenergie Ph. C Q1 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q2 "PV Meter Bezugszähler Blindenergie Q2 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q2A "PV Meter Bezugszähler Blindenergie Ph. A Q2 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q2B "PV Meter Bezugszähler Blindenergie Ph. B Q2 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q2C "PV Meter Bezugszähler Blindenergie Ph. C Q2 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q3 "PV Meter Bezugszähler Blindenergie Q3 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q3A "PV Meter Bezugszähler Blindenergie Ph. A Q3 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q3B "PV Meter Bezugszähler Blindenergie Ph. B Q3 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q3C "PV Meter Bezugszähler Blindenergie Ph. C Q3 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q4 "PV Meter Bezugszähler Blindenergie Q4 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q4A "PV Meter Bezugszähler Blindenergie Ph. A Q4 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q4B "PV Meter Bezugszähler Blindenergie Ph. B Q4 (Summe) [%.2f VARh]" <energy> (gSE2KM)
//Number:Energy SE2K_M_Import_VARh_Q4C "PV Meter Bezugszähler Blindenergie Ph. C Q4 (Summe) [%.2f VARh]" <energy> (gSE2KM)

// Other calculated Items
Number:Power				SE2KM_EigenverbrauchGesamt		"Eigenverbrauch Gesamt [%.2f Wh]"								<energy>	(gSE2KM)
Number:Power				SE2KM_GesamtverbrauchGesamt		"Gesamtverbrauch Gesamt [%.2f Wh]"								<energy>	(gSE2KM)
Number:Dimensionless		SE2KM_SolarerDeckungsgradGesamt	"SolarerDeckungsgrad Gesamt [%.2f %%]"							<line>		(gSE2KM)
Number:Power				SE2KM_DirektverbrauchMomentan	"Direktverbrauch Momentan [%.2f W]"								<energy>	(gSE2KM,gSE2KMMomentan)
Number:Power				SE2KM_HausverbrauchMomentan		"Hausverbrauch Momentan [%.2f W]"								<energy>	(gSE2KM,gSE2KMMomentan)
Number:Power				SE2KM_NetzleistungMomentan		"Netzleistung Momentan [%.2f W]"								<energy>	(gSE2KM,gSE2KMMomentan)
2 Likes

(Part 2/3)

solaredge.rules (part 1/2)

import java.lang.Math
import java.lang.Double

// Fire scaling rules on system startup
rule SE2K_SE2KM_ScaleOnStartup
when
    System started
then
    SE2K_ScaleAll.sendCommand(ON)
    SE2KM_ScaleAll.sendCommand(ON)
end

// ########## SolarEdge Inverter Item Scaling rules ##########
rule SE2K_I_AC_CurrentA_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_CurrentA_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_CurrentA - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_AC_CurrentA_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_CurrentA_int.state.toString + ', SF: 10^' + SE2K_I_AC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_CurrentA.postUpdate(result)
end

rule SE2K_I_AC_VoltageAB_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_VoltageAB_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_VoltageAB - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_AC_VoltageAB_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_VoltageAB_int.state.toString + ', SF: 10^' + SE2K_I_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_VoltageAB.postUpdate(result)
end

rule SE2K_I_AC_Power_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_Power_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_Power - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_AC_Power_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_Power_int.state.toString + ', SF: 10^' + SE2K_I_AC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_Power.postUpdate(result)
end

rule SE2K_I_AC_Frequency_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_Frequency_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_Frequency - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_Frequency_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_AC_Frequency_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_Frequency_int.state.toString + ', SF: 10^' + SE2K_I_AC_Frequency_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_Frequency.postUpdate(result)
end

rule SE2K_I_AC_VA_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_VA_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_VA - '

    // Wert normieren
    var Double intValue = (SE2K_I_AC_VA_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_VA_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_VA_int.state.toString + ', SF: 10^' + SE2K_I_AC_VA_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_VA.postUpdate(result)
end

rule SE2K_I_AC_VAR_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_VAR_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_VAR - '

    // Wert normieren
    var Double intValue = (SE2K_I_AC_VAR_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_VAR_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_VAR_int.state.toString + ', SF: 10^' + SE2K_I_AC_VAR_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_VAR.postUpdate(result)
end

rule SE2K_I_AC_PF_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_PF_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_PF - '

    // Wert normieren
    var Double intValue = (SE2K_I_AC_PF_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_PF_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_PF_int.state.toString + ', SF: 10^' + SE2K_I_AC_PF_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_PF.postUpdate(result)
end

rule SE2K_I_AC_Energy_WH_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_AC_Energy_WH_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_AC_Energy_WH - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_AC_Energy_WH_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_AC_Energy_WH_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_AC_Energy_WH_int.state.toString + ', SF: 10^' + SE2K_I_AC_Energy_WH_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_AC_Energy_WH.postUpdate(result)
end

rule SE2K_I_DC_Current_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_DC_Current_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_DC_Current - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_DC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_DC_Current_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_DC_Current_int.state.toString + ', SF: 10^' + SE2K_I_DC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_DC_Current.postUpdate(result)
end

rule SE2K_I_DC_Voltage_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_DC_Voltage_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_DC_Voltage - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_DC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_I_DC_Voltage_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_DC_Voltage_int.state.toString + ', SF: 10^' + SE2K_I_DC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_DC_Voltage.postUpdate(result)
end

rule SE2K_I_DC_Power_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_DC_Power_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_DC_Power - '

    // Wert normieren
    var Double intValue = (SE2K_I_DC_Power_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_DC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_DC_Power_int.state.toString + ', SF: 10^' + SE2K_I_DC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_DC_Power.postUpdate(result)
end

rule SE2K_I_TempSink_Scaling
when 
    Item SE2K_ScaleAll changed to ON or
    Item SE2K_I_TempSink_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_I_TempSink - '

    // Wert normieren
    var Double intValue = (SE2K_I_TempSink_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_I_TempSink_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_I_TempSink_int.state.toString + ', SF: 10^' + SE2K_I_TempSink_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_I_TempSink.postUpdate(result)
end


// ########## SolarEdge Meter Item Scaling rules ##########
rule SE2K_M_AC_Current_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Current_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Current - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Current_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Current_int.state.toString + ', SF: 10^' + SE2K_M_AC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Current.postUpdate(result)

    // Wert aus Leistung und Spannung parallel berechnen
    var Double valueCalc = (SE2K_M_AC_Power.state as QuantityType<Power>).doubleValue / ((SE2K_M_AC_Voltage_LN.state as QuantityType<ElectricPotential>).doubleValue * ((SE2K_M_AC_PF.state as QuantityType<Dimensionless>).doubleValue / 100.0 ))
    SE2K_M_AC_Current_calc.postUpdate(valueCalc)
end

rule SE2K_M_AC_Current_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Current_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Current_A - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Current_A_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Current_A_int.state.toString + ', SF: 10^' + SE2K_M_AC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Current_A.postUpdate(result)

    // Wert aus Scheinleistung und Spannung parallel berechnen
    // Bug: SE2K_M_AC_VA_A wird nicht als QuantityType<Power> erkannt, deshalb DecimalType
    var Double valueCalc = (SE2K_M_AC_VA_A.state as DecimalType).doubleValue / (SE2K_M_AC_Voltage_AN.state as QuantityType<ElectricPotential>).doubleValue
    if ((SE2K_M_AC_Power_A.state as QuantityType<Power>).doubleValue < 0.0) {
        valueCalc = -1.0 * valueCalc
    } 
    SE2K_M_AC_Current_A_calc.postUpdate(valueCalc)
end

rule SE2K_M_AC_Current_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Current_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Current_B - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Current_B_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Current_B_int.state.toString + ', SF: 10^' + SE2K_M_AC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Current_B.postUpdate(result)

    // Wert aus Scheinleistung und Spannung parallel berechnen
    // Bug: SE2K_M_AC_VA_B wird nicht als QuantityType<Power> erkannt, deshalb DecimalType
    var Double valueCalc = (SE2K_M_AC_VA_B.state as DecimalType).doubleValue / (SE2K_M_AC_Voltage_BN.state as QuantityType<ElectricPotential>).doubleValue
    if ((SE2K_M_AC_Power_B.state as QuantityType<Power>).doubleValue < 0.0) {
        valueCalc = -1.0 * valueCalc
    } 
    SE2K_M_AC_Current_B_calc.postUpdate(valueCalc)
end

rule SE2K_M_AC_Current_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Current_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Current_C - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Current_C_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Current_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Current_C_int.state.toString + ', SF: 10^' + SE2K_M_AC_Current_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Current_C.postUpdate(result)

    // Wert aus Scheinleistung und Spannung parallel berechnen
    // Bug: SE2K_M_AC_VA_C wird nicht als QuantityType<Power> erkannt, deshalb DecimalType
    var Double valueCalc = (SE2K_M_AC_VA_C.state as DecimalType).doubleValue / (SE2K_M_AC_Voltage_CN.state as QuantityType<ElectricPotential>).doubleValue
    if ((SE2K_M_AC_Power_C.state as QuantityType<Power>).doubleValue < 0.0) {
        valueCalc = -1.0 * valueCalc
    } 
    SE2K_M_AC_Current_C_calc.postUpdate(valueCalc)
end

rule SE2K_M_AC_Voltage_LN_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_LN_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_LN - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_LN_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_LN_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_LN.postUpdate(result)
end

rule SE2K_M_AC_Voltage_AN_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_AN_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_AN - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_AN_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_AN_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_AN.postUpdate(result)
end

rule SE2K_M_AC_Voltage_BN_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_BN_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_BN - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_BN_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_BN_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_BN.postUpdate(result)
end

rule SE2K_M_AC_Voltage_CN_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_CN_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_CN - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_CN_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_CN_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_CN.postUpdate(result)
end

/*rule SE2K_M_AC_Voltage_LL_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_LL_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_LL - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_LL_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_LL_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_LL.postUpdate(result)
end*/

/*rule SE2K_M_AC_Voltage_AB_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_AB_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_AB - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_AB_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_AB_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_AB.postUpdate(result)
end*/

/*rule SE2K_M_AC_Voltage_BC_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_BC_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_BC - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_BC_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_BC_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_BC.postUpdate(result)
end*/

/*rule SE2K_M_AC_Voltage_CA_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Voltage_CA_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Voltage_CA - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Voltage_CA_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Voltage_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Voltage_CA_int.state.toString + ', SF: 10^' + SE2K_M_AC_Voltage_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Voltage_CA.postUpdate(result)
end*/

rule SE2K_M_AC_Freq_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Freq_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Freq - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Freq_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Freq_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Freq_int.state.toString + ', SF: 10^' + SE2K_M_AC_Freq_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Freq.postUpdate(result)
end

rule SE2K_M_AC_Power_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Power_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Power - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Power_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    // Achtung: Das SolarEdge-Meter bewertet exportierten Strom positiv 
    //          -> anders als alle anderen Darstellungen, deshalb Multiplikation mit -1.0
    var Double result = -1.0 * intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Power_int.state.toString + ', SF: 10^' + SE2K_M_AC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Power.postUpdate(result)
end

rule SE2K_M_AC_Power_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Power_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Power_A - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Power_A_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    // Achtung: Das SolarEdge-Meter bewertet exportierten Strom positiv 
    //          -> anders als alle anderen Darstellungen, deshalb Multiplikation mit -1.0
    var Double result = -1.0 * intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Power_A_int.state.toString + ', SF: 10^' + SE2K_M_AC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Power_A.postUpdate(result)
end

rule SE2K_M_AC_Power_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Power_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Power_B - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Power_B_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    // Achtung: Das SolarEdge-Meter bewertet exportierten Strom positiv 
    //          -> anders als alle anderen Darstellungen, deshalb Multiplikation mit -1.0
    var Double result = -1.0 * intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Power_B_int.state.toString + ', SF: 10^' + SE2K_M_AC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Power_B.postUpdate(result)
end

rule SE2K_M_AC_Power_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_Power_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_Power_C - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_Power_C_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_Power_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    // Achtung: Das SolarEdge-Meter bewertet exportierten Strom positiv 
    //          -> anders als alle anderen Darstellungen, deshalb Multiplikation mit -1.0
    var Double result = -1.0 * intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_Power_C_int.state.toString + ', SF: 10^' + SE2K_M_AC_Power_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_Power_C.postUpdate(result)
end

rule SE2K_M_AC_VA_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VA_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VA - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VA_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VA_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VA_int.state.toString + ', SF: 10^' + SE2K_M_AC_VA_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VA.postUpdate(result)
end

rule SE2K_M_AC_VA_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VA_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VA_A - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VA_A_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VA_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VA_A_int.state.toString + ', SF: 10^' + SE2K_M_AC_VA_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VA_A.postUpdate(result)
end

rule SE2K_M_AC_VA_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VA_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VA_B - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VA_B_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VA_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VA_B_int.state.toString + ', SF: 10^' + SE2K_M_AC_VA_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VA_B.postUpdate(result)
end

rule SE2K_M_AC_VA_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VA_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VA_C - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VA_C_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VA_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VA_C_int.state.toString + ', SF: 10^' + SE2K_M_AC_VA_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VA_C.postUpdate(result)
end

/*rule SE2K_M_AC_VAR_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VAR_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VAR - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VAR_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VAR_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VAR_int.state.toString + ', SF: 10^' + SE2K_M_AC_VAR_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VAR.postUpdate(result)
end*/

/*rule SE2K_M_AC_VAR_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VAR_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VAR_A - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VAR_A_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VAR_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VAR_A_int.state.toString + ', SF: 10^' + SE2K_M_AC_VAR_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VAR_A.postUpdate(result)
end*/

/*rule SE2K_M_AC_VAR_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VAR_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VAR_B - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VAR_B_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VAR_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VAR_B_int.state.toString + ', SF: 10^' + SE2K_M_AC_VAR_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VAR_B.postUpdate(result)
end*/

/*rule SE2K_M_AC_VAR_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_VAR_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_VAR_C - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_VAR_C_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_VAR_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_VAR_C_int.state.toString + ', SF: 10^' + SE2K_M_AC_VAR_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_VAR_C.postUpdate(result)
end*/

rule SE2K_M_AC_PF_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_PF_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_PF - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_PF_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_PF_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_PF_int.state.toString + ', SF: 10^' + SE2K_M_AC_PF_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_PF.postUpdate(result)
end

rule SE2K_M_AC_PF_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_PF_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_PF_A - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_PF_A_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_PF_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_PF_A_int.state.toString + ', SF: 10^' + SE2K_M_AC_PF_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_PF_A.postUpdate(result)
end

rule SE2K_M_AC_PF_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_PF_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_PF_B - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_PF_B_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_PF_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_PF_B_int.state.toString + ', SF: 10^' + SE2K_M_AC_PF_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_PF_B.postUpdate(result)
end

rule SE2K_M_AC_PF_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_AC_PF_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_AC_PF_C - '

    // Wert normieren
    var Double intValue = (SE2K_M_AC_PF_C_int.state as DecimalType).doubleValue
    if (intValue > 32767) intValue = intValue - (65536).doubleValue

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_AC_PF_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = intValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_AC_PF_C_int.state.toString + ', SF: 10^' + SE2K_M_AC_PF_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_AC_PF_C.postUpdate(result)
end
3 Likes

(Part 3/3)

solaredge.rules (part 2/2)

rule SE2K_M_Exported_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Exported_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Exported - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Exported_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Exported_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Exported.postUpdate(result)
end

rule SE2K_M_Exported_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Exported_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Exported_A - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Exported_A_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Exported_A_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Exported_A.postUpdate(result)
end

rule SE2K_M_Exported_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Exported_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Exported_B - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Exported_B_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Exported_B_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Exported_B.postUpdate(result)
end

rule SE2K_M_Exported_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Exported_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Exported_C - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Exported_C_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Exported_C_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Exported_C.postUpdate(result)
end

rule SE2K_M_Imported_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Imported_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Imported - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Imported_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Imported_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Imported.postUpdate(result)
end

rule SE2K_M_Imported_A_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Imported_A_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Imported_A - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Imported_A_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Imported_A_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Imported_A.postUpdate(result)
end

rule SE2K_M_Imported_B_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Imported_B_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Imported_B - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Imported_B_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Imported_B_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Imported_B.postUpdate(result)
end

rule SE2K_M_Imported_C_Scaling
when 
    Item SE2KM_ScaleAll changed to ON or
    Item SE2K_M_Imported_C_int changed
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Werteskalierung - SE2K_M_Imported_C - '

    // Skalierungsfaktor normieren
    var Double scalingFactor = (SE2K_M_Energy_W_SF_int.state as DecimalType).doubleValue
    if (scalingFactor > 32767) scalingFactor = scalingFactor - (65536).doubleValue

    // Wert skalieren
    var Double result = (SE2K_M_Imported_C_int.state as DecimalType).doubleValue * Math::pow(10,scalingFactor)

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Rohwert: ' + SE2K_M_Imported_C_int.state.toString + ', SF: 10^' + SE2K_M_Energy_W_SF_int.state.toString + '; skaliert: ' + result.toString)
    SE2K_M_Imported_C.postUpdate(result)
end

// Eigenverbrauch (Direktverbrauch) = Erzeugung - Einspeisung
rule SE2KM_EigenverbrauchGesamt
when
    Item SE2K_I_AC_Energy_WH received update or
    Item SE2K_M_Exported received update 
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Berechnungen - SE2KM_EigenverbrauchGesamt - '

    // Eigenverbrauch berechnen
    var Double result = 0.0
    if (SE2K_I_AC_Energy_WH.state != NULL && SE2K_M_Exported.state != NULL) {
        result = (SE2K_I_AC_Energy_WH.state as QuantityType<Energy>).doubleValue - (SE2K_M_Exported.state as QuantityType<Energy>).doubleValue
    }

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Eigenverbrauch: ' + SE2KM_EigenverbrauchGesamt.state.toString + '; Produktion: ' + SE2K_I_AC_Energy_WH.state.toString + ', Export: ' + SE2K_M_Exported.state.toString)
    SE2KM_EigenverbrauchGesamt.postUpdate(result)
end

// Gesamtverbrauch = Bezug + Erzeugung - Einspeisung
rule SE2KM_GesamtverbrauchGesamt
when
    Item SE2K_I_AC_Energy_WH received update or
    Item SE2K_M_Imported received update or
    Item SE2K_M_Exported received update
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Berechnungen - SE2KM_GesamtverbrauchGesamt - '

    // Eigenverbrauch berechnen
    var Double result = 0.0
    if (SE2K_M_Imported.state != NULL && SE2K_I_AC_Energy_WH.state != NULL && SE2K_M_Exported.state != NULL) {
        result = (SE2K_M_Imported.state as QuantityType<Energy>).doubleValue + (SE2K_I_AC_Energy_WH.state as QuantityType<Energy>).doubleValue - (SE2K_M_Exported.state as QuantityType<Energy>).doubleValue
    }
    
    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Gesamtverbrauch: ' + SE2KM_GesamtverbrauchGesamt.state.toString + '; Produktion: ' + SE2K_I_AC_Energy_WH.state.toString + ', Import: ' + SE2K_M_Imported.state.toString + ', Export: ' + SE2K_M_Exported.state.toString)
    SE2KM_GesamtverbrauchGesamt.postUpdate(result)
end

// Solarer Deckungsgrad = Eigenverbrauch / Gesamtverbrauch
rule SE2KM_SolarerDeckungsgradGesamt
when
    Item SE2KM_EigenverbrauchGesamt received update or
    Item SE2KM_GesamtverbrauchGesamt received update
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Berechnungen - SE2KM_SolarerDeckungsgradGesamt - '

    // Solarer Deckungsgrad berechnen
    var Double result = 0.0
    if (SE2KM_EigenverbrauchGesamt.state != NULL && SE2KM_GesamtverbrauchGesamt.state != NULL) {
        result = (SE2KM_EigenverbrauchGesamt.state as QuantityType<Energy>).doubleValue / (SE2KM_GesamtverbrauchGesamt.state as QuantityType<Energy>).doubleValue * 100.0
    }

    // Float-Wert schreiben
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Solarer Deckungsgrad: ' + SE2KM_SolarerDeckungsgradGesamt.state.toString + '; Eigenverbrauch: ' + SE2KM_EigenverbrauchGesamt.state.toString + ', Gesamtverbrauch: ' + SE2KM_GesamtverbrauchGesamt.state.toString)
    SE2KM_SolarerDeckungsgradGesamt.postUpdate(result)
end

rule SE2KM_VerbraeucheMomentan
when 
    Item SE2K_M_AC_Power received update
then
    Thread::sleep(100)						// Let modbus finish reading all registers
    val String logPrefix = 'SolarEdge Berechnungen - SE2KM_VerbraeucheMomentan - '

    var Double erzeugung = (SE2K_I_AC_Power.state as QuantityType<Power>).doubleValue
    // gridpower = bezug - einspeisung
    var Double gridpower = (SE2K_M_AC_Power.state as QuantityType<Power>).doubleValue
    var Double verbrauch = erzeugung + gridpower
    // Direktverbrauch = Erzeugung - Einspeisung
    var Double direktverbrauch = 0.0

    // Leistung Haus (momentan) = Gesamtleistung Haus (Erzeugung + Bezug + Einspeisung)
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Hausverbrauch Momentan: ' + SE2KM_HausverbrauchMomentan.state.toString)
    SE2KM_HausverbrauchMomentan.postUpdate(verbrauch)
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Netzbezug Momentan: ' + SE2KM_NetzleistungMomentan.state.toString)
    SE2KM_NetzleistungMomentan.postUpdate(gridpower)
    
    if (gridpower < 0.0) {
        direktverbrauch = erzeugung + gridpower
    } else if (gridpower > 0.0) {
        direktverbrauch = erzeugung
    }
    
    if (EnableLog_SolarEdgeRules.state == ON) logInfo('solaredge.rules', logPrefix + 'Direktverbrauch Momentan: ' + SE2KM_DirektverbrauchMomentan.state.toString)
    SE2KM_DirektverbrauchMomentan.postUpdate(direktverbrauch)
end

Excerpt from my sitemap

Frame label="PV-Anlage" {
	Default item=SE2K_I_Status_int label="Wechselrichter Status" icon="switch"
	Default item=SE2K_I_Status_Vendor_int label="Wechselrichter Störung [%d]" icon="error"
	Default item=SE2K_I_AC_Power label="AC-Seite Wirkleistung (momentan) [%.1f W]"
	Default item=SE2K_I_DC_Power label="DC-Seite Leistung (momentan) [%.1f W]"
	Default item=SE2K_I_AC_PF label="Leistungsfaktor" icon="line"
	Default item=SE2K_I_AC_Energy_WH label="Stromerzeugung (gesamt) [%.2f MWh]"
	Default item=SE2K_M_Exported label="PV Meter Einspeisezähler Wirkenergie (Summe) [%.2f MWh]"
	Default item=SE2KM_EigenverbrauchGesamt label="Eigenverbrauch Gesamt [%.2f MWh]"
	Default item=SE2KM_GesamtverbrauchGesamt label="Gesamtverbrauch Gesamt [%.2f MWh]"
	Default item=SE2KM_SolarerDeckungsgradGesamt label="SolarerDeckungsgrad Gesamt [%.2f %%]" icon="line"
	Text item=gSE2K label="Wechselrichter PV-Anlage (float-Werte, skaliert)" icon="solarplant" {
		Default item=SE2K_I_AC_CurrentA label="PV WR AC Strom gesamt"
		Default item=SE2K_I_AC_VoltageAB label="PV WR AC Spannung"
		Default item=SE2K_I_AC_Power label="PV WR AC Wirkleistung"
		Default item=SE2K_I_AC_Frequency label="PV WR Netzfrequenz"
		Default item=SE2K_I_AC_VA label="PV WR AC Scheinleistung"
		Default item=SE2K_I_AC_VAR label="PV WR AC Blindleistung"
		Default item=SE2K_I_AC_PF label="PV WR AC Leistungsfaktor"
		Default item=SE2K_I_AC_Energy_WH label="PV WR AC Erzeugungszaehler"
		Default item=SE2K_I_DC_Current label="PV WR DC Strom"
		Default item=SE2K_I_DC_Voltage label="PV WR DC Spannung"
		Default item=SE2K_I_DC_Power label="PV WR DC Leistung"
		Default item=SE2K_I_TempSink label="PV WR Temperatur Kühlplatte"
		Default item=SE2K_ScaleAll label="Alle SE2K-Skalierungsregeln ausführen"
	}
	Text item=gSE2KM label="Meter PV-Anlage (float-Werte, skaliert)" icon="solarplant" {
		Default item=SE2K_M_AC_Current label="PV Meter AC Strom (Summe)"
		Default item=SE2K_M_AC_Current_calc label="PV Meter AC Strom (Summe, berechnet)"
		Default item=SE2K_M_AC_Current_A label="PV Meter AC Strom Phase A"
		Default item=SE2K_M_AC_Current_A_calc label="PV Meter AC Strom Phase A (berechnet)"
		Default item=SE2K_M_AC_Current_B label="PV Meter AC Strom Phase B"
		Default item=SE2K_M_AC_Current_B_calc label="PV Meter AC Strom Phase B (berechnet)"
		Default item=SE2K_M_AC_Current_C label="PV Meter AC Strom Phase C"
		Default item=SE2K_M_AC_Current_C_calc label="PV Meter AC Strom Phase C (berechnet)"
		Default item=SE2K_M_AC_Voltage_LN label="PV Meter Spannung LN (Avg.)"
		Default item=SE2K_M_AC_Voltage_AN label="PV Meter Spannung AN"
		Default item=SE2K_M_AC_Voltage_BN label="PV Meter Spannung BN"
		Default item=SE2K_M_AC_Voltage_CN label="PV Meter Spannung CN"
		Default item=SE2K_M_AC_Power label="PV Meter Wirkleistung (Summe)"
		Default item=SE2K_M_AC_Power_A label="PV Meter Wirkleistung Phase A"
		Default item=SE2K_M_AC_Power_B label="PV Meter Wirkleistung Phase B"
		Default item=SE2K_M_AC_Power_C label="PV Meter Wirkleistung Phase C"
		Default item=SE2K_M_AC_VA label="PV Meter Scheinleistung (Summe)"
		Default item=SE2K_M_AC_VA_A label="PV Meter Scheinleistung Phase A"
		Default item=SE2K_M_AC_VA_B label="PV Meter Scheinleistung Phase B"
		Default item=SE2K_M_AC_VA_C label="PV Meter Scheinleistung Phase C"
		Default item=SE2K_M_AC_PF label="PV Meter Leistungsfaktor (Avg.)"
		Default item=SE2K_M_AC_PF_A label="PV Meter Leistungsfaktor Phase A"
		Default item=SE2K_M_AC_PF_B label="PV Meter Leistungsfaktor Phase B"
		Default item=SE2K_M_AC_PF_C label="PV Meter Leistungsfaktor Phase C"
		Default item=SE2K_M_Exported label="PV Meter Einspeisezähler Wirkenergie (Summe)"
		Default item=SE2K_M_Exported_A label="PV Meter Einspeisezähler Wirkenergie Phase A"
		Default item=SE2K_M_Exported_B label="PV Meter Einspeisezähler Wirkenergie Phase B"
		Default item=SE2K_M_Exported_C label="PV Meter Einspeisezähler Wirkenergie Phase C"
		Default item=SE2K_M_Imported label="PV Meter Bezugszähler Wirkenergie (Summe)"
		Default item=SE2K_M_Imported_A label="PV Meter Bezugszähler Wirkenergie Phase A"
		Default item=SE2K_M_Imported_B label="PV Meter Bezugszähler Wirkenergie Phase B"
		Default item=SE2K_M_Imported_C label="PV Meter Bezugszähler Wirkenergie Phase C"
		Default item=SE2KM_EigenverbrauchGesamt label="Eigenverbrauch Gesamt"
		Default item=SE2KM_GesamtverbrauchGesamt label="Gesamtverbrauch Gesamt"
		Default item=SE2KM_SolarerDeckungsgradGesamt label="SolarerDeckungsgrad Gesamt"
		Default item=SE2KM_DirektverbrauchMomentan label="Direktverbrauch Momentan"
		Default item=SE2KM_HausverbrauchMomentan label="Hausverbrauch Momentan"
		Default item=SE2KM_NetzleistungMomentan label="Netzleistung Momentan"
		Default item=SE2K_M_AC_Freq label="PV Meter Frequenz"
		Default item=SE2KM_ScaleAll label="Alle SE2KM-Skalierungsregeln ausführen"
	}
	Text item=gSE2KStat label="Wechselrichter PV-Anlage (Status-Werte, nicht skalierbar)" icon="solarplant" {
		Default item=SE2K_C_SunSpec_DID_int label="PV WR Typ"
		Default item=SE2K_C_SunSpec_Length_int label="PV WR Sunspec Datensatz Länge (int)"
		Default item=SE2K_I_Status_int label="PV WR Status"
		Default item=SE2K_I_Status_Vendor_int label="PV WR Status (SE-spezifisch)"
	}
	Text item=gSE2KMStat label="Meter PV-Anlage (Status-Werte, nicht skalierbar)" icon="solarplant" {
		Default item=SE2K_M_C_SunSpec_DID_int label="PV Meter Typ"
		Default item=SE2K_M_C_SunSpec_Length_int label="PV Meter Sunspec Datensatz Länge (int)"
		Default item=SE2K_M_Events_int label="PV Meter Events"
	}
	Text item=gSE2KInt label="Wechselrichter PV-Anlage (int-Werte, skalierbar)" icon="solarplant" {
		Default item=SE2K_I_AC_Power_int label="PV WR AC Leistung (int)"
		Default item=SE2K_I_AC_Frequency_int label="PV WR AC Frequenz (int)"
		Default item=SE2K_I_AC_VA_int label="PV WR AC Scheinleistung (int)"
		Default item=SE2K_I_AC_VAR_int label="PV WR AC Blindleistung (int)"
		Default item=SE2K_I_AC_PF_int label="PV WR AC Leistungsfaktor (int)"
		Default item=SE2K_I_AC_Energy_WH_int label="PV WR AC Erzeugungszaehler (int)"
		Default item=SE2K_I_DC_Current_int label="PV WR DC Strom (int)"
		Default item=SE2K_I_DC_Voltage_int label="PV WR DC Spannung (int)"
		Default item=SE2K_I_DC_Power_int label="PV WR DC Leistung (int)"
		Default item=SE2K_I_TempSink_int label="PV WR Temperatur Kühlplatte (int)"
	}
	Text item=gSE2KMInt label="Meter PV-Anlage (int-Werte, skalierbar)" icon="solarplant" {
		Default item=SE2K_M_AC_Current_int label="PV Meter AC Strom (Summe) (int)"
		Default item=SE2K_M_AC_Current_A_int label="PV Meter AC Strom Phase A (int)"
		Default item=SE2K_M_AC_Current_B_int label="PV Meter AC Strom Phase B (int)"
		Default item=SE2K_M_AC_Current_C_int label="PV Meter AC Strom Phase C (int)"
		Default item=SE2K_M_AC_Voltage_LN_int label="PV Meter Spannung LN (Avg.) (int)"
		Default item=SE2K_M_AC_Voltage_AN_int label="PV Meter Spannung AN (int)"
		Default item=SE2K_M_AC_Voltage_BN_int label="PV Meter Spannung BN (int)"
		Default item=SE2K_M_AC_Voltage_CN_int label="PV Meter Spannung CN (int)"
		Default item=SE2K_M_AC_Freq_int label="PV Meter Frequenz (int)"
		Default item=SE2K_M_AC_Power_int label="PV Meter Wirkleistung (Summe) (int)"
		Default item=SE2K_M_AC_Power_A_int label="PV Meter Wirkleistung Phase A (int)"
		Default item=SE2K_M_AC_Power_B_int label="PV Meter Wirkleistung Phase B (int)"
		Default item=SE2K_M_AC_Power_C_int label="PV Meter Wirkleistung Phase C (int)"
		Default item=SE2K_M_AC_VA_int label="PV Meter Scheinleistung (Summe) (int)"
		Default item=SE2K_M_AC_VA_A_int label="PV Meter Scheinleistung Phase A (int)"
		Default item=SE2K_M_AC_VA_B_int label="PV Meter Scheinleistung Phase B (int)"
		Default item=SE2K_M_AC_VA_C_int label="PV Meter Scheinleistung Phase C (int)"
		Default item=SE2K_M_AC_PF_int label="PV Meter Leistungsfaktor (Avg.) (int)"
		Default item=SE2K_M_AC_PF_A_int label="PV Meter Leistungsfaktor Phase A (int)"
		Default item=SE2K_M_AC_PF_B_int label="PV Meter Leistungsfaktor Phase B (int)"
		Default item=SE2K_M_AC_PF_C_int label="PV Meter Leistungsfaktor Phase C (int)"
		Default item=SE2K_M_Exported_int label="PV Meter Einspeisezähler Wirkenergie (Summe) (int)"
		Default item=SE2K_M_Exported_A_int label="PV Meter Einspeisezähler Wirkenergie Phase A (int)"
		Default item=SE2K_M_Exported_B_int label="PV Meter Einspeisezähler Wirkenergie Phase B (int)"
		Default item=SE2K_M_Exported_C_int label="PV Meter Einspeisezähler Wirkenergie Phase C (int)"
		Default item=SE2K_M_Imported_int label="PV Meter Bezugszähler Wirkenergie (Summe) (int)"
		Default item=SE2K_M_Imported_A_int label="PV Meter Bezugszähler Wirkenergie Phase A (int)"
		Default item=SE2K_M_Imported_B_int label="PV Meter Bezugszähler Wirkenergie Phase B (int)"
		Default item=SE2K_M_Imported_C_int label="PV Meter Bezugszähler Wirkenergie Phase C (int)"
	}
	Text item=gSE2KSfInt label="Wechselrichter PV-Anlage Skalierungsfaktoren (int-Werte)" icon="solarplant" {
		Default item=SE2K_I_AC_Current_SF_int label="PV WR AC Strom Ph.A SF (int)"
		Default item=SE2K_I_AC_Voltage_SF_int label="PV WR AC Spannung SF (int)"
		Default item=SE2K_I_AC_Power_SF_int label="PV WR AC Leistung SF (int)"
		Default item=SE2K_I_AC_Frequency_SF_int label="PV WR AC Frequenz SF (int)"
		Default item=SE2K_I_AC_VA_SF_int label="PV WR AC Scheinleistung SF (int)"
		Default item=SE2K_I_AC_VAR_SF_int label="PV WR AC Blindleistung SF (int)"
		Default item=SE2K_I_AC_PF_SF_int label="PV WR AC Leistungsfaktor SF (int)"
		Default item=SE2K_I_AC_Energy_WH_SF_int label="PV WR AC Erzeugungszaehler SF (int)"
		Default item=SE2K_I_DC_Current_SF_int label="PV WR DC Strom SF (int)"
		Default item=SE2K_I_DC_Voltage_SF_int label="PV WR DC Spannung SF (int)"
		Default item=SE2K_I_DC_Power_SF_int label="PV WR DC Leistung SF (int)"
		Default item=SE2K_I_TempSink_SF_int label="PV WR Temperatur Kühlplatte SF (int)"
	}
	Text item=gSE2KMSfInt label="Meter PV-Anlage Skalierungsfaktoren (int-Werte)" icon="solarplant" {
		Default item=SE2K_M_AC_Current_SF_int label="PV Meter AC Strom SF (int)"
		Default item=SE2K_M_AC_Voltage_SF_int label="PV Meter Spannung SF (int)"
		Default item=SE2K_M_AC_Freq_SF_int label="PV Meter Frequenz SF (int)"
		Default item=SE2K_M_AC_Power_SF_int label="PV Meter Wirkleistung SF"
		Default item=SE2K_M_AC_VA_SF_int label="PV Meter Scheinleistung SF (int)"
		Default item=SE2K_M_AC_PF_SF_int label="PV Meter Leistungsfaktor SF (int)"
		Default item=SE2K_M_Energy_W_SF_int label="PV Meter Zähler Wirkenergie SF (int)"
	}
}

solaredgeInverterType.map

//  SE2000 Inverter Type Values
//	The following C_SunSpec_DID values are supported:
//	Value 					Description
//	101 					single phase
//	102 					split phase
//	103 					three phase

101=Single phase
102=Split phase
103=Three phase

solaredgeMeterType.map

//  SE2000 Inverter Type Values
//	The following C_SunSpec_DID values are supported:
//  Well-known value. Uniquely identifies this as a SunSpecMODBUS Map:
//	Value       Description
//  201         Single Phase (AN or AB) Meter
//  202         Split Single Phase (ABN) Meter
//  203         WYE-Connect Three Phase (ABCN) Meter
//  204         Delta-Connect Three Phase (ABC) Meter
    
201=Single Phase (AN or AB) Meter
202=Split Single Phase (ABN) Meter
203=WYE-Connect Three Phase (ABCN) Meter
204=Delta-Connect Three Phase (ABC) Meter

solaredgeStatus.map

//  SE2000 Inverter Device Status Values
//	The following I_Status_ xxxx values are supported:
//	Parameter 				Value 					Description
//	I_STATUS_OFF 				1 					Off
//	I_STATUS_SLEEPING 			2 					Sleeping (auto-shutdown) – Night mode
//	I_STATUS_STARTING 			3 					Grid Monitoring/wake-up
//	I_STATUS_MPPT 				4 					Inverter is ON and producing power
//	I_STATUS_THROTTLED 			5 					Production (curtailed)
//	I_STATUS_SHUTTING_DOWN 		6 					Shutting down
//	I_STATUS_FAULT 				7 					Fault
//	I_STATUS_STANDBY 			8 					Maintenance/setup

1=Aus
2=Nachtmodus
3=Startet
4=Produktion
5=Gedrosselt
6=Stoppt
7=Fehler
8=Setup
=Undefined

I have put some of the values into persistence to analyse it with grafana. This looks as follows:

Excerpt from my influxdb.persist:

Strategies {
       everyHour : "0 0 * * * ?"
       everyDay  : "0 0 0 * * ?"
       every15min: "*/15 * * * * ?" 
       default = everyChange
}

Items {
       gSE2KMMomentan*, SE2K_I_AC_Power : strategy = everyChange, every15min
}

This setup works like a charm since over three months now!
Maybe I can help anyone with that. Feel free to ask, if there is any question.

Have fun!

Cheers
Jonathan

4 Likes

Hi Jonathan,
thanks a lot for the code.

I created all files and copied the content. In the things file I changed the IP and Port to my address.
Sitemap shows NACHTMODUS so I assume it is somehow connected.

Unfortunately my error log is running full of errors:

<2020-06-18 23:06:10.317 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule ‘SE2K_I_AC_VoltageAB_Scaling’: The name ‘EnableLog_SolarEdgeRules’ cannot be resolved to an item or type; line 50, column 9, length 24>

and many more of those.

I have a different inverter: SE15K, which is a 3 phase inverter. Could that be the problem? Does it make sense to adapt your script at all, as it only refers to a single phase if I understand it correctly.

Thank you very much for your help.
Kind regards
Florian

Hi @Flo,

oops, it seems I missed to add one file to my solution above. The errors come from items which you haven’t defined yet (unintendedly)

I have some Items to enable and disable the debug outputs of my rules to keep them a bit cleaner when everything runs perfect. In case I have to debug something I enable them quickly by these items via BasicUI or whatever UI you want.

debug.items:

// Groups
Group	gEnableLog						"Freigabe Debug-Logs"						<settings>
// Items
Switch	EnableLog_SolarEdgeRules		"Freigabe Debug-Log solaredge.rules"					(gEnableLog)

I additionally use mapDB persistence to persist the states of the debug enable switches:
mapdb.persist:

Strategies {
  default = everyUpdate
}
Items {
        gEnableLog* : strategy = everyChange, restoreOnStartup
}

The switches shown in BasicUI:
image

I hope this helps!

BTW: for your three phase inverter, I think you just have to comment-in the lines which I commented out, because I don’t use them (e.g. in modbusSolaredge.things the line starting with //Thing data I_AC_CurrentB... and so on).

Cheers
Jonathan

Hi Jonathan (@elektrolubach),

I successfullly used your settings where I have another SolarEdge setup:
Two PhaseInverters: SE4000H and SE2200H, where the SE4000H is the Master, both single phase.
In addidtion a LG Battery RESU 10 H

Do you know or give me some hints how or at which places I have to enrich my (your) settings? Of course I need to add some more registers in things-file, but perhaps you can point me to the correct registers to use.

Thanks for your answers in advance,
Ralf

Hi @shotte,

I do not exactly know what you are targeting on, but the best resource is this:
Technical Note – SunSpec Logging in SolarEdge Inverters

Starting from page 15, the registers and the meanings of enumerations are described.

I hope this helps.

Jonathan

Hi Jonathan (@elektrolubach),

thank you for that hint, but I have read this documnent already. My setup consists of TWO inverters (SE4000H as RS485 master and SE2200H as RS485 slave) incl. battery (LG RESU 10H) and one meter (WND-3Y-400-MB).

The registers described in your referenced document are for a single inverter only (and multiple meters). So far as I have seen within this document there are only register addresses for one inverter (the one that is connected to ethernet). The SE2200H communicates its data to SE4000H via RS485, but how can I get this data? And are there registers that represent the sum of both inverters?

Questions over questions… hopefully you know more about it.

Thank you in advance,
Ralf

The Solaredge doc seems to suggest an external monitor can address each linked inverter independently - you’ve set them all with different Modbus ID numbers. The Solaredge “Leader” appears to able to act as a gateway.

In openHAB terms, set up separate TCP Bridge Things for each inverter, with same IP address and different ID.

Hi @rossko57 ,

sorry but this raises modbus exceptions. Any other ideas?

Based on the comprehensive information supplied, no.

Hi @rossko57 ,

the binding tries to connect with ID=2 but without success: it gives up after 3 times and restarts communication again giving up after 3 times, and so on…

I also tried ID=3 with same result. After I checked my inverter settings, the have on RS485 bus the IDs 1 (SE2200H) and 2 (SE4000H). Thus I thought, that i need to use these IDs in the bridge settings, but only ID=1 has success.

Error message from PaperUI:
Status: OFFLINE - CONFIGURATION_ERROR Endpoint ‘ModbusTCPSlaveEndpoint@91e82f[address=192.168.8.225,port=502]’ has conflicting parameters: parameters of this thing (modbus:tcp:bridge ‘SE2200H Bridge’) are different from some other thing’s parameter. Ensure that all endpoints pointing to tcp slave ‘192.168.8.225:502’ have same parameters.

It looks like your suggestion using different IDs for same IP address and port is not allewd to configure.

Works for me. What you can’t have is different timeBetweenTransactionsMillis and so on. I don’t think this part of binding “connection pooling” has changed, but it might have.

I used the follwoing:

Bridge modbus:tcp:SE4000TCP [ host=“192.168.8.225”, port=502, id=1, timeBetweenTransactionsMilli=60, timeBetweenReconnectMillis=0, connectMaxTries=3, reconnectAfterMillis=0, connectTimeoutMillis=5000 ] {

Bridge modbus:tcp:SE2200TCP [ host=“192.168.8.225”, port=502, id=2, timeBetweenTransactionsMilli=60, timeBetweenReconnectMillis=0, connectMaxTries=3, reconnectAfterMillis=0, connectTimeoutMillis=5000 ] {

Any more information required?

Looks sensible to me. Let’s summon a second opinion… @ssalonen ? This is a valid usage for gateways, has something changed here?