From 5af3ab092bb49dd5c201a4181d6f7f6ed12f839c Mon Sep 17 00:00:00 2001 From: Steins7 Date: Wed, 4 Sep 2024 17:00:03 +0200 Subject: [PATCH] Improve battery management scripts Fixes various issues, including power counter not working properly during charge and multiple batteries support --- scripts/batt_watts.py | 30 ++++++++++++++++-------------- scripts/battery.py | 22 ++++++++++++++++++++-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/scripts/batt_watts.py b/scripts/batt_watts.py index 037efa7..3cf121e 100755 --- a/scripts/batt_watts.py +++ b/scripts/batt_watts.py @@ -1,22 +1,24 @@ #!/usr/bin/python -dir='/sys/class/power_supply/BAT1/' +dir0='/sys/class/power_supply/BAT0/' +dir1='/sys/class/power_supply/BAT1/' -with open(dir + 'current_now', 'r') as f: - current = int(f.read()) / 1000000.0 -with open(dir + 'voltage_now', 'r') as f: - voltage = int(f.read()) / 1000000.0 -with open(dir + 'status', 'r') as f: - status = f.read().rstrip() - print(status) +with open(dir0 + 'power_now', 'r') as f: + power0 = int(f.read()) / 1000000.0 +with open(dir1 + 'power_now', 'r') as f: + power1 = int(f.read()) / 1000000.0 +with open(dir0 + 'status', 'r') as f: + status0 = f.read().rstrip() +with open(dir1 + 'status', 'r') as f: + status1 = f.read().rstrip() - if status == "Charging" or status == "Full": - wattage = voltage * current - elif status == "Discharging": - wattage = -voltage * current + if status0 == "Discharging" or status1 == "Discharging" + wattage = - power0 - power1 + elif status0 == "Charging" or status0 == "Full" + or status1 == "Charging" or status1 == "Full": + wattage = power0 + power1 else: wattage = 0 -print('{0:.2f}V {1:.2f}A {2:.2f}W'.format(voltage, current, wattage)) -print('{0:.2f}W'.format(wattage)) #return wattage + diff --git a/scripts/battery.py b/scripts/battery.py index 7b4c5b5..e28b086 100755 --- a/scripts/battery.py +++ b/scripts/battery.py @@ -36,6 +36,7 @@ class BatteryWatcher: bat_percentage_of_current = None bat_state = None bat_energy_rate = None + bat_remaining_time = None def __init__(self, battery_name="BAT0"): self.loop = GLib.MainLoop() @@ -68,6 +69,10 @@ class BatteryWatcher: self.bat_percentage_of_current = self.bat.Percentage self.bat_state = self.bat.State self.bat_energy_rate = self.bat.EnergyRate + if self.bat_state in [1, 5]: + self.bat_remaining_time = self.bat.TimeToFull + else: + self.bat_remaining_time = self.bat.TimeToEmpty def remove_battery(self): self.bat.onPropertiesChanged = None @@ -76,9 +81,12 @@ class BatteryWatcher: def export_state(self): if self.bat: percentage = int(round(self.bat_percentage_of_current)) - text = str(int(round(self.bat_percentage_of_design))) + "% (" \ + text = str(percentage) + "% (" \ + str(int(round(self.bat_energy_rate, 2))) + "W)" css_classes = [ bat_states[self.bat.State] ] + m, s = divmod(self.bat_remaining_time, 60) + h, m = divmod(m, 60) + tooltip = str(h) + "h" + str(m) for level in bat_levels.keys(): if self.bat_percentage_of_design <= level: @@ -91,7 +99,8 @@ class BatteryWatcher: output = { 'text': text, 'percentage': percentage, - 'class' : css_classes } + 'class' : css_classes, + 'tooltip' : tooltip } try: print(json.dumps(output), flush=True) @@ -115,6 +124,15 @@ class BatteryWatcher: if 'EnergyRate' in changed_properties: self.bat_energy_rate = changed_properties['EnergyRate'] update = True + self.bat_energy_rate = self.bat.EnergyRate + if 'TimeToFull' in changed_properties: + if self.bat_state in [1, 5]: + self.bat_remaining_time = self.bat.TimeToFull + update = True + if 'TimeToEmpty' in changed_properties: + if self.bat_state not in [1, 5]: + self.bat_remaining_time = self.bat.TimeToEmpty + update = True if update: self.export_state()