import dbus class UPowerManager(): def __init__(self): self.UPOWER_NAME = "org.freedesktop.UPower" self.UPOWER_PATH = "/org/freedesktop/UPower" self.DBUS_PROPERTIES = "org.freedesktop.DBus.Properties" self.bus = dbus.SystemBus() def detect_devices(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.UPOWER_NAME) devices = upower_interface.EnumerateDevices() return devices def get_display_device(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.UPOWER_NAME) dispdev = upower_interface.GetDisplayDevice() return dispdev def get_critical_action(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.UPOWER_NAME) critical_action = upower_interface.GetCriticalAction() return critical_action def get_device_percentage(self, battery): battery_proxy = self.bus.get_object(self.UPOWER_NAME, battery) battery_proxy_interface = dbus.Interface(battery_proxy, self.DBUS_PROPERTIES) return battery_proxy_interface.Get(self.UPOWER_NAME + ".Device", "Percentage") def get_full_device_information(self, battery): battery_proxy = self.bus.get_object(self.UPOWER_NAME, battery) battery_proxy_interface = dbus.Interface(battery_proxy, self.DBUS_PROPERTIES) # Use GetAll to retrieve all properties in a single DBus call all_properties = battery_proxy_interface.GetAll(self.UPOWER_NAME + ".Device") # Extract properties with default values for missing keys information_table = { 'HasHistory': all_properties.get('HasHistory', False), 'HasStatistics': all_properties.get('HasStatistics', False), 'IsPresent': all_properties.get('IsPresent', False), 'IsRechargeable': all_properties.get('IsRechargeable', False), 'Online': all_properties.get('Online', False), 'PowerSupply': all_properties.get('PowerSupply', False), 'Capacity': all_properties.get('Capacity', 0.0), 'Energy': all_properties.get('Energy', 0.0), 'EnergyEmpty': all_properties.get('EnergyEmpty', 0.0), 'EnergyFull': all_properties.get('EnergyFull', 0.0), 'EnergyFullDesign': all_properties.get('EnergyFullDesign', 0.0), 'EnergyRate': all_properties.get('EnergyRate', 0.0), 'Luminosity': all_properties.get('Luminosity', 0.0), 'Percentage': all_properties.get('Percentage', 0.0), 'Temperature': all_properties.get('Temperature', 0.0), 'Voltage': all_properties.get('Voltage', 0.0), 'TimeToEmpty': all_properties.get('TimeToEmpty', 0), 'TimeToFull': all_properties.get('TimeToFull', 0), 'IconName': all_properties.get('IconName', ''), 'Model': all_properties.get('Model', ''), 'NativePath': all_properties.get('NativePath', ''), 'Serial': all_properties.get('Serial', ''), 'Vendor': all_properties.get('Vendor', ''), 'State': all_properties.get('State', 0), 'Technology': all_properties.get('Technology', 0), 'Type': all_properties.get('Type', 0), 'WarningLevel': all_properties.get('WarningLevel', 0), 'UpdateTime': all_properties.get('UpdateTime', 0) } return information_table def is_lid_present(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.DBUS_PROPERTIES) is_lid_present = bool(upower_interface.Get(self.UPOWER_NAME, 'LidIsPresent')) return is_lid_present def is_lid_closed(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.DBUS_PROPERTIES) is_lid_closed = bool(upower_interface.Get(self.UPOWER_NAME, 'LidIsClosed')) return is_lid_closed def on_battery(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH) upower_interface = dbus.Interface(upower_proxy, self.DBUS_PROPERTIES) on_battery = bool(upower_interface.Get(self.UPOWER_NAME, 'OnBattery')) return on_battery def has_wakeup_capabilities(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH + "/Wakeups") upower_interface = dbus.Interface(upower_proxy, self.DBUS_PROPERTIES) has_wakeup_capabilities = bool(upower_interface.Get(self.UPOWER_NAME+ '.Wakeups', 'HasCapability')) return has_wakeup_capabilities def get_wakeups_data(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH + "/Wakeups") upower_interface = dbus.Interface(upower_proxy, self.UPOWER_NAME + '.Wakeups') data = upower_interface.GetData() return data def get_wakeups_total(self): upower_proxy = self.bus.get_object(self.UPOWER_NAME, self.UPOWER_PATH + "/Wakeups") upower_interface = dbus.Interface(upower_proxy, self.UPOWER_NAME + '.Wakeups') data = upower_interface.GetTotal() return data def is_loading(self, battery): battery_proxy = self.bus.get_object(self.UPOWER_NAME, battery) battery_proxy_interface = dbus.Interface(battery_proxy, self.DBUS_PROPERTIES) state = int(battery_proxy_interface.Get(self.UPOWER_NAME + ".Device", "State")) if (state == 1): return True else: return False def get_state(self, battery): battery_proxy = self.bus.get_object(self.UPOWER_NAME, battery) battery_proxy_interface = dbus.Interface(battery_proxy, self.DBUS_PROPERTIES) state = int(battery_proxy_interface.Get(self.UPOWER_NAME + ".Device", "State")) if (state == 0): return "Unknown" elif (state == 1): return "Loading" elif (state == 2): return "Discharging" elif (state == 3): return "Empty" elif (state == 4): return "Fully charged" elif (state == 5): return "Pending charge" elif (state == 6): return "Pending discharge"