From e6f4032865cf6a924c1e4d56ed86372ff535f6f7 Mon Sep 17 00:00:00 2001 From: reachableceo Date: Thu, 3 Sep 2026 16:12:18 -0500 Subject: [PATCH] feat(plant): temperature RECOVERY alerts - tiered clear notifications [#344] Recovery twin of the high-temperature alert: per-tier below-triggers (fire-line minus 5F, held 10 min), from_state guard against restart false-positives, peak-value reporting. Matches existing notify targets; UPS on-battery already had its restored twin. Detail: https://projects.knownelement.com/issues/344 --- automations.yaml | 136 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/automations.yaml b/automations.yaml index a7dd578..c86dabe 100644 --- a/automations.yaml +++ b/automations.yaml @@ -371,3 +371,139 @@ pulled. Restarting HA core (webhook re-registration) - back in ~1 min. - action: homeassistant.restart +- id: pfv_plant_temperature_recovered + alias: PFV plant - temperature recovered + description: >- + Recovery twin of the high-temperature alert [#344 ask 2026-09-03]: + notify when a sensor that was OVER its tier drops back below + (fire-line minus 5F hysteresis) and HOLDS there for 10 minutes. + from_state guard prevents spurious fires at HA restart; the tier + map mirrors the high-temperature automation thresholds exactly. + triggers: + - trigger: numeric_state + entity_id: + - sensor.pfv_tsys3_nvme_temperature + - sensor.pfv_tsys5_nvme_temperature + below: 145 + for: 00:10:00 + - trigger: numeric_state + entity_id: + - sensor.pfv_tsys4_dimm_18_temperature + - sensor.pfv_tsys4_dimm_19_temperature + - sensor.pfv_tsys4_dimm_1a_temperature + - sensor.pfv_tsys4_dimm_1b_temperature + below: 135 + for: 00:10:00 + - 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 + below: 135 + for: 00:10:00 + - trigger: numeric_state + entity_id: + - sensor.pfv_tsys3_gpu_temperature + - sensor.pfv_jetson_gpu_temperature + below: 180 + for: 00:10:00 + - trigger: numeric_state + entity_id: + - sensor.pfv_tsys3_pch_temperature + - sensor.pfv_tsys9_pch_temperature + below: 155 + for: 00:10:00 + - trigger: numeric_state + entity_id: + - sensor.pfv_tsys3_cpu_temperature + - sensor.pfv_tsys6_cpu_temperature + - sensor.pfv_tsys7_cpu_temperature + - sensor.pfv_tsys9_cpu_temperature + - sensor.pfv_tsys7_drac_cpu1 + - sensor.pfv_tsys7_drac_cpu2 + - sensor.pfv_jetson_temperature + - sensor.pfv_svrpi_temperature + - sensor.pfv_subopi3_temperature + - sensor.pfv_subopi_dev_3_temperature + - sensor.pfv_subopi_dev_4_temperature + below: 171 + for: 00:10:00 + - trigger: numeric_state + entity_id: + - sensor.pfv_artroom_temperature + - sensor.pfv_garage_temperature + - sensor.pfv_tsys1_rack_temperature + - sensor.pfv_tsys4_ambient_temperature + - sensor.pfv_tsys5_ambient_temperature + - sensor.pfv_tsys6_drac_ambient + - sensor.pfv_tsys7_drac_inlet + - sensor.pfv_tsys7_drac_exhaust + below: 99 + for: 00:10:00 + actions: + - variables: + fire_lines: + sensor.pfv_tsys3_nvme_temperature: 150 + sensor.pfv_tsys5_nvme_temperature: 150 + sensor.pfv_tsys4_dimm_18_temperature: 140 + sensor.pfv_tsys4_dimm_19_temperature: 140 + sensor.pfv_tsys4_dimm_1a_temperature: 140 + sensor.pfv_tsys4_dimm_1b_temperature: 140 + sensor.pfv_tsys1_drive_temperature: 140 + sensor.pfv_tsys4_drive_0_0_temperature: 140 + sensor.pfv_tsys4_drive_0_10_temperature: 140 + sensor.pfv_tsys4_drive_1_0_temperature: 140 + sensor.pfv_tsys4_drive_1_10_temperature: 140 + sensor.pfv_tsys5_drive_1_0_temperature: 140 + sensor.pfv_tsys5_drive_4_10_temperature: 140 + sensor.pfv_tsys5_drive_4_20_temperature: 140 + sensor.pfv_tsys5_drive_4_30_temperature: 140 + sensor.pfv_tsys9_drive_temperature: 140 + sensor.pfv_tsys3_gpu_temperature: 185 + sensor.pfv_jetson_gpu_temperature: 185 + sensor.pfv_tsys3_pch_temperature: 160 + sensor.pfv_tsys9_pch_temperature: 160 + sensor.pfv_tsys3_cpu_temperature: 176 + sensor.pfv_tsys6_cpu_temperature: 176 + sensor.pfv_tsys7_cpu_temperature: 176 + sensor.pfv_tsys9_cpu_temperature: 176 + sensor.pfv_tsys7_drac_cpu1: 176 + sensor.pfv_tsys7_drac_cpu2: 176 + sensor.pfv_jetson_temperature: 176 + sensor.pfv_svrpi_temperature: 176 + sensor.pfv_subopi3_temperature: 176 + sensor.pfv_subopi_dev_3_temperature: 176 + sensor.pfv_subopi_dev_4_temperature: 176 + sensor.pfv_artroom_temperature: 104 + sensor.pfv_garage_temperature: 104 + sensor.pfv_tsys1_rack_temperature: 104 + sensor.pfv_tsys4_ambient_temperature: 104 + sensor.pfv_tsys5_ambient_temperature: 104 + sensor.pfv_tsys6_drac_ambient: 104 + sensor.pfv_tsys7_drac_inlet: 104 + sensor.pfv_tsys7_drac_exhaust: 104 + fire: "{{ fire_lines.get(trigger.entity_id, 0) | int }}" + - condition: template + value_template: >- + {{ trigger.from_state is not none + and trigger.from_state.state not in ['unavailable', 'unknown', 'none'] + and trigger.from_state.state | float(-1) >= fire }} + - action: notify.send_message + target: + entity_id: + - notify.ultix_sidecar_new + - notify.allthes_ipad + data: + title: TEMPERATURE RECOVERED + message: >- + {{ state_attr(trigger.entity_id, 'friendly_name') | default(trigger.entity_id) }} + back to {{ states(trigger.entity_id) }}°F and holding — was + {{ trigger.from_state.state }}°F when the alert cleared (tier fire line {{ fire }}°F). + mode: single