From 0319dc40f7a1b34716a4470f4c2aba5ed003c890 Mon Sep 17 00:00:00 2001 From: FraI3mega <69040313+FraI3mega@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:31:04 +0200 Subject: [PATCH] Add FraI3mega/battery-graph (#115) * feat(battery-graph): Initialize plugin files * feat(battery-graph): Add bar widget * feat(battery-graph): Implement logic * docs(battery-graph): Fill out the template README * feat(battery-graph): Improve panel * feat(battery-graph): Implement settings * feat(battery-graph): Improve panel styling * feat(battery-graph): Add desktop widget * docs(battery-graph): Improve wording * docs(battery-graph): Add image * docs(battery-graph): Add tags * docs(battery-graph): Improve README * fix(battery-graph): Fix translations * docs(battery-graph): Fix tags * fix(battery-graph): Fix author name * docs(battery-graph): Rename thumbnail * docs(battery-graph): Add dependencies * docs(battery-graph): Improve README * docs(battery-graph): Bump version to 1.0.0 * fix(battery-graph): Remove leftover log * fix(battery-graph): Wrap battery path in quotes * fix(battery-graph): Implement path validation * docs(battery-graph): Clarify setting * fix(battery-graph): Wrap grapth_time in quoutes * docs(battery-graph): Fix setting description --- battery-graph/README.md | 39 ++++++++++++++ battery-graph/battery-desktop.luau | 79 +++++++++++++++++++++++++++ battery-graph/battery-graph.luau | 8 +++ battery-graph/battery-panel.luau | 82 +++++++++++++++++++++++++++++ battery-graph/plugin.toml | 44 ++++++++++++++++ battery-graph/thumbnail.webp | Bin 0 -> 36802 bytes battery-graph/translations/en.json | 19 +++++++ 7 files changed, 271 insertions(+) create mode 100644 battery-graph/README.md create mode 100644 battery-graph/battery-desktop.luau create mode 100644 battery-graph/battery-graph.luau create mode 100644 battery-graph/battery-panel.luau create mode 100644 battery-graph/plugin.toml create mode 100644 battery-graph/thumbnail.webp create mode 100644 battery-graph/translations/en.json diff --git a/battery-graph/README.md b/battery-graph/README.md new file mode 100644 index 0000000..74dc063 --- /dev/null +++ b/battery-graph/README.md @@ -0,0 +1,39 @@ +# Battery graph + +Uses the Upowerd to display the historical charge of the battery on a graph. + +## Plugin + + +| Field | Value | +| --- | --- | +| ID | `frai3mega/battery-graph` | +| Entries | Bar widget: `battery-graph-widget`; panel: `battery-panel`; Desktop widget: `battery-graph-desktop` | + +## Requirements + +Requires a running `upowerd` deamon. +Install `gdbus` on `PATH`. + +## Usage + +You can use it as a desktop/locksreen widget or on the bar. + +Show the panel using + +```sh +noctalia msg panel-toggle frai3mega/battery-graph:battery-panel +``` + + +## Settings + + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `graph_time` | `int` | `6` | Changes the timeframe of the graph | +| `battery_path` | `string` | `/org/freedesktop/UPower/devices/battery_BAT0` | The path to the battery to be graphed | +| `interpol_time` | `int` | `5` | The time beetween points on the graph. | + +``` + diff --git a/battery-graph/battery-desktop.luau b/battery-graph/battery-desktop.luau new file mode 100644 index 0000000..310c507 --- /dev/null +++ b/battery-graph/battery-desktop.luau @@ -0,0 +1,79 @@ +graph_time = 3600 * noctalia.getConfig("graph_time") +battery_path = noctalia.getConfig("battery_path") +interpol_time = 60 * noctalia.getConfig("interpol_time") + +local function validate(s) + if s:match("^/org/freedesktop/UPower/devices/[%a%d_]+$") ~= nil then + return "'" .. tostring(s):gsub("'", "'\\''") .. "'" + else + noctalia.log("Invalid battery dbus path. Check that it is correct") + end +end + + +local cmd = table.concat({"gdbus call --system --dest org.freedesktop.UPower --object-path",validate(battery_path),"--method org.freedesktop.UPower.Device.GetHistory charge",graph_time, "1000"}, " ") + +function update() + noctalia.setUpdateInterval(interpol_time * 1000) + noctalia.runAsync(cmd, parse) + end + +function parse(result) + local points = {} + for tuple in result.stdout:gmatch("%(([^%)]+)%)") do + local fields = {} + for field in tuple:gmatch("[^,]+") do + field = field:match("^%s*(.-)%s*$") -- trim whitespace + field = field:gsub("^%S+%s+", "") -- strip "uint32 " style prefix (only if followed by more content) + table.insert(fields, field) + end + local ts, value = tonumber(fields[1]), tonumber(fields[2]) + if value ~= 0.0 then + points[ts] = value + end + end + + local interpolated_points = interpolate(points) + render(table.concat(interpolated_points, " "), interpolated_points) +end + +function interpolate(points ) + local interpolated_points = {} + + local tkeys = {} + for k in pairs(points) do + table.insert(tkeys, k) + end + table.sort(tkeys) + -- use the keys to retrieve the values in the sorted order + local prev_sample = 1 + local first_sample_time = tkeys[1] + table.insert(interpolated_points, tonumber(points[tkeys[1]])/100) + local time_done = 0 + while tkeys[prev_sample + 1] and time_done < graph_time do + local cur_time = time_done + first_sample_time + if cur_time > tkeys[prev_sample + 1] then + prev_sample += 1 + end + + table.insert(interpolated_points, tonumber(points[tkeys[prev_sample]])/100) + time_done += interpol_time + end + return interpolated_points +end + + +function render(point_str,points) + panel.render(ui.column({ gap = 8, radius = 8, align = "stretch", fill = "surface_variant" }, { + ui.row( {paddingH= 10, paddingV = 6},{ ui.label({text = noctalia.tr("text.graph_name"), fontSize = 24, fontWeight = "heavy", textAlign = "center"}),}), + ui.graph({ + values = points, + color = "primary", + lineWidth = 2, + fillOpacity = 0.45, + height = 200, + width = 400 + }), + })) +end + diff --git a/battery-graph/battery-graph.luau b/battery-graph/battery-graph.luau new file mode 100644 index 0000000..5b61823 --- /dev/null +++ b/battery-graph/battery-graph.luau @@ -0,0 +1,8 @@ +function update() + noctalia.setUpdateInterval(1000) + barWidget.setGlyph("battery") +end + +function onClick() + noctalia.togglePanel("frai3mega/battery-graph:battery-panel") +end diff --git a/battery-graph/battery-panel.luau b/battery-graph/battery-panel.luau new file mode 100644 index 0000000..022e19a --- /dev/null +++ b/battery-graph/battery-panel.luau @@ -0,0 +1,82 @@ +graph_time = 3600 * noctalia.getConfig("graph_time") +battery_path = noctalia.getConfig("battery_path") +interpol_time = 60 * noctalia.getConfig("interpol_time") + +local function quote(s) + return "'" .. tostring(s):gsub("'", "'\\''") .. "'" +end + +local function validate(s) + if s:match("^/org/freedesktop/UPower/devices/[%a%d_]+$") ~= nil then + return quote(s) + else + noctalia.log("Invalid battery dbus path. Check that it is correct") + end +end + + +local cmd = table.concat({"gdbus call --system --dest org.freedesktop.UPower --object-path",validate(battery_path),"--method org.freedesktop.UPower.Device.GetHistory charge",quote( graph_time ), "1000"}, " ") + +function onOpen() + -- noctalia.setUpdateInterval(1000) + noctalia.runAsync(cmd, parse) + end + +function parse(result) + local points = {} + for tuple in result.stdout:gmatch("%(([^%)]+)%)") do + local fields = {} + for field in tuple:gmatch("[^,]+") do + field = field:match("^%s*(.-)%s*$") -- trim whitespace + field = field:gsub("^%S+%s+", "") -- strip "uint32 " style prefix (only if followed by more content) + table.insert(fields, field) + end + local ts, value = tonumber(fields[1]), tonumber(fields[2]) + if value ~= 0.0 then + points[ts] = value + end + end + + local interpolated_points = interpolate(points) + render(table.concat(interpolated_points, " "), interpolated_points) +end + +function interpolate(points ) + local interpolated_points = {} + + local tkeys = {} + for k in pairs(points) do + table.insert(tkeys, k) + end + table.sort(tkeys) + -- use the keys to retrieve the values in the sorted order + local prev_sample = 1 + local first_sample_time = tkeys[1] + table.insert(interpolated_points, tonumber(points[tkeys[1]])/100) + local time_done = 0 + while tkeys[prev_sample + 1] and time_done < graph_time do + local cur_time = time_done + first_sample_time + if cur_time > tkeys[prev_sample + 1] then + prev_sample += 1 + end + + table.insert(interpolated_points, tonumber(points[tkeys[prev_sample]])/100) + time_done += interpol_time + end + return interpolated_points +end + + +function render(point_str,points) + panel.render(ui.column({ gap = 8, radius = 8, align = "stretch", fill = "surface_variant" }, { + ui.row( {paddingH= 10, paddingV = 6},{ ui.label({text = noctalia.tr("text.graph_name"), fontSize = 24, fontWeight = "heavy", textAlign = "center"}),}), + ui.graph({ + values = points, + color = "primary", + lineWidth = 2, + fillOpacity = 0.45, + height = 200, + }), + })) +end + diff --git a/battery-graph/plugin.toml b/battery-graph/plugin.toml new file mode 100644 index 0000000..b0fcdf9 --- /dev/null +++ b/battery-graph/plugin.toml @@ -0,0 +1,44 @@ +id = "frai3mega/battery-graph" +name = "Battery graph" +version = "1.0.0" +author = "frai3mega" +license = "MIT" +icon = "battery" +description = "Plots battery level on a graph" +plugin_api = 3 +tags = ["hardware", "utility", "desktop", "panel"] +dependencies = ["upowerd", "gdbus"] + +[[setting]] +key = "graph_time" +type = "int" +label_key = "settings.graph_time.label" +description_key = "settings.graph_time.description" +default = 6 + +[[setting]] +key = "battery_path" +type = "string" +label_key = "settings.battery_path.label" +description_key = "settings.battery_path.description" +default = "/org/freedesktop/UPower/devices/battery_BAT0" + +[[setting]] +key = "interpol_time" +type = "int" +label_key = "settings.interpol_time.label" +description_key = "settings.interpol_time.description" +default = 5 + + +[[widget]] +id = "battery-graph-widget" +entry = "battery-graph.luau" + +[[panel]] +id = "battery-panel" +entry = "battery-panel.luau" + +[[desktop_widget]] +id = "battery-graph-desktop" +entry = "battery-desktop.luau" diff --git a/battery-graph/thumbnail.webp b/battery-graph/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..6f336c9e009dba23b5afc5f72fad8c4582d5fd34 GIT binary patch literal 36802 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 literal 0 HcmV?d00001 diff --git a/battery-graph/translations/en.json b/battery-graph/translations/en.json new file mode 100644 index 0000000..0bbccf4 --- /dev/null +++ b/battery-graph/translations/en.json @@ -0,0 +1,19 @@ +{ + "settings": { + "graph_time": { + "label": "Graph timeframe", + "description": "How long of a timeframe does the graph plot in hours" + }, + "battery_path": { + "label": "Battery path", + "description": "Dbus path to the upower battery device" + }, + "interpol_time": { + "label": "Time between points", + "description": "How long should the thime between points be in minutes" + } + }, + "text": { + "graph_name": "Battery" + } +}