Improve battery management scripts

Fixes various issues, including power counter not working properly
during charge and multiple batteries support
This commit is contained in:
Steins7 2024-09-04 17:00:03 +02:00
parent f02591abe0
commit 5af3ab092b
2 changed files with 36 additions and 16 deletions

View File

@ -1,22 +1,24 @@
#!/usr/bin/python #!/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: with open(dir0 + 'power_now', 'r') as f:
current = int(f.read()) / 1000000.0 power0 = int(f.read()) / 1000000.0
with open(dir + 'voltage_now', 'r') as f: with open(dir1 + 'power_now', 'r') as f:
voltage = int(f.read()) / 1000000.0 power1 = int(f.read()) / 1000000.0
with open(dir + 'status', 'r') as f: with open(dir0 + 'status', 'r') as f:
status = f.read().rstrip() status0 = f.read().rstrip()
print(status) with open(dir1 + 'status', 'r') as f:
status1 = f.read().rstrip()
if status == "Charging" or status == "Full": if status0 == "Discharging" or status1 == "Discharging"
wattage = voltage * current wattage = - power0 - power1
elif status == "Discharging": elif status0 == "Charging" or status0 == "Full"
wattage = -voltage * current or status1 == "Charging" or status1 == "Full":
wattage = power0 + power1
else: else:
wattage = 0 wattage = 0
print('{0:.2f}V {1:.2f}A {2:.2f}W'.format(voltage, current, wattage))
print('{0:.2f}W'.format(wattage))
#return wattage #return wattage

View File

@ -36,6 +36,7 @@ class BatteryWatcher:
bat_percentage_of_current = None bat_percentage_of_current = None
bat_state = None bat_state = None
bat_energy_rate = None bat_energy_rate = None
bat_remaining_time = None
def __init__(self, battery_name="BAT0"): def __init__(self, battery_name="BAT0"):
self.loop = GLib.MainLoop() self.loop = GLib.MainLoop()
@ -68,6 +69,10 @@ class BatteryWatcher:
self.bat_percentage_of_current = self.bat.Percentage self.bat_percentage_of_current = self.bat.Percentage
self.bat_state = self.bat.State self.bat_state = self.bat.State
self.bat_energy_rate = self.bat.EnergyRate 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): def remove_battery(self):
self.bat.onPropertiesChanged = None self.bat.onPropertiesChanged = None
@ -76,9 +81,12 @@ class BatteryWatcher:
def export_state(self): def export_state(self):
if self.bat: if self.bat:
percentage = int(round(self.bat_percentage_of_current)) 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)" + str(int(round(self.bat_energy_rate, 2))) + "W)"
css_classes = [ bat_states[self.bat.State] ] 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(): for level in bat_levels.keys():
if self.bat_percentage_of_design <= level: if self.bat_percentage_of_design <= level:
@ -91,7 +99,8 @@ class BatteryWatcher:
output = { 'text': text, output = { 'text': text,
'percentage': percentage, 'percentage': percentage,
'class' : css_classes } 'class' : css_classes,
'tooltip' : tooltip }
try: try:
print(json.dumps(output), flush=True) print(json.dumps(output), flush=True)
@ -115,6 +124,15 @@ class BatteryWatcher:
if 'EnergyRate' in changed_properties: if 'EnergyRate' in changed_properties:
self.bat_energy_rate = changed_properties['EnergyRate'] self.bat_energy_rate = changed_properties['EnergyRate']
update = True 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: if update:
self.export_state() self.export_state()