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
+232
View File
@@ -380,6 +380,154 @@ sensor:
{% set m = value | regex_findall('(?s)pch_cometlake.*?temp1:\s*\+?(-?\d+\.?\d*)') %}
{{ 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] ---
- platform: integration
source: sensor.pfv_garage_pdu_power
@@ -648,3 +796,87 @@ template:
state: >-
{% set v = states('sensor.tsys1_ups_battery_runtime') %}
{{ (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 }}