Skip to content

fix(myuplink): file the heat pump as a heat pump - #63

Merged
HuggeK merged 2 commits into
srcfl:mainfrom
HuggeK:fix/myuplink-heatpump-der
Jul 31, 2026
Merged

fix(myuplink): file the heat pump as a heat pump#63
HuggeK merged 2 commits into
srcfl:mainfrom
HuggeK:fix/myuplink-heatpump-der

Conversation

@HuggeK

@HuggeK HuggeK commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

myuplink declared ders: [], so the one MyUplink cloud heat-pump driver was
filed under no device type at all — absent from the Heat pump filter and
from every other one on the catalog page.
An owner searches for the device they own, and this driver could not be found
that way.

emits via host.emit calls ders before ders after
heishamon emit_metric 0 [heatpump] [heatpump]
nibe_local emit_metric 0 [heatpump] (#53) [heatpump]
myuplink emit_metric 0 [] [heatpump]

All three heat pumps now appear under Heat pump, and no driver in the
catalog is filed under nothing.

Important

This revisits a deliberate decision, so it deserves an explicit look rather
than a rubber stamp.

Why reversing #27's choice is the consistent move, not a new one

When #27 widened the DER vocabulary it set myuplink to none, on the reading
that ders names the emit stream a driver produces rather than the device it
covers — the driver reports through host.emit_metric and never calls
host.emit("heatpump", …).

#53 then settled the same question the other way for nibe_local, citing
heishamon as the precedent. The three drivers are the same case: all report a
pump through emit_metric only, none calls host.emit, and myuplink and
heishamon emit the same hp_* metric names. Two of the three already declared
heatpump, so myuplink was the one left behind rather than the one holding a
line.

If the opposite reading is preferred, the consistent form of it would be to
strip heatpump from heishamon and nibe_local too — which would remove the
Heat pump filter from the page entirely.

Why the version has to move — and how we know before merging

ders is copied into the signed artifact's capabilities, so this edit changes
the published bytes even though no Lua moved. That is exactly what took the
release down in #53.

This time the channel never got the chance to refuse it. The
signed channel accepts this tree check (#57) answers on the pull request, and
running it locally against the published manifest gives:

[the tree as committed: ders [heatpump], version 1.1.1]
  PASS -> {"added": [], "changed": ["myuplink"], "drivers": 80}

[the same ders change with the version put back to 1.1.0]
  REFUSED -> myuplink: changed artifact needs a higher version than 1.1.0 (published)
             -- make bump-driver ID=myuplink LEVEL=patch

A patch: no register, parameter or emitted metric changed, only the device
type the catalog files it under — the same call #53/#55 made for nibe_local.
The DRIVER table is left alone, keeping the driver byte-identical to its FTW
baseline the way #29 established.

The spec gap that allowed this

spec/manifest-v2.md documented four DER types — pv, battery, meter,
v2x_charger — where tools/validate_manifest.py accepts seven. ev,
heatpump and vehicle have been valid since #27 and are used by seven
manifests, but the field table a driver author reads never listed them. The
missing vocabulary is precisely what myuplink needed.

The table is now complete, and says what the field means for a metrics-only
driver — the ambiguity that produced three different answers for three drivers
doing the same thing. It also records that ders reaches the signed artifact,
so changing it costs a version.

Catalogs regenerated; sha256 and the Lua source are untouched.

🤖 Generated with Claude Code

myuplink declared ders: [], so the one MyUplink cloud heat-pump driver
was absent from the Heat pump filter and from every other device type on
the catalog page -- unreachable by the thing an owner actually searches
for. It is now ders: [heatpump].

This revisits a deliberate choice. srcfl#27 widened the DER vocabulary and set
myuplink to none, reading ders as the emit stream a driver produces
rather than the device it covers. srcfl#53 settled it the other way for
nibe_local, citing heishamon. All three report a pump through
host.emit_metric and never call host.emit; myuplink and heishamon emit
the same hp_* metric names. Two of the three already declared heatpump,
so myuplink was the one left behind rather than the one holding a line.

1.1.0 -> 1.1.1 because ders is copied into the signed artifact's
capabilities, so this changes the published bytes with no Lua moved --
the same reason nibe_local took 1.1.1. Unlike srcfl#53 the channel never got
the chance to refuse it: the preflight check answers on the pull request,
and putting the version back to 1.1.0 there reproduces the refusal.

spec/manifest-v2.md documented four DER types where validate_manifest.py
accepts seven. ev, heatpump and vehicle have been valid since srcfl#27 and are
used by seven manifests, but the field table a driver author reads never
listed them -- and the missing vocabulary is exactly what myuplink
needed. The table is now complete and says what the field means for a
metrics-only driver, which is the ambiguity that produced three different
answers for three drivers doing the same thing.

Signed-off-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
Co-authored-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
@HuggeK
HuggeK marked this pull request as ready for review July 31, 2026 10:26
srcfl#62 landed the catalog page's vendor-document section on main. Both
branches wrote to CHANGELOG.md and git merged them without conflict; this
also closes a stray blank line inside the Fixed list.

The two changes meet here for the first time, so both were checked
together: myuplink's card now carries the Heat pump badge and its vendor
document link, the generators reproduce every catalog file unchanged, and
the channel still reports myuplink as the one driver whose bytes moved.

Signed-off-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
Co-authored-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
@HuggeK
HuggeK merged commit f4ba689 into srcfl:main Jul 31, 2026
6 checks passed
HuggeK added a commit to HuggeK/device-drivers that referenced this pull request Jul 31, 2026
This branch was cut before srcfl#48, srcfl#57, srcfl#62 and srcfl#63 landed. Five files
conflicted; all five were additions on both sides and keep both:

  CHANGELOG.md          both wrote under the same ### Added heading
  spec/manifest-v2.md   Connectivity/Setup beside main's DER Types, and
                        the numbered validation list renumbered so the
                        upstream_docs rule survives
  manifests/myuplink.yaml  connectivity/setup from here, ders [heatpump]
                        and 1.1.1 from srcfl#63 -- the empty ders this branch
                        was written against no longer exists
  tools/generate_site.py   Reach labels beside the vendor-document labels
  index.yaml            regenerated rather than hand-merged

Also records V2.4 in the migration ledger. The branch adds two manifest
fields and updated the field table and validation rules, but never
recorded the version the way V2.3 did for upstream_docs.

The claim that neither field reaches the signed artifact is checked
rather than trusted: with all 80 manifests carrying connectivity,
stripping both fields back out moves no artifact digest, so no driver
needs a version bump.

Signed-off-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
Co-authored-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants