feat(heishamon): declare the heat curve offset as a control a host can render - #66
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".
| -- main/Z1_Heat_Request_Temp, but that arrives on a later poll and nothing | ||
| -- here waits for it or compares it. Claiming readback would tell a host | ||
| -- the setting was confirmed when all we know is that a message left. | ||
| controls = { |
There was a problem hiding this comment.
Preserve the control metadata in the signed artifact
When this driver is installed from the signed FTW channel, .github/workflows/ftw-drivers-release.yml builds it through _ftw_artifact, but tools/ftw_repository.py:251-273 reconstructs __sourceful_ftw_metadata without controls, and line 327 reassigns DRIVER to that reduced table after loading the source. Consequently the published artifact's final driver metadata has no declared control, so the host cannot render the new row even though the catalog source has it; propagate this field into the generated metadata and cover the signed artifact in a test.
AGENTS.md reference: AGENTS.md:L25-L26
Useful? React with 👍 / 👎.
|
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 |
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