• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

enbility / spine-go / 33385929727
93%

Build:
DEFAULT BRANCH: dev
Ran 31 Aug 2026 11:14AM UTC
Jobs 1
Files 63
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

31 Aug 2026 11:12AM UTC coverage: 92.932% (+0.08%) from 92.851%
33385929727

push

github

web-flow
fix: do not drop announced data on partial updates (#104)

A partial update of `smartEnergyManagementPsData` loses announced data
in two ways: an entry whose key is unknown locally is dropped entirely,
and an entry that is known keeps only its `state` and `schedule`. Both
were found on the same device, a Vaillant aroTHERM plus running OHPCF,
and together they leave the CEM unable to control a heat pump that is
announcing everything correctly.

## 1. Unknown keys are dropped

```go
targetAlternative := s.findAlternativeByKey(result, alternativesId)
if targetAlternative == nil {
    // Alternative not found - could create new one, but for OHPCF we expect it to exist
    return
}
```

That assumption does not hold once the server withdraws its alternatives
(evcc-io/evcc#32146):

1. flexibility announced, `alternativesCount: 1`, sequence `state:
inactive`
2. CEM schedules it, sequence runs, then partial notify `state:
completed`
3. **non-partial** notify `nodeScheduleInformation{alternativesCount:
0}` without an `alternatives` element - full replacement clears the
stored alternatives
4. hours later a **partial** notify announces a new flexibility
(`alternativesCount: 1`, `state: inactive`)

In step 4 only `nodeScheduleInformation` is merged: `alternativesCount`
goes back to 1 while `alternatives` stays empty.
`ohpcf.isDataAvailable()` requires exactly one alternative, so
`PowerConsumptionProcessState()` reports `Stopped` and the CEM never
schedules the new sequence - permanently, until the device reconnects.

The same early return exists at all four levels of the structure, so an
announced sequence, time slot or time slot value is dropped as well. All
of them now add the announced entry instead of ignoring it, while remote
writes keep the previous behaviour, since a client may only update
existing entries, never create them.

This matches the generic list merge in `Merge()`, which already appends
unmatched entries and restricts that to local updates:

```... (continued)

67 of 81 new or added lines in 1 file covered. (82.72%)

6259 of 6735 relevant lines covered (92.93%)

25188.73 hits per line

Uncovered Changes

Lines Coverage ∆ File
14
84.5
2.28% model/smartenergymanagementps_additions.go
Jobs
ID Job ID Ran Files Coverage
1 33385929727.1 31 Aug 2026 11:14AM UTC 63
92.93
GitHub Action Run
Source Files on build 33385929727
  • Tree
  • List 63
  • Changed 1
  • Source Changed 1
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #33385929727
  • f061145f on github
  • Prev Build on dev (#30638341656)
  • Next Build on dev (#33386485123)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc