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
|
#!/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
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user