feat(dashboards): garage + artroom; health heart view; fleet-wide unknown-render fix [#618][#344][#625]

This commit is contained in:
2026-09-02 16:45:09 -05:00
parent 206392c6c7
commit 12af66e1ae
5 changed files with 115 additions and 16 deletions
+10
View File
@@ -29,3 +29,13 @@ lovelace:
title: Health title: Health
filename: dashboards/health.yaml filename: dashboards/health.yaml
icon: mdi:heart-pulse icon: mdi:heart-pulse
pfv-garage:
mode: yaml
title: Garage
filename: dashboards/garage.yaml
icon: mdi:garage
pfv-artroom:
mode: yaml
title: Art Room
filename: dashboards/artroom.yaml
icon: mdi:palette
+32
View File
@@ -0,0 +1,32 @@
# Art Room dashboard [#618] — git-deployed via KNEL/pfv-bms
# Sources: TEMPer on stlpc-artroom, Canon printer toners (IPP).
# OctoPrint x2 + 3 3D printers land Friday (#466).
title: Art Room
views:
- title: Art Room
type: sections
sections:
- type: grid
cards:
- type: gauge
entity: sensor.pfv_artroom_temperature
name: Art room temp
min: 50
max: 100
unit: "°F"
- type: history-graph
title: Art room temp (24h)
entities:
- sensor.pfv_artroom_temperature
hours_to_show: 24
- type: entities
title: Printer — toner
entities:
- sensor.cnmf731c_733c_canon_cartridge_046_black_toner
- sensor.cnmf731c_733c_canon_cartridge_046_cyan_ton
- sensor.cnmf731c_733c_canon_cartridge_046_magenta_to
- sensor.cnmf731c_733c_canon_cartridge_046_yellow_ton
- type: markdown
content: >
**Pending:** TR4500 status, OctoPrint x2 + 3D printers (#466,
Friday).
+24
View File
@@ -0,0 +1,24 @@
# Garage dashboard [#618] — git-deployed via KNEL/pfv-bms
# Sources: TEMPer on stlpc-garage. PDU power/temp pending integration (#374/#351).
title: Garage
views:
- title: Garage
type: sections
sections:
- type: grid
cards:
- type: gauge
entity: sensor.pfv_garage_temperature
name: Garage temp
min: 40
max: 110
unit: "°F"
- type: history-graph
title: Garage temp (24h)
entities:
- sensor.pfv_garage_temperature
hours_to_show: 24
- type: markdown
content: >
**Pending:** garage PDU power + temp (#374 outlet naming,
#351 network onboarding), minisplit BTU context (#614).
+33
View File
@@ -29,6 +29,39 @@ views:
entities: entities:
- person.charles_n_wyble - person.charles_n_wyble
hours_to_show: 168 hours_to_show: 168
- title: Heart
type: sections
sections:
- type: grid
cards:
- type: gauge
entity: sensor.ultix_mini_heart_rate
name: Heart rate
unit: bpm
min: 40
max: 180
severity:
green: 50
yellow: 100
red: 140
- type: entities
title: Heart metrics
entities:
- sensor.ultix_mini_heart_rate
- sensor.ultix_mini_resting_heart_rate
- sensor.ultix_mini_walking_heart_rate_average
- sensor.ultix_mini_heart_rate_variability
- type: history-graph
title: Heart rate (24h)
entities:
- sensor.ultix_mini_heart_rate
hours_to_show: 24
- type: history-graph
title: Heart rate (7d)
entities:
- sensor.ultix_mini_heart_rate
- sensor.ultix_mini_resting_heart_rate
hours_to_show: 168
- title: Body temp - title: Body temp
type: sections type: sections
sections: sections:
+16 -16
View File
@@ -15,7 +15,7 @@ sensor:
{% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %} {% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %}
{% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %} {% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %}
{% set c = (ext | first) if ext else ((int | first) if int else none) %} {% set c = (ext | first) if ext else ((int | first) if int else none) %}
{{ ((c | float * 9 / 5) + 32) | round(1) if c is not none else 'unknown' }} {{ ((c | float * 9 / 5) + 32) | round(1) if c is not none }}
- platform: snmp - platform: snmp
name: "PFV garage temperature" name: "PFV garage temperature"
@@ -32,7 +32,7 @@ sensor:
{% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %} {% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %}
{% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %} {% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %}
{% set c = (ext | first) if ext else ((int | first) if int else none) %} {% set c = (ext | first) if ext else ((int | first) if int else none) %}
{{ ((c | float * 9 / 5) + 32) | round(1) if c is not none else 'unknown' }} {{ ((c | float * 9 / 5) + 32) | round(1) if c is not none }}
- platform: snmp - platform: snmp
name: "PFV tsys1 rack temperature" name: "PFV tsys1 rack temperature"
@@ -49,7 +49,7 @@ sensor:
{% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %} {% set ext = value | regex_findall('External:\s*\+?(-?\d+\.?\d*)') %}
{% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %} {% set int = value | regex_findall('Internal:\s*\+?(-?\d+\.?\d*)') %}
{% set c = (ext | first) if ext else ((int | first) if int else none) %} {% set c = (ext | first) if ext else ((int | first) if int else none) %}
{{ ((c | float * 9 / 5) + 32) | round(1) if c is not none else 'unknown' }} {{ ((c | float * 9 / 5) + 32) | round(1) if c is not none }}
# --- Native lm-sensors hosts (label picked per host ground truth 2026-08-27) --- # --- Native lm-sensors hosts (label picked per host ground truth 2026-08-27) ---
# tsys3 Precision 7510: CPU package # tsys3 Precision 7510: CPU package
@@ -66,7 +66,7 @@ sensor:
unique_id: pfv_tsys3_cpu_temperature unique_id: pfv_tsys3_cpu_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# tsys4 Precision T1700: Dell SMM ambient (board inlet) # tsys4 Precision T1700: Dell SMM ambient (board inlet)
- platform: snmp - platform: snmp
@@ -82,7 +82,7 @@ sensor:
unique_id: pfv_tsys4_ambient_temperature unique_id: pfv_tsys4_ambient_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# tsys5 Precision T7500: Dell SMM ambient (board inlet) # tsys5 Precision T7500: Dell SMM ambient (board inlet)
- platform: snmp - platform: snmp
@@ -98,7 +98,7 @@ sensor:
unique_id: pfv_tsys5_ambient_temperature unique_id: pfv_tsys5_ambient_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# tsys6 PowerEdge R610: socket-0 core temp (no Package label on Westmere) # tsys6 PowerEdge R610: socket-0 core temp (no Package label on Westmere)
- platform: snmp - platform: snmp
@@ -114,7 +114,7 @@ sensor:
unique_id: pfv_tsys6_cpu_temperature unique_id: pfv_tsys6_cpu_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Core 0:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Core 0:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# tsys6 ACPI power meter (node draw, watts) # tsys6 ACPI power meter (node draw, watts)
- platform: snmp - platform: snmp
@@ -130,7 +130,7 @@ sensor:
unique_id: pfv_tsys6_node_power unique_id: pfv_tsys6_node_power
value_template: >- value_template: >-
{% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %} {% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %}
{{ m | first | float if m else 'unknown' }} {{ m | first | float if m }}
# tsys7 PowerEdge R620: package temp # tsys7 PowerEdge R620: package temp
- platform: snmp - platform: snmp
@@ -146,7 +146,7 @@ sensor:
unique_id: pfv_tsys7_cpu_temperature unique_id: pfv_tsys7_cpu_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# tsys7 ACPI power meter (node draw, watts) # tsys7 ACPI power meter (node draw, watts)
- platform: snmp - platform: snmp
@@ -162,7 +162,7 @@ sensor:
unique_id: pfv_tsys7_node_power unique_id: pfv_tsys7_node_power
value_template: >- value_template: >-
{% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %} {% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %}
{{ m | first | float if m else 'unknown' }} {{ m | first | float if m }}
# tsys9 OptiPlex 7080: package temp # tsys9 OptiPlex 7080: package temp
- platform: snmp - platform: snmp
@@ -178,7 +178,7 @@ sensor:
unique_id: pfv_tsys9_cpu_temperature unique_id: pfv_tsys9_cpu_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# --- SBC fleet (sysfs thermal fallback in lmsensors-extend v2; temp1 = zone0/SoC) --- # --- SBC fleet (sysfs thermal fallback in lmsensors-extend v2; temp1 = zone0/SoC) ---
- platform: snmp - platform: snmp
@@ -194,7 +194,7 @@ sensor:
unique_id: pfv_jetson_temperature unique_id: pfv_jetson_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
- platform: snmp - platform: snmp
name: "PFV svrpi temperature" name: "PFV svrpi temperature"
@@ -209,7 +209,7 @@ sensor:
unique_id: pfv_svrpi_temperature unique_id: pfv_svrpi_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
- platform: snmp - platform: snmp
name: "PFV subopi3 temperature" name: "PFV subopi3 temperature"
@@ -224,7 +224,7 @@ sensor:
unique_id: pfv_subopi3_temperature unique_id: pfv_subopi3_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
- platform: snmp - platform: snmp
name: "PFV subopi-dev-3 temperature" name: "PFV subopi-dev-3 temperature"
@@ -239,7 +239,7 @@ sensor:
unique_id: pfv_subopi_dev_3_temperature unique_id: pfv_subopi_dev_3_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
- platform: snmp - platform: snmp
name: "PFV subopi-dev-4 temperature" name: "PFV subopi-dev-4 temperature"
@@ -254,7 +254,7 @@ sensor:
unique_id: pfv_subopi_dev_4_temperature unique_id: pfv_subopi_dev_4_temperature
value_template: >- value_template: >-
{% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ ((m | first | float * 9 / 5) + 32) | round(1) if m else 'unknown' }} {{ ((m | first | float * 9 / 5) + 32) | round(1) if m }}
# --- iDRAC IPMI temps via drac-extend (SNMP MIB tables empty on this hw gen) [#625] --- # --- iDRAC IPMI temps via drac-extend (SNMP MIB tables empty on this hw gen) [#625] ---