diff --git a/fhem/FHEM/42_SYSMON.pm b/fhem/FHEM/42_SYSMON.pm index 6af1ec4fb..db0edbf20 100644 --- a/fhem/FHEM/42_SYSMON.pm +++ b/fhem/FHEM/42_SYSMON.pm @@ -30,7 +30,7 @@ package main; use strict; use warnings; -my $VERSION = "1.6.1"; +my $VERSION = "1.7.1"; use constant { DATE => "date", @@ -709,7 +709,9 @@ SYSMON_obtainParameters($$) # Einmaliges if(!$u_first_mark) { - $map = SYSMON_getCPUBogoMIPS($hash, $map); + if(SYSMON_isProcFS($hash)) { + $map = SYSMON_getCPUBogoMIPS($hash, $map); + } if(SYSMON_isFB($hash)) { $map = SYSMON_FBVersionInfo($hash, $map); @@ -717,7 +719,11 @@ SYSMON_obtainParameters($$) } # immer aktualisieren: uptime, uptime_text, fhemuptime, fhemuptime_text, idletime, idletime_text - $map = SYSMON_getUptime($hash, $map); + if(SYSMON_isProcFS($hash)) { + $map = SYSMON_getUptime($hash, $map); + } else { + $map = SYSMON_getUptime2($hash, $map); + } $map = SYSMON_getFHEMUptime($hash, $map); if($m1 gt 0) { # Nur wenn > 0 @@ -736,8 +742,12 @@ SYSMON_obtainParameters($$) if(SYSMON_isCPU1Freq($hash)) { $map = SYSMON_getCPU1Freq($hash, $map); } - $map = SYSMON_getLoadAvg($hash, $map); - $map = SYSMON_getCPUProcStat($hash, $map); + if(SYSMON_isProcFS($hash)) { + $map = SYSMON_getLoadAvg($hash, $map); + $map = SYSMON_getCPUProcStat($hash, $map); + } else { + #TODO: Ohne ProcFS + } #$map = SYSMON_getDiskStat($hash, $map); # Power info (cubietruck) @@ -911,19 +921,64 @@ SYSMON_getUptime($$) #my $uptime_str = qx(cat /proc/uptime ); my $uptime_str = SYSMON_execute($hash, "cat /proc/uptime"); my ($uptime, $idle) = split(/\s+/, trim($uptime_str)); - my $idle_percent = $idle/$uptime*100; + if(int($uptime)!=0) { + my $idle_percent = $idle/$uptime*100; - $map->{+UPTIME}=sprintf("%d",$uptime); - #$map->{+UPTIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes, %02d seconds",SYSMON_decode_time_diff($uptime)); - $map->{+UPTIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes",SYSMON_decode_time_diff($uptime)); - - $map->{+IDLETIME}=sprintf("%d %.2f %%",$idle, $idle_percent); - $map->{+IDLETIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes",SYSMON_decode_time_diff($idle)).sprintf(" (%.2f %%)",$idle_percent); - #$map->{+IDLETIME_PERCENT} = sprintf ("%.2f %",$idle_percent); + $map->{+UPTIME}=sprintf("%d",$uptime); + #$map->{+UPTIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes, %02d seconds",SYSMON_decode_time_diff($uptime)); + $map->{+UPTIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes",SYSMON_decode_time_diff($uptime)); + $map->{+IDLETIME}=sprintf("%d %.2f %%",$idle, $idle_percent); + $map->{+IDLETIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes",SYSMON_decode_time_diff($idle)).sprintf(" (%.2f %%)",$idle_percent); + #$map->{+IDLETIME_PERCENT} = sprintf ("%.2f %",$idle_percent); + } + return $map; } +#------------------------------------------------------------------------------ +# leifert Zeit seit dem Systemstart. +# Alternative Version fuer Systemen ohne procfs (z.B. MACOS) +#------------------------------------------------------------------------------ +sub +SYSMON_getUptime2($$) +{ + my ($hash, $map) = @_; + +#TODO + my $uptime = SYSMON_execute($hash,"uptime"); + + #$uptime = $1 if( $uptime && $uptime =~ m/[[:alpha:]]{2}\s+(((\d+)\D+,?\s+)?(\d+):(\d+))/ ); + $uptime = $1 if( $uptime && $uptime =~ m/[[:alpha:]]{2}\s+(((\d+)\D+,?\s+)?(\d+):(\d+)).*load.*: (.*)/ ); + $uptime = "0 days, $uptime" if( $uptime && !$2); + + + my $days = $3?$3:0; + my $hours = $4; + my $minutes = $5; + + $uptime = $days * 24; + $uptime += $hours; + $uptime *= 60; + $uptime += $minutes; + $uptime *= 60; + + + $map->{+UPTIME}=sprintf("%d",$uptime); + $map->{+UPTIME_TEXT} = sprintf("%d days, %02d hours, %02d minutes",SYSMON_decode_time_diff($uptime)); + + my $loadavg=$6; + my ($la1, $la5, $la15, $prc, $lastpid) = split(/\s+/, trim($loadavg)); + $la1 =~ s/,$//; + $la5 =~ s/,$//; + $la1 =~ s/,/./; + $la5 =~ s/,/./; + $la15 =~ s/,/./; + $map->{+LOADAVG}="$la1 $la5 $la15"; + + return $map; +} + #------------------------------------------------------------------------------ # leifert Zeit seit FHEM-Start #------------------------------------------------------------------------------ @@ -1308,6 +1363,8 @@ sub SYSMON_getRamAndSwap($$) #my @speicher = qx(free -m); my @speicher = SYSMON_execute($hash, "free"); + if(!@speicher) {return $map;} + shift @speicher; my ($fs_desc, $total, $used, $free, $shared, $buffers, $cached) = split(/\s+/, trim($speicher[0])); shift @speicher; @@ -1324,21 +1381,27 @@ sub SYSMON_getRamAndSwap($$) #my $percentage_ram; #my $percentage_swap; - $total = $total / 1024; - $used = $used / 1024; - $free = $free / 1024; - $buffers = $buffers / 1024; - if(defined($cached)) { - $cached = $cached / 1024; - } else { - # Bei FritzBox wird dieser Wert nicht ausgageben - $cached = 0; + if($total > 0) { + + $total = $total / 1024; + $used = $used / 1024; + $free = $free / 1024; + $buffers = $buffers / 1024; + if(defined($cached)) { + $cached = $cached / 1024; + } else { + # Bei FritzBox wird dieser Wert nicht ausgageben + $cached = 0; + } + + $ram = sprintf("Total: %.2f MB, Used: %.2f MB, %.2f %%, Free: %.2f MB", $total, ($used - $buffers - $cached), (($used - $buffers - $cached) / $total * 100), ($free + $buffers + $cached)); + } + else + { + $ram = "n/a" } - - $ram = sprintf("Total: %.2f MB, Used: %.2f MB, %.2f %%, Free: %.2f MB", $total, ($used - $buffers - $cached), (($used - $buffers - $cached) / $total * 100), ($free + $buffers + $cached)); - $map->{+RAM} = $ram; - + # wenn kein swap definiert ist, ist die Groesse (total2) gleich Null. Dies wuerde eine Exception (division by zero) ausloesen if($total2 > 0) { @@ -1572,7 +1635,7 @@ sub SYSMON_getNetworkInfo ($$$) my $out_txt = "RX: ".$rx." MB, TX: ".$tx." MB, Total: ".$totalRxTx." MB"; $map->{$nName} = $out_txt; - my $lastVal = ReadingsVal($hash->{NAME},$device,"RX: 0 MB, TX: 0 MB, Total: 0 MB"); + my $lastVal = ReadingsVal($hash->{NAME},$nName,"RX: 0 MB, TX: 0 MB, Total: 0 MB"); my ($d0, $o_rx, $d1, $d2, $o_tx, $d3, $d4, $o_tt, $d5) = split(/\s+/, trim($lastVal)); my $d_rx = $rx-$o_rx; @@ -1911,6 +1974,17 @@ sub SYSMON_ShowValuesFmt ($$;@) return $htmlcode; } +my $proc_fs = undef; +sub +SYSMON_isProcFS($) { + my ($hash) = @_; + if(!defined $proc_fs) { + $proc_fs = int(SYSMON_execute($hash, "[ -d /proc/ ] && echo 1 || echo 0")); + } + + return $proc_fs; +} + my $sys_cpu_temp_rpi = undef; sub SYSMON_isCPUTempRPi($) {