fan-control: simplify HA dashboard + Lock = freeze-current/algo-off [ci skip]

The dashboard-it Server → Fans view is now minimal: fan speed (% + RPM), an
Override % slider, and a Lock toggle. Lock now means "freeze the current speed,
algorithm off" — a new automation (r730_fan_lock_freeze_current_speed_resume_algo)
snapshots the live target % into Override and sets mode=manual on lock-ON, and
mode=auto on lock-OFF. The host daemon is unchanged (the toggle just drives the
mode it already reads). cool/quiet stay reachable via the entity but are off the
simplified view; the 60-min auto-revert is kept as a dormant safety net. Verified
live: lock ON → mode=manual + Override captured the live 60%; lock OFF → auto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Viktor Barzin 2026-06-05 13:27:46 +00:00
parent f9376a36ff
commit c059405632
2 changed files with 30 additions and 23 deletions

View file

@ -132,12 +132,15 @@ Delivered ahead of the cron migration (which is Vault-gated) by teaching the
`input_select.r730_fan_mode` (auto/cool/quiet/manual) +
`input_number.r730_fan_manual_pct`. `auto` = the garage-presence curve above;
cool/quiet force that curve; manual holds a fixed %; `CEILING` still overrides.
HA owns the setpoint + a 60-min auto-revert-to-auto automation
(`automation.r730_fan_mode_auto_revert`), which an `input_boolean.r730_fan_lock`
toggle can disable so a deliberate override persists (a "🔒 LOCKED" banner shows
on the view while engaged; the ceiling still wins, and the automation re-checks
the lock after the delay so locking mid-countdown cancels the revert) — the
daemon just polls and actuates.
The **simplified dashboard (2026-06-05)** exposes just three things — fan speed
(%/RPM), an **Override %** slider, and a **Lock** toggle. Lock = "freeze current
speed / algo off": `automation.r730_fan_lock_freeze_current_speed_resume_algo`
snapshots the live target % into Override and sets `mode=manual` on lock-ON, and
`mode=auto` on lock-OFF — the daemon needs no change, the toggle just drives the
mode. `cool`/`quiet` stay reachable via the entity but are off the dashboard. The
60-min `automation.r730_fan_mode_auto_revert` is retained as a dormant safety net
(manual now only happens while locked, which it skips). The daemon just polls and
actuates.
Monitoring + control live on the dashboard-it "Server" view (REST sensors: fan
RPM from the redfish exporter; mode/target-% from the Pushgateway). The same
logic already exists in the Python controller (`r730-fan-control/`) for the

View file

@ -12,24 +12,28 @@ CPU cool when the garage is empty, quiet when someone's in the garage. Design:
## HA control (Home Assistant)
The daemon polls two ha-sofia helpers each loop, so you can drive the fans from
HA — **dashboard-it → "Server" view → Fans**:
- `input_select.r730_fan_mode`**auto** (garage-presence curve, default),
**cool** / **quiet** (force that curve), **manual** (hold a fixed %).
- `input_number.r730_fan_manual_pct` — the % used in `manual` mode (slider).
- `input_boolean.r730_fan_lock`**lock** the current override so the 60-min
auto-revert leaves it alone (a 🔒 banner shows on the view while engaged).
Drive the fans from **dashboard-it → "Server" view → Fans**. The view is
deliberately minimal — it shows the current **fan speed** (% of capacity +
absolute RPM) and two controls:
Any non-`auto` override **auto-reverts to `auto` after 60 min**
(`automation.r730_fan_mode_auto_revert` on ha-sofia), so a forgotten override
can't run the fans wrong indefinitely — **unless you engage the Fan Lock**
(`input_boolean.r730_fan_lock`, toggle on the same view). While locked the
override persists indefinitely and a "🔒 FAN CONTROL LOCKED" banner appears on
the view so you remember to unlock; unlocking restarts the 60-min timer. The
automation re-checks the lock *after* the hour, so locking mid-countdown also
cancels the pending revert. `CEILING` (83 °C) still overrides everything → Dell
auto — **the lock does not defeat the ceiling**. An HA change is applied within
one daemon loop (~15 s).
- **Override %** (`input_number.r730_fan_manual_pct`) — the fixed fan % to hold.
- **Lock — freeze speed** (`input_boolean.r730_fan_lock`) — turn the algorithm
off and hold a fixed speed. Toggling it **ON** snapshots the *current*
commanded % into Override and switches the daemon to `manual`
(`automation.r730_fan_lock_freeze_current_speed_resume_algo`); toggling it
**OFF** switches back to `auto`, resuming the presence curve. Fine-tune the
held % with Override while locked. A 🔒 reminder appears on the view while
locked.
Under the hood the daemon still reads `input_select.r730_fan_mode`
(auto/cool/quiet/manual) + `input_number.r730_fan_manual_pct` each loop; the Lock
toggle just drives `mode` between `manual` (locked) and `auto` (unlocked).
`cool`/`quiet` remain valid modes if set directly (via the entity) but are no
longer surfaced on the simplified dashboard. `CEILING` (83 °C) still overrides
everything → Dell auto, **even when locked**. A stale non-`auto` mode left while
*unlocked* still auto-reverts to `auto` after 60 min
(`automation.r730_fan_mode_auto_revert`, now a dormant safety net). An HA change
is applied within one daemon loop (~15 s).
Monitoring sensors on the same view: `sensor.r730_fan_speed` (redfish exporter),
`sensor.r730_fan_control_target` + `sensor.r730_fan_control_mode` +