feat(heishamon): declare the heat curve offset as a control a host can render - #66
feat(heishamon): declare the heat curve offset as a control a host can render#66frahlg wants to merge 3 commits into
Conversation
…n render A controls entry in the DRIVER block names set_heat_curve_offset, labels it, and describes its one input: number, -3..+3, step 1, °C. FTW reads this and draws the row (srcfl/ftw#738). Before it, a control verified against hardware in June had no way to reach a person, and its author was told to write a Home Assistant automation instead. The bounds are the defaults. min_offset and max_offset narrow them in config and driver_command clamps to whichever is tighter, so a narrowed site stays safe — its UI just offers a step or two that land on the configured limit. The evidence is write_ack, not readback, because that is what the driver does: apply_offset returns as soon as the publish succeeds. The pump does echo the value on main/Z1_Heat_Request_Temp, but it arrives on a later poll and nothing waits for it or compares it. Declaring readback would tell a host the setting was confirmed when all we know is that a message left, and would suppress the line the host shows for exactly this case. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
|
Automated maintenance pass: not merging this one — flagging for a maintainer. The change itself is sound: it only declares the heat-curve-offset control in the But this is stacked on #60 → #59, and:
So the order to land this stack is: get hardware confirmation on #60's Generated by Claude Code |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ee0137e6af
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Automated maintenance pass: reviewed, looks sound, but not merging.
Not merging because this is stacked on #60, which is stacked on #59, and neither has landed:
Once #59 and #60 are in, this one should be quick to land on top. Generated by Claude Code |
miravoss26
left a comment
There was a problem hiding this comment.
Reviewed the diff. Metadata-only: declares set_heat_curve_offset as a controls entry in the DRIVER block so a host UI can render it, version 0.6.0 → 0.7.0. Stacked on #60 (→ #59).
evidence = write_ack(notreadback) is the honest call:apply_offsetreturns on publish success, and the pump's echo onZ1_Heat_Request_Temparrives a poll later with nothing waiting on it. Declaringreadbackwould claim a confirmation you don't actually have. Good.- bounds
-3..3are the defaults;driver_commandclamps to the tighter ofmin_offset/max_offset, so a narrowed site stays safe. Consistent. - manifest / index.yaml / support-status.json sha256 + size all move together; no Lua logic touched.
No secrets, no authz or network surface. Safe to merge from my read once the stack (#59, #60) lands and this rebases. Not in my merge allowlist, so a human takes the merge.
The step claimed the dispatched run made the required checks green. It does not, and this branch is the measurement: run 30804965042 put six successful check runs on the head of #67 -- drivers, packages, public-boundary, history-secret-scan, the channel preflight, and dco skipped -- and the pull request still reads BLOCKED with an empty status rollup, while #66, which got its run from a pull_request event, reads CLEAN with five. A commit whose only check suite came from a dispatch has no rollup for branch protection to read. The dispatch is still worth keeping: without it nothing runs against a bot's proposal at all, and a verdict a maintainer can read before spending attention on the diff is the whole ask. It just is not the thing that unblocks the merge, so neither the comment nor the pull request body says it is. Reopening the proposal is what starts the checks that count, and the body now says so where the maintainer will be standing when they need it. Signed-off-by: HuggeK <48095810+HuggeK@users.noreply.github.com> Co-authored-by: HuggeK <48095810+HuggeK@users.noreply.github.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
|
Updated the PR head to f4a08be.
I resolved the review thread. This PR remains held behind #60 and its live Heishamon topic check. |
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
miravoss26
left a comment
There was a problem hiding this comment.
Reviewed (Mira, automated pass).
Declares a controls entry for heishamon's heat-curve offset so FTW can render it, and threads that through tools/ftw_repository.py into the signed artifact. Version bump 0.6.0 → 0.7.0 propagated consistently across manifest/index/devices.yaml/support-status.json, with matching size_bytes/sha256.
evidence = "write_ack"is the right call, and the comment explaining why is good practice —apply_offsetreturns on publish, not on the pump's later MQTT echo. Declaringreadbackhere would be a false confirmation claim to the host UI.- Bounds vs config — declared −3…+3 are defaults;
min_offset/max_offsetnarrow in config anddriver_commandclamps to the tighter range, so a narrowed site stays safe. Confirmed this is documented, not just asserted. - New test (
test_a_control_driver_keeps_its_declared_controls_in_the_signed_identity) actually checks the signed identity block contains the controls fields — not just that build succeeds. - No secrets, no new deps, no new network destinations, no injection surface — this is Lua driver metadata + a Python codegen change.
- CI green (5/5 checks incl. history-secret-scan).
Safe to merge from my read.
Stacked on #60, which is stacked on #59. Completes the driver side of srcfl/ftw#520.
A
controlsentry in theDRIVERblock states what an operator may command, in terms a host UI can render without knowing this driver:FTW reads this (srcfl/ftw#738) and draws the control on the Heating card (srcfl/ftw#749). Before it, a control verified against hardware in June had no way to reach a person.
The evidence claim is
write_ack, deliberatelyapply_offsetreturns as soon ashost.mqtt_publishsucceeds. The pump does echo the value onmain/Z1_Heat_Request_Temp, but it arrives on a later poll and nothing waits for it or compares it.Declaring
readbackwould tell a host the setting was confirmed when all we know is that a message left — and it would suppress the "the pump does not confirm this setting" line the host renders for exactly this case. Making it a real readback means completing the command asynchronously against that echo, which is a change to the control path rather than a metadata edit.Bounds vs config
The declared −3…+3 are the defaults.
min_offset/max_offsetcan narrow them in config, anddriver_commandclamps to whichever is tighter, so a narrowed site stays safe — its UI just offers a step or two that land on the configured limit. Worth a look if you would rather the declaration not state a range the site can change.Verified
make checkgreen: 3148 passed, 1323 skippedParseCatalogFile, since itsDRIVERblock regex stops at the first closing brace in column 0 and a nested list is exactly what could break it. Result:id=heishamon version=0.7.0 caps=[heatpump], one control with all bounds intact.🤖 Generated with Claude Code