Files
kde-power-monitor-plasmoid/contents/scripts/power.sh
T

48 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
STATE="/tmp/.powermonitor-state"
PTOT=""; PIDLE=""; PJ=""; PMS=""; PMAX=""
[ -r "$STATE" ] && . "$STATE" 2>/dev/null
v=$(awk '/^cpu /{print $2+$3+$4+$5+$6+$7+$8+$9, $5+$6}' /proc/stat)
TOT=${v%% *}; IDLE=${v##* }; NOW=$(date +%s%3N)
CPU_PCT=""
if [ -n "$PTOT" ] && [ "$TOT" -gt "$PTOT" ]; then
DT=$((TOT-PTOT)); DI=$((IDLE-PIDLE)); [ "$DT" -gt 0 ] && CPU_PCT=$((100*(DT-DI)/DT))
fi
GPU_UW=""; GPU_AVG_UW=""; GPU_TEMP=""; CPU_TEMP=""; GPU_HZ=""
for h in /sys/class/hwmon/hwmon*; do
n=$(cat "$h/name" 2>/dev/null)
if [ "$n" = amdgpu ]; then
[ -r "$h/power1_input" ] && GPU_UW=$(cat "$h/power1_input")
[ -r "$h/power1_average" ] && GPU_AVG_UW=$(cat "$h/power1_average")
[ -r "$h/temp1_input" ] && GPU_TEMP=$(cat "$h/temp1_input")
[ -r "$h/freq1_input" ] && GPU_HZ=$(cat "$h/freq1_input")
elif [ "$n" = k10temp ] && [ -r "$h/temp1_input" ]; then CPU_TEMP=$(cat "$h/temp1_input"); fi
done
GPU_BUSY=""
for c in /sys/class/drm/card[0-9]; do
if [ "$(readlink "$c/device/driver" 2>/dev/null | xargs -r basename)" = amdgpu ] && [ -r "$c/device/gpu_busy_percent" ]; then GPU_BUSY=$(cat "$c/device/gpu_busy_percent"); break; fi
done
E_UJ=$(cat /sys/class/powercap/intel-rapl:0/energy_uj 2>/dev/null); E_MAX=$(cat /sys/class/powercap/intel-rapl:0/max_energy_range_uj 2>/dev/null)
CPU_W100=""
if [ -n "$PJ" ] && [ -n "$E_UJ" ] && [ -n "$PMS" ]; then
DUJ=$((E_UJ-PJ)); DMS=$((NOW-PMS))
if [ "$DUJ" -lt 0 ] && [ -n "$PMAX" ] && [ "$DUJ" -lt -$((PMAX/2)) ]; then DUJ=$((DUJ+PMAX)); fi
if [ "$DUJ" -ge 0 ] && [ "$DMS" -gt 0 ] && [ "$DMS" -lt 60000 ]; then CPU_W100=$((DUJ/(DMS*10))); [ "$CPU_W100" -gt 9999 ] && CPU_W100=9999; fi
fi
RAM_TOTAL=$(awk '/^MemTotal:/{print $2}' /proc/meminfo)
RAM_AVAILABLE=$(awk '/^MemAvailable:/{print $2}' /proc/meminfo)
SWAP_TOTAL=$(awk '/^SwapTotal:/{print $2}' /proc/meminfo)
SWAP_FREE=$(awk '/^SwapFree:/{print $2}' /proc/meminfo)
RAM_USED=$((RAM_TOTAL-RAM_AVAILABLE)); SWAP_USED=$((SWAP_TOTAL-SWAP_FREE))
echo "cpu_usage_pct=${CPU_PCT}"; echo "cpu_temp_mdegC=${CPU_TEMP}"; echo "cpu_power_cw=${CPU_W100}"
echo "gpu_busy_pct=${GPU_BUSY}"; echo "gpu_temp_mdegC=${GPU_TEMP}"; echo "gpu_power_uw=${GPU_UW}"; echo "gpu_power_avg_uw=${GPU_AVG_UW}"; echo "gpu_freq_hz=${GPU_HZ}"
echo "ram_total_kb=${RAM_TOTAL}"; echo "ram_used_kb=${RAM_USED}"; echo "ram_available_kb=${RAM_AVAILABLE}"; echo "swap_total_kb=${SWAP_TOTAL}"; echo "swap_used_kb=${SWAP_USED}"
echo "ts_ms=${NOW}"
cat > "$STATE" <<EOF
PTOT=$TOT
PIDLE=$IDLE
PJ=$E_UJ
PMS=$NOW
PMAX=$E_MAX
EOF