{ pkgs, ... }: let charge-limit-apply = pkgs.writeShellScriptBin "charge-limit-apply" '' set -e if [ "$1" != "80" ] && [ "$1" != "100" ]; then echo "Usage: charge-limit-apply <80|100>" >&2 exit 1 fi ${pkgs.fw-ectool}/bin/ectool --interface=lpc fwchargelimit "$1" echo "$1" > /run/fw-charge-limit chmod 644 /run/fw-charge-limit echo "Charge limit set to $1%" ''; 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 sleep 1 ''; 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 --interface=lpc fwchargelimit 80 echo 80 > /run/fw-charge-limit chmod 644 /run/fw-charge-limit ''}"; }; }; }