107 lines
3.5 KiB
Plaintext
107 lines
3.5 KiB
Plaintext
|
#!/usr/bin/env python3
|
||
|
#
|
||
|
# Copyright (C) 2016 James Murphy
|
||
|
# Licensed under the GPL version 2 only
|
||
|
#
|
||
|
# A battery indicator blocklet script for i3blocks
|
||
|
|
||
|
from subprocess import check_output
|
||
|
import os
|
||
|
import re
|
||
|
|
||
|
config = dict(os.environ)
|
||
|
status = check_output(['acpi'], universal_newlines=True)
|
||
|
|
||
|
if not status:
|
||
|
# stands for no battery found
|
||
|
color = config.get("color_10", "red")
|
||
|
fulltext = "<span color='{}'><span font='FontAwesome'>\uf00d \uf240</span></span>".format(color)
|
||
|
percentleft = 100
|
||
|
else:
|
||
|
# if there is more than one battery in one laptop, the percentage left is
|
||
|
# available for each battery separately, although state and remaining
|
||
|
# time for overall block is shown in the status of the first battery
|
||
|
batteries = status.split("\n")
|
||
|
state_batteries=[]
|
||
|
commasplitstatus_batteries=[]
|
||
|
percentleft_batteries=[]
|
||
|
time = ""
|
||
|
for battery in batteries:
|
||
|
if battery!='':
|
||
|
state_batteries.append(battery.split(": ")[1].split(", ")[0])
|
||
|
commasplitstatus = battery.split(", ")
|
||
|
if not time:
|
||
|
time = commasplitstatus[-1].strip()
|
||
|
# check if it matches a time
|
||
|
time = re.match(r"(\d+):(\d+)", time)
|
||
|
if time:
|
||
|
time = ":".join(time.groups())
|
||
|
timeleft = " ({})".format(time)
|
||
|
else:
|
||
|
timeleft = ""
|
||
|
|
||
|
p = int(commasplitstatus[1].rstrip("%\n"))
|
||
|
if p>0:
|
||
|
percentleft_batteries.append(p)
|
||
|
commasplitstatus_batteries.append(commasplitstatus)
|
||
|
state = state_batteries[0]
|
||
|
commasplitstatus = commasplitstatus_batteries[0]
|
||
|
if percentleft_batteries:
|
||
|
percentleft = int(sum(percentleft_batteries)/len(percentleft_batteries))
|
||
|
else:
|
||
|
percentleft = 0
|
||
|
|
||
|
# stands for charging
|
||
|
color = config.get("color_charging", "yellow")
|
||
|
FA_LIGHTNING = "<span color='{}'><span font='FontAwesome'>\uf0e7</span></span>".format(color)
|
||
|
|
||
|
# stands for plugged in
|
||
|
FA_PLUG = "<span font='FontAwesome'>\uf1e6</span>"
|
||
|
|
||
|
# stands for using battery
|
||
|
FA_BATTERY = "<span font='FontAwesome'>\uf240</span>"
|
||
|
|
||
|
# stands for unknown status of battery
|
||
|
FA_QUESTION = "<span font='FontAwesome'>\uf128</span>"
|
||
|
|
||
|
|
||
|
if state == "Discharging":
|
||
|
fulltext = FA_BATTERY + " "
|
||
|
elif state == "Full":
|
||
|
fulltext = FA_PLUG + " "
|
||
|
timeleft = ""
|
||
|
elif state == "Unknown":
|
||
|
fulltext = FA_QUESTION + " " + FA_BATTERY + " "
|
||
|
timeleft = ""
|
||
|
else:
|
||
|
fulltext = FA_LIGHTNING + " " + FA_PLUG + " "
|
||
|
|
||
|
def color(percent):
|
||
|
if percent < 10:
|
||
|
# exit code 33 will turn background red
|
||
|
return config.get("color_10", "#FFFFFF")
|
||
|
if percent < 20:
|
||
|
return config.get("color_20", "#FF3300")
|
||
|
if percent < 30:
|
||
|
return config.get("color_30", "#FF6600")
|
||
|
if percent < 40:
|
||
|
return config.get("color_40", "#FF9900")
|
||
|
if percent < 50:
|
||
|
return config.get("color_50", "#FFCC00")
|
||
|
if percent < 60:
|
||
|
return config.get("color_60", "#FFFF00")
|
||
|
if percent < 70:
|
||
|
return config.get("color_70", "#FFFF33")
|
||
|
if percent < 80:
|
||
|
return config.get("color_80", "#FFFF66")
|
||
|
return config.get("color_full", "#FFFFFF")
|
||
|
|
||
|
form = '<span color="{}">{}%</span>'
|
||
|
fulltext += form.format(color(percentleft), percentleft)
|
||
|
fulltext += timeleft
|
||
|
|
||
|
print(fulltext)
|
||
|
print(fulltext)
|
||
|
if percentleft < 10:
|
||
|
exit(33)
|