diff --git a/flake.lock b/flake.lock index 5bb5e7c..0690be4 100644 --- a/flake.lock +++ b/flake.lock @@ -246,11 +246,11 @@ ] }, "locked": { - "lastModified": 1667592878, - "narHash": "sha256-zB0kNNeUBPGw+LWzWmSqTHRfvfy3ckOUMtyE3F90Dns=", + "lastModified": 1674396506, + "narHash": "sha256-NkCMOr9pHz0rlElFXeeh4dVmPiKCXa7NYXxvpjluZcI=", "ref": "refs/heads/master", - "rev": "ff4ce742bffb71fc983cb13a3634ec0d243d869c", - "revCount": 47, + "rev": "d907a415182e3051cb4b06da69320a347be24a78", + "revCount": 48, "type": "git", "url": "https://git.sbruder.de/simon/nixpkgs-overlay" }, diff --git a/modules/default.nix b/modules/default.nix index e4ac5ea..6502362 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -22,6 +22,7 @@ ./ausweisapp.nix ./cups.nix ./docker.nix + ./fancontrol.nix ./fonts.nix ./games.nix ./grub.nix diff --git a/modules/fancontrol.nix b/modules/fancontrol.nix new file mode 100644 index 0000000..227932e --- /dev/null +++ b/modules/fancontrol.nix @@ -0,0 +1,148 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.sbruder.fancontrol; +in +{ + options.sbruder.fancontrol = { + enable = lib.mkEnableOption "afancontrol based fancontrol"; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.afancontrol; + description = "The afancontrol package to use."; + }; + interval = lib.mkOption { + type = lib.types.int; + default = 1; + description = "Interval in seconds the fan speeds should be calculated and set."; + }; + enableDefaultMapping = lib.mkEnableOption "the default mapping, mapping all sensors to all fans"; + fans = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + pwmFile = lib.mkOption { + type = lib.types.path; + description = "File to write the PWM duty cycle to."; + }; + pwmLineStart = lib.mkOption { + type = lib.types.int; + default = 0; + description = "PWM value at which the linear correlation of PWM/RPM starts."; + }; + pwmLineEnd = lib.mkOption { + type = lib.types.int; + default = 255; + description = "PWM value at which the linear correlation of PWM/RPM ends."; + }; + rpmFile = lib.mkOption { + type = lib.types.path; + description = "File to read the fan RPM from."; + }; + neverStop = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether to stop the fan on speed 0% (otherwise runs with pwmLineStart)."; + }; + }; + }); + default = { }; + }; + sensors = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + file = lib.mkOption { + type = lib.types.path; + description = "File to read the temperature (in m°C) from."; + }; + min = lib.mkOption { + type = lib.types.int; + description = "Temperature at which the fan speed is lowest."; + }; + max = lib.mkOption { + type = lib.types.int; + description = "Temperature at which the fan speed is highest."; + }; + }; + }); + default = { }; + }; + mappings = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + fans = lib.mkOption { + type = lib.types.listOf (lib.types.str); + description = "Fans to map."; + }; + sensors = lib.mkOption { + type = lib.types.listOf (lib.types.str); + description = "Sensors to map."; + }; + }; + }); + default = + if cfg.enableDefaultMapping then { + all = { + fans = lib.attrNames cfg.fans; + sensors = lib.attrNames cfg.sensors; + }; + } else { }; + }; + }; + config = lib.mkIf cfg.enable { + # makes some assumptions + #systemd.packages = [ cfg.package ]; + + systemd.services.afancontrol = { + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + LimitNOFILE = 8192; + ExecStartPre = "${cfg.package}/bin/afancontrol daemon --test"; + ExecStart = "${cfg.package}/bin/afancontrol daemon --pidfile /run/afancontrol.pid"; + PIDFile = "/run/afancontrol.pid"; + Restart = "always"; + }; + }; + + environment.etc."afancontrol/afancontrol.conf".text = lib.generators.toINI + { + mkKeyValue = lib.generators.mkKeyValueDefault + { + mkValueString = v: + if lib.isList v then lib.concatMapStringsSep ", " toString v + else lib.generators.mkValueStringDefault { } v; + } + ":"; + } + ({ + daemon = { + interval = 1; + }; + + actions = { + report_cmd = "true"; + }; + } // (lib.mapAttrs' + (name: config: lib.nameValuePair "fan: ${name}" { + type = "linux"; + pwm = config.pwmFile; + fan_input = config.rpmFile; + pwm_line_start = config.pwmLineStart; + pwm_line_end = config.pwmLineEnd; + never_stop = config.neverStop; + }) + cfg.fans + ) // (lib.mapAttrs' + (name: config: lib.nameValuePair "temp: ${name}" { + type = "file"; + path = config.file; + inherit (config) min max; + }) + cfg.sensors + ) // (lib.mapAttrs' + (name: config: lib.nameValuePair "mapping: ${name}" { + inherit (config) fans; + temps = config.sensors; + }) + cfg.mappings + )); + }; +}