From 12af66e1aede7203bf750157f9249f7094ffadda Mon Sep 17 00:00:00 2001 From: reachableceo Date: Wed, 2 Sep 2026 16:45:09 -0500 Subject: [PATCH] feat(dashboards): garage + artroom; health heart view; fleet-wide unknown-render fix [#618][#344][#625] --- configuration.yaml | 10 ++++++++++ dashboards/artroom.yaml | 32 ++++++++++++++++++++++++++++++++ dashboards/garage.yaml | 24 ++++++++++++++++++++++++ dashboards/health.yaml | 33 +++++++++++++++++++++++++++++++++ packages/plant_snmp.yaml | 32 ++++++++++++++++---------------- 5 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 dashboards/artroom.yaml create mode 100644 dashboards/garage.yaml diff --git a/configuration.yaml b/configuration.yaml index fa0bcbf..e367ac7 100644 --- a/configuration.yaml +++ b/configuration.yaml @@ -29,3 +29,13 @@ lovelace: title: Health filename: dashboards/health.yaml 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 diff --git a/dashboards/artroom.yaml b/dashboards/artroom.yaml new file mode 100644 index 0000000..2dbbead --- /dev/null +++ b/dashboards/artroom.yaml @@ -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). diff --git a/dashboards/garage.yaml b/dashboards/garage.yaml new file mode 100644 index 0000000..68adc84 --- /dev/null +++ b/dashboards/garage.yaml @@ -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). diff --git a/dashboards/health.yaml b/dashboards/health.yaml index 63049e1..64c2c60 100644 --- a/dashboards/health.yaml +++ b/dashboards/health.yaml @@ -29,6 +29,39 @@ views: entities: - person.charles_n_wyble 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 type: sections sections: diff --git a/packages/plant_snmp.yaml b/packages/plant_snmp.yaml index 4a475e5..b4ade1b 100644 --- a/packages/plant_snmp.yaml +++ b/packages/plant_snmp.yaml @@ -15,7 +15,7 @@ sensor: {% set ext = value | regex_findall('External:\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) %} - {{ ((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 name: "PFV garage temperature" @@ -32,7 +32,7 @@ sensor: {% set ext = value | regex_findall('External:\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) %} - {{ ((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 name: "PFV tsys1 rack temperature" @@ -49,7 +49,7 @@ sensor: {% set ext = value | regex_findall('External:\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) %} - {{ ((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) --- # tsys3 Precision 7510: CPU package @@ -66,7 +66,7 @@ sensor: unique_id: pfv_tsys3_cpu_temperature value_template: >- {% 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) - platform: snmp @@ -82,7 +82,7 @@ sensor: unique_id: pfv_tsys4_ambient_temperature value_template: >- {% 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) - platform: snmp @@ -98,7 +98,7 @@ sensor: unique_id: pfv_tsys5_ambient_temperature value_template: >- {% 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) - platform: snmp @@ -114,7 +114,7 @@ sensor: unique_id: pfv_tsys6_cpu_temperature value_template: >- {% 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) - platform: snmp @@ -130,7 +130,7 @@ sensor: unique_id: pfv_tsys6_node_power value_template: >- {% 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 - platform: snmp @@ -146,7 +146,7 @@ sensor: unique_id: pfv_tsys7_cpu_temperature value_template: >- {% 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) - platform: snmp @@ -162,7 +162,7 @@ sensor: unique_id: pfv_tsys7_node_power value_template: >- {% 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 - platform: snmp @@ -178,7 +178,7 @@ sensor: unique_id: pfv_tsys9_cpu_temperature value_template: >- {% 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) --- - platform: snmp @@ -194,7 +194,7 @@ sensor: unique_id: pfv_jetson_temperature value_template: >- {% 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 name: "PFV svrpi temperature" @@ -209,7 +209,7 @@ sensor: unique_id: pfv_svrpi_temperature value_template: >- {% 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 name: "PFV subopi3 temperature" @@ -224,7 +224,7 @@ sensor: unique_id: pfv_subopi3_temperature value_template: >- {% 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 name: "PFV subopi-dev-3 temperature" @@ -239,7 +239,7 @@ sensor: unique_id: pfv_subopi_dev_3_temperature value_template: >- {% 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 name: "PFV subopi-dev-4 temperature" @@ -254,7 +254,7 @@ sensor: unique_id: pfv_subopi_dev_4_temperature value_template: >- {% 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] ---