Improve battery management scripts
Fixes various issues, including power counter not working properly during charge and multiple batteries support
This commit is contained in:
parent
f02591abe0
commit
5af3ab092b
@ -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
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user