Skip to content

Commit

Permalink
i3pmd: added simple daemon to monitor battery, notify and hibernate on
Browse files Browse the repository at this point in the history
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.
137 changes: 137 additions & 0 deletions scripts/i3pmd.py
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()

0 comments on commit 15af445

Please sign in to comment.