FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Bartimaus am 21 Dezember 2025, 15:59:00

Titel: 42_SYSMON >> CPU-Temp @ AMD-Ryzen
Beitrag von: Bartimaus am 21 Dezember 2025, 15:59:00
Servus,

ich brauche mal Eure Hilfe.

Mein FHEM läuft als LXC auf einem ProxmoxHost mit AMD-Ryzen CPU.

Dort liest SYSMON leider nicht die CPU-Temperatur aus.

Auf meiner vorherigen Hardware (Intel-Celeron J41xx) wurde die Temperatur korrekt ausgelesen.

Wenn ich nun folgendende Befehle ausführe:

pi@fhem:~$ for i in /sys/class/hwmon/hwmon*; do   echo "$i: $(cat $i/name 2>/dev/null)"; done
/sys/class/hwmon/hwmon0: r8169_0_100:00
/sys/class/hwmon/hwmon1: nvme
/sys/class/hwmon/hwmon2: k10temp
/sys/class/hwmon/hwmon3: amdgpu

pi@fhem:~$ cat /sys/class/hwmon/hwmon2/temp1_input | awk '{print $1/1000}'
45

Bekomme ich zumindest in der Shell eine CPU-Temperatur angezeigt.

Wenn ich in der 42_SYSMON.pm nach "hwmon" suche, stosse ich auf folgende Codezeilen:

#------------------------------------------------------------------------------
# leifert CPU Temperature (mehrere Kerne eines ?)
#------------------------------------------------------------------------------
sub
SYSMON_getCPUTemp_X($$;$) {
  my ($hash, $map, $cpuNum) = @_;

  if($hash->{helper}->{excludes}{'cputemp'}) {return $map;}

  $cpuNum = 0 unless defined $cpuNum;

  my $val = SYSMON_execute($hash, "cat /sys/class/hwmon/hwmon0/device/hwmon/hwmon0/temp".($cpuNum+1)."_input 2>&1");
  $val = int($val);
  my $val_txt = sprintf("%.2f", $val/1000);
  $map->{"cpu".$cpuNum."_temp"}="$val_txt";
  my $t_avg = sprintf( "%.1f", (3 * ReadingsVal($hash->{NAME},"cpu".$cpuNum."_temp_avg",$val_txt) + $val_txt ) / 4 );
  $map->{"cpu".$cpuNum."_temp_avg"}=$t_avg;

  $map = SYSMON_getComputeStat($hash, $map, $val_txt, "cpu".$cpuNum."_temp"."_stat");

  return $map;
}

Wenn ich den Pfad wie folgt anpasse:
my $val = SYSMON_execute($hash, "cat /sys/class/hwmon/hwmon2/temp1".($cpuNum+1)."_input 2>&1");
alternativ
my $val = SYSMON_execute(
    $hash,
    'for d in /sys/class/hwmon/hwmon*; do ' .
    '  [ "$(cat $d/name 2>/dev/null)" = "k10temp" ] && cat $d/temp1_input && exit; ' .
    'done'
);




bringt das nicht den gewünschten Erfolg. Wer kann hier bitte helfen ?