--- /dev/null
+#
+# Copyright (C) 2020 Russell Morris <rmorris@rkmorris.us>
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI Battery Status
+LUCI_DESCRIPTION:=Provides a battery charge indicator in LuCI. Currently only supports the HooToo HT-TM05 travel router.
+
+LUCI_DEPENDS:=+luci-base +libiwinfo-lua +rpcd-mod-iwinfo +libi2c +i2c-tools
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
+
--- /dev/null
+'use strict';
+'require ui';
+'require rpc';
+'require poll';
+'require baseclass';
+
+var callBatteryStatus = rpc.declare({
+ object: 'luci.battstatus',
+ method: 'getBatteryStatus',
+ expect: { '': {} }
+});
+
+var devices = {};
+
+return baseclass.extend({
+ __init__: function() {
+ this.updateIndicator();
+ poll.add(L.bind(this.updateIndicator, this), 5);
+ },
+
+ updateIndicator: function() {
+ return callBatteryStatus().then(L.bind(function(devs) {
+ for (var dev in devs) {
+ var info = devs[dev];
+ if (info.valid) {
+ info.status = (info.charging ? _('Charging') : _('Not Charging')) + ": " + info.percentage + "%";
+ info.state = "active";
+ if (info.percentage <= 20)
+ info.color = "Red";
+ else if (info.percentage <= 30)
+ info.color = "GoldenRod";
+ } else {
+ info.status = info.message;
+ info.state = "inactive";
+ }
+
+ info.name = "battery-" + dev.replace(" ", "-");
+ ui.showIndicator(info.name, info.status, null, info.state);
+ if (typeof info.color != 'undefined') {
+ info.element = document.querySelector(`[data-indicator="${info.name}"]`);
+ info.element.innerHTML = `<span style="color:${info.color}">${info.status}</span>`;
+ }
+
+ devices[dev] = info;
+ }
+
+ for (var dev in devices) {
+ if (!devs.hasOwnProperty(dev)) {
+ ui.hideIndicator('battery-%s'.format(dev));
+ delete devices[dev];
+ }
+ }
+ }, this));
+ }
+});
--- /dev/null
+#!/bin/sh
+
+. /usr/share/libubox/jshn.sh
+
+case "$1" in
+ list)
+ printf '{ "getBatteryStatus": {} }'
+ ;;
+ call)
+ case "$2" in
+ getBatteryStatus)
+ json_init
+
+ eval $(/bin/ubus call system board 2>/dev/null | /usr/bin/jsonfilter -e 'MODEL=@.model')
+ json_add_object "$MODEL"
+
+ if [ -f /usr/sbin/i2cset ] && [ -f /usr/sbin/i2cget ]; then
+ json_add_boolean valid 1
+ if [ $(i2cset -y 0 0x0a 0x0a 0x01 && i2cget -y 0 0x0a 0x0a) = 0x40 ]; then
+ json_add_boolean charging 1
+ else
+ json_add_boolean charging 0
+ fi
+ json_add_int percentage $(i2cset -y 0 0x0a 0x0a 0x10 && i2cget -y 0 0x0a 0x0a | xargs printf %d)
+ else
+ json_add_boolean valid 0
+ if [ ! -f /usr/sbin/i2cset ]; then
+ json_add_string message "Need i2cset"
+ else
+ json_add_string message "Need i2cget"
+ fi
+ fi
+
+ json_close_object
+ json_dump
+ ;;
+ esac
+ ;;
+esac