100 lines
2.6 KiB
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;
|
|
};
|
|
};
|
|
};
|
|
}
|