]> git.madduck.net Git - etc/awesome.git/blob - widgets/bat.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

bat: #177 fix Watt computation; make AC state available #178
[etc/awesome.git] / widgets / bat.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013,      Luke Bonham                
6       * (c) 2010-2012, Peter Hofmann              
7                                                   
8 --]]
9
10 local newtimer     = require("lain.helpers").newtimer
11 local first_line   = require("lain.helpers").first_line
12
13 local naughty      = require("naughty")
14 local wibox        = require("wibox")
15
16 local math         = { floor  = math.floor }
17 local string       = { format = string.format }
18 local tonumber     = tonumber
19
20 local setmetatable = setmetatable
21
22 -- Battery infos
23 -- lain.widgets.bat
24
25 local function worker(args)
26     local bat      = {}
27     local args     = args or {}
28     local timeout  = args.timeout or 30
29     local battery  = args.battery or "BAT0"
30     local ac       = args.ac or "AC0"
31     local notify   = args.notify or "on"
32     local settings = args.settings or function() end
33
34     bat.widget = wibox.widget.textbox('')
35
36     bat_notification_low_preset = {
37         title = "Battery low",
38         text = "Plug the cable!",
39         timeout = 15,
40         fg = "#202020",
41         bg = "#CDCDCD"
42     }
43
44     bat_notification_critical_preset = {
45         title = "Battery exhausted",
46         text = "Shutdown imminent",
47         timeout = 15,
48         fg = "#000000",
49         bg = "#FFFFFF"
50     }
51
52     function update()
53         bat_now = {
54             status    = "Not present",
55             ac_status = "N/A",
56             perc      = "N/A",
57             time      = "N/A",
58             watt      = "N/A"
59         }
60
61         local bstr    = "/sys/class/power_supply/" .. battery
62         local present = first_line(bstr .. "/present")
63
64         if present == "1"
65         then
66             local rate     = first_line(bstr .. "/power_now")
67
68             local rate_alt = first_line(bstr .. "/current_now")
69
70             local ratev    = first_line(bstr .. "/voltage_now")
71
72             local rem      = first_line(bstr .. "/energy_now") or
73                              first_line(bstr .. "/charge_now")
74
75             local tot      = first_line(bstr .. "/energy_full") or
76                              first_line(bstr .. "/charge_full")
77
78             bat_now.status = first_line(bstr .. "/status") or "N/A"
79             bat_now.ac     = first_line(string.format("/sys/class/power_supply/%s/online", ac)) or "N/A"
80
81             rate  = tonumber(rate)
82             ratev = tonumber(ratev)
83             rem   = tonumber(rem)
84             tot   = tonumber(tot)
85
86             local time_rat = 0
87             if bat_now.status == "Charging"
88             then
89                 time_rat = (tot - rem) / rate
90             elseif bat_now.status == "Discharging"
91             then
92                 time_rat = rem / rate
93             end
94
95             local hrs = math.floor(time_rat)
96             if hrs < 0 then hrs = 0 elseif hrs > 23 then hrs = 23 end
97
98             local min = math.floor((time_rat - hrs) * 60)
99             if min < 0 then min = 0 elseif min > 59 then min = 59 end
100
101             bat_now.time = string.format("%02d:%02d", hrs, min)
102
103             local perc = tonumber(first_line(bstr .. "/capacity")) or math.floor((rem / tot) * 100)
104
105             if perc <= 100 then
106                 bat_now.perc = string.format("%d", perc)
107             elseif perc > 100 then
108                 bat_now.perc = "100"
109             elseif perc < 0 then
110                 bat_now.perc = "0"
111             end
112
113             if rate and ratev then
114                 bat_now.watt = string.format("%.2fW", (rate * ratev) / 1e12)
115             elseif rate_alt then
116                 bat_now.watt = string.format("%.2fW", rate_alt)
117             else
118                 bat_now.watt = "N/A"
119             end
120
121         end
122
123         widget = bat.widget
124         settings()
125
126         -- notifications for low and critical states
127         if bat_now.status == "Discharging" and notify == "on" and bat_now.perc
128         then
129             local nperc = tonumber(bat_now.perc) or 100
130             if nperc <= 5
131             then
132                 bat.id = naughty.notify({
133                     preset = bat_notification_critical_preset,
134                     replaces_id = bat.id,
135                 }).id
136             elseif nperc <= 15
137             then
138                 bat.id = naughty.notify({
139                     preset = bat_notification_low_preset,
140                     replaces_id = bat.id,
141                 }).id
142             end
143         end
144     end
145
146     newtimer(battery, timeout, update)
147
148     return setmetatable(bat, { __index = bat.widget })
149 end
150
151 return setmetatable({}, { __call = function(_, ...) return worker(...) end })