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