mirror of
https://github.com/ruvnet/RuView
synced 2026-06-09 10:13:17 +00:00
ADR-115: Home Assistant + Matter integration (#778)
Closes ADR-115's MQTT track (HA-DISCO + HA-MIND + HA-FABRIC scaffolding). Headline: - 21 entity kinds per node (11 raw + 10 semantic primitives) - MQTT auto-discovery with HA conventions - Matter Bridge scaffolding (SDK wiring deferred to v0.7.1 per ADR §9.10) - Privacy mode strips biometrics at the wire, semantic primitives keep working - 420+ lib tests, mosquitto-backed integration tests, property-based fuzzing - 8 starter HA Blueprints + 3 Lovelace dashboards shipped Tracking issue: #776
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
blueprint:
|
||||
name: RuView — notify on possible distress
|
||||
description: >
|
||||
Send a push notification when RuView's HA-MIND inference layer
|
||||
detects sustained elevated heart rate + agitated motion without a
|
||||
fall (possible_distress primitive). Includes the explainability
|
||||
reason payload so the recipient knows why the alert fired.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/01-notify-on-possible-distress.yaml
|
||||
input:
|
||||
distress_entity:
|
||||
name: Possible distress binary_sensor
|
||||
description: The `binary_sensor.*_possible_distress` entity published by RuView.
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
notify_target:
|
||||
name: Notification service
|
||||
description: Notify service to call (e.g. `notify.mobile_app_pixel_8`).
|
||||
selector:
|
||||
text: {}
|
||||
cooldown_minutes:
|
||||
name: Cooldown (minutes)
|
||||
description: Suppress repeat alerts within this window.
|
||||
default: 15
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 240
|
||||
unit_of_measurement: minutes
|
||||
|
||||
mode: single
|
||||
max_exceeded: silent
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input distress_entity
|
||||
from: "off"
|
||||
to: "on"
|
||||
|
||||
action:
|
||||
- service: !input notify_target
|
||||
data:
|
||||
title: "⚠️ Possible distress detected"
|
||||
message: >
|
||||
RuView flagged sustained elevated heart rate + agitated motion in
|
||||
{{ state_attr(trigger.entity_id, 'friendly_name') or trigger.entity_id }}.
|
||||
Reason: {{ state_attr(trigger.entity_id, 'reason') or 'none provided' }}.
|
||||
- delay:
|
||||
minutes: !input cooldown_minutes
|
||||
@@ -0,0 +1,52 @@
|
||||
blueprint:
|
||||
name: RuView — dim hallway when someone sleeping
|
||||
description: >
|
||||
Drop hallway lights to a configurable brightness when anyone in the
|
||||
bedroom is in the someone_sleeping state. A midnight bathroom trip
|
||||
doesn't blast full lights. Restores when sleeping flips off.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/02-dim-hallway-when-sleeping.yaml
|
||||
input:
|
||||
sleeping_entity:
|
||||
name: Someone sleeping binary_sensor
|
||||
description: The `binary_sensor.*_someone_sleeping` entity published by RuView.
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
hallway_light:
|
||||
name: Hallway light
|
||||
selector:
|
||||
entity:
|
||||
domain: light
|
||||
sleep_brightness:
|
||||
name: Brightness while sleeping (%)
|
||||
default: 10
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 100
|
||||
unit_of_measurement: "%"
|
||||
|
||||
mode: single
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input sleeping_entity
|
||||
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: !input sleeping_entity
|
||||
state: "on"
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: !input hallway_light
|
||||
data:
|
||||
brightness_pct: !input sleep_brightness
|
||||
default:
|
||||
- service: light.turn_off
|
||||
target:
|
||||
entity_id: !input hallway_light
|
||||
@@ -0,0 +1,74 @@
|
||||
blueprint:
|
||||
name: RuView — wake-up routine on bed exit
|
||||
description: >
|
||||
When bed_exit fires in the morning window, ramp bedroom lights over
|
||||
a configurable duration, start the coffee maker, and disarm the
|
||||
home alarm. Time-window-gated so a midnight bathroom trip doesn't
|
||||
trigger it. Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/03-wake-routine-on-bed-exit.yaml
|
||||
input:
|
||||
bed_exit_event:
|
||||
name: Bed exit event entity
|
||||
selector:
|
||||
entity:
|
||||
domain: event
|
||||
bedroom_light:
|
||||
name: Bedroom light
|
||||
selector:
|
||||
entity:
|
||||
domain: light
|
||||
coffee_maker:
|
||||
name: Coffee maker switch
|
||||
selector:
|
||||
entity:
|
||||
domain: switch
|
||||
home_alarm:
|
||||
name: Home alarm control panel
|
||||
selector:
|
||||
entity:
|
||||
domain: alarm_control_panel
|
||||
window_start:
|
||||
name: Morning window start (hh:mm)
|
||||
default: "05:00:00"
|
||||
selector:
|
||||
time: {}
|
||||
window_end:
|
||||
name: Morning window end (hh:mm)
|
||||
default: "09:00:00"
|
||||
selector:
|
||||
time: {}
|
||||
ramp_seconds:
|
||||
name: Light ramp duration (seconds)
|
||||
default: 600
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 3600
|
||||
unit_of_measurement: s
|
||||
|
||||
mode: single
|
||||
max_exceeded: silent
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input bed_exit_event
|
||||
|
||||
condition:
|
||||
- condition: time
|
||||
after: !input window_start
|
||||
before: !input window_end
|
||||
|
||||
action:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: !input bedroom_light
|
||||
data:
|
||||
brightness_pct: 100
|
||||
transition: !input ramp_seconds
|
||||
- service: switch.turn_on
|
||||
target:
|
||||
entity_id: !input coffee_maker
|
||||
- service: alarm_control_panel.alarm_disarm
|
||||
target:
|
||||
entity_id: !input home_alarm
|
||||
@@ -0,0 +1,70 @@
|
||||
blueprint:
|
||||
name: RuView — alert on elderly inactivity anomaly
|
||||
description: >
|
||||
Send a high-priority push notification when elderly_inactivity_anomaly
|
||||
fires — the resident has been still for unusually long given their
|
||||
personal baseline. Includes a configurable secondary call/SMS escalation
|
||||
via a notify group if the first alert isn't acknowledged.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/04-alert-elderly-inactivity-anomaly.yaml
|
||||
input:
|
||||
anomaly_entity:
|
||||
name: Elderly inactivity anomaly binary_sensor
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
primary_notify:
|
||||
name: Primary notify service (e.g. carer's phone)
|
||||
selector:
|
||||
text: {}
|
||||
escalation_notify:
|
||||
name: Escalation notify service (optional)
|
||||
description: Fires if anomaly stays ON after ack_timeout_min.
|
||||
default: ""
|
||||
selector:
|
||||
text: {}
|
||||
ack_timeout_min:
|
||||
name: Escalation timeout (minutes)
|
||||
default: 10
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 120
|
||||
unit_of_measurement: minutes
|
||||
|
||||
mode: single
|
||||
max_exceeded: silent
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input anomaly_entity
|
||||
from: "off"
|
||||
to: "on"
|
||||
|
||||
action:
|
||||
- service: !input primary_notify
|
||||
data:
|
||||
title: "🚨 Inactivity anomaly"
|
||||
message: >
|
||||
Resident has been still longer than usual. Check on them.
|
||||
Reason: {{ state_attr(trigger.entity_id, 'reason') or 'none provided' }}.
|
||||
- wait_for_trigger:
|
||||
- platform: state
|
||||
entity_id: !input anomaly_entity
|
||||
to: "off"
|
||||
timeout:
|
||||
minutes: !input ack_timeout_min
|
||||
continue_on_timeout: true
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: !input anomaly_entity
|
||||
state: "on"
|
||||
- condition: template
|
||||
value_template: "{{ (escalation_notify | default('')) != '' }}"
|
||||
sequence:
|
||||
- service: !input escalation_notify
|
||||
data:
|
||||
title: "🆘 Escalation — anomaly still active"
|
||||
message: "No motion for the duration of the alert window. Please intervene."
|
||||
@@ -0,0 +1,52 @@
|
||||
blueprint:
|
||||
name: RuView — meeting lights + presence mode
|
||||
description: >
|
||||
When meeting_in_progress fires, set conference-room lights to a
|
||||
professional white scene and switch presence-aware automations
|
||||
(motion lights, ambient noise) into "meeting mode" so they don't
|
||||
interrupt. Restores prior scene when meeting ends.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/05-meeting-lights-presence-mode.yaml
|
||||
input:
|
||||
meeting_entity:
|
||||
name: Meeting in progress binary_sensor
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
meeting_lights:
|
||||
name: Meeting room lights (group)
|
||||
selector:
|
||||
entity:
|
||||
domain: light
|
||||
meeting_scene:
|
||||
name: Scene to activate during meeting (e.g. scene.meeting_mode)
|
||||
selector:
|
||||
entity:
|
||||
domain: scene
|
||||
restore_scene:
|
||||
name: Scene to restore after meeting (e.g. scene.room_default)
|
||||
selector:
|
||||
entity:
|
||||
domain: scene
|
||||
|
||||
mode: single
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input meeting_entity
|
||||
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: !input meeting_entity
|
||||
state: "on"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: !input meeting_scene
|
||||
default:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: !input restore_scene
|
||||
@@ -0,0 +1,52 @@
|
||||
blueprint:
|
||||
name: RuView — bathroom fan while occupied
|
||||
description: >
|
||||
Run the bathroom exhaust fan while bathroom_occupied is ON, with a
|
||||
configurable run-on delay after the zone clears (humidity recovery).
|
||||
Privacy-mode-safe: bathroom_occupied is derived from zone presence,
|
||||
not biometrics, so this works under --privacy-mode too.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/06-bathroom-fan-while-occupied.yaml
|
||||
input:
|
||||
bathroom_entity:
|
||||
name: Bathroom occupied binary_sensor
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
fan_switch:
|
||||
name: Exhaust fan switch
|
||||
selector:
|
||||
entity:
|
||||
domain: switch
|
||||
run_on_minutes:
|
||||
name: Run-on after vacated (minutes)
|
||||
default: 5
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 60
|
||||
unit_of_measurement: minutes
|
||||
|
||||
mode: restart
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input bathroom_entity
|
||||
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: state
|
||||
entity_id: !input bathroom_entity
|
||||
state: "on"
|
||||
sequence:
|
||||
- service: switch.turn_on
|
||||
target:
|
||||
entity_id: !input fan_switch
|
||||
default:
|
||||
- delay:
|
||||
minutes: !input run_on_minutes
|
||||
- service: switch.turn_off
|
||||
target:
|
||||
entity_id: !input fan_switch
|
||||
@@ -0,0 +1,44 @@
|
||||
blueprint:
|
||||
name: RuView — escalate on fall-risk score crossing
|
||||
description: >
|
||||
Send a notification when the fall_risk_elevated sensor crosses a
|
||||
configurable threshold (default 70) — the resident's near-fall
|
||||
frequency + gait-instability proxy has reached a level worth
|
||||
investigating. Pairs with the longer-term ADR-079 P9 personalisation
|
||||
flow once available. Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/07-fall-risk-escalation.yaml
|
||||
input:
|
||||
fall_risk_entity:
|
||||
name: Fall risk elevated sensor (0-100 score)
|
||||
selector:
|
||||
entity:
|
||||
domain: sensor
|
||||
notify_target:
|
||||
name: Notification service
|
||||
selector:
|
||||
text: {}
|
||||
threshold:
|
||||
name: Crossing threshold
|
||||
default: 70
|
||||
selector:
|
||||
number:
|
||||
min: 30
|
||||
max: 100
|
||||
|
||||
mode: single
|
||||
max_exceeded: silent
|
||||
|
||||
trigger:
|
||||
- platform: numeric_state
|
||||
entity_id: !input fall_risk_entity
|
||||
above: !input threshold
|
||||
|
||||
action:
|
||||
- service: !input notify_target
|
||||
data:
|
||||
title: "⚠️ Fall-risk score elevated"
|
||||
message: >
|
||||
{{ trigger.to_state.attributes.friendly_name or trigger.entity_id }}
|
||||
crossed {{ threshold }} (current value
|
||||
{{ trigger.to_state.state }}). Consider a wellness check.
|
||||
@@ -0,0 +1,65 @@
|
||||
blueprint:
|
||||
name: RuView — auto-arm security when room not active
|
||||
description: >
|
||||
Auto-arm the home alarm when room_active flips to OFF for all
|
||||
monitored rooms AND no_movement is ON in the primary room. Lets the
|
||||
home self-protect without requiring user input at the door.
|
||||
Part of the ADR-115 §3.12 starter blueprint set.
|
||||
domain: automation
|
||||
source_url: https://github.com/ruvnet/RuView/blob/main/examples/ha-blueprints/08-auto-arm-security-when-not-active.yaml
|
||||
input:
|
||||
room_active_group:
|
||||
name: Group of room_active binary_sensors (one per room)
|
||||
description: A `group.*` entity containing every RuView room_active sensor.
|
||||
selector:
|
||||
entity:
|
||||
domain: group
|
||||
primary_no_movement:
|
||||
name: Primary room no_movement binary_sensor
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
home_alarm:
|
||||
name: Home alarm control panel
|
||||
selector:
|
||||
entity:
|
||||
domain: alarm_control_panel
|
||||
arm_mode:
|
||||
name: Arm mode
|
||||
default: arm_away
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- arm_away
|
||||
- arm_home
|
||||
- arm_night
|
||||
confirm_minutes:
|
||||
name: Confirmation idle window (minutes)
|
||||
default: 10
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 120
|
||||
unit_of_measurement: minutes
|
||||
|
||||
mode: single
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input room_active_group
|
||||
to: "off"
|
||||
for:
|
||||
minutes: !input confirm_minutes
|
||||
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: !input primary_no_movement
|
||||
state: "on"
|
||||
- condition: state
|
||||
entity_id: !input home_alarm
|
||||
state: disarmed
|
||||
|
||||
action:
|
||||
- service: "alarm_control_panel.{{ arm_mode }}"
|
||||
target:
|
||||
entity_id: !input home_alarm
|
||||
@@ -0,0 +1,60 @@
|
||||
# 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](01-notify-on-possible-distress.yaml) | `possible_distress` | Healthcare / AAL / single-occupant |
|
||||
| 2 | [Dim hallway when sleeping](02-dim-hallway-when-sleeping.yaml) | `someone_sleeping` | Convenience / sleep hygiene |
|
||||
| 3 | [Wake routine on bed exit](03-wake-routine-on-bed-exit.yaml) | `bed_exit` | Morning routine / smart home |
|
||||
| 4 | [Alert on elderly inactivity anomaly](04-alert-elderly-inactivity-anomaly.yaml) | `elderly_inactivity_anomaly` | AAL / aging-in-place |
|
||||
| 5 | [Meeting lights + presence mode](05-meeting-lights-presence-mode.yaml) | `meeting_in_progress` | Conference room / WFH |
|
||||
| 6 | [Bathroom fan while occupied](06-bathroom-fan-while-occupied.yaml) | `bathroom_occupied` | Humidity / privacy-mode-safe |
|
||||
| 7 | [Escalate on fall-risk crossing](07-fall-risk-escalation.yaml) | `fall_risk_elevated` | AAL / preventive intervention |
|
||||
| 8 | [Auto-arm security when room not active](08-auto-arm-security-when-not-active.yaml) | `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:
|
||||
|
||||
```bash
|
||||
# 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](../../docs/adr/ADR-115-home-assistant-integration.md#3123-why-these-specific-primitives):
|
||||
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
|
||||
|
||||
- [ADR-115](../../docs/adr/ADR-115-home-assistant-integration.md) — full design
|
||||
- [`docs/integrations/home-assistant.md`](../../docs/integrations/home-assistant.md) — operator guide
|
||||
- [`docs/integrations/semantic-primitives-metrics.md`](../../docs/integrations/semantic-primitives-metrics.md) — per-primitive F1
|
||||
@@ -0,0 +1,93 @@
|
||||
# RuView — Single-room overview Lovelace dashboard
|
||||
#
|
||||
# Drop into a Home Assistant Lovelace view (raw config editor). Replace
|
||||
# the `binary_sensor.ruview_bedroom_*` entity IDs with the entity IDs
|
||||
# auto-generated by your RuView node (HA picks them up from MQTT
|
||||
# discovery automatically — see `mosquitto_sub -t 'homeassistant/#'`
|
||||
# to enumerate them).
|
||||
#
|
||||
# This view shows the full 21-entity RuView surface for one room:
|
||||
# raw signals on the left (presence, HR, BR, motion, RSSI, fall risk
|
||||
# score) and semantic primitives on the right (sleeping, distress,
|
||||
# room active, no movement). Pose visualisation is a placeholder for
|
||||
# the v0.7.1 picture-elements integration.
|
||||
|
||||
title: RuView — Bedroom
|
||||
path: ruview-bedroom
|
||||
icon: mdi:home-thermometer
|
||||
cards:
|
||||
- type: vertical-stack
|
||||
cards:
|
||||
- type: markdown
|
||||
content: >
|
||||
## Bedroom — RuView sensing
|
||||
Status pulled live from MQTT auto-discovery. Tap any tile to
|
||||
see the raw history graph.
|
||||
|
||||
- type: horizontal-stack
|
||||
cards:
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_presence
|
||||
name: Presence
|
||||
icon: mdi:motion-sensor
|
||||
color: green
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_someone_sleeping
|
||||
name: Sleeping
|
||||
icon: mdi:sleep
|
||||
color: blue
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_room_active
|
||||
name: Room active
|
||||
icon: mdi:home-account
|
||||
color: amber
|
||||
|
||||
- type: glance
|
||||
title: Raw vitals
|
||||
entities:
|
||||
- entity: sensor.ruview_bedroom_heart_rate
|
||||
name: HR
|
||||
- entity: sensor.ruview_bedroom_breathing_rate
|
||||
name: BR
|
||||
- entity: sensor.ruview_bedroom_motion_level
|
||||
name: Motion
|
||||
- entity: sensor.ruview_bedroom_person_count
|
||||
name: Persons
|
||||
- entity: sensor.ruview_bedroom_rssi
|
||||
name: RSSI
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.ruview_bedroom_fall_risk_elevated
|
||||
name: Fall risk score
|
||||
min: 0
|
||||
max: 100
|
||||
severity:
|
||||
green: 0
|
||||
yellow: 40
|
||||
red: 70
|
||||
|
||||
- type: entities
|
||||
title: Safety
|
||||
entities:
|
||||
- entity: binary_sensor.ruview_bedroom_possible_distress
|
||||
name: Possible distress
|
||||
- entity: binary_sensor.ruview_bedroom_no_movement
|
||||
name: No movement (safety)
|
||||
- entity: binary_sensor.ruview_bedroom_elderly_inactivity_anomaly
|
||||
name: Inactivity anomaly
|
||||
|
||||
- type: history-graph
|
||||
title: Last 6h — Heart rate & breathing
|
||||
hours_to_show: 6
|
||||
refresh_interval: 60
|
||||
entities:
|
||||
- entity: sensor.ruview_bedroom_heart_rate
|
||||
- entity: sensor.ruview_bedroom_breathing_rate
|
||||
|
||||
- type: logbook
|
||||
title: Recent events
|
||||
hours_to_show: 24
|
||||
entities:
|
||||
- event.ruview_bedroom_fall
|
||||
- event.ruview_bedroom_bed_exit
|
||||
- event.ruview_bedroom_multi_room_transition
|
||||
@@ -0,0 +1,82 @@
|
||||
# RuView — Multi-node grid Lovelace dashboard
|
||||
#
|
||||
# For deployments with multiple RuView nodes (typical: one per room,
|
||||
# all behind a Cognitum Seed bridge). Shows a top-level grid of every
|
||||
# room's presence + person count + activity, with drill-in links.
|
||||
#
|
||||
# Replace `_bedroom`, `_living`, `_kitchen`, `_office`, `_bathroom`
|
||||
# with your actual room slugs from the friendly_name resolution.
|
||||
|
||||
title: RuView — Whole house
|
||||
path: ruview-house
|
||||
icon: mdi:home-search
|
||||
|
||||
cards:
|
||||
- type: markdown
|
||||
content: >
|
||||
## RuView — Whole house view
|
||||
Each tile is one room; tap to drill into raw vitals + semantic
|
||||
primitives for that room.
|
||||
|
||||
- type: grid
|
||||
columns: 2
|
||||
square: false
|
||||
cards:
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_presence
|
||||
name: 🛏 Bedroom
|
||||
features:
|
||||
- type: target-temperature
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/ruview-bedroom
|
||||
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_living_presence
|
||||
name: 🛋 Living
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/ruview-living
|
||||
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_kitchen_presence
|
||||
name: 🍳 Kitchen
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/ruview-kitchen
|
||||
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_office_presence
|
||||
name: 💻 Office
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/ruview-office
|
||||
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bathroom_occupied
|
||||
name: 🚿 Bathroom
|
||||
tap_action:
|
||||
action: navigate
|
||||
navigation_path: /lovelace/ruview-bathroom
|
||||
|
||||
- type: glance
|
||||
title: House-wide counts
|
||||
entities:
|
||||
- entity: sensor.ruview_bedroom_person_count
|
||||
name: Bedroom
|
||||
- entity: sensor.ruview_living_person_count
|
||||
name: Living
|
||||
- entity: sensor.ruview_kitchen_person_count
|
||||
name: Kitchen
|
||||
- entity: sensor.ruview_office_person_count
|
||||
name: Office
|
||||
|
||||
- type: logbook
|
||||
title: Recent semantic events
|
||||
hours_to_show: 24
|
||||
entities:
|
||||
- event.ruview_bedroom_fall
|
||||
- event.ruview_bedroom_bed_exit
|
||||
- event.ruview_living_fall
|
||||
- event.ruview_kitchen_fall
|
||||
- event.ruview_office_multi_room_transition
|
||||
@@ -0,0 +1,88 @@
|
||||
# RuView — Healthcare / AAL (Active and Assisted Living) dashboard
|
||||
#
|
||||
# A care-giver-facing view designed for deployments where the
|
||||
# resident's wellbeing is the primary signal. Uses ONLY the semantic
|
||||
# primitives — no raw HR/BR exposed to the dashboard surface — so it
|
||||
# remains useful under `--privacy-mode` where biometric values are
|
||||
# stripped from MQTT.
|
||||
#
|
||||
# Drop into a Lovelace view that the carer accesses via their phone
|
||||
# (HA mobile app). The custom-button-card and apexcharts-card
|
||||
# dependencies are optional but improve readability — install via
|
||||
# HACS or fall back to the standard "entity" and "history-graph"
|
||||
# cards below as graceful degradation.
|
||||
|
||||
title: RuView — Care view
|
||||
path: ruview-care
|
||||
icon: mdi:heart-pulse
|
||||
|
||||
cards:
|
||||
- type: markdown
|
||||
content: >
|
||||
## RuView — Resident care view
|
||||
**Privacy-mode-compatible** — only inferred wellbeing states
|
||||
shown. No biometric values exposed to this dashboard.
|
||||
|
||||
- type: vertical-stack
|
||||
cards:
|
||||
- type: horizontal-stack
|
||||
cards:
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_someone_sleeping
|
||||
name: Sleeping
|
||||
icon: mdi:sleep
|
||||
color: blue
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_room_active
|
||||
name: Active
|
||||
icon: mdi:home-account
|
||||
color: green
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_bathroom_occupied
|
||||
name: Bathroom
|
||||
icon: mdi:shower
|
||||
color: cyan
|
||||
|
||||
- type: horizontal-stack
|
||||
cards:
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_possible_distress
|
||||
name: Distress
|
||||
icon: mdi:alert-octagon
|
||||
color: red
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_elderly_inactivity_anomaly
|
||||
name: Inactivity anomaly
|
||||
icon: mdi:account-off
|
||||
color: orange
|
||||
- type: tile
|
||||
entity: binary_sensor.ruview_bedroom_no_movement
|
||||
name: No movement
|
||||
icon: mdi:hand-back-left-off
|
||||
color: amber
|
||||
|
||||
- type: gauge
|
||||
entity: sensor.ruview_bedroom_fall_risk_elevated
|
||||
name: Fall risk (24h trailing)
|
||||
min: 0
|
||||
max: 100
|
||||
severity:
|
||||
green: 0
|
||||
yellow: 40
|
||||
red: 70
|
||||
|
||||
- type: logbook
|
||||
title: 24h care events
|
||||
hours_to_show: 24
|
||||
entities:
|
||||
- event.ruview_bedroom_fall
|
||||
- event.ruview_bedroom_bed_exit
|
||||
- binary_sensor.ruview_bedroom_possible_distress
|
||||
- binary_sensor.ruview_bedroom_elderly_inactivity_anomaly
|
||||
- binary_sensor.ruview_bedroom_no_movement
|
||||
|
||||
- type: entity
|
||||
entity: binary_sensor.ruview_bedroom_presence
|
||||
name: Last presence change
|
||||
attribute: last_changed
|
||||
icon: mdi:clock-outline
|
||||
@@ -0,0 +1,47 @@
|
||||
# RuView Lovelace dashboards
|
||||
|
||||
Drop-in Lovelace dashboard YAMLs for three common deployment shapes.
|
||||
Paste the contents of any file into HA's **Lovelace raw config editor**
|
||||
(Settings → Dashboards → ⋮ → Edit dashboard → ⋮ → Raw config editor)
|
||||
and edit the `binary_sensor.ruview_<room>_*` entity IDs to match what
|
||||
HA auto-discovered from your RuView nodes.
|
||||
|
||||
| # | View | When to use |
|
||||
|---|-----------------------------------|----------------------------------------|
|
||||
| 1 | [Single-room overview](01-single-room-overview.yaml) | One RuView node, full 21-entity surface |
|
||||
| 2 | [Multi-node grid](02-multi-node-grid.yaml) | 3+ RuView nodes (whole-house deploy) |
|
||||
| 3 | [Healthcare / AAL view](03-healthcare-aal-view.yaml) | Care-giver dashboard; **privacy-mode-safe** (no biometrics shown) |
|
||||
|
||||
## Renaming entities
|
||||
|
||||
RuView's MQTT auto-discovery generates entity IDs from the node's MAC
|
||||
address by default (`binary_sensor.ruview_aabbccddeeff_presence`).
|
||||
To get friendly names like `binary_sensor.ruview_bedroom_presence`,
|
||||
either:
|
||||
|
||||
1. **Rename in HA** — open the entity, click the settings cog, change
|
||||
the entity ID. HA stores the rename in its own DB; the MQTT
|
||||
discovery topic stays the same.
|
||||
2. **Set `node_friendly_name`** in the sensing-server NVS config (per
|
||||
ADR-115 §9.6 maintainer-ACK'd decision: NVS-only, no ADR-039
|
||||
packet change). HA picks the friendly name up at next discovery
|
||||
refresh.
|
||||
|
||||
## Privacy-mode compatibility
|
||||
|
||||
The third dashboard is designed for healthcare / AAL deployments where
|
||||
`--privacy-mode` is set on the sensing-server. Under privacy mode:
|
||||
|
||||
- HR / BR / pose entities never reach HA (discovery is suppressed).
|
||||
- Semantic primitives (someone_sleeping, possible_distress, etc.)
|
||||
continue to publish because they're inferred *states* server-side,
|
||||
not biometric *values*.
|
||||
|
||||
The healthcare dashboard binds only to semantic-primitive entities,
|
||||
so it remains useful — and HIPAA / GDPR-cleaner — under privacy mode.
|
||||
|
||||
## Linked
|
||||
|
||||
- [ADR-115](../../docs/adr/ADR-115-home-assistant-integration.md) — full design
|
||||
- [`docs/integrations/home-assistant.md`](../../docs/integrations/home-assistant.md)
|
||||
- [`examples/ha-blueprints/`](../ha-blueprints/) — 8 starter automations
|
||||
Reference in New Issue
Block a user