Commit Graph
77 Commits
Author SHA1 Message Date
mrcharles 239e449d45 feat(validate): post-deploy validation on every HA start [#778]
ci / lint (push) Successful in 41s
Missing/stale criticals after restart page with specifics instead of
waiting for humans; watchdog handles recovery; revert procedure
documented for repeat failures.
2026-09-04 16:23:53 -05:00
mrcharles 601c70ec5e fix(alerts): iOS data.url only — clickAction rejected by apns schema [#344 #778]
ci / lint (push) Successful in 46s
Watchdog notify crash root-caused: iOS companion schema rejects
data.clickAction; url is the iOS deep-link key. Suite updated to
assert url presence per alert.
https://projects.knownelement.com/issues/778
2026-09-04 16:11:31 -05:00
mrcharles 13b0976ad6 fix(doorman): unlock dispatch via shell_command — rest_command absent [#345 #355]
ci / lint (push) Successful in 47s
rest_command integration silently fails to register on this box
(404 services, valid config+secret; root-cause pending #741).
shell_command curl is the working mechanism; arm-switch gate unchanged.
https://projects.knownelement.com/issues/355
2026-09-04 16:01:40 -05:00
mrcharles 8f48730a40 fix(dash): tripp lite runtime entity id (tripp_lite slug) [#784]
ci / lint (push) Successful in 58s
2026-09-04 15:06:36 -05:00
mrcharles c23d256ced feat(dash): dashboard series v2 — Ops Overview, Power, Thermal [#784 #344]
ci / lint (push) Successful in 35s
Role-based rework per founder: overview + detail dashboards. UPS
parity (Tripp Lite runtime-minutes template). Phase 1 of the ground-up
rework; Capacity/Access views land with fans + lock.
https://projects.knownelement.com/issues/784
2026-09-04 14:49:14 -05:00
mrcharles 45024f80c3 feat(sdlc): regression test suite in CI + watchdog covers deploy sensor [#778 #789]
ci / lint (push) Successful in 38s
tests/test_sdlc.sh: alert-twin presence, per-alert deep-link check,
watchdog coverage, ghost-entity + secret guards. Runs as a CI step.
https://projects.knownelement.com/issues/778
2026-09-04 14:27:51 -05:00
mrcharles 403f83a187 fix(deploy): sha-watch sensor URL -> KNEL/KNELBMS post-rename [#785 #784]
ci / lint (push) Successful in 49s
2026-09-04 13:33:18 -05:00
mrcharles c8f2cbde4a fix(ci): bookworm pip via apt, valid truthy nesting, runtime-file ignores [#784]
ci / lint (push) Successful in 45s
Red/green: run 1 failed 27s (no pip in node image); run 2 blocker was
invalid truthy nesting in .yamllint. Local repro now green.
https://projects.knownelement.com/issues/784
2026-09-04 12:22:23 -05:00
mrcharles 5629bc9b4b ci: runs-on ultix — fleet runner label scoping [#784]
ci / lint (push) Failing after 27s
Runner is label-scoped to this fleet; other repos' ubuntu-latest
jobs no longer land on it.
https://projects.knownelement.com/issues/784
2026-09-04 12:13:35 -05:00
mrcharles 4f54635b33 feat(watchdog): stale-entity auto-heal — reload, notify, guarded restart [#789]
ci / lint (push) Failing after 14s
5-min staleness checks on 12 critical entities; reload_config_entry
auto-heal (no restart); notify on failure; auto-restart behind
input_boolean arm (default OFF).
https://projects.knownelement.com/issues/789
2026-09-04 10:55:00 -05:00
mrcharles 523a56bd52 feat(dash): Tripp Lite power entities — apparent VA, current, runtime [#372 #344]
ci / lint (push) Failing after 9s
4 integration-disabled entities enabled via registry (config-entry
platform, no restart). dev only.
https://projects.knownelement.com/issues/372
2026-09-04 10:50:03 -05:00
mrcharles 758fc92e36 feat(dash): Tripp Lite cards on Server Room UPS view [#372 #344]
ci / lint (push) Failing after 10s
charge + load gauges, status entities, hardware note. dev only.
https://projects.knownelement.com/issues/372
2026-09-04 10:43:48 -05:00
mrcharles 528dab5100 chore(garden): themes dir placeholder, empty-include markers, doorman contract pointer [#784]
ci / lint (push) Failing after 9s
Gardening pass: themes/ dir must exist for include_dir_merge_named;
scenes/scripts marked intentionally-empty; cross-repo contract pointer
to KNEL/doorman README. dev only.
https://projects.knownelement.com/issues/784
2026-09-04 07:46:10 -05:00
mrcharles 6266043d11 ci(gitea): workflow — yamllint + secret scan on dev/release [#784]
ci / lint (push) Failing after 27s
Fleet CI standard; runner #784. Runs go green once the act_runner
registers (token pending founder).
https://projects.knownelement.com/issues/784
2026-09-04 07:25:04 -05:00
mrcharles 8931b653d5 feat(ups): Tripp Lite into on-battery/low-battery/comms alerts [#372 #344]
tsys1_triplite entities replace the never-real tsys9_ups_status
ghost references; battery-low trigger gains the triplite charge.
dev only - release push pending founder go.
https://projects.knownelement.com/issues/372
2026-09-04 07:12:28 -05:00
mrcharles 09f3276b31 feat(deploy): branch model — box tracks release, dev is WIP-integration [#779 #344]
webhook ref-guard + sha-watch sensor pinned to ?sha=release;
sensor renamed pfv_deploy_gitea_release_head; master frozen.
https://projects.knownelement.com/issues/779
2026-09-04 06:32:56 -05:00
mrcharles 41116c7feb feat(alerts): deep-link taps to UPS/Temps/Overview views [#344]
clickAction (Android) + url (iOS) on all 9 alert notifications;
explicit lovelace view paths for deterministic links.
https://projects.knownelement.com/issues/344
2026-09-04 06:04:19 -05:00
mrcharles d93f9c0264 fix(snmp): document + restart after silent tsys9 drive poller wedge [#344]
12h stale despite healthy OID; registry cycle can't revive legacy
snmp pollers - core restart required.
https://projects.knownelement.com/issues/344
2026-09-04 06:00:04 -05:00
mrcharles 0d046fa0be docs: HomeKit controller-only ruling — never bridge outward [#344]
https://projects.knownelement.com/issues/344
2026-09-03 21:27:10 -05:00
mrcharles 33505c647e fix(plant): recovery alert condition indentation [#344]
value_template must be a sibling key of condition in the action
sequence, not a continuation - reload 500 pointed at line 494.

Detail: https://projects.knownelement.com/issues/344
2026-09-03 16:16:04 -05:00
mrcharles e6f4032865 feat(plant): temperature RECOVERY alerts - tiered clear notifications [#344]
Recovery twin of the high-temperature alert: per-tier below-triggers
(fire-line minus 5F, held 10 min), from_state guard against restart
false-positives, peak-value reporting. Matches existing notify
targets; UPS on-battery already had its restored twin.

Detail: https://projects.knownelement.com/issues/344
2026-09-03 16:12:18 -05:00
mrcharles db4624a2df feat(plant): tsys3 GPU temp sensor - match nouveau hwmon too [#763]
Maxwell card runs in-tree nouveau on kernel 7.0.14 (no proprietary
branch supports both 7.0 and Maxwell); regex widened with a
non-capturing alternation, template downstream unchanged.

Detail: https://projects.knownelement.com/issues/763
2026-09-03 14:02:09 -05:00
mrcharles 6c5efbb609 docs: showpiece README — mermaid architecture, sensor/alert tables [#762]
Also absorbs PFVCluster operator tooling: tools/ha-ws-call.py and
docs/reference-packs/ (historical, NOT loaded by HA — clearly marked).
No live-config changes in this commit.

Detail: https://projects.knownelement.com/issues/762
2026-09-03 13:34:53 -05:00
mrcharles 96e70aa231 docs: AGPLv3 license + public README [#762]
Pre-publication packaging. Full-history secret/badge scans clean;
badge IDs live only in the private access-roster repo.

Detail: https://projects.knownelement.com/issues/762
2026-09-03 13:22:49 -05:00
mrcharles 2519aec5b6 feat(doorman): honor local_unlock flag from break-glass scans [#345]
Break-glass badges fire the relay locally on the reader host (no HA
dependency); the flagged scan still reaches HA for the audit trail
but skips re-dispatch. NOTE: deployed while pfv-bms is down — YAML
lint clean, ha core check to run at Friday boot before arming.

https://projects.knownelement.com/issues/345
2026-09-03 08:15:21 -05:00
mrcharles 66a5c45b7e feat(doorman): unlock dispatch — arm switch + rest_command to doorctl [#345]
Founder-approved: valid badge + armed input_boolean -> rest_command
fires the pfvsvrpi doorctl endpoint (Tailscale-bound, token+source
allowlisted, self-securing relay). Disarm = boolean off = log-only.
URL secret on-box only (doorman_unlock_url).

https://projects.knownelement.com/issues/345
2026-09-03 07:08:06 -05:00
mrcharles b7f376b6b3 fix(deploy): sha-watch deploys must restart core - reload kills webhook triggers [#345]
Found live 2026-09-03: after reload-only deploys, webhook-triggered
automations (doorman ingest, deploy fast path) silently stop firing
while the endpoint still returns HTTP 200. Proven: core restart
restores them. Sha-watch now restarts core on every new master HEAD
(same semantics as the webhook fast path for packages/** changes).

https://projects.knownelement.com/issues/345
2026-09-03 06:33:00 -05:00
mrcharles 85fdd1aa5e fix(doorman): HA Jinja has no split filter — method-call parsing [#345]
Live webhook test caught it: TemplateRuntimeError 'No filter named
split'. enabled_ids/holder rebuilt with row.split('|') method calls
in a namespace loop.

https://projects.knownelement.com/issues/345
2026-09-03 06:11:26 -05:00
mrcharles 908c14d8e4 feat(doorman): badge scan ingest + roster whitelist sensors [#345]
Roster fetched live from KNEL/access-roster via gitea API (no git
mechanics; access-roster stays the single gated source of truth).
Known/disabled/unknown decision branches + last-scan entities.
UNLOCK deliberately not wired - pending HA->Pi control path (#741).

Validated: yamllint clean, ha core check passed on staged copy.
https://projects.knownelement.com/issues/345
2026-09-03 06:02:51 -05:00
mrcharles ec974c9061 fix(alarms): CPU/SoC silicon tier at 176F - ambient 104F only for true ambient [#733]
subopi3 SoC idles at 117F and false-alarmed the 104F ambient bucket
at 23:15 CDT. Silicon (server CPUs, drac cpu, Pi/Jetson SoCs) now
alerts at 176F (80C pre-throttle).
Detail: https://projects.knownelement.com/issues/733
2026-09-02 23:17:07 -05:00
mrcharles 2eef3e49d7 test(deploy): e2e self-deploy proof [#734] 2026-09-02 22:56:51 -05:00
mrcharles 02e6df0340 fix(deploy): !secret must be the whole header value, not inline [#734]
gitea got no auth (401: only signed in user) - secrets do not
concatenate. Secret now holds the full 'Bearer <token>' header.
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:46:31 -05:00
mrcharles fbd88aa2f0 fix(deploy): drop availability mask so sensor state shows gitea response [#734]
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:38:56 -05:00
mrcharles 751bf1c396 fix(deploy): self-diagnosing sha sensor + drop invalid not-key [#734]
Gitea response came back a dict (error body) - sensor state now shows
the truncated body so one restart identifies it. not: rejected by
trigger schema; guard lives in the condition template already.
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:30:16 -05:00
mrcharles 0667eebc0e chore: keep .crush/ session scratch out of the repo [#734]
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:24:11 -05:00
mrcharles 975974b043 feat(deploy): gitea sha-watch safety net - reload-only deploys [#734]
REST sensor polls master HEAD (scoped read token in host secrets);
sha change -> pull + reload_all, no core bounce. Webhook stays the
fast path pending gitea ALLOWED_HOST_LIST widening (CGNAT target).
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:23:57 -05:00
mrcharles cf921b1eb0 chore: webhook delivery probe 2 (post gitea restart) [#734] 2026-09-02 22:18:36 -05:00
mrcharles 4b94d71c80 chore: webhook delivery probe [#734] 2026-09-02 22:13:10 -05:00
mrcharles 10f9d2d02d feat(deploy): founder push notifications on deploys [#734]
Also first live E2E of the gitea webhook: this push triggers the
pull + reload_all path with no core restart.
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:09:28 -05:00
mrcharles d08f3131f0 fix(deploy): drop invalid stop_reason key (blocked automation reload) [#734]
stop action takes the message inline; stop_reason is not in the 2026.8
script schema and validation failure aborts the whole automations reload.
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:04:07 -05:00
mrcharles 2669c3cf7c feat(deploy): gitea webhook - pull + minimal reload pipeline [#734]
Webhook automation: master pushes force a git pull then reload_all;
core restart only for configuration.yaml / packages platform files.
Add-on auto_restart disabled separately on the host (race source).
Detail: https://projects.knownelement.com/issues/734
2026-09-02 21:57:17 -05:00
mrcharles 8d004b5ee3 fix(plant): tsys3 GPU anchor nouveau->nvidia (driver deferred to CUDA work) [#736]
Founder ruling: proprietary nvidia driver only (needed for CUDA, version
choice his) — no nouveau. Anchor pre-flipped; sensor stays unknown until
the driver lands, then populates with zero further changes.
2026-09-02 21:43:09 -05:00
mrcharles 12492759bc feat(plant): drive (drivetemp) + GPU (nouveau, jetson zone) temps [#736]
12 new two-layer sensors: 10 drive temps across tsys1/4/5/9 (server
disks behind PERC remain a documented gap), tsys3 Quadro via nouveau
hwmon, jetson GPU-therm zone. Alert triggers: drives 140F (drive
ratings), GPUs 185F. Dashboard sections extended.
2026-09-02 21:27:50 -05:00
mrcharles bb863e61d9 feat(automations): class-threshold temp alerts + UPS runtime-low [#344]
NVMe 150F, DIMM 140F, PCH 160F triggers on the new storage/mem/chipset
sensors (104F general threshold retained for air/CPU); UPS runtime-low
alert (<10 min while not Online) guards the #455 shutdown window.

https://projects.knownelement.com/issues/344
2026-09-02 21:05:23 -05:00
mrcharles 0ecd48c007 feat(dashboards): nest art room + garage under STLP dashboard [#344]
HA sidebar has no dashboard folders — nesting = one dashboard with tab
views (same pattern as Server Room). Art Room/Garage views merged into
stlp.yaml verbatim; old single-purpose dashboards removed.

https://projects.knownelement.com/issues/344
2026-09-02 20:53:08 -05:00
mrcharles cdc270f8e8 fix(automations): drop invalid nested data: blocks breaking 3 plant alarms [#344]
notify.send_message rejects extra data['data'] (old mobile-app push
syntax) — UPS battery low, UPS comm lost, and high-temperature alerts
all errored on every fire. Blocks removed; notifications send plain.

https://projects.knownelement.com/issues/344
2026-09-02 20:44:10 -05:00
mrcharles f1898daa8a feat(dashboards): data-dense Overview, dedicated UPS tab, Automations tab [#344]
Overview: at-a-glance markdown (UPS/PDU/hottest temps/fleet count) +
Power entities + key-temp history; giant status card dropped. New UPS
view (charge+runtime gauges, battery V, 7d charge / 24h V+runtime
graphs, unit facts incl. no-input/output-voltage note, UPS automations).
Automations moved to own tab with trend sensors. NUT runtime/voltage/
setpoint entities enabled via registry (disabled-by-default). New
pfv_ups_runtime_minutes template sensor.

https://projects.knownelement.com/issues/344
2026-09-02 20:37:53 -05:00
mrcharles 1eca4b8f1d feat(dashboards): Storage/Memory/Chipset section with new nvme/dimm/pch sensors [#344] 2026-09-02 20:20:33 -05:00
mrcharles 494e5565e7 feat(plant): storage/mem/chipset temps — NVMe, DIMM jc42, PCH [#344]
8 new two-layer sensors from data already in lm-sensors extends: NVMe
composite (tsys3/5), 4x jc42 DIMM temps anchored by i2c address (tsys4),
PCH (tsys3/9). GPU/SATA/DRAC-DIMM temps need host-side work — ticketed.

https://projects.knownelement.com/issues/344
2026-09-02 20:12:28 -05:00
mrcharles 84e4fb286c fix(plant): amps semantic must read raw by entity_id, not unique_id slug [#344]
Raw entity_id comes from the name slug (pfv_garage_pdu_output_current_raw),
not the unique_id (pfv_garage_pdu_amps_raw) — only this sensor's name and
unique_id diverge, so only its semantic was reading a nonexistent entity.

https://projects.knownelement.com/issues/344#note-3916
2026-09-02 19:53:13 -05:00
mrcharles 0e8197fd2d refactor(plant): two-layer snmp sensors — raw transport + semantic templates [#344]
HA 2026.8 rejects ANY non-numeric native_value on a unit-bearing snmp
sensor at entity ADD (host down at boot renders ''/'unknown'/'None' as
strings) — unit-bearing adds crash and the entity vanishes until manual
reload. Raw layer now carries no unit (validation off); semantic template
layer carries unit + device_class under the original unique_ids so
entity_ids, dashboards, and automations are unchanged.

https://projects.knownelement.com/issues/344#note-3916
2026-09-02 19:18:43 -05:00
mrcharles 5880ce2100 test(plant): default_value+none-render on 3 down-host snmp sensors [#344] 2026-09-02 19:08:32 -05:00
mrcharles cb03118b5a fix(plant): drop device_class from snmp sensors — empty first render kills add [#344]
HA 2026.8 raises ValueError(int('')) at entity ADD when a device_classed
snmp sensor's first render is empty (host down at boot/reload), so the
entity silently vanishes (artroom/garage/subopi3). Units alone keep the
°F/W/A display; automations are numeric_state, dashboards don't filter
on device_class.

https://projects.knownelement.com/issues/344#note-3916
2026-09-02 18:54:12 -05:00
mrcharles d1c09ae225 fix(plant): dedupe sensor: key that shadowed all 22 SNMP temps [#344]
Second top-level sensor: key (PDU energy) made YAML last-one-wins drop
the whole first block at config load — every SNMP temp/power entity
stopped being created after the restart that pulled this file.

https://projects.knownelement.com/issues/344#note-3916
2026-09-02 18:45:38 -05:00
mrcharles f647e4f214 feat(dashboards): garage daily-kWh card [#344] 2026-09-02 18:00:43 -05:00
mrcharles aea1e49b22 feat(plant): rate-of-change temp early warning + garage PDU kWh (integration+daily) [#344][#682] 2026-09-02 17:59:59 -05:00
mrcharles 3690b5c9f1 feat(plant): garage PDU current+power via librenms relay; garage dashboard cards [#344] 2026-09-02 17:24:17 -05:00
mrcharles deb8805c16 feat(automations): sensor watchdog; DRACs in high-temp trigger; drop dead tsys9 refs [#344][#625] 2026-09-02 17:13:57 -05:00
mrcharles 5aaac7b63d fix(plant): drop state_class from snmp sensors — 2026.8 rejects unknown at add-time when host asleep [#618][#625] 2026-09-02 16:55:33 -05:00
mrcharles ca169408fc fix(dashboards): rack labels on temps; health map/timeline ultix-mini only [#618][#344] 2026-09-02 16:53:08 -05:00
mrcharles 12af66e1ae feat(dashboards): garage + artroom; health heart view; fleet-wide unknown-render fix [#618][#344][#625] 2026-09-02 16:45:09 -05:00
mrcharles 206392c6c7 feat(dashboards): temps view grouped by hardware class [#618] 2026-09-02 16:38:19 -05:00
mrcharles 6421e35936 fix(dashboards): health v2 (location-first, no batteries); name SR overview view [#344][#618] 2026-09-02 16:37:45 -05:00
mrcharles 0e1cc2be97 fix(dashboards): server-room was missing views wrapper (blank render) + DRAC temps view [#618] 2026-09-02 16:33:07 -05:00
mrcharles 553af1196f fix(plant): DRAC template guards — multiline-safe regex, clean unavailable [#625] 2026-09-02 15:13:02 -05:00
mrcharles 507a3b0d10 feat(plant): 5 DRAC IPMI temp sensors via snmp extend [#625] 2026-09-02 14:56:07 -05:00
mrcharles 74f48b650f feat(dashboards): Health starter dashboard (vitals + trackers) [#344]
💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-09-02 14:50:31 -05:00
mrcharles 584b862cc8 fix(plant): restore SNMP pack with valid slug (platform was fine) [#618] 2026-09-01 18:26:38 -05:00
mrcharles 7a0d63aeaf fix(lovelace): filename key; drop dead plant-snmp package (invalid slug) 2026-09-01 17:53:31 -05:00
mrcharles 88f2a53d15 feat(dashboards): Server Room starter dashboard [#618] 2026-09-01 17:31:59 -05:00
mrcharles cc4ab4c6e6 feat(metrics): enable prometheus endpoint for VM pipeline [#621] 2026-09-01 16:04:46 -05:00
mrcharles 69abd3785c feat(plant): SNMP temp pack + packages bootstrap [#618][#439] 2026-09-01 15:44:29 -05:00
mrcharles a7ca5cbdb5 chore: gitignore custom_components (in-place self-managed) [#344] 2026-09-01 13:28:36 -05:00
mrcharles ff823ddf01 feat(nut): both plant UPS into HA via LAN NUT servers [#439] 2026-09-01 13:28:06 -05:00
mrcharles 38454a45fb feat(automations): plant alerts to HA companion app (phone+iPad) [#344] 2026-09-01 13:00:52 -05:00
mrcharles d0ecc9dd59 chore: untrack .storage runtime state for clean pulls [#344] 2026-09-01 12:46:55 -05:00
mrcharles 0f8e129c99 feat: import live pfv-bms HA configuration [#344] 2026-09-01 12:43:01 -05:00