SolarEdge ModBus Registers - SunSpec

With fantastic help from two of the contributors I have now learned how to decode the ModBus registers from the SolarEdge inverter. It is fitted with a WattNode meter which also uses ModBus.

Following the

I have so far decoded as far as register 40189 on page 19 successfully. The main data I need is in the Export+Import section but all the registers beyond 400189 appear to be either zero or 32780. As far as its worth empty.

Ive seen a few posts about SolarEdge Modbus and was hoping someone's got any further than this.

Has anyone successfully decoded

Hi @lanmidd

Did you get any further?, I am trying to read how much solar is being generated and the battery state, have this all figured out on my Victron system but no luck on solar edge

Some progress. I will know more on Thursday after Solaredge help me check / set the Modbus correctly.



Thanks, I'll eagerly await anything your good enough to post.



Just got off the phone with Solaredge. They changed the Meter to ID as you suggested and I’m getting data now.

Block 40188 is showing 203 and I think it should be 201.

I’m looking at the other fields now. They seem to be populated now.




Any chance I could get a copy of you flow please, if I go to block 40188 I get out of range - I'll be honest I don't totally know what I am doing!!

@Ianmidd Did you every get the solar edge, so very close to get it working. Would really appreciate any help you can offer.

or share what i have done if you need it.



I’ll be back on this at the weekend.

I have finished up with a combination of API, Modbus and eMonTx.

I’ll send some stuff over.



very kind, thanks

[{"id":"9ad5eb66.99dcc8","type":"function","z":"cafd2af1.b44da8","name":"Solaredge TCP modbus -> JSON","func":"// Create new Buffer based on array bytes\nconst buf = Buffer.from(msg.payload.buffer);\n\n// Create influxdb JSON\nmsg.payload = [\n    [{\n        'AC Total Current      40072':  round(uint16(40072) * scalefactor(40076),1),\n        'AC Voltage phase AB   40077':  round(uint16(40077) * scalefactor(40083),1),\n        'AC Power              40083':  round(uint16(40083) * scalefactor(40084),1),\n        'AC Power output Watts 40084':  round(int16(40084) * scalefactor(40085), 1),\n        'AC Frequency Hz      40086':   round(uint16(40086) * scalefactor(40087),1),\n        'AC Apparent Power    40088':   round(uint16(40088) * scalefactor(40089),1),\n        'AC Reactive Power    40090':   round(uint16(40090) * scalefactor(40091),1),\n        'AC Power Factor      40092':   round(uint16(40092) * scalefactor(40093),1),\n        'DC Current':                   round(int16(40097) * scalefactor(40098),1),\n        'DC Current Factor':            round(int16(40098),2),\n        'DC Voltage':                   round(uint16(40099) * scalefactor(40100),1),\n        'DC Volt Factor':               round(int16(40100),2),\n        'DC Power':                     round(int16(40101) * scalefactor(40102),1),\n        'Status               40108':   round(uint16(40108), 2),\n        time: new Date()\n    },\n    {\n        inverter: '1'\n    }]\n];\n\nreturn msg;\n\nfunction word(address) {\n    // Find the correct offset in bytes\n    // 40070 is the starting address we fetch from SolarEdge inverter\n    return (address-40070) * 2;\n}\n\nfunction scalefactor(address) {\n    return Math.pow(10, buf.readInt16BE(word(address)));\n}\n\nfunction int16(address) {\n    return buf.readInt16BE(word(address))\n}\n\nfunction uint16(address) {\n    return buf.readUInt16BE(word(address));\n}\n\nfunction int32(address) {\n    return buf.readInt32BE(word(address))\n}\n\nfunction uint32(address) {\n    return buf.readUInt32BE(word(address))\n}\n\nfunction round(value, decimals) {\n return Number(Math.round(value+'e'+decimals)+'e-'+decimals);\n} \n\n        \n//        'Single Phase 101      40070':  round(int16(40070),2),\n//        'Sunspec Length        40071':  round(uint16(40071),2),\n//        'AC Current phase A    40073':  round(uint16(40073) * scalefactor(40076), 2),\n//        'AC Current phase B   40074':  round(uint16(40074) * scalefactor(40076), 2),\n//        'AC Current phase C   40075':  round(uint16(40075) * scalefactor(40076), 2),\n//        'AC Current scale      40076':  round(int16(40076), 2),\n//        'AC Voltage phase BC  40077':  round(uint16(40078) * scalefactor(40083), 2),\n//        'AC Voltage phase CA  40078':  round(uint16(40079) * scalefactor(40083), 2),\n//        'AC Voltage phase AN  40079':  round(uint16(40080) * scalefactor(40083), 2),\n//        'AC Voltage phase BN  40080':  round(uint16(40081) * scalefactor(40083), 2),\n//        'AC Voltage Scale     40083':  round(int16(40083), 2),\n//        'AC Power Scale       40085':  round(int16(40085), 2), \n//        'AC Frequency Scale   40087':  round(int16(40087), 2),\n//        'AC A/Power Scale     40089':  round(int16(40089), 2), \n//        'AC R/Power Scale     40091':  round(int16(40091), 2), \n//        'AC P/F Scale         40093':  round(int16(40093), 2),    \n//        'AC Lifetimeproduction 40094': round(uint32(40094) * scalefactor(40096), 2),\n//        'Heat sink temp':         round(int16(40104) * scalefactor(40107), 2),\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":560,"y":300,"wires":[["f2b18b54.e946c8","8a92ecec.f736c"]]}]

This is my Modbus decode function thus far. Problems I have encountered are:-

  1. The Inverter/s were incorrectly configured so Modbus values were missing or incorrect.
  2. The SolarEdge document has errors and is generally unhelpful.
  3. The Flex Getter Node causes errors so I use only yet Modbus Getter.
  4. I have also installed eMonTx units (2 of them because my system is in a annex and the main CB panel is in the main house) in an attempt to gather reliable data.
  5. It is difficult (almost impossible) to reconcile the data with SolarEdge monitor because of the time lag so independent measurements have to be made onsite.
  6. The turnaround time for a Support "case" with SolarEdge is measured in weeks.
  7. Much of the values we actually need have to calculated or deduced form other data.
  8. The eMonTx vales need to be subjected to a calibration depending on the prevailing mans voltage which varies constantly.
  9. SolarEdge API is unusable due to the limit of 300 squawks per day.
  10. I wanted to fit a supplemental API init so my old Inverters could be interrogated locally. The Newer inverters are (so-say) incompatible with Taels batteries. This is because Tesla got pissed of with Solaredge and went their own way in my opinion. So if you have Tesla batteries do not expect any help from SolarEdge are monitoring.
  11. As far as I can tell theStarage LEVEL (Battery %) is not even implemented in the Modbus version used by SolarEdge. If it is they won't tell me the register number despite many requests.

My conclusion is any salesman who sells a SolarEdge system based on User monitoring is being deceitful. And finally there is no way the User can alter the Charge profiles themselves whatever the salesman tells you.

I have spent many many hours on this and the results are borderline adequate to unusable.

@Ianmidd about the same conclusion i came to. I have a victron system and a soloredge system and the victron is so much nicer to work with. All i have tried to get it the generater solar power and will they help? will they bugger. I'm looking at putting a meter on the connection to the solaredge that will give me much of what i need fed into my victron system.

I have reasonably big system with 149 panels and 40kw avaliable inverter power mainly needed as i can get three phase electric to the property and when i add up the hot tub coming on charging the car 12 kw water heater the fuse blows if the wife cooks a roast!!

if i get anywhere i will gladly share it



1 Like

I think I’ve more or less mastered the Modbus part. The actual relevance of the fields decoded is far from clear and very difficult to correlate with the Portal due to time delay and poll limit.

I asked Solaredge to explain the fields and so far they have refused. I think I will end up changing the inverters as I suspect they are very inefficient anyway.



I've looked at replacing mine with a fronius inverter as that is compatible with my victron stuff but the LG Chem battery I have would go to waste also all the panels have optimisers on them but totally in agreement with you,

It turns out the WattNode meter was incorrectly configured in the Inverter thus contained no actual data.

Now that’s fixed. There is some data. I have asked Solaredge to clarify :-1:

What is meant by DC Current? Is the Panel output, Battery Input/Output or the sum of all those +/-.

What is meant by AC Current ? Is it Inverter production or Grid Flow +/-?

Where is Storage Charge Level % stored ?

So far I have had 2 responses both not referring to Modbus so no use at all.

I really do not understand how they can claim that the System can be monitored if it’s all so vague.

I have also installed eMonTX in an effort to get progress but so far I have done data but no means to verify.

Ok, current state of play is: Because I have two inverters I need to read both Modbusses which explains why all the date I had was not credible. Also because each inverter has its own battery I need to pick up Battery 1 from Inverter 1 and Battery ONE from Inverter 2. (Doh!).

So far I now have all the data coming in with reasonable values with the exception of PV Output. Still searching for this. I have Total AC Output and Total DC Output but is seems to be referring only to the passage from Inverter/s to House and not from PV to Battery. Still waiting from Solaredge Technical support who seem to be almost further in the dark than I am at the moment.

This is a super-interesting discussion!

I'm about to install solar PV on our (small) roof. I'm a real data geek, so I want to get my hands on as much data as possible, ideally at the level of the individual PV modules :slight_smile: Would you folks recommend against SolarEdge? In which case, it looks like my only choice is Enphase micro-inverters if I want module-level data; is that right?

I’ve pretty much found all the inputs I need despite SolarEdge. Their manuals are incorrect and the support with one exception openly admit I know more than they do.

The problem I’m struggling with atm is the Modbus keeps collapsing. It’ll work for several hours and then just stop.

I’ve tried eMonTx units but they’re not stable and drop off the network from time to time.

I can keep the roof panels but it looks as if I’ll need to sell the SE Inverters and Tesla PW1s.

I just need inverters that provide proper power tracking and data feed and suitable batteries to go with them.

I’m at the point where I can track the data and can show that the SE inverters are Exporting when there is no need and Importing when there is no need. Wasting me money unless I could get Netmetering instead.



I actually want to go the other direction and start with a dumb inverter and implement a flow that mimic's the Sunspec ModbusTCP compliant inverter profile for the Victron CCGX display device.

Any pointers?