Reading Data from Solaredge inverters via Modbus TCP

Next, let me give you the sitemap definitions. Note that the Eclipse smart home designer doesn’t like me putting a Frame and a Group into the widget, but this seems to be cosmetic.
Once again, if you have no Modbus meter, remove the "SE9KM "items.

Text item=se9k_Watt {

  	Frame label="Wechselrichter SE9k" {
            Text item=se9k_Watt
            Text item=se9k_kWh
            Text item=se9k_kWh_Jahr
  		Setpoint item=se9k_kWh_Jahr_Offset  minValue=-100000 maxValue=100000 step=0.1
            Text item=se9k_Hz
  		Text item=se9k_VA
            Text item=se9k_VAR
            Text item=se9k_PF
  		Text item=se9k_Amps
  		Text item=se9k_AmpA
            Text item=se9k_AmpB
            Text item=se9k_AmpC
            Text item=se9k_VoltA
            Text item=se9k_VoltB
            Text item=se9k_VoltC
            Text item=se9k_DCA
            Text item=se9k_DCV
            Text item=se9k_DCW
            Text item=se9k_THS
            Text item=se9k_Status
            Text item=se9k_Status_Vendor
  	}
  	Group item=se9kint label="Werte SE9K Wechselrichter (int)"
  }
  Text item=se9km_Watt label="Smartmeter Einspeisepunkt [%.2f W]" {
  	
  		Frame label="Leistung und Zaehler" 
  		{
  			Text item=se9km_DID
  			Text item=se9km_Watt
  			Text item=se9km_kWh_Exp_Jahr
  			Text item=se9km_kWh_Imp_Jahr
  			Text item=se9km_Frequenz
  			Text item=se9km_PF
  			Text item=se9km_kWh_Exp
  			Setpoint item=se9km_kWh_Exp_Jahr_Offset minValue=-100000 maxValue=100000 step=0.1
  			Text item=se9km_kWh_Imp
  			Setpoint item=se9km_kWh_Imp_Jahr_Offset minValue=-100000 maxValue=100000 step=0.1
  		}
  		Frame label="Stromwerte Einspeisepunkt" {
  			Text item=se9km_Amp
                Text item=se9km_AmpA
                Text item=se9km_AmpB
                Text item=se9km_AmpC
  		}
            Frame label="Spannungswerte Einspeisepunkt" {
                Text item=se9km_VoltL
                Text item=se9km_VoltA
                Text item=se9km_VoltB
                Text item=se9km_VoltC
            }
         	Frame label="Wirkleistung Einspeisepunkt" {
                Text item=se9km_Watt
                Text item=se9km_WattA
                Text item=se9km_WattB
                Text item=se9km_WattC
           }
           Frame label="Scheinleistung Einspeisepunkt" {
                Text item=se9km_VA
                Text item=se9km_VAA
                Text item=se9km_VAB
                Text item=se9km_VAC
           }
           Frame label="reaktive Leistung Einspeisepunkt" {
                Text item=se9km_VAR
                Text item=se9km_VARA
                Text item=se9km_VARB
                Text item=se9km_VARC
           }
           Frame label="Leistungsfaktor Einspeisepunkt" {
                Text item=se9km_PF
                Text item=se9km_PFA
                Text item=se9km_PFB
                Text item=se9km_PFC
           }
           Frame label="Zaehler Wirkleistung" {
                Text item=se9km_kWh_Exp
                Text item=se9km_kWh_Exp_Jahr
                Text item=se9km_kWh_Imp
                Text item=se9km_kWh_Imp_Jahr
  			Text item=se9km_kWhA_Exp
                Text item=se9km_kWhB_Exp
                Text item=se9km_kWhC_Exp
                Text item=se9km_kWhA_Imp
                Text item=se9km_kWhB_Imp
                Text item=se9km_kWhC_Imp
           }
           Frame label="Zaehler Scheinleistung" {
                Text item=se9km_VAh_Exp
                Text item=se9km_VAh_Imp
                Text item=se9km_VAhA_Exp
                Text item=se9km_VAhB_Exp
                Text item=se9km_VAhC_Exp
                Text item=se9km_VAhA_Imp
                Text item=se9km_VAhB_Imp
                Text item=se9km_VAhC_Imp
           }
           Frame label="Zaehler reaktive Leistung" {
                Text item=se9km_VARhQ1
                Text item=se9km_VARhQ1A 
                Text item=se9km_VARhQ1B 
                Text item=se9km_VARhQ1C 
                Text item=se9km_VARhQ2
                Text item=se9km_VARhQ2A
                Text item=se9km_VARhQ2B
                Text item=se9km_VARhQ2C
                Text item=se9km_VARhQ3
                Text item=se9km_VARhQ3A
                Text item=se9km_VARhQ3B
                Text item=se9km_VARhQ3C
                Text item=se9km_VARhQ4
                Text item=se9km_VARhQ4A
                Text item=se9km_VARhQ4B
                Text item=se9km_VARhQ4C
           }
  	Group item=se9kmint label="Werte Modbus Meter (int)"
  }

Now, some rules to fill the Float items from the integer items read form the inverter:

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

rule se9k_Amps_add
when Item se9k_Amps_int received update
then
var Double SF = (se9k_AmpSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

  var Double result = (se9k_Amps_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Stromerzeugung gesamt: ", value)

postUpdate(se9k_Amps, result)

end

rule se9k_AmpA_add
when Item se9k_AmpA_int received update
then
var Double SF = (se9k_AmpSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_AmpA_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Strom Phase A: ", value)
    postUpdate(se9k_AmpA, result)

end

rule se9k_AmpB_add
when Item se9k_AmpB_int received update
then
var Double SF = (se9k_AmpSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_AmpB_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Strom Phase B: ", value)
    postUpdate(se9k_AmpB, result)

end

rule se9k_AmpC_add
when Item se9k_AmpC_int received update
then
var Double SF = (se9k_AmpSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_AmpC_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Strom Phase C: ", value)
    postUpdate(se9k_AmpC, result)

end

rule se9k_VoltA_add
when Item se9k_VoltA_int received update
then
var Double SF = (se9k_VoltSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_VoltA_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Spannung Phase A: ", value)
    postUpdate(se9k_VoltA, result)

end

rule se9k_VoltB_add
when Item se9k_VoltB_int received update
then
var Double SF = (se9k_VoltSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_VoltB_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Spannung Phase B: ", value)
    postUpdate(se9k_VoltB, result)

end

rule se9k_VoltC_add
when Item se9k_VoltC_int received update
then
var Double SF = (se9k_VoltSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_VoltC_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Spannung Phase C: ", value)
    postUpdate(se9k_VoltC, result)

end

rule se9k_Watt_add
when Item se9k_Watt_int received update
then
var Double power = (se9k_Watt_int.state as DecimalType).doubleValue
if (power > 32767) power = power-(65536).doubleValue
var Double SF = (se9k_WattSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = power * Math::pow(10,SF)
    logInfo("[se9k] Watt: ", result.toString)
    postUpdate(se9k_Watt, result)

end

rule se9k_Hz_add
when Item se9k_Hz_int received update
then
var Double SF = (se9k_HzSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_Hz_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Netzfrequenz: ", value)
    postUpdate(se9k_Hz, result)

end

rule se9k_VA_add
when Item se9k_VA_int received update
then
var Double VA = (se9k_VA_int.state as DecimalType).doubleValue
if (VA > 32767) VA = VA-(65536).doubleValue
var Double SF = (se9k_VoltSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = VA * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Scheinleistung: ", value)
    postUpdate(se9k_VA, result)

end

rule se9k_VAR_add
when Item se9k_VAR_int received update
then
var Double VAR = (se9k_VAR_int.state as DecimalType).doubleValue
if (VAR > 32767) VAR = VAR-(65536).doubleValue
var Double SF = (se9k_VARSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = VAR * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR reaktive Leistung: ", value)
    postUpdate(se9k_VAR, result)

end

rule se9k_PF_add
when Item se9k_PF_int received update
then
var Double PF = (se9k_PF_int.state as DecimalType).doubleValue
if (PF > 32767) PF = PF-(65536).doubleValue
var Double SF = (se9k_PFSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = PF * Math::pow(10,SF) /100
    var String value = result.toString
    logDebug("SE9K WR Leistungsfaktor: ", value)
    postUpdate(se9k_PF, result)

end

rule se9k_kWh_add
when Item se9k_Wh2_int received update
then
var Double SF = (se9k_WhSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double resultWh = ((se9k_Wh1_int.state as DecimalType * 65536).doubleValue + (se9k_Wh2_int.state as DecimalType).doubleValue) * Math::pow(10,SF)
    var Double Offset = (se9k_kWh_Jahr_Offset.state as DecimalType).doubleValue * 1000.0
    var Double Jahr = (resultWh - Offset) / 1000.0
  var String valueWh= resultWh.toString
    var String wrjahr = Jahr.toString
  logInfo("[se9k]  Wh: ", valueWh)
    logInfo("SE9K WR Erzeugung seit 1.1. kWh: ", wrjahr)
  var Double result = resultWh / 1000.0
    postUpdate(se9k_kWh, result)
  postUpdate(se9k_kWh_Jahr, Jahr)

end

rule se9k_DCA_add
when Item se9k_DCA_int received update
then
var Double SF = (se9k_DCASF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_DCA_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Strom DC: ", value)
    postUpdate(se9k_DCA, result)

end

rule se9k_DCV_add
when Item se9k_DCV_int received update
then
var Double SF = (se9k_DCVSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = (se9k_DCV_int.state as DecimalType).doubleValue * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Spannung DC: ", value)
    postUpdate(se9k_DCV, result)

end

rule se9k_DCW_add
when Item se9k_DCW_int received update
then
var Double DCW= (se9k_DCW_int.state as DecimalType).doubleValue
if (DCW > 32767) DCW = DCW-(65536).doubleValue
var Double SF = (se9k_DCWSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = DCW * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K WR Leistung DC: ", value)
    postUpdate(se9k_DCW, result)

end

rule se9k_THS_add
when Item se9k_THS_int received update
then
var Double THS= (se9k_THS_int.state as DecimalType).doubleValue
if (THS > 32767) THS = THS-(65536).doubleValue
var Double SF = (se9k_THSSF_int.state as DecimalType).doubleValue
if (SF > 32767) SF = SF-(65536).doubleValue

    var Double result = THS * Math::pow(10,SF)
    var String value = result.toString
    logDebug("SE9K Temperatur Kuehlkoerper: ", value)
    postUpdate(se9k_THS, result)

end

rule se9k_Status_map
when Item se9k_Status_int received update
then

var String str=“-”
if (se9k_Status_int.state == 1) str = “AUS”
if (se9k_Status_int.state == 2) str = “Nachtmodus”
if (se9k_Status_int.state == 4) str = “AN/Produktion”

    logDebug("Status Wechselrichter:  ", str)
    postUpdate(se9k_Status, str)

end

rule se9k_DID_map
when Item se9k_DID_int received update
then

var String str=“-”
if (se9k_DID_int.state == 101) str = “einphasig”
if (se9k_DID_int.state == 102) str = “Split phase”
if (se9k_DID_int.state == 103) str = “dreiphasig”

    logDebug("Status Wechselrichter:  ", str)
    postUpdate(se9k_DID, str)

end

rule se9k_Status__Vendor_map
when Item se9k_Status_vendor_int received update
then

var String str= se9k_Status_Vendor_int.state.toString

    logDebug("Status Wechselrichter (Fehlermeldungen):  ", str)
    postUpdate(se9k_Status_Vendor, str)

end