Small remake of Acpitool based power widget for Awesome3

Frist you need to have acpitool installed which is basically a Linux ACPI client, allowing you to query or set ACPI values and display them. Basically said it parses /proc/acpi or /sys/class entries and presents the output in a well formatted text. Acpitool is available in most of the Linux distros and the requirement is that your kernel has the support for ACPI, which it probably does.

Here is the code, also don't forget to register  mybattmon to the widget list in rc.lua



mybattmon = widget({ type = "textbox", 
                     name = "mybattmon",
                     align = "right" })

function battery_status ()
    --output buffer
    local output={} 
    -- read data from battery
    local fd=io.popen("acpitool -b", "r") 
    local line=fd:read()
    -- we match the output from acpitool
    local battery_load = string.match(line,
                           " (%d*\.%d+)%%")
    local time_rem = string.match(line,
                           "(%d+\:%d+)\:%d+")
    local discharging -- temp var for opening tag
    if string.match(line, 
                   "discharging")=="discharging" then 
                -- discharging: set the color to red
                discharging="< span color=\"#CC7777\">"
    elseif tonumber(battery_load)>85 then --almost charged
                discharging="< span color=\"#77CC77\">"
    else --charging
                discharging="< span color=\"#CCCC77\">"
    end
    if battery_num and battery_load and time_rem then
       table.insert(output,
       discharging.."B "..battery_load.."%% "..time_rem..
       "</span >")
    elseif battery_num and battery_load then 
    --remaining time unavailable so the battery is loading
       table.insert(output,discharging.."B "..battery_load..
       "%%</span >")
     end 
     -- even more data unavailable: 
     -- we might be getting an unexpected output format 
     -- so let's just skip this line.
    return table.concat(output," ") 
end
mybattmon.text = " " .. battery_status() .. " "
-- every 30 sec call the fucntion battery_status()
my_battmon_timer=timer({timeout=30}) 
my_battmon_timer:add_signal("timeout", function()
    mybattmon.text = " " .. battery_status() .. " "
end)
my_battmon_timer:start()

and I must say Lua is really good scripting language.
The original code works with multiple batteries and can be found here

Popular Posts