@chris_ka thankyou. I just tried slave 3 and it finally started returning some sort of data. Although the data ins’t totally meaningful. I’m getting -1 as the result. For some other registers I’m getting some sort of number other than -1 but none are correct. Is it the “count” or something else I should be looking at?
OK let’s do this step by step.
Prerequisites:
- SMA Inverter which uses speedwire (Ethernet) or WiFi to connect to the local network. (Not bluetooth).
- You can connect to the inverter with sunny explorer https://www.sma-america.com/products/monitoring-control/sunny-explorer.html
- You have the password to log in as installer/plumber to change settings
-
Get the IP address of the inverter in your local Network. At daytime when the Inverter is sending data you can check your router to find the ip address. (note it down)
-
Start Sunny Explorer and connect to your Inverter. Go to Settings and open External Communication: You should find something similar to this
-
Note down the UnitID and TCP-Server port. Ensure that TCP-Server is active. If not change it!
-
Now get this document: http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-en-19.pdf
and have a look on page 28 Section 5.4.1 common Addresses of all SMA Devices. here you find the values for all relevant registers (ADR), the count (CNT) and their description. -
configure modbus integration in Home Manager configuration
modbus:
name: sma
type: tcp
host: 192.168.178.101 # use the ip address for your inverter as mentioned in the text
port: 502 # use the port you saw in sunny explorer
- configure modbus sensors in HA
sensors:
- platform: modbus
scan_interval: 30
registers:
- name: Gesamtertrag
hub: sma
unit_of_measurement: kWh # see register description in section 5.4.1 of the document
slave: 3 # use the UnitID you found in Sunny Explorer
register: 30531 # use a register from section 5.4.1 of the document
register_type: input # all registers starting with 3 need to have the type input
count: 2 # use the correct count for the register see section 5.4.1 of the document
- Have fun
Ah turns out getting the slave number, register and count right as per the SMA specs right can lead to point 7.
All seems to be working well except for a couple of registers such as model ID. Maybe my model is actually -1. in any case, it’ unimportant as the other values are working as expected.
Just noting that I fount there are 2 different sets of Sunny Island (SI) register specifications. The Excel one that is found on the SMA website seems to be only partially correct which this one http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-en-19.pdf has registers that mostly work.
I use the following. This gets data out of the SMA Tripower 8.0. Not all registers seem to have the right variables I think. And if the power generated by the solar panels is to low or none, the most of the registers will go to the maximum value in the variable or so. Few still make sense like SMA total.
Does anyone else has the same experience?
configuration.yaml:
modbus:
type: tcp
host: 192.168.15.35
port: 502
sensor.yaml
- platform: modbus
scan_interval: 10
registers:
- name: SMA Power L1
unit_of_measurement: kW
slave: 3
register: 30777
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Power L2
unit_of_measurement: kW
slave: 3
register: 30779
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Power L3
unit_of_measurement: kW
slave: 3
register: 30781
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Stroom L1
unit_of_measurement: A
slave: 3
register: 30977
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Stroom L2
unit_of_measurement: A
slave: 3
register: 30979
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Stroom L3
unit_of_measurement: A
slave: 3
register: 30981
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Spanning L1
unit_of_measurement: V
slave: 3
register: 30783
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMA Spanning L2
unit_of_measurement: V
slave: 3
register: 30785
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMA Spanning L3
unit_of_measurement: V
slave: 3
register: 30787
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMA Netfrequentie
unit_of_measurement: Hz
slave: 3
register: 30803
count: 2
data_type: uint
scale: 0.01
precision: 2
- name: SMA power
unit_of_measurement: k
slave: 3
register: 30775
count: 2
data_type: int
scale: 0.001
precision: 2
- name: SMA Total
unit_of_measurement: kW
slave: 3
register: 30529
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA Today
unit_of_measurement: kWh
slave: 3
register: 30535
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMA device type 9347 = 8.0
slave: 3
register: 30053
count: 2
data_type: int
- name: SMA grid relay 51=Closed 311= Open
slave: 3
register: 30217
count: 2
data_type: int
And would colde like the code in the bottom of this message be a good catch to go to ‘0’ in stead of high values?
- platform: SMA
sensors:
sma_power_power:
value_template: “{% if states(‘sensor.sma_power_l1’)|float < 0 %}0{% else %}{{ states(‘sensor.sma_power_l1’) | float / 100 | round(2)}}{% endif %}”
friendly_name: ‘Power’
unit_of_measurement: ‘W’
icon_template: mdi:flash-circle
Hi MBolt,
I solved this by using an additional template sensor using the modbus sensor as input like this:
power_sma_filtered:
friendly_name: "Erzeugung aktuell"
unit_of_measurement: W
value_template: >-
{% if (states('sensor.power_sma')|int >= 10000 or states('sensor.power_smal')|int < 0) %}
0
{% else %}
{{(states('sensor.power_sma')|int)}}
{% endif %}
I use this in config
# SMA over modbus
modbus:
type: tcp
host: 192.168.178.171
port: 502
and this in sensors
- platform: modbus
scan_interval: 30
registers:
- name: Gesamtertrag
hub: sma
unit_of_measurement: kWh # see register description in section 5.4.1 of the document
slave: 3 # use the UnitID you found in Sunny Explorer
register: 30531 # use a register from section 5.4.1 of the document
register_type: input # all registers starting with 3 need to have the type input
count: 2 # use the correct count for the register see section 5.4.1 of the document
and get this error in my log
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 179, in _async_setup_platform
await asyncio.wait_for(asyncio.shield(task), SLOW_SETUP_MAX_WAIT)
File "/usr/local/lib/python3.7/asyncio/tasks.py", line 442, in wait_for
return fut.result()
File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/src/homeassistant/homeassistant/components/modbus/sensor.py", line 129, in setup_platform
hub = hass.data[MODBUS_DOMAIN][hub_name]
KeyError: 'sma'
I can login to the webinterface just fine. I came here bc the standard SMA integration was not working, but am having issues with this as well. Anyone care to shed some light on this?
I think it’s because you are missing the sma name for the modbus tcp, port and ip settings.
Add “name: sma” or it might also work if you remove “hub: sma” from the registers.
You have:
# SMA over modbus
modbus:
type: tcp
host: 192.168.178.171
port: 502
Should be (if you use “hub: sma”)
# SMA over modbus
modbus:
name: sma
type: tcp
host: 192.168.178.171
port: 502
I will try this too
Modbus seems broken in 0.108 before in worked perfectly.
There were fixes in 0.108.2
Fix modbus default delay (@janiversen - #33877) (modbus docs)
The new default delay is 0.
delay
(integer)(Optional)
Time to sleep in seconds after connecting and before sending messages. Some modbus-tcp servers need a short delay typically 1-2 seconds in order to prepare the communication. If a server accepts connecting, but there is no response to the requests send, this parameter might help.
Default value:
0
My modbus integration looked like this
modbus:
name: sma
type: tcp
host: 192.168.178.101
port: 502
Unfortunately after adding the delay parameter with 1 or 2 doesn’t help. I get the following errors:
Logger: pymodbus.factory
Source: __main__.py:342
First occurred: 11:26:58 (6 occurrences)
Last logged: 11:29:32
Unable to decode response Modbus Error: Unknown response 59
Unable to decode response Modbus Error: Unknown response 90
Unable to decode response Modbus Error: Unknown response 125
index out of range
Logger: homeassistant.core
Source: /usr/src/homeassistant/homeassistant/core.py:144
First occurred: 11:26:58 (6 occurrences)
Last logged: 11:29:32
Error doing job: Fatal error: protocol.data_received() call failed.
Traceback (most recent call last):
File "/usr/local/lib/python3.7/asyncio/selector_events.py", line 826, in _read_ready__data_received
self._protocol.data_received(data)
File "/usr/local/lib/python3.7/site-packages/pymodbus/client/asynchronous/asyncio/__init__.py", line 192, in data_received
self._dataReceived(data)
File "/usr/local/lib/python3.7/site-packages/pymodbus/client/asynchronous/asyncio/__init__.py", line 139, in _dataReceived
self.framer.processIncomingPacket(data, self._handleResponse, unit=unit)
File "/usr/local/lib/python3.7/site-packages/pymodbus/framer/socket_framer.py", line 165, in processIncomingPacket
self._process(callback, error=True)
File "/usr/local/lib/python3.7/site-packages/pymodbus/framer/socket_framer.py", line 175, in _process
raise ModbusIOException("Unable to decode request")
pymodbus.exceptions.ModbusIOException: Modbus Error: [Input/Output] Unable to decode request
I have the same issue with 0.108.1-3.
Reverted to 0.107.7 and it works fine again.
Yes modbus is definitely broken in 0.108 1-3
I stay on 0.108.3 but I switched to NodeRed and MQTT to retrieve my modbus data.
everything works now again.
I wrote a tutorial how to do this:
I thought it was me!, nothing would make my SunGrow inverter connect reliably.
I gave up on the Modbus intergration and went node-red also
Hi Darren, welcome to the club!
I see that you use the Modbus reader with input definition via a function block. Do you mind sharing the content of the block. I would like to add this approach to my tutorial with reference to your post
regards Chris
According to the source code of the modbus flex-getter, @drmcinnes is just reading an address range. You can also take a look at the Modbus-Flex-Suite examples via Import -> Examples -> node-red-contrib-modbus.
Sorry I haven’t been checking my mail, I’ll post it later tonight.
Heres the updated flow and screenshot, it’s still a work in progress!
It looks like the native modbus integration is working again. in 0.108.7 they reverted back to the 0.107.7 version
Hi All,
This is my current modbus code and template for the SMA Tripower 8.0 . With some help of the @chris_ka post above I managed to realise a good working solution for the SMA.Probably the code below is not the best code but it does the job.
Note: the ‘day power’ was wrong and after a firmware update of the inverter the values made sense
How to convert this to a nice Home Assistant integration?
#configuration.yaml
#SMA solar inverter Tripower 8.0
modbus:
type: tcp
host: 192.168.1.123
port: 502
# sensor.yaml
# sensor:
- platform: modbus
scan_interval: 2
registers:
- name: SMApwrL1
unit_of_measurement: kW
slave: 3
register: 30777
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMApwrL2
unit_of_measurement: kW
slave: 3
register: 30779
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMApwrL3
unit_of_measurement: kW
slave: 3
register: 30781
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMAcurL1
unit_of_measurement: A
slave: 3
register: 30977
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMAcurL2
unit_of_measurement: A
slave: 3
register: 30979
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMAcurL3
unit_of_measurement: A
slave: 3
register: 30981
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMAvoltL1
unit_of_measurement: V
slave: 3
register: 30783
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMAvoltL2
unit_of_measurement: V
slave: 3
register: 30785
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMAvoltL3
unit_of_measurement: V
slave: 3
register: 30787
count: 2
data_type: uint
scale: 0.01
precision: 1
- name: SMAnetHZ
unit_of_measurement: Hz
slave: 3
register: 30803
count: 2
data_type: uint
scale: 0.01
precision: 2
- name: SMApwr
unit_of_measurement: kW
slave: 3
register: 30775
count: 2
data_type: int
scale: 0.001
precision: 2
- name: SMAtotal
unit_of_measurement: MW
slave: 3
register: 30529
count: 2
data_type: uint
scale: 0.000001
precision: 2
- name: SMAtoday
unit_of_measurement: kWh
slave: 3
register: 30535
count: 2
data_type: uint
scale: 0.001
precision: 2
- name: SMAdevtype
slave: 3
register: 30053
count: 2
data_type: int
- name: SMAgridrelay
slave: 3
register: 30217
count: 2
data_type: int
- platform: template
sensors:
sma_power_l1:
value_template: "{% if states('sensor.smapwrl1')|float > 10000 %}0{% else %}{{ states('sensor.smapwrl1') | float | round(2)}}{% endif %}"
friendly_name: "SMA power L1"
unit_of_measurement: 'kW'
icon_template: mdi:solar-power
sma_power_l2:
value_template: "{% if states('sensor.smapwrl2')|float > 10000 %}0{% else %}{{ states('sensor.smapwrl2') | float | round(2)}}{% endif %}"
friendly_name: "SMA power L2"
unit_of_measurement: 'kW'
icon_template: mdi:solar-power
sma_power_l3:
value_template: "{% if states('sensor.smapwrl3')|float > 10000 %}0{% else %}{{ states('sensor.smapwrl3') | float | round(2)}}{% endif %}"
friendly_name: "SMA power L3"
unit_of_measurement: 'kW'
icon_template: mdi:solar-power
sma_stroom_l1:
value_template: "{% if states('sensor.smacurl1')|float > 100 %}0{% else %}{{ states('sensor.smacurl1') | float | round(2)}}{% endif %}"
friendly_name: "SMA stroom L1"
unit_of_measurement: 'A'
icon_template: mdi:solar-power
sma_stroom_l2:
value_template: "{% if states('sensor.smacurl2')|float > 100 %}0{% else %}{{ states('sensor.smacurl2') | float | round(2)}}{% endif %}"
friendly_name: "SMA stroom L2"
unit_of_measurement: 'A'
icon_template: mdi:solar-power
sma_stroom_l3:
value_template: "{% if states('sensor.smacurl3')|float > 100 %}0{% else %}{{ states('sensor.smacurl3') | float | round(2)}}{% endif %}"
friendly_name: "SMA stroom L3"
unit_of_measurement: 'A'
icon_template: mdi:solar-power
sma_spanning_l1:
value_template: "{% if states('sensor.smavoltl1')|float > 1000 %}0{% else %}{{ states('sensor.smavoltl1') | float | round(2)}}{% endif %}"
friendly_name: "SMA spanning L1"
unit_of_measurement: 'V'
icon_template: mdi:solar-power
sma_spanning_l2:
value_template: "{% if states('sensor.smavoltl2')|float > 1000 %}0{% else %}{{ states('sensor.smavoltl2') | float | round(2)}}{% endif %}"
friendly_name: "SMA spanning L2"
unit_of_measurement: 'V'
icon_template: mdi:solar-power
sma_spanning_l3:
value_template: "{% if states('sensor.smavoltl3')|float > 1000 %}0{% else %}{{ states('sensor.smavoltl3') | float | round(2)}}{% endif %}"
friendly_name: "SMA spanning L3"
unit_of_measurement: 'V'
icon_template: mdi:solar-power
sma_netfrequentie:
value_template: "{% if states('sensor.smanethz')|float > 1000 %}0{% else %}{{ states('sensor.smanethz') | float | round(2)}}{% endif %}"
friendly_name: "SMA Netfrequentie"
unit_of_measurement: 'Hz'
icon_template: mdi:solar-power
sma_power:
value_template: "{% if states('sensor.smapwr')|float < 0 %}0{% else %}{{ states('sensor.smapwr') | float | round(2)}}{% endif %}"
friendly_name: "SMA Power"
unit_of_measurement: 'kW'
icon_template: mdi:solar-power
sma_total:
value_template: "{% if states('sensor.smatotal')|float < 0 %}0{% else %}{{ states('sensor.smatotal') | float | round(2)}}{% endif %}"
friendly_name: "SMA Total"
unit_of_measurement: 'MWh'
icon_template: mdi:solar-power
sma_today:
value_template: "{% if states('sensor.smatoday')|float > 1000 %}0{% else %}{{ states('sensor.smatoday') | float | round(2)}}{% endif %}"
friendly_name: "SMA Today"
unit_of_measurement: 'kWh'
icon_template: mdi:solar-power
sma_device_type:
value_template: "{% if states('sensor.smadevtype')|float == 9347 %}Tripower 8.0{% else %}?{% endif %}"
friendly_name: "SMA device type"
icon_template: mdi:solar-power
sma_grid_relay:
value_template: "{% if states('sensor.smagridrelay')|float == 51 %}closed{% elif states('sensor.smagridrelay')|float == 311 %}open{% else %}?{% endif %}"
friendly_name: "SMA grid relay"
icon_template: mdi:solar-power
Hey guys. I’ve got a Sungrow 8K inverter and was pulling in data via MQTT using ‘meltaxa’s solariot script’, which I was able to use grafana for statistic, and HA templating to calculate net load and daily/month costs, and other useful stuff. This was working fine for a few months after I had everything installed, and then it just stopped working.
The python script just started returning ModbusIOException object has no attribute registers “sungrow”, and I’ve tried various other python scripts.
I’ve tried various modbus scanning tools, and I can confirm port 502 is still open. I can physically check on the inverter panel it is using (slave) id ‘1’.
I tried @drmcinnes node-red flow today to see what I might get. The error it returns is Error: Modbus exception 4: Slave device failure (device reports internal error) An unrecoverable error??
Any ideas or suggestions? Data is still being populated in the Sungrow isolarcloud portal. The only thing I can think of is a possible firmware update was push down to it, preventing TCP modbus interrogation.
Thanks in advance.