-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
i3pmd: added simple daemon to monitor battery, notify and hibernate on
in ciritical situation
- Loading branch information
biiiep
committed
Jan 15, 2015
1 parent
b6f5ab0
commit 15af445
Showing
1 changed file
with
137 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
#!/usr/bin env python2 | ||
|
||
import sys | ||
import dbus | ||
from dbus.mainloop.glib import DBusGMainLoop | ||
import pynotify | ||
import gobject | ||
|
||
class Pm_message: | ||
def __init__(self, urgency, message): | ||
self.urgency = urgency | ||
self.message = message | ||
|
||
def send(self): | ||
if not pynotify.is_initted(): | ||
print (" msg: " + self.message) | ||
return | ||
n = pynotify.Notification(self.message) | ||
n.set_urgency(self.urgency) | ||
n.set_timeout(6000) | ||
n.show() | ||
|
||
class Pmd: | ||
def __init__(self, low_limit, crit_limit): | ||
self.low_limit = low_limit | ||
self.crit_limit = crit_limit | ||
|
||
self.msg_low = Pm_message(pynotify.URGENCY_NORMAL, "battery level is low") | ||
self.msg_crit = Pm_message(pynotify.URGENCY_CRITICAL, "battery level is critical low") | ||
|
||
self.bus = dbus.SystemBus() | ||
self.session = self.bus.get_object("org.freedesktop.login1", "/org/freedesktop/login1") | ||
self.session_iface = dbus.Interface(self.session, "org.freedesktop.login1.Manager") | ||
self.upower = self.bus.get_object("org.freedesktop.UPower", "/org/freedesktop/UPower") | ||
self.upower_iface = dbus.Interface(self.upower, "org.freedesktop.DBus.Properties") | ||
#self.wakeup = self.bus.get_object("org.freedesktop.UPower", "/org/freedesktop/UPower/Wakeups") | ||
#self.wakeup.connect_to_signal("DataChanged", pmd_handler_update) | ||
self.bat = self.bus.get_object("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/battery_BAT1") | ||
self.bat_iface = dbus.Interface(self.bat, "org.freedesktop.DBus.Properties") | ||
self.bat.connect_to_signal("PropertiesChanged", pmd_handler_update) | ||
|
||
def is_on_battery(self): | ||
return self.upower_iface.Get('org.freedesktop.UPower', 'OnBattery') | ||
|
||
def get_percentage(self): | ||
return int(self.bat_iface.Get('org.freedesktop.UPower.Device', 'Percentage')) | ||
|
||
def is_low(self): | ||
return self.get_percentage() < self.low_limit | ||
|
||
def is_crit(self): | ||
return self.get_percentage() < self.crit_limit | ||
|
||
def can_suspend(self): | ||
return self.session_iface.CanSuspend('org.freedesktop.login1.Manager') == 'yes' | ||
|
||
def can_hybrid_sleep(self): | ||
return self.session_iface.CanHybridSleep('org.freedesktop.login1.Manager') == 'yes' | ||
|
||
def can_hibernate(self): | ||
return self.session_iface.CanHibernate('org.freedesktop.login1.Manager') == 'yes' | ||
|
||
def lock(self): | ||
# TODO or do i3pm stuff if i3pm is running | ||
return self.session_iface.LockSessions('org.freedesktop.login1.Manager') | ||
|
||
def suspend(self): | ||
return self.session_iface.Suspend('org.freedesktop.login1.Manager', True) | ||
|
||
def hibernate(self): | ||
return self.session_iface.Hibernate('org.freedesktop.login1.Manager', True) | ||
|
||
def hybrid_sleep(self): | ||
return self.HybridSleep('org.freedesktop.login1.Manager', True) | ||
|
||
def pmd_handler_update(interface_name, changed_properties, invalidated_properties): | ||
global pmd | ||
|
||
print ("pmd_handler_update: iname: " + interface_name) | ||
print (" changed: ") | ||
for entry in changed_properties: | ||
print (entry) | ||
print ("invalidated: ") | ||
for entry in invalidated_properties: | ||
print (entry) | ||
changed_properties | ||
invalidated_properties | ||
|
||
if not pmd.is_on_battery(): | ||
return | ||
|
||
if pmd.is_crit(): | ||
pmd.msg_crit.send() | ||
elif pmd.is_low(): | ||
pmd.msg_low.send() | ||
|
||
if pmd.is_crit(): | ||
if pmd.can_hybrid_sleep(): | ||
pmd.hybrid_sleep() | ||
elif pmd.hibernate(): | ||
pmd.hibernate() | ||
elif pmd.suspend(): | ||
pmd.suspend() | ||
else: | ||
print ("neither hybrid sleep, hibernate or suspend work") | ||
|
||
# unset low and crit state | ||
|
||
|
||
def main(): | ||
loop = gobject.MainLoop() | ||
loop.run() | ||
|
||
if __name__ == "__main__": | ||
print ("starting " + sys.argv[0] + "...") | ||
|
||
DBusGMainLoop(set_as_default=True) | ||
if not pynotify.init(sys.argv[0]): | ||
print ("failed to init pynotify") | ||
exit(1) | ||
|
||
low = 12 | ||
crit = 10 | ||
if len(sys.argv) >= 2: | ||
low = int(sys.argv[1]) | ||
|
||
if len(sys.argv) >= 3: | ||
crit = int(sys.argv[2]) | ||
|
||
print "low", low, "crit", crit | ||
pmd = Pmd(low, crit) | ||
|
||
#print "low", pmd.is_low() | ||
#print "ciritcal", pmd.is_crit() | ||
#pmd.msg_low.send() | ||
|
||
main() |