From 400fbcfaee83d53917267f640f449404ade8911a Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Sun, 21 Aug 2022 06:53:42 -0400 Subject: [PATCH] feat: add total energy consumption (#976) (#1037) * feat: add total energy consumption (#976) * feat: add average system total power --- Modules/Sensors/readers.swift | 23 +++++++++++++++++++++-- Modules/Sensors/values.swift | 11 +++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Modules/Sensors/readers.swift b/Modules/Sensors/readers.swift index 39e56bcb..94a4dffb 100644 --- a/Modules/Sensors/readers.swift +++ b/Modules/Sensors/readers.swift @@ -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: diff --git a/Modules/Sensors/values.swift b/Modules/Sensors/values.swift index ae5e0738..82db29e9 100644 --- a/Modules/Sensors/values.swift +++ b/Modules/Sensors/values.swift @@ -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] = [