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.
This commit is contained in:
2026-09-02 21:27:50 -05:00
parent bb863e61d9
commit 12492759bc
3 changed files with 263 additions and 1 deletions
+18
View File
@@ -119,6 +119,24 @@
- sensor.pfv_tsys4_dimm_1a_temperature - sensor.pfv_tsys4_dimm_1a_temperature
- sensor.pfv_tsys4_dimm_1b_temperature - sensor.pfv_tsys4_dimm_1b_temperature
above: 140 above: 140
- trigger: numeric_state
entity_id:
- sensor.pfv_tsys1_drive_temperature
- sensor.pfv_tsys4_drive_0_0_temperature
- sensor.pfv_tsys4_drive_0_10_temperature
- sensor.pfv_tsys4_drive_1_0_temperature
- sensor.pfv_tsys4_drive_1_10_temperature
- sensor.pfv_tsys5_drive_1_0_temperature
- sensor.pfv_tsys5_drive_4_10_temperature
- sensor.pfv_tsys5_drive_4_20_temperature
- sensor.pfv_tsys5_drive_4_30_temperature
- sensor.pfv_tsys9_drive_temperature
above: 140
- trigger: numeric_state
entity_id:
- sensor.pfv_tsys3_gpu_temperature
- sensor.pfv_jetson_gpu_temperature
above: 185
- trigger: numeric_state - trigger: numeric_state
entity_id: entity_id:
- sensor.pfv_tsys3_pch_temperature - sensor.pfv_tsys3_pch_temperature
+13 -1
View File
@@ -172,12 +172,14 @@ views:
- sensor.pfv_subopi_dev_3_temperature - sensor.pfv_subopi_dev_3_temperature
- sensor.pfv_subopi_dev_4_temperature - sensor.pfv_subopi_dev_4_temperature
- sensor.pfv_jetson_temperature - sensor.pfv_jetson_temperature
- sensor.pfv_jetson_gpu_temperature
- type: grid - type: grid
cards: cards:
- type: entities - type: entities
title: R5 · Laptops title: R5 · Laptops
entities: entities:
- sensor.pfv_tsys3_cpu_temperature - sensor.pfv_tsys3_cpu_temperature
- sensor.pfv_tsys3_gpu_temperature
- type: grid - type: grid
cards: cards:
- type: entities - type: entities
@@ -192,7 +194,7 @@ views:
- type: grid - type: grid
cards: cards:
- type: entities - type: entities
title: Storage · Memory · Chipset title: Storage · Memory · Chipset · GPU
entities: entities:
- sensor.pfv_tsys3_nvme_temperature - sensor.pfv_tsys3_nvme_temperature
- sensor.pfv_tsys5_nvme_temperature - sensor.pfv_tsys5_nvme_temperature
@@ -202,6 +204,16 @@ views:
- sensor.pfv_tsys4_dimm_1b_temperature - sensor.pfv_tsys4_dimm_1b_temperature
- sensor.pfv_tsys3_pch_temperature - sensor.pfv_tsys3_pch_temperature
- sensor.pfv_tsys9_pch_temperature - sensor.pfv_tsys9_pch_temperature
- sensor.pfv_tsys1_drive_temperature
- sensor.pfv_tsys4_drive_0_0_temperature
- sensor.pfv_tsys4_drive_0_10_temperature
- sensor.pfv_tsys4_drive_1_0_temperature
- sensor.pfv_tsys4_drive_1_10_temperature
- sensor.pfv_tsys5_drive_1_0_temperature
- sensor.pfv_tsys5_drive_4_10_temperature
- sensor.pfv_tsys5_drive_4_20_temperature
- sensor.pfv_tsys5_drive_4_30_temperature
- sensor.pfv_tsys9_drive_temperature
- type: grid - type: grid
cards: cards:
- type: history-graph - type: history-graph
+232
View File
@@ -380,6 +380,154 @@ sensor:
{% set m = value | regex_findall('(?s)pch_cometlake.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {% set m = value | regex_findall('(?s)pch_cometlake.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }} {{ m | first | float if m }}
# --- Drive temps (drivetemp) + GPU temps [#736] ---
# Drive chips are drivetemp-scsi-<host>-<id>; the trailing \n anchor keeps
# scsi-1-0 from matching scsi-1-10. Server disks behind PERC are NOT
# OS-visible (storcli gap, documented in #736).
- platform: snmp
name: "PFV tsys1 drive temperature raw"
host: pfv-tsys1.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys1_drive_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-1-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys4 drive 0-0 temperature raw"
host: pfv-tsys4.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys4_drive_0_0_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-0-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys4 drive 0-10 temperature raw"
host: pfv-tsys4.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys4_drive_0_10_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-0-10\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys4 drive 1-0 temperature raw"
host: pfv-tsys4.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys4_drive_1_0_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-1-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys4 drive 1-10 temperature raw"
host: pfv-tsys4.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys4_drive_1_10_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-1-10\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys5 drive 1-0 temperature raw"
host: pfv-tsys5.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys5_drive_1_0_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-1-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys5 drive 4-10 temperature raw"
host: pfv-tsys5.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys5_drive_4_10_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-4-10\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys5 drive 4-20 temperature raw"
host: pfv-tsys5.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys5_drive_4_20_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-4-20\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys5 drive 4-30 temperature raw"
host: pfv-tsys5.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys5_drive_4_30_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-4-30\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys9 drive temperature raw"
host: pfv-tsys9.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys9_drive_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)drivetemp-scsi-0-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV tsys3 GPU temperature raw"
host: pfv-tsys3.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_tsys3_gpu_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)nouveau.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
- platform: snmp
name: "PFV jetson GPU temperature raw"
host: pfv-jetson-nano-1.knel.net
version: 2c
community: kn3lmgmt
baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.108.109.115.101.110.115.111.114.115
accept_errors: true
unique_id: pfv_jetson_gpu_temperature_raw
value_template: >-
{% set m = value | regex_findall('(?s)zone-GPU-therm-virtual-0\n.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ m | first | float if m }}
# --- Garage PDU energy (kWh) integrated from watts [#344] --- # --- Garage PDU energy (kWh) integrated from watts [#344] ---
- platform: integration - platform: integration
source: sensor.pfv_garage_pdu_power source: sensor.pfv_garage_pdu_power
@@ -648,3 +796,87 @@ template:
state: >- state: >-
{% set v = states('sensor.tsys1_ups_battery_runtime') %} {% set v = states('sensor.tsys1_ups_battery_runtime') %}
{{ (v | float / 60) | round(0) if is_number(v) else none }} {{ (v | float / 60) | round(0) if is_number(v) else none }}
- name: "PFV tsys1 drive temperature"
unique_id: pfv_tsys1_drive_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys1_drive_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys4 drive 0-0 temperature"
unique_id: pfv_tsys4_drive_0_0_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys4_drive_0_0_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys4 drive 0-10 temperature"
unique_id: pfv_tsys4_drive_0_10_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys4_drive_0_10_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys4 drive 1-0 temperature"
unique_id: pfv_tsys4_drive_1_0_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys4_drive_1_0_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys4 drive 1-10 temperature"
unique_id: pfv_tsys4_drive_1_10_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys4_drive_1_10_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys5 drive 1-0 temperature"
unique_id: pfv_tsys5_drive_1_0_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys5_drive_1_0_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys5 drive 4-10 temperature"
unique_id: pfv_tsys5_drive_4_10_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys5_drive_4_10_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys5 drive 4-20 temperature"
unique_id: pfv_tsys5_drive_4_20_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys5_drive_4_20_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys5 drive 4-30 temperature"
unique_id: pfv_tsys5_drive_4_30_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys5_drive_4_30_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys9 drive temperature"
unique_id: pfv_tsys9_drive_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys9_drive_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV tsys3 GPU temperature"
unique_id: pfv_tsys3_gpu_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_tsys3_gpu_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}
- name: "PFV jetson GPU temperature"
unique_id: pfv_jetson_gpu_temperature
device_class: temperature
unit_of_measurement: "°F"
state: >-
{% set v = states('sensor.pfv_jetson_gpu_temperature_raw') %}
{{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}