Hi,
I have a new install of FoxESS KH10 inverter with Solar, connected to my HA using USB to RS-485 adapter. I have installed modbus, and I can see the inverter on HA. However, I am unable to find the controls for limiting import and export. For e.g., currently the export prices are negative and my battery is full, I would like to stop export.
Appreciate any pointers.
Thanks
Sandeep
So when U say your export is - are U saying they are charging u to export ?
That's crazy, I'm sorry but I don't have any recommendations for you, but you would think there would be a setting to turn the inverter off once battery has reached 100% , my best advice would be offer all the neighbours extention leads & tell them to use the excess power.
Does the excess Solar occur at random times, or fixed?
If it is fixed times, can you not set an automation to force discharge beforehand for a few hours so the battery has capacity to mop up your Solar generation. To protect the discharge session from draining on a dull day, make sure to add in And-if "SoC" is above xx%
Example, If time is 09:00 to 11:00, and if SoC is above 50%, then set Work mode to discharge
I am new to Home Assistant, but I am sure that you can make it do something like this.
Sandeep,
You are on Amber like me. I am not sure this will work but can you adjust your grid export limit to zero while this occurs?
You are on Amber like me. I am not sure this will work but can you adjust your grid export limit to zero while this occurs?
Thank you Simon for your input, you are correct, if you are able to adjust this value in Modbus that would work for the best.simonsthill wrote: ↑Mon Jan 19, 2026 10:28 pm Sandeep,
You are on Amber like me. I am not sure this will work but can you adjust your grid export limit to zero while this occurs?
This is exactly what I wanted to do, but don't know how. Appreciate your inputs, thanks.simonsthill wrote: ↑Mon Jan 19, 2026 10:28 pm Sandeep,
You are on Amber like me. I am not sure this will work but can you adjust your grid export limit to zero while this occurs?
You can also use the service once you know the registers to set and reset the export limit.
I don't know the values as my solar is ac coupled and I already can do this with my old solar inverter. Fox is just battery for me.
There is also a read service too so you can go poking around and you can verify the values by changing in the app.
Code: Select all
foxess_modbus.write_registersI don't know the values as my solar is ac coupled and I already can do this with my old solar inverter. Fox is just battery for me.
There is also a read service too so you can go poking around and you can verify the values by changing in the app.
Thanks. I am aware of the write registers, but don't know the addresses. Also, is there a limit on number of writes?aliens9531 wrote: ↑Tue Feb 10, 2026 8:55 pm You can also use theservice once you know the registers to set and reset the export limit.Code: Select all
foxess_modbus.write_registers
I don't know the values as my solar is ac coupled and I already can do this with my old solar inverter. Fox is just battery for me.
There is also a read service too so you can go poking around and you can verify the values by changing in the app.
No limit on writes as far as a I know, Changing other modes settings in the home assistant addon does the same writes anyway.
Did you managed to get access to your inverter via modbus in HA? I'm trying to do the same thing now. Looks like I have the CT clamps installed via the ethernet port and a wifi adapter connected that gets me onto foxcloud, but I can't figure out how to get onto modbus.
Yes, I did. It turns out the boot lace terminals I was using didn't go deep enough into the plug. So it was simple in the end. I had to cut the red plastic bit off so the terminal could be fully inserted. Then I checked the continuity by putting a bit of wire in the end of the plug and checking back ot my modbus connection.
There was a lot of misleading evidence for me to think I actually did have a connection when I didn't. I got a voltage across the terminals which is weird because normally if it's not connected it is floating so I can't explain that at all.
Once I was hooked up it worked first go. Months of frustration sorted out by cutting down the boot lace and pushing the pins in further.
There was a lot of misleading evidence for me to think I actually did have a connection when I didn't. I got a voltage across the terminals which is weird because normally if it's not connected it is floating so I can't explain that at all.
Once I was hooked up it worked first go. Months of frustration sorted out by cutting down the boot lace and pushing the pins in further.
**贴到 foxesscommunity.com/viewtopic.php?t=2571 的回帖(论坛要登录,我发不了,请你复制粘贴)**
---
Here are the registers you're looking for. Tested on a **KH10** (Manager 1.64 / Master 1.69 / Slave 1.03, AUX RS485 → EW41, `rtu_over_tcp`, slave 247).
**Export limit is a u32 in watts at holding registers 46616 (high) / 46617 (low).** It's also mirrored at 41022 / 41023 — writing either pair works, and both change what the FoxESS cloud shows for the `ExportLimit` device setting.
Set it to zero with `foxess_modbus.write_registers`:
```yaml
service: foxess_modbus.write_registers
data:
start_address: 46616
values: "0,0" # high word, low word -> 0 W, no export
```
Restore your normal limit the same way — e.g. 5000 W is `"0,5000"`, and 15000 W is `"0,15000"`. Values above 65535 get clamped by the inverter.
**Proof it actually limits feed-in** — I set a 1000 W limit while PV was rising:
| | PV | load | feed-in | battery charge |
|---|---|---|---|---|
| +20s | 3.47 kW | 2.13 kW | **1.122 kW** | 0.166 kW |
| +40s | 4.09 kW | 2.08 kW | **1.117 kW** | 0.779 kW |
| +60s | 4.32 kW | 2.15 kW | **1.078 kW** | 0.982 kW |
PV rose 0.85 kW, feed-in stayed pinned at ~1.1 kW, and the surplus went into the battery instead.
**Two things that make this hard to find:**
1. `41019-43999` is listed in the integration's `invalid_register_ranges` for KH, so those registers never appear in a bulk read. You have to read addresses **one at a time**. I scanned in bulk twice and stopped at 41018, five addresses short of 41023.
2. 46616 reads `0` (it's the high word), so it's invisible if you only look at non-zero registers.
**Register 41012 is a red herring on this firmware** — it reads 100, only accepts 0–100, and changing it has no effect on feed-in at all. There's an open PR (nathanmarlor/foxess_modbus#934) that uses 41012; it works on the author's unit but not mine, so the semantics differ across firmware versions.
The method that found it, if you want to verify on your own inverter: note your current `ExportLimit` from the FoxESS cloud/app, read registers one by one and look for that exact value, then change the limit from the cloud and re-read to see which register follows.
---
Here are the registers you're looking for. Tested on a **KH10** (Manager 1.64 / Master 1.69 / Slave 1.03, AUX RS485 → EW41, `rtu_over_tcp`, slave 247).
**Export limit is a u32 in watts at holding registers 46616 (high) / 46617 (low).** It's also mirrored at 41022 / 41023 — writing either pair works, and both change what the FoxESS cloud shows for the `ExportLimit` device setting.
Set it to zero with `foxess_modbus.write_registers`:
```yaml
service: foxess_modbus.write_registers
data:
start_address: 46616
values: "0,0" # high word, low word -> 0 W, no export
```
Restore your normal limit the same way — e.g. 5000 W is `"0,5000"`, and 15000 W is `"0,15000"`. Values above 65535 get clamped by the inverter.
**Proof it actually limits feed-in** — I set a 1000 W limit while PV was rising:
| | PV | load | feed-in | battery charge |
|---|---|---|---|---|
| +20s | 3.47 kW | 2.13 kW | **1.122 kW** | 0.166 kW |
| +40s | 4.09 kW | 2.08 kW | **1.117 kW** | 0.779 kW |
| +60s | 4.32 kW | 2.15 kW | **1.078 kW** | 0.982 kW |
PV rose 0.85 kW, feed-in stayed pinned at ~1.1 kW, and the surplus went into the battery instead.
**Two things that make this hard to find:**
1. `41019-43999` is listed in the integration's `invalid_register_ranges` for KH, so those registers never appear in a bulk read. You have to read addresses **one at a time**. I scanned in bulk twice and stopped at 41018, five addresses short of 41023.
2. 46616 reads `0` (it's the high word), so it's invisible if you only look at non-zero registers.
**Register 41012 is a red herring on this firmware** — it reads 100, only accepts 0–100, and changing it has no effect on feed-in at all. There's an open PR (nathanmarlor/foxess_modbus#934) that uses 41012; it works on the author's unit but not mine, so the semantics differ across firmware versions.
The method that found it, if you want to verify on your own inverter: note your current `ExportLimit` from the FoxESS cloud/app, read registers one by one and look for that exact value, then change the limit from the cloud and re-read to see which register follows.