Show Omega2 Battery Voltage in OpenWrt LuCI
Sometime ago, I bought an Onion Omega2 Pro and flashed it with OpenWrt 18.06. I plan to take my Omega on the road, so I installed a Li-Po battery on the device, so that it does not need to depend on USB power input. One big question is: what's the remaining power level?
The standalone Power Dock has a set of battery indicator LEDs that visually tells how much juice is left.
However, the Omega2 Pro that I have does not have battery indicators.
Instead, I need to use
power-dock2 command to read battery level.
Let me try it:
root@Omega2:~# power-dock2 -ash: power-dock2: not found
It does not work, because I flashed my Omega with OpenWrt 18.06, and
power-dock2 command is not included in the standard OpenWrt distribution.
The command comes from OnionIoT's OpenWrt feed (package source).
I must add the OpenWrt feed before I can install the
To add the OnionIoT feed to OpenWrt:
Append the feed configuration to
echo src/gz omega2_onion http://repo.onion.io/omega2/packages/onion | tee -a /etc/opkg/distfeeds.conf
Disable opkg signature check, because we don't yet have Onion's signing keys.
sed -i '/check_signature/ s/^/#/' /etc/opkg.conf
Refresh package feeds and install Onion signing keys.
opkg update opkg install onion-repo-keys
Enable opkg signature check, as now we have the signing keys.
sed -i '/check_signature/ s/^#//' /etc/opkg.conf
Refresh package feeds again, so that the package list is updated with the newly installed signing key.
Now we are ready to install packages from Onion's OpenWrt feed.
power-dock2 package did not properly declare its dependencies, so that a simple
opkg install power-dock2 would not work.
However, it's easy enough to figure out the correct dependencies.
The command of installing
power-dock2 and necessary dependencies is:
opkg install kmod-i2c-mt7628 i2c-tools power-dock2
After this, I can see my battery voltage via command line:
root@Omega2:~# power-dock2 Battery Voltage Level: 3.66 V
LuCI is OpenWrt's web user interface. It is written in Lua programming language, designed to be extensible and easily maintainable, and structured as an Model-View-Controller (MVC) web framework.
I am still learning LuCI, but I have figured out the simplest way to display battery level on LuCI's homepage:
Create a file
/usr/lib/lua/luci/view/admin_status/index/powerdock2.htm, and paste the following code:
<%- require "string" require "luci.sys" local powerdock2_output = luci.sys.exec("power-dock2") powerdock2_output = string.gsub(powerdock2_output, "Battery Voltage Level: ", "") -%> <div class="cbi-section"> <h3><%:Omega2 - Power Dock%></h3> <div class="table" width="100%"> <div class="tr"><div class="td left" width="33%"><%:Battery Voltage Level%></div><div class="td left" id="powerdock2_output"><%=powerdock2_output%></div></div> </div> </div>
This code invokes
power-dock2 command, parses its output, and displays the result on the webpage.
Login to Omega's LuCI, and I can see the battery level at bottom of the page:
It works because:
- The "homepage" is actually "status overview".
- The page template is
- At the end of this template, the code includes every
- Therefore, I can put a file into this directory to insert a new section at the end of LuCI homepage.
I have noticed two limitation in my current approach. First, when I keep the "status overview" page open, system and network statistics are updated automatically, but the battery level information I added would not refresh. Second, the code shows battery voltage, but it would be nice to know battery percentage. I will improve on these aspects next time.