{ config, lib, pkgs, self, ... }: let cfg = config.modules.services.home-assistant; in { config = lib.mkIf cfg.enable { services.mosquitto = { enable = true; listeners = [ { acl = [ "pattern readwrite #" ]; omitPasswordAuth = true; port = 1883; settings = { allow_anonymous = true; }; } ]; }; age.secrets."files/services/zigbee2mqtt/secret.yaml" = { file = "${self.inputs.secrets}/files/services/zigbee2mqtt/secret.yaml.age"; path = "${config.services.zigbee2mqtt.dataDir}/secret.yaml"; owner = "zigbee2mqtt"; group = "zigbee2mqtt"; }; services.zigbee2mqtt = { package = pkgs.unstable.zigbee2mqtt; enable = true; dataDir = "/var/lib/zigbee2mqtt"; settings = { homeassistant = lib.optionalAttrs config.services.home-assistant.enable { discovery_topic = "homeassistant"; status_topic = "hass/status"; }; availability = true; frontend = true; device_options = { retain = true; }; serial = { port = "/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0"; adapter = "zstack"; }; advanced = { channel = 20; network_key = "!secret.yaml network_key"; pan_id = 13001; ext_pan_id = [ 79 1 73 47 250 136 124 222 ]; transmit_power = 20; }; mqtt = { version = 5; server = "mqtt://localhost:1883"; }; }; }; modules.services.borgmatic.directories = [ config.services.mosquitto.dataDir config.services.zigbee2mqtt.dataDir ]; services.home-assistant = { config.mqtt = { }; extraComponents = [ "mqtt" "mqtt_eventstream" "mqtt_json" "mqtt_room" "mqtt_statestream" ]; }; }; }