sensor: # ARCHITECTURE (2026-09-02, HA 2026.8) — two layers, do not re-merge: # RAW layer (platform snmp, below): transport only. NO unit_of_measurement # and NO device_class — HA 2026.8 raises ValueError at entity ADD when a # unit-bearing sensor's native_value is non-numeric (host down/asleep at # boot renders '' or the literal string 'unknown'; even {{ none }} is # stringified to 'None'). Unit-bearing adds CRASH and the entity vanishes. # SEMANTIC layer (template: below): carries unit + device_class under the # ORIGINAL unique_ids (registry keeps the original entity_ids so dashboards # and automations are unaffected). Template platform degrades to unknown # gracefully. value must never render empty — guard with is_number(). # --- RAW SNMP transport (lm-sensors / drac / pdu extends) --- - platform: snmp name: "PFV artroom temperature raw" host: stlpc-artroom.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_artroom_temperature_raw value_template: >- {% 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 if c is not none }} - platform: snmp name: "PFV garage temperature raw" host: stlpc-garage.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_garage_temperature_raw value_template: >- {% 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 if c is not none }} - platform: snmp name: "PFV tsys1 rack 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_rack_temperature_raw value_template: >- {% 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 if c is not none }} - platform: snmp name: "PFV tsys3 CPU 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_cpu_temperature_raw value_template: >- {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys4 ambient 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_ambient_temperature_raw value_template: >- {% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys5 ambient 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_ambient_temperature_raw value_template: >- {% set m = value | regex_findall('Ambient:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys6 CPU temperature raw" host: pfv-tsys6.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_tsys6_cpu_temperature_raw value_template: >- {% set m = value | regex_findall('Core 0:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys6 node power raw" host: pfv-tsys6.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_tsys6_node_power_raw value_template: >- {% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys7 CPU temperature raw" host: pfv-tsys7.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_tsys7_cpu_temperature_raw value_template: >- {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys7 node power raw" host: pfv-tsys7.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_tsys7_node_power_raw value_template: >- {% set m = value | regex_findall('power1:\s*(\d+\.?\d*)\s*W') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys9 CPU 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_cpu_temperature_raw value_template: >- {% set m = value | regex_findall('Package id 0:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV jetson 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_temperature_raw value_template: >- {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV svrpi temperature raw" host: pfvsvrpi.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_svrpi_temperature_raw value_template: >- {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV subopi3 temperature raw" host: subopi3.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_subopi3_temperature_raw value_template: >- {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV subopi-dev-3 temperature raw" host: subopi-dev-3.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_subopi_dev_3_temperature_raw value_template: >- {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV subopi-dev-4 temperature raw" host: subopi-dev-4.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_subopi_dev_4_temperature_raw value_template: >- {% set m = value | regex_findall('temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys6 DRAC ambient raw" host: pfv-tsys6.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.4.100.114.97.99 accept_errors: true unique_id: pfv_tsys6_drac_ambient_raw value_template: >- {% set m = value | regex_findall('ambient_temp (\d+)') %} {{ m[0] | float if m | length > 0 }} - platform: snmp name: "PFV tsys7 DRAC inlet raw" host: pfv-tsys7.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.4.100.114.97.99 accept_errors: true unique_id: pfv_tsys7_drac_inlet_raw value_template: >- {% set m = value | regex_findall('inlet_temp (\d+)') %} {{ m[0] | float if m | length > 0 }} - platform: snmp name: "PFV tsys7 DRAC exhaust raw" host: pfv-tsys7.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.4.100.114.97.99 accept_errors: true unique_id: pfv_tsys7_drac_exhaust_raw value_template: >- {% set m = value | regex_findall('exhaust_temp (\d+)') %} {{ m[0] | float if m | length > 0 }} - platform: snmp name: "PFV tsys7 DRAC CPU1 raw" host: pfv-tsys7.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.4.100.114.97.99 accept_errors: true unique_id: pfv_tsys7_drac_cpu1_raw value_template: >- {% set t = value | regex_findall('(?:^|\n)temp (\d+)') %} {{ t[0] | float if t | length > 0 }} - platform: snmp name: "PFV tsys7 DRAC CPU2 raw" host: pfv-tsys7.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.4.100.114.97.99 accept_errors: true unique_id: pfv_tsys7_drac_cpu2_raw value_template: >- {% set t = value | regex_findall('(?:^|\n)temp (\d+)') %} {{ t[1] | float if t | length > 1 }} - platform: snmp name: "PFV garage PDU output current raw" host: tsys-librenms.knel.net version: 2c community: kn3lmgmt baseoid: .1.3.6.1.4.1.8072.1.3.2.3.1.2.9.103.97.114.97.103.101.112.100.117 accept_errors: true unique_id: pfv_garage_pdu_amps_raw value_template: >- {% set m = value | regex_findall('output_amps ([0-9.]+)') %} {{ m[0] | float if m | length > 0 }} # --- Storage / memory / chipset temps (already in lm-sensors output) --- # DIMM patterns anchor to the jc42 i2c address — a bare 'temp1:' regex # would match the wrong chip (each host has several temp1 lines). The jc42 # ALARM flags are a limits-read artifact (limits read as 0.0C); values are good. - platform: snmp name: "PFV tsys3 NVMe 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_nvme_temperature_raw value_template: >- {% set m = value | regex_findall('Composite:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys3 PCH 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_pch_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)pch_skylake.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys4 DIMM 18 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_dimm_18_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)jc42-i2c-0-18.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys4 DIMM 19 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_dimm_19_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)jc42-i2c-0-19.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys4 DIMM 1a 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_dimm_1a_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)jc42-i2c-0-1a.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys4 DIMM 1b 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_dimm_1b_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)jc42-i2c-0-1b.*?temp1:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys5 NVMe 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_nvme_temperature_raw value_template: >- {% set m = value | regex_findall('Composite:\s*\+?(-?\d+\.?\d*)') %} {{ m | first | float if m }} - platform: snmp name: "PFV tsys9 PCH 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_pch_temperature_raw value_template: >- {% set m = value | regex_findall('(?s)pch_cometlake.*?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 name: pfv garage PDU energy round: 2 unit_prefix: k unit_time: h method: left unique_id: pfv_garage_pdu_energy # --- Rate-of-change early warning (#682): +10°F/15min = AC trouble [#344] --- binary_sensor: - platform: trend sensors: server_room_temp_rising: entity_id: sensor.pfv_tsys1_rack_temperature sample_duration: 900 min_gradient: 0.011 unique_id: trend_server_room_rising tsys6_ambient_rising: entity_id: sensor.pfv_tsys6_drac_ambient sample_duration: 900 min_gradient: 0.011 unique_id: trend_tsys6_ambient_rising tsys7_inlet_rising: entity_id: sensor.pfv_tsys7_drac_inlet sample_duration: 900 min_gradient: 0.011 unique_id: trend_tsys7_inlet_rising garage_temp_rising: entity_id: sensor.pfv_garage_temperature sample_duration: 900 min_gradient: 0.011 unique_id: trend_garage_rising utility_meter: garage_pdu_daily: source: sensor.pfv_garage_pdu_energy name: Garage PDU daily energy unique_id: garage_pdu_daily_energy cycle: daily template: - sensor: - name: "PFV artroom temperature" unique_id: pfv_artroom_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_artroom_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV garage temperature" unique_id: pfv_garage_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_garage_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys1 rack temperature" unique_id: pfv_tsys1_rack_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys1_rack_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys3 CPU temperature" unique_id: pfv_tsys3_cpu_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys3_cpu_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys4 ambient temperature" unique_id: pfv_tsys4_ambient_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys4_ambient_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys5 ambient temperature" unique_id: pfv_tsys5_ambient_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys5_ambient_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys6 CPU temperature" unique_id: pfv_tsys6_cpu_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys6_cpu_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys6 node power" unique_id: pfv_tsys6_node_power device_class: power unit_of_measurement: "W" state: >- {% set v = states('sensor.pfv_tsys6_node_power_raw') %} {{ v | float | round(1) if is_number(v) else none }} - name: "PFV tsys7 CPU temperature" unique_id: pfv_tsys7_cpu_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys7_cpu_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys7 node power" unique_id: pfv_tsys7_node_power device_class: power unit_of_measurement: "W" state: >- {% set v = states('sensor.pfv_tsys7_node_power_raw') %} {{ v | float | round(1) if is_number(v) else none }} - name: "PFV tsys9 CPU temperature" unique_id: pfv_tsys9_cpu_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys9_cpu_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV jetson temperature" unique_id: pfv_jetson_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_jetson_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV svrpi temperature" unique_id: pfv_svrpi_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_svrpi_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV subopi3 temperature" unique_id: pfv_subopi3_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_subopi3_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV subopi-dev-3 temperature" unique_id: pfv_subopi_dev_3_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_subopi_dev_3_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV subopi-dev-4 temperature" unique_id: pfv_subopi_dev_4_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_subopi_dev_4_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys6 DRAC ambient" unique_id: pfv_tsys6_drac_ambient device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys6_drac_ambient_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys7 DRAC inlet" unique_id: pfv_tsys7_drac_inlet device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys7_drac_inlet_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys7 DRAC exhaust" unique_id: pfv_tsys7_drac_exhaust device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys7_drac_exhaust_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys7 DRAC CPU1" unique_id: pfv_tsys7_drac_cpu1 device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys7_drac_cpu1_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys7 DRAC CPU2" unique_id: pfv_tsys7_drac_cpu2 device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys7_drac_cpu2_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV garage PDU output current" unique_id: pfv_garage_pdu_amps device_class: current unit_of_measurement: "A" state: >- {% set v = states('sensor.pfv_garage_pdu_output_current_raw') %} {{ v | float | round(1) if is_number(v) else none }} - name: "PFV garage PDU power" unique_id: pfv_garage_pdu_watts device_class: power unit_of_measurement: "W" state: >- {% set a = states('sensor.pfv_garage_pdu_output_current') | float(-1) %} {{ (a * 120) | round(0) if a >= 0 }} - name: "PFV tsys3 NVMe temperature" unique_id: pfv_tsys3_nvme_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys3_nvme_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys3 PCH temperature" unique_id: pfv_tsys3_pch_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys3_pch_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys4 DIMM 18 temperature" unique_id: pfv_tsys4_dimm_18_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys4_dimm_18_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys4 DIMM 19 temperature" unique_id: pfv_tsys4_dimm_19_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys4_dimm_19_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys4 DIMM 1a temperature" unique_id: pfv_tsys4_dimm_1a_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys4_dimm_1a_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys4 DIMM 1b temperature" unique_id: pfv_tsys4_dimm_1b_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys4_dimm_1b_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys5 NVMe temperature" unique_id: pfv_tsys5_nvme_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys5_nvme_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }} - name: "PFV tsys9 PCH temperature" unique_id: pfv_tsys9_pch_temperature device_class: temperature unit_of_measurement: "°F" state: >- {% set v = states('sensor.pfv_tsys9_pch_temperature_raw') %} {{ ((v | float * 9 / 5) + 32) | round(1) if is_number(v) else none }}