import os
import subprocess
from jadi import service
[docs]@service
class PowerManager():
"""
Utility class for power management.
"""
def __init__(self, context):
self.context = context
def __parse_acpi_value(self, v):
"""
Extract the right energy value.
:param v: Energy value with unit, e.g. 10 wh
:type v: string
:return: Only the value
:rtype: float
"""
value, unit = v.split()
value = float(value)
if unit.startswith('m'):
value /= 1000
return value
[docs] def get_batteries(self):
"""
Parse directory /proc/acpi/battery for systems running on battery.
:return: All batteries informations
:rtype: list of dict
"""
batteries = []
battery_dir = '/proc/acpi/battery'
if not os.path.exists(battery_dir):
return []
for d in sorted(os.listdir(battery_dir)):
props = {}
for path in [
os.path.join(battery_dir, d, 'info'),
os.path.join(battery_dir, d, 'state'),
]:
for l in open(path).read().splitlines():
if ':' in l:
key, value = l.strip().split(':')
props[key] = value.strip()
battery = {
'name': d,
'designCapacity': self.__parse_acpi_value(props.get('design capacity', '0 Wh')),
'fullCapacity': self.__parse_acpi_value(props.get('last full capacity', '0 Wh')),
'capacityLeft': self.__parse_acpi_value(props.get('remaining capacity', '0 Wh')),
'rate': self.__parse_acpi_value(props.get('present rate', '0 W')),
'voltage': self.__parse_acpi_value(props.get('present rate', '0 V')),
'type': props.get('battery type', 'Unknown'),
'manufacturer': props.get('OEM info', 'Unknown'),
'charging': props.get('charging state', None) == 'charging',
}
batteries.append(battery)
return batteries
[docs] def get_adapters(self):
"""
Read the list of adapters from /proc/acpi/ac_adapter.
:return: List of adapters, one per dict
:rtype: list of dict
"""
adapters = []
adapter_dir = '/proc/acpi/ac_adapter'
if not os.path.exists(adapter_dir):
return []
for d in sorted(os.listdir(adapter_dir)):
props = {}
path = os.path.join(adapter_dir, d, 'state')
for l in open(path).read().splitlines():
if ':' in l:
key, value = l.strip().split(':')
props[key] = value.strip()
adapter = {
'name': d,
'pluggedIn': props.get('state', None) == 'on-line',
}
adapters.append(adapter)
return adapters
[docs] def poweroff(self):
"""
Basically power off the system.
"""
subprocess.check_call(['poweroff'])
[docs] def reboot(self):
"""
Basically reboot the system.
"""
subprocess.check_call(['reboot'])
[docs] def suspend(self):
"""
Basically suspend the system.
"""
subprocess.check_call(['pm-suspend'])
[docs] def hibernate(self):
"""
Basically hibernate the system.
"""
subprocess.check_call(['pm-hibernate'])