b4dcf4b373
gates / gates (push) Successful in 6m35s
plugswitch.py refuses 'off' unless 20 s of readings show the N100 is already off (standby + 1 W, no ping); 7 tests, each check red-proofed. By hand: guest shutdown 12 s, host off, 0.0 W; the hub stayed silent and 'ONLINE' for 18 min; plug off/on did not start the N100, its power button did (dashboard in 42 s). Wall figures into SIZING.md 4 and sizing.json power (8.5 / 20.7 / 0.0 W).
35 lines
3.6 KiB
Markdown
35 lines
3.6 KiB
Markdown
# Turning a Felhom machine off — Part A spike on the N100, 2026-10-13
|
||
|
||
By hand, no product change. Bench: N100 `demo-felhom` (host `felhom-pve`, guest 9201), on the Tuya meter plug
|
||
(`scripts/bench/plugmeter.py`, 2 s). Times are UTC. No key, device id or token here; the household's e-mail address in
|
||
the hub page captures is replaced by `<household e-mail>`.
|
||
|
||
## Results
|
||
|
||
| Step | What happened | File |
|
||
|---|---|---|
|
||
| A0 `plugswitch.py` | `off` refused while the N100 ran: „no standby_w" and „the machine answered a ping" (rc 2). First live `off` refused „only 16 s of readings" — slow plug reads shortened the window (a tool bug, fixed: read until the readings span 20 s); the second was allowed: 5 readings over 22 s at 0.0 W, no ping | `A4-plug.log` |
|
||
| A1 at rest | 10 min, 212 rows: **8.46 W mean, 7.2 W median**, sd 2.76, 6.3–19.1 W | `A1-rest.csv` |
|
||
| A1 at work | Immich deployed through the product (deploy 202 → running in 98 s), 200 photos uploaded (200/0), every job queue empty after 442 s: **20.7 W mean, 24.0 W busiest 60 s, 25.2 W max**. Removed through the product: stop 200, remove 200, no leftovers; photo set and bench folder deleted | `A1-work*.{csv,json,txt,log}` |
|
||
| A2 checks | no active Proxmox task, no backup/restore/update/swap line in the controller log for 20 min | `A2-before.txt` |
|
||
| A2 guest | `pct shutdown 9201 --timeout 120` at 16:43:35 → stopped, **12.3 s**, rc 0 | `A2-steps.log` |
|
||
| A2 host | `systemctl poweroff` at 16:43:53 → no ping 16:44:06 (13 s) → plug **0.0 W** from 16:44:15 | `A2-A4-power.csv` |
|
||
| A2 standby | **0.0 W** for 18 min, 254 readings (below the plug's 0.1 W step) | `A2-A4-power.csv` |
|
||
| A3 hub | 18 min after power-off: hosts page still **ONLINE**, cloudflared „running (connected)" (the last report), „Last Report 18 min ago", box connection „last connected 16:45 (16 min ago)". **No event, no notification** — the customer's last-10 list unchanged. Operator mailbox (a second channel): no mail for demo-felhom after 13:58; the 13:58 `host_crash_restart` mail shows the channel delivers | `A3-hub-*` |
|
||
| A3 stays off | no ping, 0.0 W for the whole 18 min | `A2-A4-power.csv` |
|
||
| A4 plug off/on | plug off 17:04:17, on 17:04:27. **The N100 did NOT start** (operator: no monitor at hand, BIOS not read) | `A4-plug.log` |
|
||
| A4 power button | operator pressed it: first watts 17:06:03 → ping 17:06:33 (30 s) → **dashboard 200 at 17:06:45 (42 s)**; boot peak 20.4 W | `A4-boot-*` |
|
||
| A4 after | crash guard `last_boot_unclean: false`; guest running, `onboot: 1`, mounts as before; the same 5 containers healthy; scheduler started with 22 jobs. Hub: report 2 min later, no event (no crash, nothing to recover) | `A4-after.txt` |
|
||
|
||
## What this means
|
||
|
||
- A clean guest shutdown + host power-off on command works, and costs nothing at the plug.
|
||
- **Today the hub does not notice a machine that is off for 18 minutes.** Code (05 §4, `hub.yaml` 45 m): `host_stale` at
|
||
45 min, `host_down` at 90 min; the controller checker `node_stale`/`node_down` too; and every morning at 05:00 the
|
||
`expected_backup_missed` / `expected_dbdump_missed` pair — the operator's mailbox shows exactly this pair for Tester 2,
|
||
which is off (2026-10-13 05:00).
|
||
- **Plug off/on did not start the N100**, but at 13:42 the same day it DID restart by itself after an unplanned power cut
|
||
(hub `host_crash_restart`). Consistent with the BIOS „after power loss = last state": a machine that was off stays off.
|
||
Not read in the BIOS (no monitor) — an inference. That is the behaviour the household text promises („press the power
|
||
button"), so the spike passes for the button; the plug cannot restart a deliberately-off N100 on the bench.
|