1
0
mirror of https://github.com/tw93/Mole.git synced 2026-02-04 14:26:46 +00:00

refactor(status): simplify temperature detection using ioreg battery sensor

This commit is contained in:
Tw93
2025-12-11 14:00:44 +08:00
parent d7bf52a397
commit 33467be3d3
2 changed files with 9 additions and 43 deletions

Binary file not shown.

View File

@@ -177,54 +177,20 @@ func collectThermal() ThermalStatus {
}
}
// 1. Try osx-cpu-temp (most accurate for users without sudo)
if commandExists("osx-cpu-temp") {
ctxTemp, cancelTemp := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancelTemp()
if out, err := runCmd(ctxTemp, "osx-cpu-temp"); err == nil {
valStr := strings.TrimSpace(out)
valStr = strings.TrimSuffix(valStr, "°C")
valStr = strings.TrimSuffix(valStr, "C")
valStr = strings.TrimSpace(valStr)
if t, err := strconv.ParseFloat(valStr, 64); err == nil && t > 0 {
thermal.CPUTemp = t
return thermal
}
// 1. Try ioreg battery temperature (simple, no sudo needed)
ctxIoreg, cancelIoreg := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancelIoreg()
if out, err := runCmd(ctxIoreg, "sh", "-c", "ioreg -rn AppleSmartBattery | awk '/\"Temperature\"/ {print $3}'"); err == nil {
valStr := strings.TrimSpace(out)
if tempRaw, err := strconv.Atoi(valStr); err == nil && tempRaw > 0 {
thermal.CPUTemp = float64(tempRaw) / 100.0
return thermal
}
}
// 2. Try powermetrics (requires sudo, works on Apple Silicon)
if commandExists("powermetrics") {
// Only run if we are effectively root to avoid password prompt/failure delays
if os.Geteuid() == 0 {
ctxPower, cancelPower := context.WithTimeout(context.Background(), 2*time.Second)
defer cancelPower()
// Use thermal sampler
out, err := runCmd(ctxPower, "powermetrics", "-n", "1", "--samplers", "thermal", "-i", "100")
if err == nil {
lines := strings.Split(out, "\n")
for _, line := range lines {
if strings.Contains(line, "CPU die temperature") {
// Format: "CPU die temperature: 35.43 C"
parts := strings.Split(line, ":")
if len(parts) == 2 {
valStr := strings.TrimSpace(parts[1])
valStr = strings.TrimSuffix(valStr, " C")
if t, err := strconv.ParseFloat(valStr, 64); err == nil {
thermal.CPUTemp = t
return thermal
}
}
}
}
}
}
}
// 3. Try thermal level as a proxy (fallback)
// 2. Try thermal level as a proxy (fallback)
ctx2, cancel2 := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel2()
out2, err := runCmd(ctx2, "sysctl", "-n", "machdep.xcpm.cpu_thermal_level")
if err == nil {
level, _ := strconv.Atoi(strings.TrimSpace(out2))