{ config, lib, pkgs, namespace, ... }: with lib; let cfg = config.${namespace}.services.home-assistant; # ESPHome with littlefs-python and pyfatfs added to PYTHONPATH so PlatformIO's # espressif32 platform builder can import them (needed for LittleFS/FAT support). esphomeWithLittlefs = pkgs.esphome.overridePythonAttrs (oldAttrs: { makeWrapperArgs = (oldAttrs.makeWrapperArgs or [ ]) ++ [ "--prefix PYTHONPATH : ${pkgs.${namespace}.littlefs-python}/${pkgs.python3.sitePackages}" "--prefix PYTHONPATH : ${pkgs.python3Packages.pyfatfs}/${pkgs.python3.sitePackages}" ]; }); in { config = mkIf cfg.enable { services = { esphome = { enable = true; openFirewall = true; # 6052 address = "0.0.0.0"; package = esphomeWithLittlefs; }; }; # Add uv to the ESPHome service PATH so PlatformIO uses the Nix-provided # binary instead of downloading its own (which would fail due to permissions). # Also disable MemoryDenyWriteExecute so uv (a native Rust binary) can run. systemd.services.esphome = { path = [ pkgs.uv ]; serviceConfig = { MemoryDenyWriteExecute = lib.mkForce false; }; }; }; }