Enquanto trabalhava em um dos meus projetos anteriores, descobri que o indicador de energia no Unity, na verdade, aparentemente tem atrasos por atualização, e se origina do daemon UPower, que é o que o indicador parece usar para obter informações de energia. Isso atrapalha os scripts personalizados que tentam monitorar o uso da bateria através do daemon UPower com certa precisão. No entanto, o serviço UPower tem chamadas para atualizar / atualizar essas informações. O script abaixo aproveita essa chamada dbus. O script deve ser copiado e salvo como um arquivo, preferencialmente na pasta ~/bin
.
O uso é muito simples: ./update_battery.py <SECONDS>
, em que <SECONDS>
é a frequência com que você deseja atualizar as informações. Obviamente, você deve ter em mente que a atualização muito frequente levará a um maior uso de recursos, portanto, eu recomendaria algo mais ou menos sensato, por exemplo, de 3 a 10 segundos.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dbus
import time
import sys
def run_dbus_method(bus_type, obj, path, interface, method, arg):
if bus_type == "session":
bus = dbus.SessionBus()
elif bus_type == "system":
bus = dbus.SystemBus()
else:
return None
proxy = bus.get_object(obj, path)
dbus_method = proxy.get_dbus_method(method, interface)
return dbus_method(arg) if arg else dbus_method()
def find_battery_path():
call = [ 'system', 'org.freedesktop.UPower',
'/org/freedesktop/UPower', 'org.freedesktop.UPower',
'EnumerateDevices', None ]
devices = run_dbus_method(*call)
for i in devices:
if 'BAT' in i: return str(i)
def main():
bat_path = find_battery_path()
call = [ 'system', 'org.freedesktop.UPower',
bat_path, 'org.freedesktop.UPower.Device',
'Refresh', None ]
timeout = int(sys.argv[1])
while True:
run_dbus_method(*call)
time.sleep(timeout)
if __name__ == '__main__': main()