feat: add total energy consumption (#976) (#1037)

* feat: add total energy consumption (#976)

* feat: add average system total power
This commit is contained in:
Samuel Reed
2022-08-21 06:53:42 -04:00
committed by GitHub
parent 15a188d0b2
commit 400fbcfaee
2 changed files with 28 additions and 6 deletions

View File

@@ -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:

View File

@@ -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] = [