SMA NaN check for values at night - #3675
Conversation
There was a problem hiding this comment.
Pull request overview
Fixes SMA Sunny Boy night-standby behavior where the inverter reports sentinel “NaN” values (e.g., -0x80000000) that previously triggered the peak filter and put the module into an error state (Issue #3674).
Changes:
- Extend SMA “NaN” sentinel constants (INT16/INT32/UINT32/UINT64).
- Treat sentinel “NaN” power readings as
0at night (and reset related values) to avoid peak filter errors. - Broaden the “NaN” detection for energy counters to include additional sentinel representations.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@ndrsnhs kannst du dir das mal ansehen? |
|
Copilot kritisiert, dass hier eine Überfilterung stattfindet. In der Realität können die NaN Schranken aber nicht erreicht werden. |
Ich sehe das anders. Bei einem UINT_64 sind die anderen beiden NaN Werte durchaus gültige Zahlen. Das Problem ist, dass der Registertyp nicht mit beachtet wird. |
|
Vorschlag ich setz je nach Inverter typ auf einen nan Wert und mach den Vergleich anschließend, so könnte man das umgehen? Also so: ` def update(self) -> None: |
|
Vom Prinzip passt die Prüfung jetzt. Rein von der Struktur hast Du zwei Varianten umgesetzt.
Das macht den Code für mich relativ schwer lesbar und verschleiert ggf. Probleme, wenn bei der Zuweisung von Ungetesteter Pseudocode: def check_nan(value, nan_value, default_value):
if value == nan_value:
return default_value, True
return value, False
power_total, power_is_nan = check_nan(self.tcp_client.read_holding_registers(30775, ModbusDataType.INT_32, unit=unit), self.SMA_INT32_NAN, 0)
if not power_is_nan: # oder weglassen, wenn `default_value` auch mit `-1` multipliziert werden kann
power_total = power_total * -1 |
|
Danke für den Vorschlag Lutz, ich habs mal so umgebaut, bei mir läuft das so in meinem Testsystem mit nem SMA String WR. So ist es auch besser lesbar, der Vorschlag von mir war echt auch schlecht lesbar. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
packages/modules/devices/sma/sma_sunny_boy/inverter.py:96
- Im
core2-Zweig wirdenergyauch dann skaliert (*= 100), wennenergy_is_nanTrue ist. Dadurch geht der (laut Kommentar gewünschte) rohe SMA-Sentinel-Wert in der Fehlermeldung verloren und der angezeigte Wert wird künstlich verändert. Skalierung daher nur anwenden, wenn kein NaN erkannt wurde.
energy, energy_is_nan = self.check_nan(
self.tcp_client.read_holding_registers(40094, ModbusDataType.UINT_32, unit=unit),
self.SMA_UINT32_NAN, self.SMA_UINT32_NAN)
energy *= 100
packages/modules/devices/sma/sma_sunny_boy/inverter.py:40
- Die Rückgabetyp-Annotation ist als String geschrieben (
"tuple[int, bool]"). Im Codebase werden die Built-in-Generics ohne Quotes verwendet (z.B.packages/modules/common/utils/peak_filter.py:24). Ohne Quotes ist die Annotation konsistenter und besser für Type-Checker/Refactoring.
def check_nan(value: int, nan_value: int, default_value: int = 0) -> "tuple[int, bool]":
Added comments explaining the SMA sentinel values and their handling in Modbus.
Fix for #3674