{ config, lib, pkgs, namespace, ... }: with lib; let inherit (lib.${namespace}) mkOpt; cfg = config.${namespace}.services.home-assistant.automation; yamlFormat = pkgs.formats.yaml { }; mkLightswitchAutomation = name: lscfg: { "${toString lscfg.id}" = { alias = lscfg.alias; description = lscfg.description; triggers = [ { domain = "mqtt"; device_id = lscfg.mqttDeviceId; type = "action"; subtype = "on-press"; trigger = "device"; id = "on press"; } { domain = "mqtt"; device_id = lscfg.mqttDeviceId; type = "action"; subtype = "off-press"; trigger = "device"; id = "off press"; } { domain = "mqtt"; device_id = lscfg.mqttDeviceId; type = "action"; subtype = "up-press"; trigger = "device"; id = "up press"; } { domain = "mqtt"; device_id = lscfg.mqttDeviceId; type = "action"; subtype = "down-press"; trigger = "device"; id = "down press"; } { domain = "mqtt"; device_id = lscfg.mqttDeviceId; type = "action"; subtype = "on-hold"; trigger = "device"; id = "on hold"; } ]; conditions = []; actions = [ { choose = [ { conditions = [ { condition = "trigger"; id = [ "on press" ]; } ]; sequence = [ { action = "light.turn_on"; metadata = {}; data = { transition = lscfg.transitionTime; brightness_pct = lscfg.brightnessPercent; kelvin = lscfg.lightTemperature; }; target.entity_id = [ lscfg.lightEntityId ]; } ]; } { conditions = [ { condition = "trigger"; id = [ "off press" ]; } ]; sequence = [ { action = "light.turn_off"; metadata = {}; data.transition = lscfg.transitionTime; target.entity_id = [ lscfg.lightEntityId ]; } ]; } { conditions = [ { condition = "trigger"; id = [ "up press" ]; } ]; sequence = [ { action = "light.turn_on"; metadata = {}; data.brightness_step_pct = lscfg.brightnessStepPercent; target.entity_id = lscfg.lightEntityId; } ]; } { conditions = [ { condition = "trigger"; id = [ "down press" ]; } ]; sequence = [ { action = "light.turn_on"; metadata = {}; data.brightness_step_pct = -lscfg.brightnessStepPercent; target.entity_id = lscfg.lightEntityId; } ]; } { conditions = [ { condition = "trigger"; id = [ "on hold" ]; } ]; sequence = [ { action = "light.turn_on"; metadata = {}; data = { transition = 0; brightness_pct = 100; rgb_color = [ 255 38 0 ]; }; target.entity_id = [ lscfg.lightEntityId ]; } ]; } ]; } ]; mode = "single"; }; }; # Generate all automations as list lightswitchAutomations = mapAttrsToList mkLightswitchAutomation cfg.lightswitch; in { options.${namespace}.services.home-assistant.automation = { lightswitch = mkOpt (types.attrsOf ( types.submodule { options = { id = mkOpt types.int 0 "Automation Id"; alias = mkOpt types.str "" "Alias/Friendly Name"; description = mkOpt types.str "" "Automation Description"; mqttDeviceId = mkOpt types.str "" "mqtt device id of the sitch"; lightEntityId = mkOpt types.str "" "home assistant entity id for the lights"; transitionTime = mkOpt types.int 2 "light transition time in seconds"; brightnessPercent = mkOpt types.int 100 "brightness percentage when turned on"; lightTemperature = mkOpt types.int 6000 "light temperature when turned on"; brightnessStepPercent = mkOpt types.int 10 "dimmer step in brightness percent"; }; } )) { } "lightswitch automations"; }; config = { environment.etc."lightswitch-automations.yaml".source = yamlFormat.generate "lightswitch-automations.yaml" lightswitchAutomations; }; }