nixos/hosts/nb/modules/charge-control.nix

91 lines
2.7 KiB
Nix

{ pkgs, ... }:
let
charge-limit-apply = pkgs.writeShellScriptBin "charge-limit-apply" ''
if [ "$1" != "80" ] && [ "$1" != "100" ]; then
echo "Usage: charge-limit-apply <80|100>" >&2
exit 1
fi
${pkgs.fw-ectool}/bin/ectool fwchargelimit "$1"
echo "$1" > /run/fw-charge-limit
chmod 644 /run/fw-charge-limit
'';
charge-limit-menu = pkgs.writeShellScriptBin "charge-limit-menu" ''
choice=$(printf "80%%\n100%%" | ${pkgs.fzf}/bin/fzf --prompt="Charge limit > " --reverse --no-info)
case "$choice" in
"80%") /run/wrappers/bin/sudo ${charge-limit-apply}/bin/charge-limit-apply 80 ;;
"100%") /run/wrappers/bin/sudo ${charge-limit-apply}/bin/charge-limit-apply 100 ;;
esac
'';
waybar-battery = pkgs.writeShellScriptBin "waybar-battery" ''
charging_icons=("󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅")
default_icons=("󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹")
bat_path=$(echo /sys/class/power_supply/BAT*)
capacity=$(cat "$bat_path/capacity" 2>/dev/null || echo 0)
status=$(cat "$bat_path/status" 2>/dev/null || echo "Unknown")
limit=$(cat /run/fw-charge-limit 2>/dev/null || echo 80)
# Select icon based on capacity (10 icons, index 0-9)
idx=$(( capacity / 11 ))
if [ "$idx" -gt 9 ]; then idx=9; fi
if [ "$status" = "Charging" ]; then
icon="''${charging_icons[$idx]}"
else
icon="''${default_icons[$idx]}"
fi
# Determine CSS class
class=""
if [ "$capacity" -le 15 ]; then
class="critical"
elif [ "$capacity" -le 30 ]; then
class="warning"
elif [ "$capacity" -ge 95 ]; then
class="good"
fi
tooltip="Battery: ''${capacity}% [''${status}]\nCharge limit: ''${limit}%"
${pkgs.jq}/bin/jq -cn \
--arg text "$icon ''${capacity}% (''${limit}%)" \
--arg tooltip "$tooltip" \
--arg class "$class" \
'{text: $text, tooltip: $tooltip, class: $class}'
'';
in
{
environment.systemPackages = [
pkgs.fw-ectool
charge-limit-apply
charge-limit-menu
waybar-battery
];
security.sudo.extraRules = [
{
users = [ "dominik" ];
commands = [
{
command = "${charge-limit-apply}/bin/charge-limit-apply";
options = [ "NOPASSWD" ];
}
];
}
];
systemd.services.fw-charge-limit = {
description = "Set Framework charge limit on boot";
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
ExecStart = "${pkgs.writeShellScript "fw-charge-limit-init" ''
${pkgs.fw-ectool}/bin/ectool fwchargelimit 80
echo 80 > /run/fw-charge-limit
chmod 644 /run/fw-charge-limit
''}";
};
};
}