Add a heater_blower type driven by a flow5d heater #141

Merged
Claude merged 4 commits from feat/yaml-blower into feat/yaml-nodes 2026-10-17 19:46:33 +00:00
Collaborator

YN-23, reworked after review. Stacks on #140 (YN-21), so the diff also shows that PR's commits (and #139 and #137 under it) until they merge.

New output type heater_blower: the blower motor of a flow5d on the same node, a PWM LevelEndpoint of EndpointType::Fan with Failsafe::Autonomous, run by heater::BlowerControl. Fields are pin or pins, frequency (default 1000), heater (label of the flow5d, resolved on the same node only), threshold and optional disabled_modes. threshold is a coolant temperature in °C to one decimal place, or the label of a same-node setting of setting_type: temperature. It takes no binds, failsafe, invert or fade; the config leaves the fade at the library defaults, as the hand-written node does. For a literal threshold the generator declares an unregistered SettingEndpoint holding that value, since BlowerControl reads a setting. The control objects are declared after all the endpoints, so list order does not matter, and loop calls <name>Control.loop(ctrl::nowMs()) before node.loop().

BlowerControl moved from src/node_heater into its own library, lib/heater-blower (namespace heater:: as before, with a library.json depending on node-runtime), because it is specific to the heater and does not belong in the runtime. The hand-written heater node only changes its include from "blower_control.h" to <blower_control.h>, test_blower_control is unchanged, and the native env lists the library and its include path. No behaviour change.

Until YN-22 adds the measure bind, a generated heater's measured reading is Unknown, so the blower runs full in the PI branch (its cabin reading is not usable).

Schema regenerated (per-type frequency default, heater and threshold required, threshold as number or label). README gets the type row and a Heater blower section saying it must share the node with its heater. The heater fixture gains two blowers, one with a setting label and one with a literal, so CI compiles both.

Tested: Python 124 and native 639, none skipped locally. Tests cover the heater-label resolution and cross-node rejection, both threshold forms and their ranges, the rejected fields and the render; changing the failsafe fails them. All fixtures and pio run build.

YN-23, reworked after review. Stacks on #140 (YN-21), so the diff also shows that PR's commits (and #139 and #137 under it) until they merge. New output type `heater_blower`: the blower motor of a `flow5d` on the same node, a PWM `LevelEndpoint` of `EndpointType::Fan` with `Failsafe::Autonomous`, run by `heater::BlowerControl`. Fields are `pin` or `pins`, `frequency` (default 1000), `heater` (label of the flow5d, resolved on the same node only), `threshold` and optional `disabled_modes`. `threshold` is a coolant temperature in °C to one decimal place, or the label of a same-node `setting` of `setting_type: temperature`. It takes no `binds`, `failsafe`, `invert` or `fade`; the config leaves the fade at the library defaults, as the hand-written node does. For a literal threshold the generator declares an unregistered `SettingEndpoint` holding that value, since `BlowerControl` reads a setting. The control objects are declared after all the endpoints, so list order does not matter, and `loop` calls `<name>Control.loop(ctrl::nowMs())` before `node.loop()`. `BlowerControl` moved from `src/node_heater` into its own library, `lib/heater-blower` (namespace `heater::` as before, with a `library.json` depending on `node-runtime`), because it is specific to the heater and does not belong in the runtime. The hand-written heater node only changes its include from `"blower_control.h"` to `<blower_control.h>`, `test_blower_control` is unchanged, and the native env lists the library and its include path. No behaviour change. Until YN-22 adds the measure bind, a generated heater's measured reading is Unknown, so the blower runs full in the PI branch (its cabin reading is not usable). Schema regenerated (per-type `frequency` default, `heater` and `threshold` required, threshold as number or label). README gets the type row and a Heater blower section saying it must share the node with its heater. The heater fixture gains two blowers, one with a setting label and one with a literal, so CI compiles both. Tested: Python 124 and native 639, none skipped locally. Tests cover the heater-label resolution and cross-node rejection, both threshold forms and their ranges, the rejected fields and the render; changing the failsafe fails them. All fixtures and `pio run` build.
Make endpoint index optional with auto-increment
Some checks failed
Build and test / build (pull_request) Has been cancelled
Build and test / release (pull_request) Has been cancelled
a105a004cd
Rename next_index and restore the README wrapping
All checks were successful
Build and test / build (pull_request) Successful in 5m46s
Build and test / release (pull_request) Has been skipped
2448011705
Add temperature_setting and humidity types to YAML nodes
Some checks failed
Build and test / build (pull_request) Has been cancelled
Build and test / release (pull_request) Has been cancelled
117844c82a
List the climate checks in the schema description and wrap the README
Some checks failed
Build and test / release (pull_request) Has been cancelled
Build and test / build (pull_request) Successful in 6m49s
b6806810a9
Rewrap the settings paragraph
All checks were successful
Build and test / build (pull_request) Successful in 6m57s
Build and test / release (pull_request) Has been skipped
77e437053f
Add a flow5d type for the Autoterm Flow 5D heater
Some checks failed
Build and test / build (pull_request) Has been cancelled
Build and test / release (pull_request) Has been cancelled
d450f32169
Split the flow5d writer from its helpers and note the omitted arbiter
All checks were successful
Build and test / build (pull_request) Successful in 5m23s
Build and test / release (pull_request) Has been skipped
93f8be36cf
Report a wanted heat as the heater endpoint's on state
All checks were successful
Build and test / build (pull_request) Successful in 2m8s
Build and test / release (pull_request) Has been skipped
22aab89772
Add a heater_blower type driven by a flow5d heater
Some checks failed
Build and test / build (pull_request) Has been cancelled
Build and test / release (pull_request) Has been cancelled
f3cab85aca
Claude left a comment

nodes/README.md, Heater blower: it says the blower "follows a PI loop on the heater's setpoint and the cabin temperature". The generated cabin reading is always can::SensorScalar{} (status Unknown), so the loop never runs. The blower is only ever off or flat out. Say that plainly, or the PI sentence will mislead anyone configuring it.

nodes/README.md, Heater blower: it says the blower "follows a PI loop on the heater's setpoint and the cabin temperature". The generated cabin reading is always `can::SensorScalar{}` (status Unknown), so the loop never runs. The blower is only ever off or flat out. Say that plainly, or the PI sentence will mislead anyone configuring it.
Say the generated blower has no cabin temperature yet
All checks were successful
Build and test / build (pull_request) Successful in 6m58s
Build and test / release (pull_request) Has been skipped
1f2107d6ed
rob requested changes 2026-10-17 16:28:43 +00:00
Dismissed
@ -0,0 +1,97 @@
#pragma once
Owner

This file shouldn't be part of the runtime as it's hardware specific. Put it in its own library

This file shouldn't be part of the runtime as it's hardware specific. Put it in its own library
rob force-pushed feat/yaml-blower from 1f2107d6ed
All checks were successful
Build and test / build (pull_request) Successful in 6m58s
Build and test / release (pull_request) Has been skipped
to e00319f99d
Some checks failed
Build and test / build (pull_request) Has been cancelled
Build and test / release (pull_request) Has been cancelled
2026-10-17 16:48:36 +00:00
Compare
Claude left a comment

nodes/README.md, Heater blower section: "temperature_setting" is a stale name. Say a setting with setting_type: temperature. Also rewrap the paragraph; one line runs long after the last edit.

nodes/README.md, Heater blower section: "`temperature_setting`" is a stale name. Say a `setting` with `setting_type: temperature`. Also rewrap the paragraph; one line runs long after the last edit.
Name the temperature setting correctly in the blower README
All checks were successful
Build and test / build (pull_request) Successful in 5m24s
Build and test / release (pull_request) Has been skipped
66ef745b55
rob approved these changes 2026-10-17 19:40:37 +00:00
Claude merged commit 01592374ca into feat/yaml-nodes 2026-10-17 19:46:33 +00:00
Sign in to join this conversation.
No reviewers
rob
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
CamperCan/CampervanControlSystems!141
No description provided.