wifi-densepose/examples/ha-blueprints
ruv f5d787ccde feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint
Per ADR-115 §9.4 (maintainer ACK on #776), v0.7.0 ships **3 starter
blueprints**. This commit goes further: all **8** of the catalog
proposed in §3.12.2 land as standalone YAML files under
`examples/ha-blueprints/`, ready to import into HA.

## Blueprints

1. Notify on possible distress      → possible_distress
2. Dim hallway when sleeping         → someone_sleeping
3. Wake routine on bed exit          → bed_exit (time-window-gated)
4. Alert on elderly inactivity       → elderly_inactivity_anomaly
                                       (with optional escalation chain)
5. Meeting lights + presence mode    → meeting_in_progress
                                       (activates a HA scene)
6. Bathroom fan while occupied       → bathroom_occupied
                                       (privacy-mode-safe; zone-derived)
7. Escalate on fall-risk crossing    → fall_risk_elevated
                                       (numeric_state trigger)
8. Auto-arm security when not active → group(room_active) + no_movement
                                       (composed; multi-room sense)

Each blueprint:
- Uses HA's blueprint schema (https://www.home-assistant.io/docs/blueprint/schema/)
- Declares typed `selector:` for every input (entity-domain-constrained
  where applicable)
- Carries a `source_url` for HACS-style re-import
- Includes `mode: single` + `max_exceeded: silent` where appropriate
  so transient retriggers don't spam
- Includes a `cooldown_minutes` / `confirm_minutes` / `ack_timeout_min`
  parameter where time-debouncing matters

## Validator (`scripts/validate-ha-blueprints.py`)

Pure-Python validator that:
- Registers no-op constructors for HA's `!input` and `!secret` YAML tags
  (PyYAML doesn't know them)
- Asserts every file has a top-level `blueprint:` mapping with
  `name`/`description`/`domain`
- Asserts `domain` is `automation` or `script`
- Asserts at least one declared `input`
- Asserts at least one of `trigger`/`action`/`sequence` is present

Exits 0 only when all 8 validate. Local run:

    python scripts/validate-ha-blueprints.py
    All 8 HA Blueprints validate OK

## CI integration

`.github/workflows/mqtt-integration.yml` gains a new
`Validate HA Blueprints` step that runs the Python validator before
the cargo test phases — fails the workflow on any malformed blueprint
in a PR.

## Privacy-mode coverage table

5 of 8 blueprints are unconditionally privacy-mode-safe (no biometric
dependency in the state derivation). The other 3 depend on inferred
states that themselves derive from biometrics — the inferred state
still publishes under `--privacy-mode` (per ADR §3.12.3) but the
operator should audit the use case in regulated contexts. Full table
in `examples/ha-blueprints/README.md`.

Refs #776, PR #778.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-23 15:01:20 -04:00
..
01-notify-on-possible-distress.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
02-dim-hallway-when-sleeping.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
03-wake-routine-on-bed-exit.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
04-alert-elderly-inactivity-anomaly.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
05-meeting-lights-presence-mode.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
06-bathroom-fan-while-occupied.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
07-fall-risk-escalation.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
08-auto-arm-security-when-not-active.yaml feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00
README.md feat(adr-115): ship 8 starter HA Blueprints + YAML validator + CI lint 2026-05-23 15:01:20 -04:00

README.md

RuView starter Home Assistant Blueprints

8 ready-to-import HA Blueprints covering the highest-leverage automations RuView's HA-MIND semantic primitives unlock. Drop the YAML files into <HA config>/blueprints/automation/ruvnet/ and import from the HA UI (Settings → Automations & Scenes → Blueprints → Import Blueprint).

# Blueprint Primary primitive Use case
1 Notify on possible distress possible_distress Healthcare / AAL / single-occupant
2 Dim hallway when sleeping someone_sleeping Convenience / sleep hygiene
3 Wake routine on bed exit bed_exit Morning routine / smart home
4 Alert on elderly inactivity anomaly elderly_inactivity_anomaly AAL / aging-in-place
5 Meeting lights + presence mode meeting_in_progress Conference room / WFH
6 Bathroom fan while occupied bathroom_occupied Humidity / privacy-mode-safe
7 Escalate on fall-risk crossing fall_risk_elevated AAL / preventive intervention
8 Auto-arm security when room not active room_active + no_movement Self-arming security

Verifying the YAML

Each blueprint validates against the HA blueprint schema (https://www.home-assistant.io/docs/blueprint/schema/). To check locally without an HA install:

# Requires python3 + PyYAML
for f in examples/ha-blueprints/*.yaml; do
  python -c "import yaml,sys; yaml.safe_load(open('$f'))" && echo "✓ $f" || echo "✗ $f"
done

Privacy-mode compatibility

Five of the eight blueprints work under --privacy-mode (no biometrics exposed). The other three depend on inferred states that themselves derive from biometrics, so they still publish, but the operator should audit before deploying in regulated contexts.

Blueprint Privacy-mode safe?
01 Notify on possible distress ⚠️ derives from HR/motion — state still publishes
02 Dim hallway when sleeping ⚠️ derives from BR — state still publishes
03 Wake routine on bed exit
04 Alert on elderly inactivity anomaly
05 Meeting lights
06 Bathroom fan while occupied zone-derived only
07 Escalate on fall-risk crossing ⚠️ derives from motion-variance — state still publishes
08 Auto-arm security

The "⚠️" markers are the inferred-state-vs-raw-value distinction from ADR-115 §3.12.3: the state (e.g. binary_sensor.someone_sleeping) crosses the wire even in privacy mode because it's derived server-side, but it's no longer accompanied by the raw biometric values.

See also