[APP][Pro] Connect Solar Goodwe Inverter to Homey

hi @Michal_Stranik I’ve installed it but in the create flow interface I’m not seeing a Then card option yet. The goodwe app simply isn’t available in the set of available ‘Then’ cards. Am I overlooking something?

I have a GoodWe 5000D-NS currently connected through the cloud, but I would like to control the inverter locally. When a try to add the inverter via Modbus, it doesn’t show any values. Is it possible to add this type of inverter via Modbus?

Hi there,

Yes, it is technically possible to communicate with the GoodWe DNS series (including the 5000D-NS) via Modbus, but it has a few specific hardware quirks.

However, to be completely transparent: I don’t own this specific inverter hardware myself, which makes developing and blind-testing custom Modbus register mappings incredibly difficult and time-consuming. In the past, I have spent countless hours coding features like this for the community, only to find that people are generally not willing to donate even a single coffee for the effort.

Because I get absolutely nothing in reward for spending my free time on this, I am not willing to waste days of work on something that might only end up serving one or two people.

If there is actual, widespread interest in getting local control for these older solar-only inverters, I might consider looking into it—but I need to see a real demand first.

M.

I also have a 5000 dns which I want to add local via modbus. So thats already 2 :wink:

I will buy you a few coffee, if you can get it working.

I understand your point of view. If you decide to get the Modbus working on this specific type of inverter, it would be nice :slight_smile: . If I can assist you in any way, or by testing etc. I’m open for this.

Can you do some tests before I do that? We must be sure that your inverters are possible to read.

Test 1: The “SolarGo” App Check (No Computer Required)

This is the easiest test you can put in your documentation. GoodWe uses two completely different communication architectures for their local configuration apps.

Instructions for your users:

  1. Connect your smartphone directly to the local home Wi-Fi network that the inverter is on.

  2. Download and open the official SolarGo app (not the SEMS+ app).

  3. Try to locate and connect to your inverter over the local network.

The Rule: If the SolarGo app successfully connects, reads data, and shows live values over local Wi-Fi, the inverter is 100% capable of local communication. If it only works via Bluetooth or fails completely, local network communication is locked.

Test 2: The Quick Port Connectivity Check

Many users think their inverter is broken when in reality their home router is isolating Wi-Fi devices, or the inverter’s internal port is completely shut down. They can test this using a terminal command.

Depending on their operating system, they can open a terminal/command prompt and run a quick test against the inverter’s local IP on UDP port 8899 or TCP port 502.

For Windows Users (PowerShell):

PowerShell

# Testing the classic GoodWe Wi-Fi UDP port
Test-NetConnection -ComputerName YOUR_INVERTER_IP -Port 8899

# Testing the standard Modbus TCP port (used by newer LAN/Wi-Fi kit v2 dongles)
Test-NetConnection -ComputerName YOUR_INVERTER_IP -Port 502

For Mac / Linux Users (Terminal):

Bash

# Check if the ports are listening
nc -zv YOUR_INVERTER_IP 502
nc -zuv YOUR_INVERTER_IP 8899

I’m able to access the Inverter via de SolarGo App, read the values and adjust some parameters. I already searched at the Communication Options if I can activate Modbus, but there is no option for this.

I also already tested this, but port 8899 and 502 are not listening. Only port 80 was open to ‘talk’.

Another (maybe off-topic) comment, my inverter has 2 IP-adressess. 1 for the WiFi connection and 1 for the ethernet connection.

Thank you so much for this detailed feedback! This is extremely helpful and tells us exactly what is going on with your hardware.

Because your inverter shows two separate IP addresses and only responds on Port 80, you have the newer GoodWe Wi-Fi/LAN Kit module. On this specific hardware generation, GoodWe intentionally disables the Modbus configuration options out of box for security reasons. This is why ports 502 and 8899 are showing up as closed.

To unlock them, you just need to access the hidden engineer menu in the SolarGo app. Here is how to do it:

How to Activate Modbus TCP via SolarGo

**1.Log in as an Installer:**Use default credentials.

Disconnect from the inverter in SolarGo and log back in. This time, do not log in as an “Owner”. Select the Installer role instead. Use the default initial password: 1234.

**2.Locate the hidden toggle:**Location depends on your dongle version.

Go to the Settings menu at the bottom of the main page. Look for the configuration toggle using one of these two paths:

  • Path A (Regular Dongles): Go to Communication SettingsRS485 and toggle Enable Modbus TCP.
  • Path B (Cybersecurity Firmware): Go to Privacy & Security and toggle Enable Modbus TCP.

**3.Configure the Modbus port:**Apply default values.

Once enabled, set the following parameters: Device ID: 1, Port: 502, and Baud rate: 9600. Save the changes.

:light_bulb: Which IP address should you use in Homey?

Once Modbus is turned on, configure the Homey Modbus driver using the Ethernet/LAN IP address rather than the Wi-Fi IP address. Running Modbus traffic over a physical network cable is much more stable and prevents the inverter’s wireless chip from dropping offline when queried frequently!

Give this a shot, and run the port check again to see if Port 502 opens up!

@Michal_Stranik hi Michal, I have added two inverters for my two strings of solar panels. Regularly one or both of my inverters aren’t found. Sometimes they alternate in becoming unavailable as you can see in the screenshots (that were taken only 3 minutes after each other).

Can you please see why?

FYI, I have added them by going twice through the “add device” flow in Homey while typing 1 in the inverter ID field first time and 2 in the inverter ID field second time. Of course the login credentials are correct otherwise I wouldn’t have been able to successfully add them in the first place.

Log ID: d28d13b5-6b63-452e-b25c-69cf5c58 e444

and

e34079f9-6388-4e72-a9b4-727f480bb3e5

Thank you from the support! I tried your suggestion, but unfortunately the settings in the SolarGo app seem different.

  • In Privacy & Security: only option to change the password of the WLAN module
  • In Communication settings → RS485: option to select protocol (GOODWE or Sunspec) and COM Address.

No direct option to turn on the Modbus. Any further ideas?

hi @Michal_Stranik Any chance you can check what’s happening here, since not having both Goodwe inverters available has quite some impact on the Smart Charging app which uses the inverters power generation to schedule my battery loading.
Your help would be highly appreciated! :folded_hands:

1fd0212e-61c7-4da3-b216-7b6bb8865ed8

Since 4 days now i have no connection anymore with my phylontech Force H2 that is connected with my goodwe inverter. The connection is with modbus, I can see the inverter and that is orking fine but everything from my battery is gone.

Sorry, but I am not able provide step-by-step support to all.
I would suggest contact install company or ask AI to help you with that.

Please try new version and let me know:

The GoodWe Modbus Battery gives no data, see below. Can this be fixed?

Depends, what version of app do you have? Is it working in this one?

Yes it is. Thanks

Hi Michal,

My battery has shown no data since update 1.3.18. I’ve tried the beta 1.3.21 but still no luck. On the battery tab I get the following error message:

Summary

TypeError: Cannot read property ‘id’ of undefined

Component stack:
at DeviceBatteryIndicator (address at index.android.bundle:1:7636010)
at DeviceGeneratedControl (address at index.android.bundle:1:5061919)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at SceneView (address at index.android.bundle:1:4859740)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at RNCViewPager ()
at PagerView (address at index.android.bundle:1:7538254)
at Animated(Anonymous) (address at index.android.bundle:1:5686007)
at PagerViewAdapter (address at index.android.bundle:1:4858040)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at TabView (address at index.android.bundle:1:4857284)
at Carousel (address at index.android.bundle:1:5080943)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at DeviceControlsView (address at index.android.bundle:1:7630358)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at anonymous (address at index.android.bundle:1:4348009)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at DeviceScene (address at index.android.bundle:1:5053201)
at withNavigation(DeviceScene) (address at index.android.bundle:1:7148575)
at ThemeProvider (address at index.android.bundle:1:3155199)
at WithThemeDarkComponent ()
at SurfacePortalProvider (address at index.android.bundle:1:3778475)
at SurfacePortalBoundary (address at index.android.bundle:1:3778617)
at SurfacePortalHostWrapper (address at index.android.bundle:1:6545333)
at StaticContainer (address at index.android.bundle:1:3207248)
at EnsureSingleNavigator (address at index.android.bundle:1:3182433)
at SceneView (address at index.android.bundle:1:3206319)
at NavigationProvider (address at index.android.bundle:1:3182822)
at RNSScreenContentWrapper ()
at ScreenContentWrapper ()
at DebugContainer (address at index.android.bundle:1:3788083)
at RNSScreen ()
at Animated(Anonymous) (address at index.android.bundle:1:5686007)
at Suspender (address at index.android.bundle:1:3784803)
at Suspense ()
at Freeze (address at index.android.bundle:1:3784869)
at DelayedFreeze (address at index.android.bundle:1:3784634)
at InnerScreen (address at index.android.bundle:1:3782910)
at anonymous (address at index.android.bundle:1:3784549)
at ScreenStackItem (address at index.android.bundle:1:3787101)
at NavigationProvider (address at index.android.bundle:1:3182822)
at SceneView (address at index.android.bundle:1:4478367)
at RNSScreenStack ()
at anonymous (address at index.android.bundle:1:3787073)
at ScreenStack (address at index.android.bundle:1:3786441)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at FrameSizeProvider (address at index.android.bundle:1:4452347)
at SafeAreaProviderCompat (address at index.android.bundle:1:4456770)
at NativeStackView (address at index.android.bundle:1:4478071)
at PreventRemoveProvider (address at index.android.bundle:1:3183329)
at NavigationStateListenerProvider (address at index.android.bundle:1:3207720)
at NavigationContent (address at index.android.bundle:1:3207575)
at anonymous (address at index.android.bundle:1:6163551)
at NativeStackNavigator (address at index.android.bundle:1:4483921)
at NavigatorRoot (address at index.android.bundle:1:4426461)
at ThemeProvider (address at index.android.bundle:1:3182529)
at EnsureSingleNavigator (address at index.android.bundle:1:3182433)
at BaseNavigationContainer (address at index.android.bundle:1:3175841)
at NavigationContainerInner (address at index.android.bundle:1:3208692)
at AppNavigationContainer (address at index.android.bundle:1:4403461)
at SurfacePortalProvider (address at index.android.bundle:1:3778475)
at ThemeProvider (address at index.android.bundle:1:3155199)
at Provider (address at index.android.bundle:1:3166156)
at RNGestureHandlerRootView ()
at GestureHandlerRootView (address at index.android.bundle:1:2862696)
at RNCSafeAreaProvider ()
at SafeAreaProvider (address at index.android.bundle:1:3167937)
at ErrorBoundary (address at index.android.bundle:1:6218663)
at App (address at index.android.bundle:1:4401092)
at RCTView ()
at View_withRef (address at index.android.bundle:1:2468494)
at AppContainer (address at index.android.bundle:1:2616872)

Stack trace:
TypeError: Cannot read property ‘id’ of undefined
at render (address at index.android.bundle:1:7636510)
at finishClassComponent (address at index.android.bundle:1:2523610)
at updateClassComponent (address at index.android.bundle:1:2523395)
at beginWork (address at index.android.bundle:1:2535017)
at workLoopSync (address at index.android.bundle:1:2552244)
at renderRootSync (address at index.android.bundle:1:2552079)
at performWorkOnRoot (address at index.android.bundle:1:2548963)
at flushSyncWorkAcrossRoots_impl (address at index.android.bundle:1:2497318)
at processRootScheduleInMicrotask (address at index.android.bundle:1:2497713)
at anonymous (address at index.android.bundle:1:5578613)

Any help would be appreciated

Apologies, just figured out the solution. I had to delete the old battery and add a new device. Now it is working.

Question: are there any plans to add the Goodwe EV charger to the devices?

Many thanks for the great app and support