From 6414fee6ec683652a9f3610c4e762f8a37281d65 Mon Sep 17 00:00:00 2001 From: reachableceo Date: Wed, 2 Sep 2026 21:16:34 -0500 Subject: [PATCH] feat(sensors): labeled per-zone thermal layer in lmsensors-extend [#736] Hosts opt in via /etc/snmp/lmsensors-zone-types (one zone type per line, e.g. Jetson GPU-therm); each type renders its own zone- chip block so HA templates anchor on the chip name. Default behavior unchanged; no snmpd restarts (extend re-execs per poll). --- dcinfra/sensors/temper/lmsensors-extend.sh | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/dcinfra/sensors/temper/lmsensors-extend.sh b/dcinfra/sensors/temper/lmsensors-extend.sh index c8f5a06..9919354 100644 --- a/dcinfra/sensors/temper/lmsensors-extend.sh +++ b/dcinfra/sensors/temper/lmsensors-extend.sh @@ -134,6 +134,32 @@ format_sysfs_block() { done <<<"$input" } +# Labeled per-zone temps (e.g. Jetson GPU-therm) [#736]. Hosts opt in by +# listing zone types (one per line) in /etc/snmp/lmsensors-zone-types; no +# snmpd.conf change or restart needed (extend re-execs per poll). Each type +# renders its own chip block so HA templates can anchor on the chip name. +ZONE_TYPES_FILE="${ZONE_TYPES_FILE:-/etc/snmp/lmsensors-zone-types}" + +format_labeled_zones() { + local z type mc want signed + [[ -r "$ZONE_TYPES_FILE" ]] || return 1 + while IFS= read -r want; do + want="${want%%#*}"; want="${want//[[:space:]]/}" + [[ -n "$want" ]] || continue + for z in "$SYSFS_THERMAL_ROOT"/thermal_zone[0-9]*; do + [[ -r "$z/type" && -r "$z/temp" ]] || continue + [[ "$(<"$z/type")" == "$want" ]] || continue + mc="$(<"$z/temp")" + [[ "$mc" =~ ^-?[0-9]+$ ]] || continue + signed="$(awk -v mc="$mc" 'BEGIN { printf "%.1f", mc / 1000 }')" + signed="${signed#+}" + [[ "$signed" == -* ]] || signed="+$signed" + printf 'zone-%s-virtual-0\nAdapter: Virtual device\ntemp1: %s°C\n\n' "$want" "$signed" + done + done <"$ZONE_TYPES_FILE" + return 0 +} + main() { local out="" block internal external native="" sysinput if native="$(run_native_sensors)" && [[ -n "$native" ]]; then @@ -155,6 +181,9 @@ main() { && block="$(format_sysfs_block "$sysinput")"; then out+="$block"$'\n' fi + if block="$(format_labeled_zones)" && [[ -n "$block" ]]; then + out+="$block"$'\n' + fi [[ -n "$out" ]] || { echo "error: no sensor sources available (lm-sensors pkg? TEMPer venv? sysfs thermal?)" >&2 return 1