mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
* feat: add total energy consumption (#976) * feat: add average system total power
This commit is contained in:
@@ -15,6 +15,8 @@ import Kit
|
||||
internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
internal var list: [Sensor_p] = []
|
||||
static let HIDtypes: [SensorType] = [.temperature, .voltage]
|
||||
private var lastRead: Date = Date()
|
||||
private let firstRead: Date = Date()
|
||||
|
||||
private var HIDState: Bool {
|
||||
get {
|
||||
@@ -163,6 +165,18 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
}
|
||||
}
|
||||
|
||||
// Cumulative power is in watt-hours
|
||||
if let PSTRSensor = self.list.first(where: { $0.key == "PSTR"}) {
|
||||
if let totalIdx = self.list.firstIndex(where: {$0.key == "Total System Consumption"}) {
|
||||
self.list[totalIdx].value += PSTRSensor.value * Date().timeIntervalSince(self.lastRead) / 3600
|
||||
if let avgIdx = self.list.firstIndex(where: {$0.key == "Average System Total"}) {
|
||||
// Avg power consumption is simply total consumption divided by time online
|
||||
self.list[avgIdx].value = self.list[totalIdx].value * 3600 / Date().timeIntervalSince(self.firstRead)
|
||||
}
|
||||
self.lastRead = Date()
|
||||
}
|
||||
}
|
||||
|
||||
self.callback(self.list)
|
||||
}
|
||||
|
||||
@@ -249,8 +263,7 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
page = 0xff08
|
||||
usage = 0x0003
|
||||
eventType = kIOHIDEventTypePower
|
||||
case .power: break
|
||||
case .fan: break
|
||||
case .power, .energy, .fan: break
|
||||
}
|
||||
|
||||
return (page, usage, eventType)
|
||||
@@ -350,6 +363,12 @@ internal class SensorsReader: Reader<[Sensor_p]> {
|
||||
}
|
||||
}
|
||||
|
||||
// Init total power since launched, only if Total Power sensor is available
|
||||
if self.list.contains(where: { $0.key == "PSTR"}) {
|
||||
list.append(Sensor(key: "Total System Consumption", name: "Total System Consumption", value: 0, group: .sensor, type: .energy, isComputed: true))
|
||||
list.append(Sensor(key: "Average System Total", name: "Average System Total", value: 0, group: .sensor, type: .power, isComputed: true))
|
||||
}
|
||||
|
||||
return list.filter({ (s: Sensor_p) -> Bool in
|
||||
switch s.type {
|
||||
case .temperature:
|
||||
|
||||
@@ -25,6 +25,7 @@ internal enum SensorType: String {
|
||||
case voltage = "Voltage"
|
||||
case current = "Current"
|
||||
case power = "Power"
|
||||
case energy = "Energy"
|
||||
case fan = "Fans"
|
||||
}
|
||||
|
||||
@@ -66,6 +67,8 @@ internal struct Sensor: Sensor_p {
|
||||
return "V"
|
||||
case .power:
|
||||
return "W"
|
||||
case .energy:
|
||||
return "Wh"
|
||||
case .current:
|
||||
return "A"
|
||||
case .fan:
|
||||
@@ -82,7 +85,7 @@ internal struct Sensor: Sensor_p {
|
||||
case .voltage:
|
||||
let val = value >= 100 ? "\(Int(value))" : String(format: "%.3f", value)
|
||||
return "\(val)\(unit)"
|
||||
case .power:
|
||||
case .power, .energy:
|
||||
let val = value >= 100 ? "\(Int(value))" : String(format: "%.2f", value)
|
||||
return "\(val)\(unit)"
|
||||
case .current:
|
||||
@@ -98,7 +101,7 @@ internal struct Sensor: Sensor_p {
|
||||
switch self.type {
|
||||
case .temperature:
|
||||
return Temperature(value).replacingOccurrences(of: "C", with: "").replacingOccurrences(of: "F", with: "")
|
||||
case .voltage, .power, .current:
|
||||
case .voltage, .power, .energy, .current:
|
||||
let val = value >= 9.95 ? "\(Int(round(value)))" : String(format: "%.1f", value)
|
||||
return "\(val)\(unit)"
|
||||
case .fan:
|
||||
@@ -197,7 +200,7 @@ let SensorsList: [Sensor] = [
|
||||
// Temperature
|
||||
Sensor(key: "TA%P", name: "Ambient %", group: .sensor, type: .temperature),
|
||||
Sensor(key: "Th%H", name: "Heatpipe %", group: .sensor, type: .temperature, isIntelOnly: true),
|
||||
Sensor(key: "TZ%C", name: "Termal zone %", group: .sensor, type: .temperature),
|
||||
Sensor(key: "TZ%C", name: "Thermal zone %", group: .sensor, type: .temperature),
|
||||
|
||||
Sensor(key: "TC0D", name: "CPU diode", group: .CPU, type: .temperature),
|
||||
Sensor(key: "TC0E", name: "CPU diode virtual", group: .CPU, type: .temperature),
|
||||
@@ -299,7 +302,7 @@ let SensorsList: [Sensor] = [
|
||||
Sensor(key: "PC3C", name: "RAM", group: .sensor, type: .power),
|
||||
Sensor(key: "PPBR", name: "Battery", group: .sensor, type: .power),
|
||||
Sensor(key: "PDTR", name: "DC In", group: .sensor, type: .power),
|
||||
Sensor(key: "PSTR", name: "System total", group: .sensor, type: .power)
|
||||
Sensor(key: "PSTR", name: "System Total", group: .sensor, type: .power)
|
||||
]
|
||||
|
||||
let HIDSensorsList: [Sensor] = [
|
||||
|
||||
Reference in New Issue
Block a user