ha-mqtt-agent/module.nix

100 lines
2.6 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.services.ha-mqtt-agent;
in
{
options.services.ha-mqtt-agent = {
enable = lib.mkEnableOption "enable ha-mqtt-agent";
buttons.enable = lib.mkEnableOption "enable buttons" // { default = true; };
dbm = {
enable = lib.mkEnableOption "enable display brightness manager";
displayDevice = lib.mkOption { type = lib.types.str; };
touchDevice = lib.mkOption { type = lib.types.str; };
};
device = {
id = lib.mkOption { type = lib.types.str; };
name = lib.mkOption { type = lib.types.str; };
};
mqtt = {
hostname = lib.mkOption { type = lib.types.str; };
username = lib.mkOption { type = lib.types.str; };
passwordFile = lib.mkOption { type = lib.types.str; };
};
user = lib.mkOption {
default = "ha-mqtt-agent";
type = lib.types.str;
};
group = lib.mkOption {
default = "ha-mqtt-agent";
type = lib.types.str;
};
};
config = lib.mkIf cfg.enable {
users.users."${cfg.user}" = {
isSystemUser = true;
group = cfg.group;
extraGroups = []
++ (lib.optionals cfg.dbm.enable [ "input" "video" ]);
};
users.groups."${cfg.group}" = {};
security.sudo = lib.mkIf cfg.buttons.enable {
enable = true;
extraRules = [{
commands = [
{
command = "${pkgs.systemd}/bin/systemctl reboot";
options = [ "NOPASSWD" ];
}
{
command = "${pkgs.systemd}/bin/systemctl poweroff";
options = [ "NOPASSWD" ];
}
];
users = [ cfg.user ];
}];
};
systemd.services."ha-mqtt-agent" = let
scriptStart = ''
export MQTT_PASS=$(cat "''${MQTT_PASS_FILE}")
${pkgs.ha-mqtt-agent}/bin/ha-mqtt-agent \
--device-id "${cfg.device.id}" \
--device-name "${cfg.device.name}" \
--mqtt-host "${cfg.mqtt.hostname}" \
--mqtt-user "${cfg.mqtt.username}"'';
scriptTail = if cfg.dbm.enable then '' \
--display-device "${cfg.dbm.displayDevice}" \
--touch-device "${cfg.dbm.touchDevice}"
'' else "";
script = (scriptStart + scriptTail);
in {
inherit script;
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
path = [ pkgs.bash "/run/wrappers" ];
environment = {
MQTT_PASS_FILE = "%d/mqtt_pass";
};
serviceConfig = {
LoadCredential = "mqtt_pass:${cfg.mqtt.passwordFile}";
Restart = "on-failure";
RestartSec = 3;
User = cfg.user;
};
};
};
}