Mouse Battery Widget

Quick tutorial on how to create widget which displays battery status of a wireless mouse - Logitech’s Performance MX in my case. I will follow simple flow which I described in this post: How to create widget for Awesome WM.

Get battery info

The hardest part here is to get battery percentage from CLI. I’m using UPower. To list available devices run

$ upower --dump
...
Device: /org/freedesktop/UPower/devices/mouse_0003o046Do101Ax0006
  native-path:          /sys/devices/pci0000:00/<numbers>
  vendor:               Logitech, Inc.
  model:                Performance MX
  serial:               34998006
  power supply:         no
  updated:              Thu 05 Jan 2017 10:35:12 EST (85 seconds ago)
  has history:          yes
  has statistics:       no
  mouse
    present:             yes
    rechargeable:        yes
    state:               discharging
    warning-level:       none
    percentage:          20%  # <- we need this guy
    icon-name:          'battery-low-symbolic'
...

In the output list find the mouse device and use it’s name to get info about it and then grep for percentage:

$ upower -i /org/freedesktop/UPower/devices/mouse_0003o046Do101Ax0006 \
| grep percentage \  # get line with percentage
| grep -E -o '[0-9]+'    # get number
20

Text widget

Create file ~/.config/awesome/mouse-battery.lua with following content:

local wibox = require("wibox")
local awful = require("awful")

mouse_widget = wibox.widget.textbox()
mouse_widget:set_font('Play 9')

function update_mouse_widget(widget)
    local current = awful.util.pread(
    "upower -i /org/freedesktop/UPower/devices/mouse_0003o046Do101Ax0006 " ..
    "| grep percentage | grep -E -o '[0-9]+'")
  widget:set_text(current)
end

mouse_timer = timer({ timeout = 3600 })
mouse_timer:connect_signal("timeout", function () update_mouse_widget(mouse_widget) end)
mouse_timer:start()

mouse_timer:emit_signal("timeout")

And in ~/.config/awesome/rc.lua

require("mouse")
...
right_layout:add(mouse_widget)

Image widget

Instead of text we can show battery image. I used the gnome images (found under /usr/share/icons/gnome/scalable/status/ and also icon-name from upower command gives image name from that folder. Here’s the code for widget:

local wibox = require("wibox")
local awful = require("awful")

function update_mouse_battery_icon(icon)
    local iconName = awful.util.pread(
    "upower -i /org/freedesktop/UPower/devices/mouse_0003o046Do101Ax0006 " ..
    "| grep icon-name | grep -oP \"(?<=').*(?=')\"")
    icon:set_image("/usr/share/icons/gnome/scalable/status/" .. string.gsub(iconName, "\n", "") .. ".svg")
end

mouse_battery_icon = wibox.widget.imagebox()

mouse_battery_timer = timer({ timeout = 60 })
mouse_battery_timer:connect_signal("timeout",  function() update_mouse_battery_icon(mouse_battery_icon) end)
mouse_battery_timer:start()

mouse_battery_timer:emit_signal("timeout")

To use it add it in rc.lua

...
right_layout:add(mouse_battery_icon)
...