mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-15 00:34:08 +09:00
feat: added average and hottest CPU and GPU sensors (calculated) to the sensors list (#826)
This commit is contained in:
@@ -85,9 +85,21 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
self.list += self.initHIDSensors()
|
||||
}
|
||||
#endif
|
||||
|
||||
self.list += self.initCalculatedSensors()
|
||||
}
|
||||
|
||||
public override func read() {
|
||||
for (i, s) in self.list.enumerated() {
|
||||
if s.group == .hid || s.isComputed {
|
||||
continue
|
||||
}
|
||||
self.list[i].value = SMC.shared.getValue(self.list[i].key) ?? 0
|
||||
}
|
||||
|
||||
var cpuSensors = self.list.filter({ $0.group == .CPU && $0.type == .temperature && $0.average }).map{ $0.value }
|
||||
var gpuSensors = self.list.filter({ $0.group == .GPU && $0.type == .temperature && $0.average }).map{ $0.value }
|
||||
|
||||
#if arch(arm64)
|
||||
if self.HIDState {
|
||||
for typ in SensorsReader.HIDtypes {
|
||||
@@ -103,30 +115,10 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
}
|
||||
}
|
||||
|
||||
let cpuSensors = list.filter({ $0.key.hasPrefix("pACC MTR Temp") || $0.key.hasPrefix("eACC MTR Temp") }).map{ $0.value }
|
||||
let gpuSensors = list.filter({ $0.key.hasPrefix("GPU MTR Temp") }).map{ $0.value }
|
||||
cpuSensors = list.filter({ $0.key.hasPrefix("pACC MTR Temp") || $0.key.hasPrefix("eACC MTR Temp") }).map{ $0.value }
|
||||
gpuSensors = list.filter({ $0.key.hasPrefix("GPU MTR Temp") }).map{ $0.value }
|
||||
let socSensors = list.filter({ $0.key.hasPrefix("SOC MTR Temp") }).map{ $0.value }
|
||||
|
||||
if !cpuSensors.isEmpty {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Average CPU" }) {
|
||||
self.list[idx].value = cpuSensors.reduce(0, +) / Double(cpuSensors.count)
|
||||
}
|
||||
if let max = cpuSensors.max() {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Hottest CPU" }) {
|
||||
self.list[idx].value = max
|
||||
}
|
||||
}
|
||||
}
|
||||
if !gpuSensors.isEmpty {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Average GPU" }) {
|
||||
self.list[idx].value = gpuSensors.reduce(0, +) / Double(gpuSensors.count)
|
||||
}
|
||||
if let max = gpuSensors.max() {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Hottest GPU" }) {
|
||||
self.list[idx].value = max
|
||||
}
|
||||
}
|
||||
}
|
||||
if !socSensors.isEmpty {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Average SOC" }) {
|
||||
self.list[idx].value = socSensors.reduce(0, +) / Double(socSensors.count)
|
||||
@@ -140,11 +132,25 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i, s) in self.list.enumerated() {
|
||||
if s.group == .hid {
|
||||
continue
|
||||
if !cpuSensors.isEmpty {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Average CPU" }) {
|
||||
self.list[idx].value = cpuSensors.reduce(0, +) / Double(cpuSensors.count)
|
||||
}
|
||||
if let max = cpuSensors.max() {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Hottest CPU" }) {
|
||||
self.list[idx].value = max
|
||||
}
|
||||
}
|
||||
}
|
||||
if !gpuSensors.isEmpty {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Average GPU" }) {
|
||||
self.list[idx].value = gpuSensors.reduce(0, +) / Double(gpuSensors.count)
|
||||
}
|
||||
if let max = gpuSensors.max() {
|
||||
if let idx = self.list.firstIndex(where: { $0.key == "Hottest GPU" }) {
|
||||
self.list[idx].value = max
|
||||
}
|
||||
}
|
||||
self.list[i].value = SMC.shared.getValue(self.list[i].key) ?? 0
|
||||
}
|
||||
|
||||
self.callback(self.list)
|
||||
@@ -316,6 +322,40 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
}).sorted { $0.key.lowercased() < $1.key.lowercased() }
|
||||
}
|
||||
|
||||
private func initCalculatedSensors() -> [Sensor] {
|
||||
var list: [Sensor] = []
|
||||
|
||||
let cpuSensors = self.list.filter({ $0.group == .CPU && $0.type == .temperature && $0.average }).map{ $0.value }
|
||||
let gpuSensors = self.list.filter({ $0.group == .GPU && $0.type == .temperature && $0.average }).map{ $0.value }
|
||||
|
||||
if !cpuSensors.isEmpty {
|
||||
let value = cpuSensors.reduce(0, +) / Double(cpuSensors.count)
|
||||
list.append(Sensor(key: "Average CPU", name: "Average CPU", value: value, group: .hid, type: .temperature))
|
||||
if let max = cpuSensors.max() {
|
||||
list.append(Sensor(key: "Hottest CPU", name: "Hottest CPU", value: max, group: .hid, type: .temperature))
|
||||
}
|
||||
}
|
||||
if !gpuSensors.isEmpty {
|
||||
let value = gpuSensors.reduce(0, +) / Double(gpuSensors.count)
|
||||
list.append(Sensor(key: "Average GPU", name: "Average GPU", value: value, group: .hid, type: .temperature))
|
||||
if let max = gpuSensors.max() {
|
||||
list.append(Sensor(key: "Hottest GPU", name: "Hottest GPU", value: max, group: .hid, type: .temperature))
|
||||
}
|
||||
}
|
||||
|
||||
return list.filter({ (s: Sensor_p) -> Bool in
|
||||
switch s.type {
|
||||
case .temperature:
|
||||
return s.value < 110 && s.value >= 0
|
||||
case .voltage:
|
||||
return s.value < 300 && s.value >= 0
|
||||
case .current:
|
||||
return s.value < 100 && s.value >= 0
|
||||
default: return true
|
||||
}
|
||||
}).sorted { $0.key.lowercased() < $1.key.lowercased() }
|
||||
}
|
||||
|
||||
public func HIDCallback() {
|
||||
if self.HIDState {
|
||||
self.list += self.initHIDSensors()
|
||||
|
||||
@@ -36,6 +36,8 @@ internal protocol Sensor_p {
|
||||
var group: SensorGroup { get }
|
||||
var type: SensorType { get }
|
||||
var isIntelOnly: Bool { get }
|
||||
var isComputed: Bool { get }
|
||||
var average: Bool { get }
|
||||
|
||||
var unit: String { get }
|
||||
var formattedValue: String { get }
|
||||
@@ -51,6 +53,8 @@ internal struct Sensor: Sensor_p {
|
||||
var group: SensorGroup
|
||||
var type: SensorType
|
||||
var isIntelOnly: Bool = false
|
||||
var isComputed: Bool = false
|
||||
var average: Bool = false
|
||||
|
||||
var unit: String {
|
||||
get {
|
||||
@@ -115,7 +119,15 @@ internal struct Sensor: Sensor_p {
|
||||
}
|
||||
|
||||
func copy() -> Sensor {
|
||||
return Sensor(key: self.key, name: self.name, group: self.group, type: self.type)
|
||||
return Sensor(
|
||||
key: self.key,
|
||||
name: self.name,
|
||||
group: self.group,
|
||||
type: self.type,
|
||||
isIntelOnly: self.isIntelOnly,
|
||||
isComputed: self.isComputed,
|
||||
average: self.average
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,6 +143,8 @@ internal struct Fan: Sensor_p {
|
||||
var group: SensorGroup = .sensor
|
||||
var type: SensorType = .fan
|
||||
var isIntelOnly: Bool = false
|
||||
var isComputed: Bool = false
|
||||
var average: Bool = false
|
||||
var unit: String = "RPM"
|
||||
|
||||
var formattedValue: String {
|
||||
@@ -165,8 +179,8 @@ let SensorsList: [Sensor] = [
|
||||
Sensor(key: "TC0P", name: "CPU proximity", group: .CPU, type: .temperature),
|
||||
Sensor(key: "TCAD", name: "CPU package", group: .CPU, type: .temperature),
|
||||
|
||||
Sensor(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature),
|
||||
Sensor(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature),
|
||||
Sensor(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature, average: true),
|
||||
|
||||
Sensor(key: "TCGC", name: "GPU Intel Graphics", group: .GPU, type: .temperature),
|
||||
Sensor(key: "TG0D", name: "GPU diode", group: .GPU, type: .temperature),
|
||||
@@ -189,21 +203,21 @@ let SensorsList: [Sensor] = [
|
||||
Sensor(key: "TN0P", name: "Northbridge proximity", group: .system, type: .temperature),
|
||||
|
||||
// Apple Silicon
|
||||
Sensor(key: "Tp09", name: "CPU efficient core 1", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0T", name: "CPU efficient core 2", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp01", name: "CPU performance core 1", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp05", name: "CPU performance core 2", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0D", name: "CPU performance core 3", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0H", name: "CPU performance core 4", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0L", name: "CPU performance core 5", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0P", name: "CPU performance core 6", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0X", name: "CPU performance core 7", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp0b", name: "CPU performance core 8", group: .CPU, type: .temperature),
|
||||
Sensor(key: "Tp09", name: "CPU efficient core 1", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0T", name: "CPU efficient core 2", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp01", name: "CPU performance core 1", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp05", name: "CPU performance core 2", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0D", name: "CPU performance core 3", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0H", name: "CPU performance core 4", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0L", name: "CPU performance core 5", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0P", name: "CPU performance core 6", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0X", name: "CPU performance core 7", group: .CPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tp0b", name: "CPU performance core 8", group: .CPU, type: .temperature, average: true),
|
||||
|
||||
Sensor(key: "Tg05", name: "GPU 1", group: .GPU, type: .temperature),
|
||||
Sensor(key: "Tg0D", name: "GPU 2", group: .GPU, type: .temperature),
|
||||
Sensor(key: "Tg0L", name: "GPU 3", group: .GPU, type: .temperature),
|
||||
Sensor(key: "Tg0T", name: "GPU 4", group: .GPU, type: .temperature),
|
||||
Sensor(key: "Tg05", name: "GPU 1", group: .GPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tg0D", name: "GPU 2", group: .GPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tg0L", name: "GPU 3", group: .GPU, type: .temperature, average: true),
|
||||
Sensor(key: "Tg0T", name: "GPU 4", group: .GPU, type: .temperature, average: true),
|
||||
|
||||
Sensor(key: "TaLP", name: "Airflow left", group: .sensor, type: .temperature),
|
||||
Sensor(key: "TaRF", name: "Airflow right", group: .sensor, type: .temperature),
|
||||
|
||||
Reference in New Issue
Block a user