Replies: 2 comments 11 replies
|
Quick follow-up on my own question — I went ahead and tested it. The good news: the Omnibattery Huawei driver works with the SUN2000-17K-MB0. Setup completed successfully, all telemetry comes through correctly (SOC, battery power, PV production per MPPT string, AC output, temperatures). The problem: my setup toggles between charging and discharging every few seconds when Omnibattery has active control over the LUNA2000. The root cause is that the SUN2000-17K-MB0 has a built-in power meter (Huawei DTSU666-H) directly at the grid connection point. The inverter uses this to regulate itself autonomously and in real time (Self-Use mode). When Omnibattery sends charge/discharge commands via Modbus at the same time, both controllers fight each other — resulting in rapid toggling. My current workaround: I enabled "Manual Battery Control" in Omnibattery for the Huawei entry, which stops Omnibattery from sending commands. The LUNA2000 then self-regulates again without toggling. I also reverted to the Huawei Solar Integration for telemetry, as it provides more detail. My question for the community / @sphings79: Does it make sense to include a Huawei system with a built-in power meter in Omnibattery at all? What would be the actual benefit compared to just leaving the Huawei to self-regulate and only controlling the Marstek batteries via Omnibattery? My current setup that works stably: Thanks for any insight! |
|
Thanks — that is two distinct bugs in one report, and the first one has a data-loss consequence. Both reproduce on my side, so neither needs guesswork. I have filed them: #494 and #495. The values are not readings. They are Huawei's "value not available" markers. The live block is decoded like this ( _BLOCK_LIVE = (37000, 5, "high", {
"inverter_state": (0, "u16", 1),
"battery_power": (1, "i32", 1),
"battery_voltage": (3, "u16", 0.1),
"battery_soc": (4, "u16", 0.1),
})SOC is an unsigned 16-bit register scaled by 0.1. Huawei's invalid marker for u16 is
Why they reach the control layer. The decode loop only discards a block that fails to read: regs = await self._client.async_read_holding_block(start, count)
if regs is None:
continue # keys omitted — correctA block that reads successfully and contains the marker is published verbatim. Downstream, the coordinator's only plausibility check is Worth noting that the guard already exists in the codebase, just on the other brand's path — That is also why your Marstek units sat idle. A SOC of 6553 % puts the Huawei far above every floor and cutoff, and a battery power of 2.1 GW poisons the derived house-consumption balance, which is computed from battery power, grid and solar. The allocator had no usable picture of the fleet for those two hours. The grid import was the consequence, not a second fault. One thing you should know before you upgrade: this is not fixed in 1.5.0. I checked against On the 12 % minimum — you are right, and it is a Marstek limit leaking into your Huawei. The entity comes from a class written for Marstek batteries that have no hardware cutoff registers ( class MarstekSoftSocLimitNumber(CoordinatorEntity, NumberEntity):
"""Software-enforced SOC limit for batteries that don't expose hardware
cutoff registers (v3/vA/vD)."""
...
self._attr_native_min_value = 1212 % is the Venus D's hardware floor. On my own installation the contradiction is visible directly: the Huawei's discharge cutoff entity reads 5.0, taken from the inverter, while its slider will not go below 12 — the displayed value is below the minimum the control offers. Looking into it turned up something wider that affects you too. The Huawei driver declares its own register ranges: _CHARGE_CUTOFF_RANGE = (90.0, 100.0) # register 47081
_DISCHARGE_CUTOFF_RANGE = (0.0, 20.0) # register 47082
Outside the driver's range the write is skipped, not clamped, and only logged at debug level. So if you ever set the discharge cutoff above 20 %, or the charge cutoff below 90 %, the entity shows your new value while the hardware backstop never moves — silently. Worth knowing before you go looking for a setting that appears to have no effect. Do we need anything more from you? No. Both fixes are determined by the code, and I would rather not have you chasing a 4 a.m. event again. One thing would still be useful if it is no trouble: the exact peak values rather than the rounded ones. If SOC tops out at precisely 6553.5, that closes the last gap between inference and proof — and it would tell us whether the trigger is the battery sleeping at its cutoff overnight, which decides whether dropping the value is enough or whether the driver should also report the battery as temporarily unavailable. That is a refinement, not a blocker. I will put up a pull request for both. |


Uh oh!
There was an error while loading. Please reload this page.
Hi,
I'm planning to migrate my Huawei setup from the Huawei Solar Integration to Omnibattery v1.4.0 using the new native Huawei SUN2000 + LUNA2000 driver.
My hardware:
Inverter: Huawei SUN2000-17K-MB0
Battery: Huawei LUNA2000, 10 kWh total
Already running: 2× Marstek Venus via Omnibattery (working great!)
The release notes mention the driver was validated on a SUN2000-8K-MAP0. My inverter is the MB0 series, which has a slightly different hardware revision.
My questions:
Is the SUN2000-17K-MB0 compatible with the Omnibattery Huawei driver?
Are there any known issues or register differences with the MB0 series compared to the MAP0?
Since the SUN2000 SDongle only allows one Modbus TCP connection, I plan to fully replace the Huawei Solar Integration with Omnibattery. Any caveats I should be aware of?
Thanks in advance!
All reactions