From 4b1714d2c50a5b155569aef7e11ef82850eff2d4 Mon Sep 17 00:00:00 2001 From: Damian D'Souza <113062544+damian-ds7@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:30:26 +0200 Subject: [PATCH] Feat/battery threshold (#7) * feat(battery-threshold): add translations and rule file * feat(battery-threshold): add setup script * feat(battery-threshold): add plugin manifest * feat(battery-threshold): implement battery-threshold service * feat(battery-threshold): implement battery-threshold widget * feat(battery-threshold): implement battery-threshold panel * feat(battery-threshold): add readme * chore(battery-threshold): add dependencies field * chore(battery-threshold): add thumbnail * docs(battery-threshold): add thumbnail to readme * fix(battery-threshold): add thumbnail from generator * chore(battery-threshold): add license and icon fields to plugin.toml * style(battery-threshold): replace tabs with spaces * style(battery-threshold): unflatten translation files * refactor(battery-threshold): use translations for widget tooltip * chore(battery-threshold): replace raw strings with translations * chore(battery-threshold): remove panel ipc event * chore(battery-threshold): check error on file read * chore(battery-threshold): remove `setUpdateInterval` calls * style(battery-threshold): fix formatting * chore(battery-threshold): remove tags capital letters * Update plugin.toml * chore(battery-threshold): remove de fr and tr translations * chore(battery-threshold): update thumbnail * fix(battery-threshold): add shell quoting for runAsync * chore(battery-threshold): embed rule file content in setup script * chore(battery-threshold): update manifest * refactor(battery-threshold): use noctalia.pluginDataDir, log read/write errors * docs(battery-threshold): update README to match template * chore(battery-threshold): add missing dependencies to manifest --------- Co-authored-by: Lemmy --- battery-threshold/README.md | 63 +++++++ battery-threshold/panel.luau | 172 +++++++++++++++++++ battery-threshold/plugin.toml | 43 +++++ battery-threshold/service.luau | 228 +++++++++++++++++++++++++ battery-threshold/setup_rules.sh | 54 ++++++ battery-threshold/thumbnail.webp | Bin 0 -> 54706 bytes battery-threshold/translations/en.json | 26 +++ battery-threshold/widget.luau | 35 ++++ 8 files changed, 621 insertions(+) create mode 100644 battery-threshold/README.md create mode 100644 battery-threshold/panel.luau create mode 100644 battery-threshold/plugin.toml create mode 100644 battery-threshold/service.luau create mode 100755 battery-threshold/setup_rules.sh create mode 100644 battery-threshold/thumbnail.webp create mode 100644 battery-threshold/translations/en.json create mode 100644 battery-threshold/widget.luau diff --git a/battery-threshold/README.md b/battery-threshold/README.md new file mode 100644 index 0000000..40fa7c2 --- /dev/null +++ b/battery-threshold/README.md @@ -0,0 +1,63 @@ +# Battery Threshold Control + +Control the battery charge threshold on laptop batteries to help extend overall +battery lifespan. Someone would use this plugin to limit maximum charge levels +while plugged in, reducing battery wear and heat. + +## Plugin + +| Field | Value | +| ------- | ------------------------------------------------------------------- | +| ID | `damian-ds7/battery-threshold` | +| Entries | Bar widget: `battery-threshold`; panel: `panel`; service: `service` | + +## Requirements + +- `polkit` - required for interactive setup +- Laptop hardware supporting battery charge threshold control in sysfs + (`/sys/class/power_supply/*/charge_control_end_threshold`). +- The following external programs must be available on `PATH`: `test`, `pkexec`, + `bash`, `cat`, `getent`, `groupadd`, `usermod`, `udevadm`, `chgrp`, and + `chmod`. + +## Usage + +- **Bar Widget (`battery-threshold`)**: Displays the current battery threshold + in the bar. Click to toggle the panel. +- **Panel (`panel`)**: Adjust the battery threshold using a slider (40–100%). + Includes a **Configure Permissions** button if write access is missing. Toggle + the panel using: + +```sh +noctalia msg panel-toggle damian-ds7/battery-threshold:panel +``` + +## Settings + +| Setting | Type | Default | Description | +| ------------------ | -------- | ------------------------------ | ---------------------------------------------- | +| `battery_device` | `folder` | `/sys/class/power_supply/BAT0` | Path to the battery sysfs directory. | +| `charge_threshold` | `int` | `80` | Default charge threshold percentage (40–100%). | + +## IPC + +```sh +# Set charge threshold percentage (between 40 and 100) +noctalia msg plugin damian-ds7/battery-threshold:service all set 80 + +# Trigger setup script for udev permissions +noctalia msg plugin damian-ds7/battery-threshold:service all setup +``` + +## Notes + +- **Permissions & Setup**: Requires write access to + `/sys/class/power_supply/BAT0/charge_control_end_threshold`. Automated setup + creates the `battery_ctl` group, adds the active user to it, and installs + `99-battery-threshold.rules` to `/etc/udev/rules.d/`. +- **Relogin / Reboot**: A logout or system reboot is required after running + setup for `battery_ctl` group membership changes to take effect. +- **Manual Setup Fallback**: If Polkit is not available, run + `sudo ./setup_rules.sh` manually from the plugin directory. +- **Persistence**: Threshold settings are stored in `threshold.txt` in plugin + directory and restored across reboots. diff --git a/battery-threshold/panel.luau b/battery-threshold/panel.luau new file mode 100644 index 0000000..673a4b9 --- /dev/null +++ b/battery-threshold/panel.luau @@ -0,0 +1,172 @@ +--!nonstrict +local is_open = false + +local function render_panel() + if not is_open then + return + end + + local is_available = noctalia.state.get("is_available") == true + local is_writable = noctalia.state.get("is_writable") == true + local threshold = noctalia.state.get("current_threshold") or 0 + local model_name = noctalia.state.get("battery_model_name") or "" + + local title_text = noctalia.tr("panel.title") + local sub_text = "" + if not is_available then + sub_text = noctalia.tr("panel.not-available") + else + sub_text = model_name + end + + local hint_text = "" + local hint_color = "on_surface_variant" + if not is_writable then + hint_text = noctalia.tr("panel.read-only") + hint_color = "error" + else + hint_text = noctalia.tr("panel.adjust-limit") + end + + local children = { + ui.row({ align = "center", justify = "space_between" }, { + ui.column({ gap = 2 }, { + ui.label({ + text = title_text, + fontSize = 16, + fontWeight = "bold", + color = "primary", + }), + ui.label({ + text = sub_text, + fontSize = 12, + color = "on_surface_variant", + }), + }), + ui.button({ + glyph = "close", + variant = "ghost", + onClick = "onCloseClicked", + }), + }), + } + + if is_available then + table.insert( + children, + ui.separator({ thickness = 1, color = "outline/0.3", spacing = 8 }) + ) + + if is_writable then + table.insert( + children, + ui.column({ gap = 8 }, { + ui.row({ align = "center", justify = "space_between" }, { + ui.label({ + text = title_text, + fontSize = 14, + color = "on_surface", + }), + ui.label({ + text = tostring(threshold) .. "%", + fontSize = 16, + fontWeight = "bold", + color = "primary", + }), + }), + ui.row({ align = "center", gap = 8 }, { + ui.label({ + text = "40%", + fontSize = 11, + color = "on_surface_variant", + }), + ui.slider({ + min = 40, + max = 100, + step = 5, + value = threshold, + enabled = is_writable, + onChange = "onSliderChange", + }), + ui.label({ + text = "100%", + fontSize = 11, + color = "on_surface_variant", + }), + }), + ui.label({ + text = hint_text, + fontSize = 11, + color = hint_color, + textAlign = "center", + }), + }) + ) + else + table.insert( + children, + ui.column({ gap = 12, align = "center" }, { + ui.label({ + text = hint_text, + fontSize = 12, + color = "error", + textAlign = "center", + maxLines = 2, + }), + ui.button({ + text = noctalia.tr("panel.button"), + glyph = "shield-lock", + variant = "primary", + onClick = "onRunSetup", + }), + }) + ) + end + end + + panel.render(ui.column({ gap = 12, padding = 12 }, children)) +end + +function onOpen(context: string?) + is_open = true + render_panel() +end + +function onClose() + is_open = false +end + +function onSliderChange(value: string) + local num = tonumber(value) + if num then + noctalia.state.set("set_threshold_request", num) + noctalia.state.set("current_threshold", num) + render_panel() + end +end + +function onCloseClicked() + panel.close() +end + +function onRunSetup() + noctalia.state.set("run_setup_request", true) +end + +noctalia.state.watch("current_threshold", function() + if is_open then + render_panel() + end +end) + +noctalia.state.watch("is_writable", function() + if is_open then + render_panel() + end +end) + +noctalia.state.watch("is_available", function() + if is_open then + render_panel() + end +end) diff --git a/battery-threshold/plugin.toml b/battery-threshold/plugin.toml new file mode 100644 index 0000000..65bc0be --- /dev/null +++ b/battery-threshold/plugin.toml @@ -0,0 +1,43 @@ +id = "damian-ds7/battery-threshold" +name = "Battery Threshold Control" +version = "1.0.0" +plugin_api = 3 +author = "Damian D'Souza" +description = "Set the battery threshold for laptop batteries to extend battery lifespan" +license = "MIT" +icon = "battery-eco" +tags = ["hardware", "system", "utility", "bar", "panel"] +dependencies = ["test", "pkexec", "bash", "cat", "getent", "groupadd", "usermod", "udevadm", "chgrp", "chmod"] + +[[service]] +id = "service" +entry = "service.luau" + +[[widget]] +id = "battery-threshold" +entry = "widget.luau" + +[[panel]] +id = "panel" +entry = "panel.luau" +width = 320 +height = 220 +placement = "floating" +position = "center" +open_near_click = true + +[[setting]] +key = "battery_device" +type = "folder" +label_key = "settings.battery-device" +description_key = "settings.battery-device-desc" +default = "/sys/class/power_supply/BAT0" + +[[setting]] +key = "charge_threshold" +type = "int" +label_key = "settings.charge-threshold" +description_key = "settings.charge-threshold-desc" +default = 80 +min = 40 +max = 100 diff --git a/battery-threshold/service.luau b/battery-threshold/service.luau new file mode 100644 index 0000000..a9a956f --- /dev/null +++ b/battery-threshold/service.luau @@ -0,0 +1,228 @@ +--!nonstrict +local function get_batteries(): { string } + local batteries = {} + local files, _ = noctalia.listDir("/sys/class/power_supply") + + if files then + for _, name in files do + local path = "/sys/class/power_supply/" .. name + if noctalia.fileExists(path .. "/charge_control_end_threshold") then + table.insert(batteries, path) + end + end + end + + return batteries +end + +local function get_active_battery(): string? + local configured = noctalia.getConfig("battery_device") + + if + typeof(configured) == "string" + and configured ~= "" + and noctalia.fileExists(configured .. "/charge_control_end_threshold") + then + return configured + end + + local list = get_batteries() + return list[1] +end + +local function shell_quote(str: string): string + return "'" .. string.gsub(str, "'", "'\\''") .. "'" +end + +local function check_writable(path: string, callback: (boolean) -> ()) + noctalia.runAsync("test -w " .. shell_quote(path), function(res) + callback(res.exitCode == 0) + end) +end + +local data_dir, data_dir_err = noctalia.pluginDataDir() +if not data_dir or data_dir_err then + noctalia.log( + "Failed to get plugin data directory: " + .. tostring(data_dir_err or "unknown error") + ) +end +local THRESHOLD_FILE_PATH: string? = if data_dir + then data_dir .. "/threshold.txt" + else nil + +local function set_threshold(value: number) + local battery = get_active_battery() + if not battery then + return + end + local threshold_file = battery .. "/charge_control_end_threshold" + + local v = math.floor(value + 0.5) + if v < 40 then + v = 40 + end + if v > 100 then + v = 100 + end + + noctalia.log("Setting charge threshold to " .. tostring(v) .. "% on " .. battery) + + local ok, err = noctalia.writeFile(threshold_file, tostring(v) .. "\n") + if ok then + noctalia.state.set("current_threshold", v) + if THRESHOLD_FILE_PATH then + local save_ok, save_err = + noctalia.writeFile(THRESHOLD_FILE_PATH, tostring(v)) + if not save_ok then + noctalia.log( + "Failed to write saved threshold to " + .. THRESHOLD_FILE_PATH + .. ": " + .. tostring(save_err) + ) + end + end + else + noctalia.log("Failed to write threshold: " .. tostring(err)) + noctalia.notifyError( + noctalia.tr("notification.error-title"), + noctalia.tr("notification.error-msg", { file = threshold_file }) + ) + end +end + +local function check_status() + local battery = get_active_battery() + if not battery then + noctalia.state.set("is_available", false) + noctalia.state.set("is_writable", false) + noctalia.state.set("current_threshold", 0) + noctalia.state.set("battery_model_name", "") + return + end + + noctalia.state.set("is_available", true) + + local model_name = "" + local content, err = noctalia.readFile(battery .. "/model_name") + if content and not err then + model_name = noctalia.string.trim(content) + end + noctalia.state.set("battery_model_name", model_name) + + local threshold_file = battery .. "/charge_control_end_threshold" + + local threshold_content = noctalia.readFile(threshold_file) + local current_val = 0 + if threshold_content then + current_val = tonumber(noctalia.string.trim(threshold_content)) or 0 + noctalia.state.set("current_threshold", current_val) + end + + check_writable(threshold_file, function(writable) + noctalia.state.set("is_writable", writable) + + if writable then + local saved_val = nil + if THRESHOLD_FILE_PATH and noctalia.fileExists(THRESHOLD_FILE_PATH) then + local saved_content, read_err = noctalia.readFile(THRESHOLD_FILE_PATH) + if saved_content and not read_err then + saved_val = tonumber(noctalia.string.trim(saved_content)) + elseif read_err then + noctalia.log( + "Failed to read saved threshold from " + .. THRESHOLD_FILE_PATH + .. ": " + .. tostring(read_err) + ) + end + end + + if not saved_val then + local config_val = noctalia.getConfig("charge_threshold") + if typeof(config_val) == "number" then + saved_val = config_val + end + end + + if saved_val and saved_val >= 40 and saved_val <= 100 then + if saved_val ~= current_val then + set_threshold(saved_val) + end + end + end + end) +end + +local function run_setup() + local user = noctalia.getenv("USER") + if not user or user == "" then + noctalia.log("Could not get USER environment variable") + return + end + + local plugin_dir = noctalia.pluginDir() + if not plugin_dir then + noctalia.log("Could not get plugin directory") + return + end + + local rules_script = plugin_dir .. "/setup_rules.sh" + + local cmd = + string.format("pkexec bash %s %s", shell_quote(rules_script), shell_quote(user)) + + noctalia.log("Running setup script via pkexec: " .. cmd) + noctalia.runAsync(cmd, function(result) + if result.exitCode == 0 then + noctalia.log("Setup completed successfully") + noctalia.notify( + noctalia.tr("notification.setup-title"), + noctalia.tr("notification.setup-success") + ) + check_status() + else + noctalia.log("Setup failed with exit code " .. tostring(result.exitCode)) + noctalia.notifyError( + noctalia.tr("notification.setup-title"), + noctalia.tr("notification.setup-fail") + ) + end + noctalia.state.set("run_setup_request", false) + end) +end + +noctalia.state.watch("run_setup_request", function(val) + if val == true then + run_setup() + end +end) + +noctalia.state.watch("set_threshold_request", function(val) + if val then + local num = tonumber(val) + if num then + set_threshold(num) + end + end +end) + +function onIpc(event, payload) + if event == "set" then + if payload then + local val = tonumber(payload) + if val and val >= 40 and val <= 100 then + set_threshold(val) + end + end + elseif event == "setup" then + run_setup() + end +end + +function onConfigChanged() + check_status() +end + +check_status() diff --git a/battery-threshold/setup_rules.sh b/battery-threshold/setup_rules.sh new file mode 100755 index 0000000..1865d41 --- /dev/null +++ b/battery-threshold/setup_rules.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# ------------------------------ +# Battery Threshold Udev Setup +# ------------------------------ +# This script sets up udev rules to allow a non-root user to write to +# /sys/class/power_supply/BAT0/charge_control_end_threshold. +# It creates a group 'battery_ctl' and adds the target user to this group. +# +# Usage: +# $ sudo ./setup_rules.sh # uses SUDO_USER (with sudo) +# $ ./setup_rules.sh username # use provided username (if ran as root) +# ------------------------------ +set -e + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "Error: This script must be run as root (use sudo)" + exit 1 +fi + +# Determine target user +TARGET_USER=${SUDO_USER:-$1} + +if [ -z "$TARGET_USER" ]; then + echo "Error: No target user specified." >&2 + exit 1 +fi + +if ! getent group battery_ctl >/dev/null; then + echo "Creating battery_ctl group..." + groupadd battery_ctl +fi + +echo "Adding $TARGET_USER to battery_ctl group..." +usermod -aG battery_ctl "$TARGET_USER" + +echo "Writing udev rule to /etc/udev/rules.d/99-battery-threshold.rules..." + +cat <<'EOF' >/etc/udev/rules.d/99-battery-threshold.rules +# Battery Threshold Control - udev rule +# Grants write access to charge_control_end_threshold for users in the +# 'battery_ctl' group. +SUBSYSTEM=="power_supply", KERNEL=="BAT*", \ + RUN+="/bin/chgrp battery_ctl /sys$devpath/charge_control_end_threshold", \ + RUN+="/bin/chmod g+w /sys$devpath/charge_control_end_threshold" +EOF + +echo "Reloading rules..." + +udevadm control --reload-rules && udevadm trigger + +echo "You may need a reboot for the plugin's write access to take effect" +echo "Done!" diff --git a/battery-threshold/thumbnail.webp b/battery-threshold/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..d71bc6162111b7ec2595636a86ed73a428697ec1 GIT binary patch literal 54706 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 literal 0 HcmV?d00001 diff --git a/battery-threshold/translations/en.json b/battery-threshold/translations/en.json new file mode 100644 index 0000000..28794c5 --- /dev/null +++ b/battery-threshold/translations/en.json @@ -0,0 +1,26 @@ +{ + "settings": { + "battery-device": "Battery Device", + "battery-device-desc": "Battery to configure threshold for", + "charge-threshold": "Charge Threshold", + "charge-threshold-desc": "The percentage at which the battery should stop charging", + "no-battery-device": "No configurable batteries are available on this system" + }, + "notification": { + "error-title": "Battery Threshold Error", + "error-msg": "Failed to write battery threshold to {file}", + "setup-title": "Battery Threshold Setup", + "setup-fail": "Failed to configure permissions.", + "setup-success": "Permissions configured. Please log out and back in for group changes to take effect." + }, + "actions": { + "widget-settings": "Widget Settings" + }, + "panel": { + "title": "Battery Threshold", + "not-available": "Not available on this system", + "adjust-limit": "Drag slider to adjust limit", + "read-only": "Read-only: Install udev rule for write access", + "button": "Configure Permissions" + } +} diff --git a/battery-threshold/widget.luau b/battery-threshold/widget.luau new file mode 100644 index 0000000..f357050 --- /dev/null +++ b/battery-threshold/widget.luau @@ -0,0 +1,35 @@ +--!nonstrict +local function render_widget() + local is_available = noctalia.state.get("is_available") == true + local threshold = noctalia.state.get("current_threshold") or 0 + + local container = barWidget.isVertical() and ui.column or ui.row + + if is_available then + barWidget.render(container({ gap = 4, align = "center" }, { + ui.glyph({ name = "charging-pile", size = 14 }), + ui.label({ text = tostring(threshold) .. "%", fontWeight = "bold" }), + })) + barWidget.setTooltip( + noctalia.tr("panel.title") .. " " .. tostring(threshold) .. "%" + ) + else + barWidget.render(container({ gap = 4, align = "center" }, { + ui.glyph({ name = "charging-pile", size = 14, color = "on_surface/0.4" }), + })) + barWidget.setTooltip(noctalia.tr("settings.no-battery-device")) + end +end + +noctalia.state.watch("current_threshold", render_widget) +noctalia.state.watch("is_available", render_widget) + +function onClick() + noctalia.togglePanel("damian-ds7/battery-threshold:panel") +end + +function update() + render_widget() +end + +render_widget()