Multiple Growatt (SPH and MOD) solar inverters via modbus

Hi openHAB community.

I’ve spent several weeks to figure out how the best way to read data from my Growatt inverters and make them available to openHAB. Afterall I managed to find most of the interesting modbus registers and implemented many rules to control devices based on the amount of solar energy being generated (pool pump, water heaters etc.)

In case any of you are trying to achive the same I decided to post my findings/solutions here - maybe there are some among you finding this helpful or inspiring?

The setup:
Soft-/hardware:
openHAB 4.1.2 on raspberry pi 5b 8GB
modbus binding
solar forecast PV binding
influxDB
grafana
RS485 to serial/USB interface connected to USB port of openhab raspberry
1 x Growatt SPH10000TL3 BH-UP inverter
1 x Growatt ARK-HV 10.2kWh (9,21 usable) battery connected to SPH10000
1 x Growatt MOD3000TL3-XH BP inverter
1 X Growatt EV charger
1 X Eastron SDM630 smart meter connected to SPH10000 and EV charger (not connected to openHAB raspberry directly)

The look and feel on the UI:

On my energy management page the solar production is displayed by solar field:

Clicking the three dots on any of the solar field card brings a popup with some stats:

Clickin the card itself shows the history in production, battery state of charge, consumption etc. in form of a grafana graph:

Intro:
First I started with the grott MQTT solution but I’ve experienced issues such as data logger no longer visible in the Growatt App (Shine-App) and wrong readings of the 3-phase grid data consequently resulting in unclever decisions of the inverter as to what to do with the generated solar power and also, from time to time when I had to restart the openHAB server the grott service wouldn’t start automatically.

Bottom line I decided to switch from the MQTT (grott) solution to the modbus solution which I’m outlining in this post.

The modbus solutiuon:

The inverters only required minimum config/wiring:

  1. Frist I had to configure the SPH10000 to spit out its data on its RS485 port by setting the parameter RS485-settings->port to VPP and set the RS485-address of the SPH to 1.
  2. The MOD3000 only required setting its RS485-address (I chose 17).
  3. Then I connected the RS485-3 terminal of the SPH to the raspberry and the Growatt MOD3000 inverter (bus topology: raspberry being first device, then SPH last MOD).
    Even though I have a approx. 20m (60ft) cable between first and last modbus device I did not need to use terminal resistors on the RS484 line.

The openHAB config was way more complex:
Since some values are being sent in two separate but subsequent modbus registers (each being a uint16, one being the HI- the other the LO-value) I used a trick by reading both registers at once via a uint32 thing and send the value into a JS transformation (growattUint32To2xUint16.js) to “extract” the correct value.

JS-Transformation “growattUint32To2xUint16.js” to extract value of a uint32 modbus register:

(function(val) {
    if(val < 0) return "UNDEF";
    lo = val & 0xffff;          // first 16 bits
    hi = (val >> 16) & 0xffff;  // last 16 bits
    return ( (lo / 10) + (hi / 10 * 65536) )
  })(input)

Thing file for SPH Inverter:
Modbus_growattSPH.things.txt (17.8 KB)

Thing file for MOD Inverter:
Modbus_growattMOD.things.txt (10.9 KB)

SPH Items file:
Growatt_SPH.items.txt (41.5 KB)

MOD items file:
Growatt_MOD.items.txt (21.9 KB)

Items representing data on an aggregate of both invereters I put in a third Items file:
Growatt.items.txt (1.2 KB)

Rules to calculate some Items values such as degree of self-sufficiency (Autarkie) or max daily/overall production values etc:
Growatt.rules.txt (17.8 KB)

As to the animated energy-flow widget I adopted and modified the widget described here:
animated energy widget

My version of the animated energy flow widget:
energy_widget.txt (22.7 KB)

Open issues:

  • still didn’t figure out how to best read out the values from the smart meter directly via the same single RS485 bus which currently connects to SPH, the MOD and the raspberry.
  • Voltage values for 3 grid phases still show ±400V each - probably an issue with proper smart meter readings by the SPH
  • clean-up of items and thing files (remove unnecessary stuff)
  • some overall values (combined SPH and MOD measurements) appear off (such as degree of self-suffiency/Autarkie)
  • daily production values in grafana graph missing (I want one bar chart with bars for each of the four solar-strings)
  • Im sure there are several more :wink:

Maybe some of you find this helpful!?
Have fun!

Kind regards,
Ralph…

There is a Growatt binding in OH v4.2 …

Hi AndrewFG.

Interesting - I did see the development requests for such binding and good we’ll have a Growatt binding soon!

Unfortunately the binding apparently still relies on the grott service with which I made some unsatisfying experience (it probably still depends on grott to correctly and completely map the values received from the various inverters to its output).
I’ll take a look at it as soon as it becomes available as part of the stable release and will probably post my findings here.

An additional idea for improving the binding that comes to my mind is an option to use modbus as an alternative to the grott service as a communication medium with the inverters :wink:

Thanks and kind regrads,
Ralph…

TBH we have had it for over 6 months already.

Yes it does use the Grott proxy service, which happily runs on the same RPi machine.

It has been explicitly validated with user inputs for SPH and MID inverters with resp. GBLI and APX batteries plus a CHNT meter. I have not had feedback from any user with a MOD inverter yet, but obviously if there is anything missing for that model, I can fix it for you.

I’ll check it out with my SPH and MOD inverters and will provide feedback here ASAP…

Hallo Ralph,
durch Zufall bin ich auf Deine Configdateien gestoßen. Ich habe einen Growatt MOD 10KTL3 plus Batterie ARK 12.8H und dem Thor Ladegerät. Ich hab also fast alles genauso wie du.
hier abei findest Du meine Configdatei in Home Assistant. Die meisten Daten stimmen, weil ich sie schon seit Monaten bekomme. Aber:
Stimmen die Dateien bei Dir? Die Register sind anders…
Hast Du noch Tipps zur Anbindung der Batterie,Wallbox? und ggf. Estron?
Schöne Grüße
Thomas

 #=3000,  name="status-inverter",                 type="UINT16"              },
  #=3001,  name="power-pv",                        type="UINT32", scale=0.1   },
  #=3003,  name="voltage-pv1",                     type="UINT16", scale=0.1   },
  #=3004,  name="current-pv1",                     type="UINT16", scale=0.1   },
  #=3005,  name="power-pv1",                       type="UINT32", scale=0.1   },
  #=3007,  name="voltage-pv2",                     type="UINT16", scale=0.1   },
  #=3008,  name="current-pv2",                     type="UINT16", scale=0.1   },
  #=3009,  name="power-pv2",                       type="INT32",  scale=0.1   },
  #=3019,  name="power-system",                    type="INT32",  scale=0.1   },
  #=3021,  name="reactive-power",                  type="INT32",  scale=0.1   },
  #=3023,  name="power-ac",                        type="INT32",  scale=0.1   },
  #=3025,  name="frequency-ac",                    type="UINT16", scale=0.01  },
  #=3026,  name="voltage-ac1",                     type="UINT16", scale=0.1   },
  #=3027,  name="current-ac1",                     type="UINT16", scale=0.1   },
  #=3028,  name="power-ac1",                       type="INT32",  scale=0.1   },
  #=3030,  name="voltage-ac2",                     type="UINT16", scale=0.1   },
  #=3031,  name="current-ac2",                     type="UINT16", scale=0.1   },
  #=3032,  name="power-ac2",                       type="INT32",  scale=0.1   },
  #=3034,  name="voltage-ac3",                     type="UINT16", scale=0.1   },
  #=3035,  name="current-ac3",                     type="UINT16", scale=0.1   },
  #=3036,  name="power-ac3",                       type="INT32",  scale=0.1   },
  #=3038,  name="voltage-ac-rs",                   type="UINT16", scale=0.1   },
  #=3039,  name="voltage-ac-st",                   type="UINT16", scale=0.1   },
  #=3040,  name="voltage-ac-tr",                   type="UINT16", scale=0.1   },
  #=3041,  name="power-to-user",                   type="INT32",  scale=0.1   },
  #=3043,  name="power-to-grid",                   type="INT32",  scale=0.1   },
  #=3045,  name="power-load",                      type="INT32",  scale=0.1   },
  #=3049,  name="energy-ac-today",                 type="UINT32", scale=0.1   },
  #=3051,  name="energy-ac-total",                 type="UINT32", scale=0.1   },
  #=3053,  name="energy-pv-total",                 type="UINT32", scale=0.1   },
  #=3055,  name="energy-pv1-today",                type="UINT32", scale=0.1   },
  #=3057,  name="energy-pv1-total",                type="UINT32", scale=0.1   },
  #=3059,  name="energy-pv2-today",                type="UINT32", scale=0.1   },
  #=3061,  name="energy-pv2-total",                type="UINT32", scale=0.1   },
  #=3067,  name="energy-to-user-today",            type="UINT32", scale=0.1   },
  #=3069,  name="energy-to-user-total",            type="UINT32", scale=0.1   },
  #=3071,  name="energy-to-grid-today",            type="UINT32", scale=0.1   },
  #=3073,  name="energy-to-grid-total",            type="UINT32", scale=0.1   },
  #=3075,  name="energy-load-today",               type="UINT32", scale=0.1   },
  #=3077,  name="energy-load-total",               type="UINT32", scale=0.1   },
  #=3083,  name="energy-pv-today",                 type="UINT32", scale=0.1   },
  #=3086,  name="status-derating",                 type="UINT16"              },
  #=3087,  name="resistance-isolation",            type="UINT16", scale=0.1   },
  #=3093,  name="temperature-inverter",            type="UINT16", scale=0.1   },
  #=3094,  name="temperature-ipm",                 type="UINT16", scale=0.1   },
  #=3095,  name="temperature-boost",               type="UINT16", scale=0.1   },
  #=3097,  name="temperature-com-board",           type="UINT16", scale=0.1   },
  #=3098,  name="voltage-p-bus",                   type="UINT16", scale=0.1   },
  #=3099,  name="voltage-n-bus",                   type="UINT16", scale=0.1   },
  #=3121,  name="power-self",                      type="UINT32", scale=0.1   },
  #=3123,  name="energy-system-today",             type="UINT32", scale=0.1   },
  #=3125,  name="energy-battery-discharge-today",  type="UINT32", scale=0.1   },
  #=3127,  name="energy-battery-discharge-total",  type="UINT32", scale=0.1   },
  #=3129,  name="energy-battery-charge-today",     type="UINT32", scale=0.1   },
  #=3131,  name="energy-battery-charge-total",     type="UINT32", scale=0.1   },
  #=3133,  name="energy-battery-ac-charge-today",  type="UINT32", scale=0.1   },
  #=3135,  name="energy-battery-ac-charge-total",  type="UINT32", scale=0.1   },
  #=3137,  name="energy-system-total",             type="UINT32", scale=0.1   },
  #=3139,  name="energy-self-today",               type="UINT32", scale=0.1   },
  #=3141,  name="energy-self-total",               type="UINT32", scale=0.1   },
  #=3144,  name="status-mode",                     type="UINT16"              },
  #=3165,  name="status-bdc-derating",             type="UINT16"              },
  #=3166,  name="status-bdc-mode",                 type="UINT16"              },
  #=3169,  name="voltage-battery",                 type="UINT16", scale=0.01  },
  #=3170,  name="current-battery",                 type="UINT16", scale=0.1   },
  #=3171,  name="charge-battery",                  type="UINT16", scale=1.0   },
  #=3172,  name="voltage-bdc-bus",                 type="UINT16", scale=0.1   },
  #=3173,  name="voltage-bdc-bus1",                type="UINT16", scale=0.1   },
  #=3174,  name="current-buck-boost",              type="UINT16", scale=0.1   },
  #=3175,  name="current-llc",                     type="UINT16", scale=0.1   },
  #=3176,  name="temperature-bdc1",                type="UINT16", scale=0.1   },
  #=3178,  name="power-battery-discharge",         type="UINT32", scale=0.1   },
  #=3180,  name="power-battery-charge",            type="UINT32", scale=0.1   },
  #=3187,  name="status-bdc",                      type="UINT16"              },
  #=3188,  name="voltage-bdc-bus2",                type="UINT16", scale=0.1   },
  #=61442, name="voltage-sm-ac1",                  type="INT32",  scale=0.1   },
  #=61444, name="voltage-sm-ac2",                  type="INT32",  scale=0.1   },
  #=61446, name="voltage-sm-ac3",                  type="INT32",  scale=0.1   },
  #=61448, name="current-sm-ac1",                  type="INT32",  scale=0.1   },
  #=61450, name="current-sm-ac2",                  type="INT32",  scale=0.1   },
  #=61452, name="current-sm-ac3",                  type="INT32",  scale=0.1   },
  #=61454, name="power-sm-ac1",                    type="INT32",  scale=0.1   },
  #=61456, name="power-sm-ac2",                    type="INT32",  scale=0.1   },
  #=61458, name="power-sm-ac3",                    type="INT32",  scale=0.1   },
  #=61466, name="reactive-power-sm-ac1",   	       type="INT32",  scale=0.1   },
  #=61468, name="reactive-power-sm-ac2",   	       type="INT32",  scale=0.1   },
  #=61470, name="reactive-power-sm-ac3",   	       type="INT32",  scale=0.1   },
  #=61472, name="power-factor-sm-ac1",             type="INT32",  scale=0.001 },
  #=61474, name="power-factor-sm-ac2",             type="INT32",  scale=0.001 },
  #=61476, name="power-factor-sm-ac3",             type="INT32",  scale=0.001 },
  #=61478, name="power-sm-ac",                     type="INT32",  scale=0.1   },
  #=61482, name="reactive-power-sm-ac",            type="INT32",  scale=0.1   },
  #=61484, name="power-factor-sm-ac",              type="INT32",  scale=0.001 },
  #=61486, name="frequency-sm-ac",                 type="INT32",  scale=0.1   },
  #=61488, name="voltage-sm-ac-rs",                type="INT32",  scale=0.1   },
  #=61490, name="voltage-sm-ac-st",                type="INT32",  scale=0.1   },
  #=61492, name="voltage-sm-ac-tr",                type="INT32",  scale=0.1   },
  #=61494, name="energy-sm-import-total",          type="INT32",  scale=0.1   },
  #=61496, name="energy-sm-export-total",          type="INT32",  scale=0.1

Hi Thomas.
Thanks for your data
Finding the “correct” registers was quite a job as there are so many different version of the Growatt modbus docu out there (and none is either complete or 100% correct :wink: ).
I’m sure I still have quite some registers wrong but all those I use in rules and UI’s do properly work.
I did try to read the Eastron (used by the Growatt) directly by bringing it onto the modbus line to the openHab server but this resulted in issues in communication bt. Growatt SPH and the Eastron so I discarded this attempt.
The Growatt (my SPH-10000) “forwards” the Eastron data so I read the forwarded data. I also have some additional Eastrons in the modbus line to the openHab to monitor additional consumers not related to the Growatt solar system.

The battery is only connected to my SPH (none on my MOD) and the SPH provides very detailed data on the battery and BMS (address ranges 1082-1096 BMS-Data, 1009;1014 charging data, and 118-119, 608, etc).

As far as I see the register addresses differ significantly bt. MOD and SPH as MOD mostly uses addresses in the 3000 range, on my SPH there’s not a single one in that range.
Below you find my current addresses of the SPH-, MOD- and Eastron- (those not used by Growatt but only monitor other consumers) - thete might have some additions/changes since my original post.

I also tried to integrate the Wallbox into the Modbus line to the Server but was I was not successful. I neither found register addresses for the Thor-Wallbox on the internet nor was I able to detect any myself.
Have you been more successful in integrating the Wallbox to the modbus network?

It would be great to start/stop the chargin process or limit/increse charging power via the openHab Server.

I’ll take a deep dive on your register addresses ASAP and check if I find some that I can use for my applications :wink:

Did you find any errors in my addresses? Of course I’d love to correct them.

Thanks and kind regards,
Ralph…

MOD-Register:

//Growatt MOD-3000:
Bridge modbus:serial:MOD3000 "Modbus MOD3000" [port="/dev/ttyUSB0", id=17, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ] 
{ 
	//HOLDING registers:

	Bridge poller Firmware "Firmware" [start=9, length=6, type="holding", refresh=12000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data FwH "Firmware High" 		[readStart="9",  readValueType="uint16"]
		Thing data FwM "Firmware M"  		[readStart="10", readValueType="uint16"]
		Thing data FwL "Firmware Low" 		[readStart="11", readValueType="uint16"]
		Thing data Fw2H "Firmware 2 High" 	[readStart="12", readValueType="uint16"]
		Thing data Fw2M "Firmware 2 M"  	[readStart="13", readValueType="uint16"]
		Thing data Fw2L "Firmware 2 Low" 	[readStart="14", readValueType="uint16"] 
	} 

	Bridge poller GeneralSettings "Allgemeine Einstellungen" [start=15, length=1, type="holding", refresh=1200000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{ 
		Thing data LcdLanguage "LCD Sprache" [readStart="15", readValueType="uint16"] 
	}

	Bridge poller Modbus "Modbus" [start=73, length=2, type="holding", refresh=60000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data version						"Modbus-Version"					[readStart="73",  readValueType="uint16"]
	}

	Bridge poller Serial "Seriennummer" [start=3001, length=15, type="holding", refresh=1200000, maxTries=2] //für TL-X und TL-XH ab holding register 3000!
	{ 
		Thing data Serial1  	"Seriennummer1"  [readStart="3001", readValueType="uint16"]
		Thing data Serial2  	"Seriennummer2"  [readStart="3002", readValueType="uint16"]
		Thing data Serial3  	"Seriennummer3"  [readStart="3003", readValueType="uint16"] 
		Thing data Serial4 	 	"Seriennummer4"  [readStart="3004", readValueType="uint16"]		
		Thing data Serial5 	 	"Seriennummer5"  [readStart="3005", readValueType="uint16"]
		Thing data Serial6  	"Seriennummer6"  [readStart="3006", readValueType="uint16"]
		Thing data Serial7  	"Seriennummer7"  [readStart="3007", readValueType="uint16"] 
		Thing data Serial8  	"Seriennummer8"  [readStart="3008", readValueType="uint16"]
		Thing data Serial9  	"Seriennummer9"  [readStart="3009", readValueType="uint16"]
		Thing data Serial10 	"Seriennummer10" [readStart="3010", readValueType="uint16"]
		Thing data Serial11 	"Seriennummer11" [readStart="3011", readValueType="uint16"]
		Thing data Serial12 	"Seriennummer12" [readStart="3012", readValueType="uint16"]
		Thing data Serial13 	"Seriennummer13" [readStart="3013", readValueType="uint16"]
		Thing data Serial14 	"Seriennummer14" [readStart="3014", readValueType="uint16"]
		Thing data Serial15 	"Seriennummer15" [readStart="3015", readValueType="uint16"]
	} 

	
	//INPUT registers:

	Bridge poller status "Status-Daten" [start=0, length=1, type="input", refresh=12000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{	
		Thing data inverterStatus 				"Inverter-Status"					[readStart="0",  readValueType="uint16"]
		Thing data inverterStatusTxt 			"Inverter-Status"					[readStart="0",  readValueType="uint16", readTransform="MAP:growattModStatus.map"]		
	}
 
	Bridge poller InverterPvDaten1 "PV-Daten 1" [start=1, length=10, type="input", refresh=10000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data InputPower   				"Eingangsleistung"					[readStart="1",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Pv1V							"String 1 Spannung"					[readStart="3",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv1A							"String 1 Stromstärke"				[readStart="4",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv1W							"String 1 Leistung"					[readStart="5",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Pv2V							"String 2 Spannung"					[readStart="7",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv2A							"String 2 Stromstärke"				[readStart="8",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv2W							"String 2 Leistung"					[readStart="9",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}

	Bridge poller InverterPvDaten2 "PV-Daten 2" [start=35, length=2, type="input", refresh=10000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data OutputPower		 			"Ausgangsleistung"					[readStart="35", readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}
	
	Bridge poller InverterNetzDaten "Netz-Daten" [start=37, length=13, type="input", refresh=60000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data Netzfrequenz  				"Netzfrequenz"						[readStart="37",  readValueType="uint16", readTransform="JS:divide_100.js"]
		Thing data Phase1V  					"Spannung Phase 1"					[readStart="38",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase1A  					"Stromstärke Phase 1"				[readStart="39",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase1W						"Leistung Phase 1"					[readStart="40",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Phase2V  					"Spannung Phase 2"					[readStart="42",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase2A  					"Stromstärke Phase 2"				[readStart="43",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase2W						"Leistung Phase 2"					[readStart="44",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Phase3V  					"Spannung Phase 3"					[readStart="46",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase3A  					"Stromstärke Phase 3"				[readStart="47",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase3W						"Leistung Phase 3"					[readStart="48",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}

	Bridge poller ProduktionsDaten "Produktions-Daten" [start=53, length=6, type="input", refresh=60000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data energyToday					"Tagesproduktion"					[readStart="53",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyTotal					"Gesamtproduktion"					[readStart="55",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data workTimeTotal				"Betriebszeit"						[readStart="57",  readValueType="uint32", readTransform="JS:growattWtUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data workTimeTotalTxt    			"Betriebszeit"						[readStart="57",  readValueType="uint32", readTransform="JS:growattWtUint32To2xUint16.js∩JS:secondsToDDHHMMSS.js"] 	//kommt als 2x uint16, jeweils in 0.5sec Einheiten
	}

	Bridge poller PvProduktionsDaten1 "Produktions-Daten" [start=59, length=8, type="input", refresh=60000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data energyPv1Today				"Tagesproduktion String-1"			[readStart="59",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv1Total				"Gesamtproduktion String-1"			[readStart="61",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv2Today				"Tagesproduktion String-2"			[readStart="63",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv2Total				"Gesamtproduktion String-2"			[readStart="65",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}

	Bridge poller PvProduktionsDaten2 "PV-Produktions-Daten" [start=91, length=2, type="input", refresh=60000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data energyPvTotal 				"PV-Gesamtproduktion"				[readStart="91",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	} 

	
	Bridge poller FehlerDaten "Fehler-Daten" [start=86, length=9, type="input", refresh=12000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{
		Thing data StrFault						"StrFault"							[readStart="86",  readValueType="uint16"]
		Thing data StrWarn 						"StrWarn"							[readStart="87",  readValueType="uint16"]
		Thing data StrBreak						"StrBreak"							[readStart="88",  readValueType="uint16"]
		Thing data PIDFaultCode					"PIDFaultCoude"						[readStart="89",  readValueType="uint16"]
		Thing data GridFaultRecord1Code			"GridFaultRecord1Code"				[readStart="90",  readValueType="uint16"]
	}

	Bridge poller Netzdaten "Netzdaten" [start=1015, length=24, type="input", refresh=10000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{ 
		Thing data pacToUser1					"pacToUser1"						[readStart="1015",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUser2					"pacToUser2"						[readStart="1017",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUser3					"pacToUser3"						[readStart="1019",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUserTotal 				"pacToUserTotal" 					[readStart="1021",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid1					"pacToGrid1"						[readStart="1023",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid2					"pacToGrid2"						[readStart="1025",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid3					"pacToGrid3"						[readStart="1027",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGridTotal				"pacToGridTotal"					[readStart="1029",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad1				"pacToLocalLoad1"					[readStart="1031",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad2				"pacToLocalLoad2"					[readStart="1033",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad3				"pacToLocalLoad3"					[readStart="1035",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoadTotal			"pacToLocalLoadTotal"				[readStart="1037",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	} 

}  

SPH-Register:

//Modbus message parser: https://rapidscada.net/modbus/
Bridge modbus:serial:SPH10000 "Growatt SPH10000" [ port="/dev/ttyUSB0", id=1, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ] 
{  
	//Holding registers ************************************************************************************************

	Bridge poller growattGeneralSettings "Allgemeine Einstellungen" [start=15, length=1, type="holding", refresh=1200000, maxTries=2]  //start=608, length=1, refresh=12000, type="holding", maxTries=2 ] 
	{ 
		Thing data growattLcdLanguage 		"LCD Sprache" 							[readStart="15", readValueType="uint16"]
	} 

	Bridge poller InverterPvDaten1 "PV-Daten 1" [start=1, length=10, type="input", refresh=10000, maxTries=2] 
	{
		Thing data InputPower   				"Eingangsleistung"					[readStart="1",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Pv1V							"String 1 Spannung"					[readStart="3",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv1A							"String 1 Stromstärke"				[readStart="4",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv1W							"String 1 Leistung"					[readStart="5",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Pv2V							"String 2 Spannung"					[readStart="7",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv2A							"String 2 Stromstärke"				[readStart="8",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Pv2W							"String 1 Leistung"					[readStart="9",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16				
	}  
	Bridge poller InverterPvDaten2 "PV-Daten 2" [start=35, length=2, type="input", refresh=10000, maxTries=2]  
	{
		Thing data OutputPower		 			"Ausgangsleistung"					[readStart="35", readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	} 
   
	Bridge poller status "Inverter-Daten 1" [start=0, length=1, type="input", refresh=12000, maxTries=2] 
	{	
		Thing data inverterStatus 			"Inverter-Status"						[readStart="0",  readValueType="uint16"]
		Thing data inverterStatusTxt 		"Inverter-Status"						[readStart="0",  readValueType="uint16", readTransform="MAP:UwSysWorkMode.map"]
	}

	Bridge poller Firmware "Firmware" [start=9, length=6, type="holding", refresh=1200000, maxTries=2]  
	{
		Thing data FwH 						"Firmware High" 						[readStart="9",  readValueType="uint16"]
		Thing data FwM 						"Firmware M"  							[readStart="10", readValueType="uint16"]
		Thing data FwL 						"Firmware Low" 							[readStart="11", readValueType="uint16"]
		Thing data Fw2H 					"Firmware 2 High" 						[readStart="12", readValueType="uint16"]
		Thing data Fw2M 					"Firmware 2 M"  						[readStart="13", readValueType="uint16"]
		Thing data Fw2L 					"Firmware 2 Low" 						[readStart="14", readValueType="uint16"] 
	} 

	Bridge poller growattSerial "Seriennummer" [start=23, length=5, type="holding", refresh=1200000, maxTries=2] 
	{
		Thing data growattSerial5 				"Seriennummer5" 					[readStart="23", readValueType="uint16"]
		Thing data growattSerial4				"Seriennummer4" 					[readStart="24", readValueType="uint16"]
		Thing data growattSerial3 				"Seriennummer3" 					[readStart="25", readValueType="uint16"] 
		Thing data growattSerial2 				"Seriennummer2" 					[readStart="26", readValueType="uint16"]
		Thing data growattSerial1 				"Seriennummer1" 					[readStart="27", readValueType="uint16"] 
	}
	

	Bridge poller Batteriewerte "Modbus Batteriewerte" [start=608, length=1,type="holding", refresh=60000, maxTries=2]  
	{
		Thing data BatterieMinSoc 				"Minimum SOC" 							[readStart="608", readValueType="uint16"]
	}

	Bridge poller batteryFirst "Battery first" [start=1041, length=14, type="holding", refresh=6000, maxTries=2] 
	{
		Thing data minSocLoadFirst				 	"Min-SOC (Verbraucher-zuerst)"		[readStart="1041", readValueType="uint16", writeStart="1041", writeValueType="int16", writeType="holding"]
		Thing data minSocBatteryFirst 				"Min-SOC (Batterie-zuerst)"			[readStart="1042", readValueType="uint16", writeStart="1042", writeValueType="int16", writeType="holding"]
		Thing data batteryFirstAcCharge	 			"Beladung mit Netzstrom erlaubt"	[readStart="1043", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data pvUsageMode		 				"PV-Energie-Verwendungs-Modus" 		[readStart="1044", readValueType="uint16", writeStart="1044", writeValueType="int16", writeType="holding"]		
		Thing data pvUsageModeTxt					"PV-Energie-Verwendungs-Modus" 		[readStart="1044", readValueType="uint16", readTransform="MAP:growattPvUsageMode.map"]
		Thing data batteryFirstChargePowerRate	 	"Charge Power Rate"					[readStart="1045", readValueType="uint16", writeStart="1045", writeValueType="int16", writeType="holding"]
		Thing data batteryFirst1046 	 			"1046" 								[readStart="1046", readValueType="uint16", writeStart="1046", writeValueType="int16", writeType="holding"]
		Thing data batteryFirst1047 	 			"1047" 								[readStart="1047", readValueType="uint16", writeStart="1047", writeValueType="int16", writeType="holding"]
		Thing data batteryType		 	 			"Battery Type" 						[readStart="1048", readValueType="uint16"] 												//1:Lithium, 0:Lead-acid, 2:other  Mapping ist in growatt V1.24 modbus doku falsch!
		Thing data batteryTypeTxt		 	 		"Battery Type" 						[readStart="1048", readValueType="uint16", readTransform="MAP:growattBatteryType.map"] 	//1:Lithium, 0:Lead-acid, 2:other	Mapping ist in growatt V1.24 modbus doku falsch!
		Thing data batteryFirst1049 	 			"1049" 								[readStart="1049", readValueType="uint16", writeStart="1049", writeValueType="int16", writeType="holding"]
		Thing data batteryFirstTimeslot1			"Battery first time slot 1" 		[readStart="1050", readValueType="uint16", writeStart="1050", writeValueType="int16", writeType="holding"]
		Thing data batteryirst1051					"1051" 								[readStart="1051", readValueType="uint16", writeStart="1051", writeValueType="int16", writeType="holding"]
		Thing data batteryFirstTimeslot2			"Battery first time slot 2" 		[readStart="1052", readValueType="uint16", writeStart="1052", writeValueType="int16", writeType="holding"]
		Thing data batteryirst1053					"103" 								[readStart="1053", readValueType="uint16", writeStart="1053", writeValueType="int16", writeType="holding"]
		Thing data batteryFirstTimeslot3			"Battery first time slot 3" 		[readStart="1054", readValueType="uint16", writeStart="1054", writeValueType="int16", writeType="holding"]
	} 

	Bridge poller prioritySet1 "Prio Einstellungen 1" [start=1017, length=49, type="holding", refresh=6000, maxTries=2] 
	{
		//battery-first (bf) settings:
		Thing data bfStartTime4			 			"Battery-first start time 4"		[readStart="1017", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfStopTime4			 			"Battery-first stop time 4"			[readStart="1018", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]		
		Thing data bfTime4Switch		 			"Battery-first time 4 switch"		[readStart="1019", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data bfStartTime5			 			"Battery-first start time 5"		[readStart="1020", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfStopTime5			 			"Battery-first stop time 5"			[readStart="1021", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfTime5Switch		 			"Battery-first time 5 switch"		[readStart="1022", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data bfStartTime6			 			"Battery-first start time 6"		[readStart="1023", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"] 
		Thing data bfStopTime6			 			"Battery-first stop time 6"			[readStart="1024", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfTime6Switch		 			"Battery-first time 6 switch"		[readStart="1025", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	

		//grid-first (gf) settings:
		Thing data gfStartTime4			 			"Grid-first start time 4"			[readStart="1026", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime4			 			"Grid-first stop time 4"			[readStart="1027", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfTime4Switch		 			"Grid-first time 4 switch"			[readStart="1028", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfStartTime5			 			"Grid-first start time 5"			[readStart="1029", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime5			 			"Grid-first stop time 5"			[readStart="1030", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfTime5Switch		 			"Grid-first time 5 switch"			[readStart="1031", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfStartTime6			 			"Grid-first start time 6"			[readStart="1032", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime6			 			"Grid-first stop time 6"			[readStart="1033", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfTime6Switch		 			"Grid-first time 6 switch"			[readStart="1034", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
	} 

	Bridge poller prioritySet2 "Prio Einstellungen 2" [start=1070, length=49, type="holding", refresh=6000, maxTries=2] 
	{
		//grid-first (gf) settings:
		Thing data gfDischargePowerRate				"Grid-first discharge power rate"	[readStart="1070", readValueType="uint16", writeStart="1041", writeValueType="int16", writeType="holding"]
		Thing data gfStopSOC		 				"Grid-first stop SOC"				[readStart="1071", readValueType="uint16", writeStart="1042", writeValueType="int16", writeType="holding"]
		Thing data gfStartTime1			 			"Grid-first start time 1"			[readStart="1080", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime1			 			"Grid-first stop time 1"			[readStart="1081", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfTime1Switch		 			"Grid-first time 1 switch"			[readStart="1082", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfStartTime2			 			"Grid-first start time 2"			[readStart="1083", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime2			 			"Grid-first stop time 2"			[readStart="1084", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfTime2Switch		 			"Grid-first time 2 switch"			[readStart="1085", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data gfStartTime3			 			"Grid-first start time 3"			[readStart="1086", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfStopTime3			 			"Grid-first stop time 3"			[readStart="1087", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data gfTime3Switch		 			"Grid-first time 3 switch"			[readStart="1088", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		//battery-first (bf) settings:
		Thing data bfChargePowerRate				"Battery-first charge power rate"	[readStart="1090", readValueType="uint16", writeStart="1041", writeValueType="int16", writeType="holding"]
		Thing data bfStopSOC		 				"Battery-first stop SOC"			[readStart="1091", readValueType="uint16", writeStart="1042", writeValueType="int16", writeType="holding"]
		Thing data bfAllowAcCharge	 				"Battery-first allow AC-charge"		[readStart="1092", readValueType="uint16", writeStart="1042", writeValueType="int16", writeType="holding"]	//1=enable, 0= disable

		Thing data bfStartTime1			 			"Battery-first start time 1"		[readStart="1100", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfStopTime1			 			"Battery-first stop time 1"			[readStart="1101", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]		
		Thing data bfTime1Switch		 			"Battery-first time 1 switch"		[readStart="1102", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data bfStartTime2			 			"Battery-first start time 2"		[readStart="1103", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfStopTime2			 			"Battery-first stop time 2"			[readStart="1104", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfTime2Switch		 			"Battery-first time 2 switch"		[readStart="1105", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data bfStartTime3			 			"Battery-first start time 3"		[readStart="1106", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"] 
		Thing data bfStopTime3			 			"Battery-first stop time 3"			[readStart="1107", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data bfTime3Switch		 			"Battery-first time 3 switch"		[readStart="1108", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		//load first (lf) settings
		Thing data lfStartTime1			 			"Load-first start time 1"			[readStart="1110", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfStopTime1			 			"Load-first stop time 1"			[readStart="1111", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]	
		Thing data lfTime1Switch		 			"Load-first time 1 switch"			[readStart="1112", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]		
		Thing data lfStartTime2			 			"Load-first start time 2"			[readStart="1113", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfStopTime2			 			"Grid-first stop time 2"			[readStart="1114", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfTime2Switch		 			"Load-first time 2 switch"			[readStart="1113", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfStartTime3			 			"Load-first start time 3"			[readStart="1116", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfStopTime3			 			"Load-first stop time 3"			[readStart="1117", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
		Thing data lfTime3Switch		 			"Load-first time 3 switch"			[readStart="1118", readValueType="uint16", writeStart="1043", writeValueType="int16", writeType="holding"]
	} 




	//Input-registers **************************************************************************************************

	Bridge poller InverterNetzDaten "Netz-Daten" [start=37, length=13, type="input", refresh=60000, maxTries=2]  
	{
		Thing data Netzfrequenz  				"Netzfrequenz"						[readStart="37",  readValueType="uint16", readTransform="JS:divide_100.js"]
		Thing data Phase1V  					"Spannung Phase 1"					[readStart="38",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase1A  					"Stromstärke Phase 1"				[readStart="39",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase1W						"Leistung Phase 1"					[readStart="40",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Phase2V  					"Spannung Phase 2"					[readStart="42",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase2A  					"Stromstärke Phase 2"				[readStart="43",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase2W						"Leistung Phase 2"					[readStart="44",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data Phase3V  					"Spannung Phase 3"					[readStart="46",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase3A  					"Stromstärke Phase 3"				[readStart="47",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data Phase3W						"Leistung Phase 3"					[readStart="48",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}
	 
	Bridge poller ProduktionsDaten1 "Produktions-Daten" [start=53, length=14, type="input", refresh=60000, maxTries=2] 
	{
		Thing data energyToday					"Tagesproduktion"						[readStart="53",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyTotal					"Gesamtproduktion"						[readStart="55",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data workTimeTotal    			"Betriebszeit"							[readStart="57",  readValueType="uint32", readTransform="JS:growattWtUint32To2xUint16.js"] 	//kommt als 2x uint16, jeweils in 0.5sec Einheiten
		Thing data workTimeTotalTxt    			"Betriebszeit"							[readStart="57",  readValueType="uint32", readTransform="JS:growattWtUint32To2xUint16.js∩JS:secondsToDDHHMMSS.js"] 	//kommt als 2x uint16, jeweils in 0.5sec Einheiten
		Thing data energyPv1Today				"PV-Tagesproduktion String-1"			[readStart="59",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv1Total				"PV-Gesamtproduktion String-1"			[readStart="61",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv2Today				"PV-Tagesproduktion String-2"			[readStart="63",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data energyPv2Total				"PV-Gesamtproduktion String-2"			[readStart="65",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}
	
	Bridge poller ProduktionsDaten2 "Produktions-Daten" [start=91, length=2, type="input", refresh=60000, maxTries=2]  
	{
		Thing data energyPvTotal				"PV-Gesamtproduktion"					[readStart="91",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	} 

	Bridge poller Modbus "Modbus" [start=73, length=2, type="holding", refresh=60000, maxTries=2]  
	{
		Thing data version						"Modbus-Version"						[readStart="73",  readValueType="uint16"]
	}
 
	Bridge poller FehlerDaten "Fehler-Daten" [start=86, length=9, type="input", refresh=1200000, maxTries=2]  
	{
		Thing data StrFault						"StrFault"								[readStart="86",  readValueType="uint16"]
		Thing data StrWarn 						"StrWarn"								[readStart="87",  readValueType="uint16"]
		Thing data StrBreak						"StrBreak"								[readStart="88",  readValueType="uint16"]
		Thing data PIDFaultCode					"PIDFaultCoude"							[readStart="89",  readValueType="uint16"]
		Thing data GridFaultRecord1Code			"GridFaultRecord1Code"					[readStart="90",  readValueType="uint16"]
	}

	Bridge poller batterie1 "Batterie1" [start=118, length=2, type="input", refresh=10000, maxTries=2]  
	{
		Thing data priority 					"PV-Verwendung" 					[readStart="118", readValueType="uint16"]
		Thing data batteryType					"Battery Type" 						[readStart="119", readValueType="uint16"]
	}

	Bridge poller BatterieLadedaten "Batterie-Ladedaten" [start=1009, length=6, type="input", refresh=10000, maxTries=2]  
	{
		Thing data batteryDischarge				"Batterie-Entladeleistung"				[readStart="1009",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data batteryCharge				"Batterie-Ladeleistung"					[readStart="1011",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data batteryVoltage				"Batteriespannung"						[readStart="1013",  readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data batterySoc					"Batterie-Ladestand"					[readStart="1014",  readValueType="uint16"]
	} 

	Bridge poller Netzdaten "Netzdaten" [start=1015, length=24, type="input", refresh=10000, maxTries=2] 
	{ 
		Thing data pacToUser1					"pacToUser1"							[readStart="1015",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUser2					"pacToUser2"							[readStart="1017",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUser3					"pacToUser3"							[readStart="1019",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToUserTotal 				"pacToUserTotal" 						[readStart="1021",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid1					"pacToGrid1"							[readStart="1023",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid2					"pacToGrid2"							[readStart="1025",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGrid3					"pacToGrid3"							[readStart="1027",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToGridTotal				"pacToGridTotal"						[readStart="1029",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad1				"pacToLocalLoad1"						[readStart="1031",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad2				"pacToLocalLoad2"						[readStart="1033",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoad3				"pacToLocalLoad3"						[readStart="1035",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data pacToLocalLoadTotal			"pacToLocalLoadTotal"					[readStart="1037",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	} 
	
	Bridge poller spDspStatus "SP DSP Status" [start=1041, length=1, type="input", refresh=10000, maxTries=2] 
	{
		Thing data spDspStatus						"SP DSP Status"						[readStart="1041",  readValueType="uint16"]
	}

	Bridge poller VerwendungsDaten "Verwendungs-Daten" [start=1044, length=20, type="input", refresh=10000, maxTries=2] 
	{ 
		Thing data eToUserToday						"eToUserToday"						[readStart="1044",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eToUserTotal						"eToUserTotal"						[readStart="1046",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eToGridToday						"eToGridToday"						[readStart="1048",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eToGridTotal						"eToGridTotal"						[readStart="1050",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eDischarge1Today					"eDischarge1Today"					[readStart="1052",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eDischarge1Total					"eDischarge1Total"					[readStart="1054",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eCharge1Today					"eCharge1Today"						[readStart="1056",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eCharge1Total					"eCharge1Total"						[readStart="1058",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eLocalLoadToday					"eLocalLoadToday"					[readStart="1060",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
		Thing data eLocalLoadTotal					"eLocalLoadTotal"					[readStart="1062",  readValueType="uint32", readTransform="JS:growattUint32To2xUint16.js"]	//kommt als 2x uint16
	}
	
	Bridge poller bms "BMS-Daten" [start=1082, length=15, type="input", refresh=10000, maxTries=2] 
	{
		Thing data statusOld		 				"StatusOld"							[readStart="1082", readValueType="uint16"]
		Thing data status 							"Status"							[readStart="1083", readValueType="uint16"]
		Thing data errorOld	 						"ErrorOld"							[readStart="1084", readValueType="uint16"]
		Thing data error					 		"Error" 							[readStart="1085", readValueType="uint16"]
		Thing data soc								"SOC" 								[readStart="1086", readValueType="uint16"]
		Thing data batteryVolt						"BatteryVolt"						[readStart="1087", readValueType="uint16", readTransform="JS:divide_10.js"]
		Thing data batteryCurr				 		"BatteryCurr"						[readStart="1088", readValueType="int16", readTransform="JS:divide_100.js"]
		Thing data batteryTemp 				 		"BatteryTemp" 						[readStart="1089", readValueType="int16", readTransform="JS:divide_10.js"]
		Thing data maxCurr	 						"MaxCurr" 							[readStart="1090", readValueType="uint16", readTransform="JS:divide_10.js"] 
		Thing data gaugeRm 							"GaugeRM"							[readStart="1091", readValueType="uint16"] 
		Thing data gaugeFcc							"GaugeFCC"							[readStart="1092", readValueType="uint16"] 
		Thing data fw 								"Firmware"							[readStart="1093", readValueType="uint16"] 
		Thing data deltaVolt 						"DeltaVolt"							[readStart="1094", readValueType="uint16"] 
		Thing data cycleCnt							"Ladezyklen"						[readStart="1095", readValueType="uint16"]
		Thing data soh 								"State of health"					[readStart="1096", readValueType="uint16"] 
	}

	
}  

SDM230 Register:

//Modbus message parser: https://rapidscada.net/modbus/
Bridge modbus:serial:SDM230_1 "SDM230 SmartMeter Nr 1" [ port="/dev/ttyUSB0", id=23, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ]
{
    Bridge poller inputRegisters1 [ start=0, length=80, refresh=60000, type="input" ] 
    {
        Thing data Voltage                       "Voltage"                              [ readStart="0", readValueType="float32" ]
        Thing data Current                       "Current"                              [ readStart="6", readValueType="float32" ]
        Thing data ActivePower                   "Active Power"                         [ readStart="12", readValueType="float32" ]
        Thing data ApparentPower                 "Apparent Power"                       [ readStart="18", readValueType="float32" ]
        Thing data ReactivePower                 "Reactive Power"                       [ readStart="24", readValueType="float32" ]
        Thing data PowerFactor                   "Power Factor"                         [ readStart="30", readValueType="float32" ]
        Thing data PhaseAngle                    "Phase Angle"                          [ readStart="36", readValueType="float32" ]
        Thing data Frequency                     "Frequency"                            [ readStart="70", readValueType="float32" ]
        Thing data ImportActiveEnergy            "Import Active Energy"                 [ readStart="72", readValueType="float32" ]
        Thing data ExportActiveEnergy            "Export Active Energy"                 [ readStart="74", readValueType="float32" ] 
        Thing data ImportReactiveEnergy          "Import Reactive Energy"               [ readStart="76", readValueType="float32" ]
        Thing data ExportReactiveEnergy          "Export Reactive Energy"               [ readStart="78", readValueType="float32" ]
    }

    Bridge poller Frequenz [start=70, length=2, type="input", refresh=60000] 
    {
        Thing data frequency                     "Netzferquenz"                         [readStart="70", readValueType="float32" ]     
    }    
    
    Bridge poller SystemPower [start=52, length=2, type="input", refresh=60000] {
        Thing data systemPower                   "Systemleistung"                       [readStart="52", readValueType="float32" ]      
    }

    Bridge poller kwh [start=342, length=22, type="input", refresh=60000] {
        Thing data totalKwh         "Gesamtverbrauch"           [readStart="342", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalkVarh       "Gesamt VARH"               [readStart="344", readValueType="float32" ]      
        Thing data importKwh1       "Import 1"                  [readStart="346", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data importKwh2       "Import 2"                  [readStart="348", readValueType="float32", readTransform="JS:round2Decimals.js"] 
        Thing data importKwh3       "Import 3"                  [readStart="350", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh1       "Export 1"                  [readStart="352", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh2       "Export 2"                  [readStart="354", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh3       "Export 3"                  [readStart="356", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalKwh1        "Gesamt 1"                  [readStart="358", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalKwh2        "Gesamt 2"                  [readStart="360", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalKwh3        "Gesamt 3"                  [readStart="362", readValueType="float32", readTransform="JS:round2Decimals.js"]        
        
    }   

    Bridge poller powerDemand [ start=84, length=12, refresh=60000, type="input" ] 
    {
        Thing data TotalSysPowerDemand           "Total system power demand"            [ readStart="84", readValueType="float32" ]
        Thing data MaxTotalSysPowerDemand        "Maximum total system power demand"    [ readStart="86", readValueType="float32" ]
        Thing data CurrentSysPositivePowerDemand "Current system positive power demand" [ readStart="88", readValueType="float32" ]
        Thing data MaxSysPositivePowerDemand     "Maximum system positive power demand" [ readStart="90", readValueType="float32" ]
        Thing data CurrentSysReversePowerDemand  "Current system reverse power demand"  [ readStart="92", readValueType="float32" ]
        Thing data MaxSysReversePowerDemand      "Maximum system reverse power demand"  [ readStart="94", readValueType="float32" ]
    }
    
    Bridge poller currentDemand [ start=258, length=8, refresh=60000, type="input" ] 
    {
        Thing   data    CurrentDemand           "Current demand"                        [ readStart="258", readValueType="float32" ]
        Thing   data    MaximumCurrentDemand    "Maximum current Demand"                [ readStart="264", readValueType="float32" ]
    }

    Bridge poller totalEnergy [ start=342, length=4, refresh=60000, type="input" ] 
    {
        Thing   data    TotalActiveEnergy      "Total Active Energy"                    [ readStart="342", readValueType="float32" ]
        Thing   data    TotalReactiveEnergy    "Total Reactive Energy"                  [ readStart="344", readValueType="float32" ]
    }
}

SDM54-Register:

//Modbus message parser: https://rapidscada.net/modbus/
Bridge modbus:serial:SDM54_1 "SDM54-T2 SmartMeter Nr 1" [ port="/dev/ttyUSB0", id=21, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ]
{ 
    Bridge poller BasisWerte [start=0, length=36, type="input", refresh=60000]
    {
        Thing data voltage1         "Spannung Phase 1"          [readStart="0", readValueType="float32" ]
        Thing data voltage2         "Spannung Phase 2"          [readStart="2", readValueType="float32" ]
        Thing data voltage3         "Spannung Phase 3"          [readStart="4", readValueType="float32" ]
        Thing data current1         "Stromstärke Phase 1"       [readStart="6", readValueType="float32" ]
        Thing data current2         "Stromstärke Phase 2"       [readStart="8", readValueType="float32" ]
        Thing data current3         "Stromstärke Phase 3"       [readStart="10", readValueType="float32" ]
        Thing data power1           "Leistung Phase 1"          [readStart="12", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data power2           "Leistung Phase 2"          [readStart="14", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data power3           "Leistung Phase 3"          [readStart="16", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data va1              "VA 1"                      [readStart="18", readValueType="float32" ]
        Thing data va2              "VA 2"                      [readStart="20", readValueType="float32" ]
        Thing data va3              "VA 3"                      [readStart="22", readValueType="float32" ]
        Thing data var1             "VAR 1"                     [readStart="24", readValueType="float32" ]
        Thing data var2             "VAR 2"                     [readStart="26", readValueType="float32" ]
        Thing data var3             "VAR 3"                     [readStart="28", readValueType="float32" ]
        Thing data powerfactor1     "Leistungsfaktor 1"         [readStart="30", readValueType="float32" ]
        Thing data powerfactor2     "Leistungsfaktor 2"         [readStart="32", readValueType="float32" ]
        Thing data powerfactor3     "Leistungsfaktor 3"         [readStart="34", readValueType="float32" ]            
    }
 
    Bridge poller Frequenz [start=70, length=2, type="input", refresh=60000] 
    {
        Thing data frequency        "Netzferquenz"              [readStart="70", readValueType="float32" ]     
    }    
    
    Bridge poller SystemPower [start=52, length=2, type="input", refresh=60000] {
        Thing data systemPower      "Systemleistung"            [readStart="52", readValueType="float32" ]      
    }

    Bridge poller kwh [start=342, length=22, type="input", refresh=60000] {
        Thing data totalKwh         "Gesamtverbrauch"           [readStart="342", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalkVarh       "Gesamt VARH"               [readStart="344", readValueType="float32" ]      
        Thing data importKwh1       "Import 1"                  [readStart="346", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data importKwh2       "Import 2"                  [readStart="348", readValueType="float32", readTransform="JS:round2Decimals.js"] 
        Thing data importKwh3       "Import 3"                  [readStart="350", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh1       "Export 1"                  [readStart="352", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh2       "Export 2"                  [readStart="354", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh3       "Export 3"                  [readStart="356", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalKwh1        "Gesamt 1"                  [readStart="358", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalKwh2        "Gesamt 2"                  [readStart="360", readValueType="float32", readTransform="JS:round2Decimals.js"]      
        Thing data totalKwh3        "Gesamt 3"                  [readStart="362", readValueType="float32", readTransform="JS:round2Decimals.js"]        
        
    }    
}

//Modbus message parser: https://rapidscada.net/modbus/
Bridge modbus:serial:SDM54_2 "SDM54-T2 SmartMeter Nr 2" [ port="/dev/ttyUSB0", id=22, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ]
{ 
    Bridge poller BasisWerte [start=0, length=36, type="input", refresh=60000]
    {
        Thing data voltage1         "Spannung Phase 1"          [readStart="0", readValueType="float32" ]
        Thing data voltage2         "Spannung Phase 2"          [readStart="2", readValueType="float32" ]
        Thing data voltage3         "Spannung Phase 3"          [readStart="4", readValueType="float32" ]
        Thing data current1         "Stromstärke Phase 1"       [readStart="6", readValueType="float32" ]
        Thing data current2         "Stromstärke Phase 2"       [readStart="8", readValueType="float32" ]
        Thing data current3         "Stromstärke Phase 3"       [readStart="10", readValueType="float32" ]
        Thing data power1           "Leistung Phase 1"          [readStart="12", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data power2           "Leistung Phase 2"          [readStart="14", readValueType="float32", readTransform="JS:round2Decimals.js" ]
        Thing data power3           "Leistung Phase 3"          [readStart="16", readValueType="float32", readTransform="JS:round2Decimals.js" ]
        Thing data va1              "VA 1"                      [readStart="18", readValueType="float32" ]
        Thing data va2              "VA 2"                      [readStart="20", readValueType="float32" ]
        Thing data va3              "VA 3"                      [readStart="22", readValueType="float32" ]
        Thing data var1             "VAR 1"                     [readStart="24", readValueType="float32" ]
        Thing data var2             "VAR 2"                     [readStart="26", readValueType="float32" ]
        Thing data var3             "VAR 3"                     [readStart="28", readValueType="float32" ]
        Thing data powerfactor1     "Leistungsfaktor 1"         [readStart="30", readValueType="float32" ]
        Thing data powerfactor2     "Leistungsfaktor 2"         [readStart="32", readValueType="float32" ]
        Thing data powerfactor3     "Leistungsfaktor 3"         [readStart="34", readValueType="float32" ]            
    }
 
    Bridge poller Frequenz [start=70, length=2, type="input", refresh=60000] 
    {
        Thing data frequency        "Netzferquenz"              [readStart="70", readValueType="float32" ]     
    }    
    
    Bridge poller SystemPower [start=52, length=2, type="input", refresh=60000] {
        Thing data systemPower      "Systemleistung"            [readStart="52", readValueType="float32" ]      
    }  

    Bridge poller kwh [start=342, length=22, type="input", refresh=60000] {
        Thing data totalKwh         "Gesamtverbrauch"           [readStart="342", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalkVarh       "Gesamt VARH"               [readStart="344", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data importKwh1       "Import 1"                  [readStart="346", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data importKwh2       "Import 2"                  [readStart="348", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data importKwh3       "Import 3"                  [readStart="350", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh1       "Export 1"                  [readStart="352", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh2       "Export 2"                  [readStart="354", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data exportKwh3       "Export 3"                  [readStart="356", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalKwh1        "Gesamt 1"                  [readStart="358", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalKwh2        "Gesamt 2"                  [readStart="360", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data totalKwh3        "Gesamt 3"                  [readStart="362", readValueType="float32", readTransform="JS:round2Decimals.js"]        
        
    }    
}

SDM630-Adressen (aktuell nicht in Verwendung, weil wird vom Growatt SPH ausgelsen und von diesem “weitergegeben”):

Bridge modbus:serial:SDM630 "SDM630 SmartMeter Nr 1"    [ port="/dev/ttyUSB0", id=3, baud=9600, stopBits="1.0", parity="none", dataBits=8, encoding="rtu", timeBetweenTransactionsMillis=1000 ]
{ 
    Bridge poller BasisWerte [start=0, length=36, type="input", refresh=5000]
    {
        Thing data voltage1         "Spannung Phase 1"          [readStart="0", readValueType="float32" ]
        Thing data voltage2         "Spannung Phase 2"          [readStart="2", readValueType="float32" ]
        Thing data voltage3         "Spannung Phase 3"          [readStart="4", readValueType="float32" ]
        Thing data current1         "Stromstärke Phase 1"       [readStart="6", readValueType="float32" ]
        Thing data current2         "Stromstärke Phase 2"       [readStart="8", readValueType="float32" ]
        Thing data current3         "Stromstärke Phase 3"       [readStart="10", readValueType="float32" ]
        Thing data power1           "Leistung Phase 1"          [readStart="12", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data power2           "Leistung Phase 2"          [readStart="14", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data power3           "Leistung Phase 3"          [readStart="16", readValueType="float32", readTransform="JS:round2Decimals.js"]
        Thing data va1              "VA 1"                      [readStart="18", readValueType="float32" ]
        Thing data va2              "VA 2"                      [readStart="20", readValueType="float32" ]
        Thing data va3              "VA 3"                      [readStart="22", readValueType="float32" ]
        Thing data var1             "VAR 1"                     [readStart="24", readValueType="float32" ]
        Thing data var2             "VAR 2"                     [readStart="26", readValueType="float32" ]
        Thing data var3             "VAR 3"                     [readStart="28", readValueType="float32" ]
        Thing data powerfactor1     "Leistungsfaktor 1"         [readStart="30", readValueType="float32" ]
        Thing data powerfactor2     "Leistungsfaktor 2"         [readStart="32", readValueType="float32" ]
        Thing data powerfactor3     "Leistungsfaktor 3"         [readStart="34", readValueType="float32" ]            
    }

    //Bridge poller Frequenz [start=70, length=2, type="input", refresh=5000] {
        //Thing data sdm_frequency       [readStart="70", readValueType="float32" ]      
    //}    

    //Bridge poller SystemPower [start=52, length=2, type="input", refresh=5000] {
        //Thing data sdm_systemPower       [readStart="52", readValueType="float32" ]      
    //}    

    //Bridge poller kWh [start=342, length=22, type="input", refresh=5000] {
        //Thing data sdm_kwh_Totalkwh       [readStart="342", readValueType="float32" ]      
        //Thing data sdm_kwh_Totalkvarh     [readStart="344", readValueType="float32" ]      
        //Thing data sdm_kwh_L1_import_kWh  [readStart="346", readValueType="float32" ]      
        //Thing data sdm_kwh_L2_import_kWh  [readStart="348", readValueType="float32" ]      
        //Thing data sdm_kwh_L3_import_kWh  [readStart="350", readValueType="float32" ]
        //Thing data sdm_kwh_L1_export_kWh  [readStart="352", readValueType="float32" ]      
        //Thing data sdm_kwh_L2_export_kWh  [readStart="354", readValueType="float32" ]      
        //Thing data sdm_kwh_L3_export_kWh  [readStart="356", readValueType="float32" ]
        //Thing data sdm_kwh_L1_total_kWh   [readStart="358", readValueType="float32" ]      
        //Thing data sdm_kwh_L2_total_kWh   [readStart="360", readValueType="float32" ]      
        //Thing data sdm_kwh_L3_total_kWh   [readStart="362", readValueType="float32" ]        
//        
    //}    
}