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

View File

@ -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()