Commit ef5cf5b
fix: do not write a control that already holds the requested value (#384)
These registers live in EEPROM, which has finite write endurance. Nothing in the
integration writes on its own - a write happens only when async_set_native_value
is called - but there was no guard against a write that could not change
anything. An automation re-applying the same value on a schedule burned a cycle
every run.
Raised by a reporter whose contact repairs inverters and has seen four SPF6000ES
units with failed EEPROMs in a year. That is not attributable to anything here,
and the integration was already innocent of the thing he was worried about, but
there is no argument for spending write cycles on writes that are no-ops.
Gated on having a current reading. When the register has not been read yet the
comparison is meaningless and the write proceeds - a skipped write that should
have happened is a worse failure than a redundant one.
Tests assert the guard exists, that it requires a known current value, and - the
reassuring half of the answer given to the reporter - that neither coordinator.py
nor __init__.py performs any Modbus write at all. If polling ever starts writing,
that promise is void and the test says so.
1008 tests pass.
Co-Authored-By: Claude <noreply@anthropic.com>1 parent 0ecc4b4 commit ef5cf5b
3 files changed
Lines changed: 68 additions & 0 deletions
File tree
- custom_components/growatt_modbus
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
11 | 15 | | |
12 | 16 | | |
13 | 17 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
319 | 319 | | |
320 | 320 | | |
321 | 321 | | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
322 | 344 | | |
323 | 345 | | |
324 | 346 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
196 | 196 | | |
197 | 197 | | |
198 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
0 commit comments