From 46609fff8dfb6d76897bf784fa7b657c758d6e81 Mon Sep 17 00:00:00 2001 From: Asmir A Date: Sat, 30 Sep 2023 14:11:16 +0200 Subject: [PATCH] modules: add suspend --- common/suspend.nix | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 common/suspend.nix diff --git a/common/suspend.nix b/common/suspend.nix new file mode 100644 index 0000000..f9da254 --- /dev/null +++ b/common/suspend.nix @@ -0,0 +1,70 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.services.batteryNotifier; +in { + options = { + services.batteryNotifier = { + enable = mkOption { + default = false; + description = '' + Whether to enable battery notifier. + ''; + }; + device = mkOption { + default = "BAT0"; + description = '' + Device to monitor. + ''; + }; + notifyCapacity = mkOption { + default = 10; + description = '' + Battery level at which a notification shall be sent. + ''; + }; + suspendCapacity = mkOption { + default = 5; + description = '' + Battery level at which a suspend unless connected shall be sent. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + systemd.user.timers."lowbatt" = { + description = "check battery level"; + timerConfig.OnBootSec = "1m"; + timerConfig.OnUnitInactiveSec = "1m"; + timerConfig.Unit = "lowbatt.service"; + wantedBy = ["timers.target"]; + }; + systemd.user.services."lowbatt" = { + description = "battery level notifier"; + serviceConfig.PassEnvironment = "DISPLAY"; + script = '' + export battery_capacity=$(${pkgs.coreutils}/bin/cat /sys/class/power_supply/${cfg.device}/capacity) + export battery_status=$(${pkgs.coreutils}/bin/cat /sys/class/power_supply/${cfg.device}/status) + + if [[ $battery_capacity -le ${builtins.toString cfg.notifyCapacity} && $battery_status = "Discharging" ]]; then + ${pkgs.libnotify}/bin/notify-send --urgency=critical --hint=int:transient:1 --icon=battery_empty "Battery Low" "You should probably plug-in." + fi + + if [[ $battery_capacity -le ${builtins.toString cfg.suspendCapacity} && $battery_status = "Discharging" ]]; then + ${pkgs.libnotify}/bin/notify-send --urgency=critical --hint=int:transient:1 --icon=battery_empty "Battery Critically Low" "Computer will suspend in 60 seconds." + sleep 60s + + battery_status=$(${pkgs.coreutils}/bin/cat /sys/class/power_supply/${cfg.device}/status) + if [[ $battery_status = "Discharging" ]]; then + systemctl suspend + fi + fi + ''; + }; + }; +}