Merge pull request #3947 from RKBoss6/Smart-Battery

Create Smart Battery Widget
master^2
Rob Pilling 2025-08-17 18:30:30 +01:00 committed by GitHub
commit 28692988ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 120 additions and 0 deletions

View File

@ -0,0 +1 @@
v0.01: New app!

View File

@ -0,0 +1,12 @@
# Smart Battery Widget
Shows battery in terms of days (21 days, 12 hours), and uses the [`smartbatt`](https://banglejs.com/apps/?id=smartbatt) module to learn from daily battery drainage and provide accurate estimations.
This app was modified from `wid_a_battery_widget`, by @alainsaas
When you install this widget for the first time, or clear the data, it will also install the [`smartbatt`](https://banglejs.com/apps/?id=smartbatt) module as a dependency. As it learns your battery usage for the first time the forecast will fluctate, and will not be reliable for a while. As it compunds many drainage values together, it will keep learning, and provide better predictions.
The module learns by averaging all the battery drainage over a period of time, and saves it to a json, averaging it with many others, providing an accurate prediction. The module gives the best forecast when you use the watch relatively similar per day.
Tap on the widget to show the battery percentage. It will go back to the days left after 3 seconds.
When charging, only the percentage is shown.
## Creator
RKBoss6

BIN
apps/widsmartbatt/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,17 @@
{
"id": "widsmartbatt",
"name": "Smart Battery Widget",
"shortName":"Smart Batt Wid",
"icon": "icon.png",
"version":"0.01",
"type": "widget",
"supports": ["BANGLEJS", "BANGLEJS2"],
"readme": "README.md",
"dependencies" : { "smartbatt":"module" },
"description": "Simple and slim battery widget that shows days remaining, and uses the `smartbatt` module to learm from your usage and provide accurate predictions.",
"tags": "widget,battery",
"provides_widgets" : ["battery"],
"storage": [
{"name":"widsmartbatt.wid.js","url":"widget.js"}
]
}

View File

@ -0,0 +1,90 @@
(function(){
var showPercent = false;
const width = 40;
const height = 24;
let COLORS = {
'bg': g.theme.bg,
'fg': g.theme.fg,
'charging': "#08f",
'high': g.theme.dark ? "#fff" : "#000",
'low': "#f00",
};
const levelColor = (l) => {
if (Bangle.isCharging()) return COLORS.charging;
if (l >= 30) return COLORS.high;
return COLORS.low;
};
function draw() {
let batt=E.getBattery();
let data = require("smartbatt").get();
let hrsLeft=data.hrsLeft;
let days = hrsLeft / 24;
let txt = showPercent
? batt
: (days >= 1
? Math.round(Math.min(days, 99)) + "d"
: Math.round(hrsLeft) + "h");
if(Bangle.isCharging()) txt=E.getBattery();
let s = 29;
let x = this.x, y = this.y;
let xl = x + 4 + batt * (s - 12) / 100;
// Drawing code follows...
g.setColor(COLORS.bg);
g.fillRect(x + 2, y + 5, x + s - 6, y + 18);
g.setColor(levelColor(batt));
g.fillRect(x + 1, y + 3, x + s - 5, y + 4);
g.fillRect(x + 1, y + 19, x + s - 5, y + 20);
g.fillRect(x, y + 4, x + 1, y + 19);
g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19);
g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16);
g.fillRect(x + 4, y + 15, xl, y + 16);
g.setColor(COLORS.fg);
g.setFontAlign(0, 0);
g.setFont('6x8');
g.drawString(txt, x + 14, y + 10);
}
WIDGETS["widsmartbatt"] = {
area: "tr",
width: 30,
draw: draw
};
// Touch to temporarily show battery percent
Bangle.on("touch", function (_btn, xy) {
if (WIDGETS["back"] || !xy) return;
var oversize = 5;
var w = WIDGETS["widsmartbatt"];
var x = xy.x, y = xy.y;
if (w.x - oversize <= x && x < w.x + width + oversize
&& w.y - oversize <= y && y < w.y + height + oversize) {
E.stopEventPropagation && E.stopEventPropagation();
showPercent = true;
setTimeout(() => {
showPercent = false;
w.draw(w);
}, 3000);
w.draw(w);
}
});
// Update widget on charging state change
Bangle.on('charging', function () {
WIDGETS["widsmartbatt"].draw();
});
setInterval(() => WIDGETS["widsmartbatt"].draw(), 60000);
})();