From 0924dfae805a4f18646a72b20842cedfe472c856 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Fri, 1 Nov 2024 00:46:59 +0100 Subject: [PATCH] nixos/home-assistant: escape yaml functions in lovelace config and improve the documentation around this topic by a large margin. Closes: #352651 --- .../home-automation/home-assistant.nix | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/nixos/modules/services/home-automation/home-assistant.nix b/nixos/modules/services/home-automation/home-assistant.nix index c7b28b910515..d5af0bcd5e91 100644 --- a/nixos/modules/services/home-automation/home-assistant.nix +++ b/nixos/modules/services/home-automation/home-assistant.nix @@ -6,17 +6,21 @@ let cfg = config.services.home-assistant; format = pkgs.formats.yaml {}; - # Render config attribute sets to YAML - # Values that are null will be filtered from the output, so this is one way to have optional - # options shown in settings. - # We post-process the result to add support for YAML functions, like secrets or includes, see e.g. + # Post-process YAML output to add support for YAML functions, like + # secrets or includes, by naively unquoting strings with leading bangs + # and at least one space-separated parameter. # https://www.home-assistant.io/docs/configuration/secrets/ - filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! elem v [ null ])) (lib.recursiveUpdate customLovelaceModulesResources (cfg.config or {})); - configFile = pkgs.runCommandLocal "configuration.yaml" { } '' - cp ${format.generate "configuration.yaml" filteredConfig} $out + renderYAMLFile = fn: yaml: pkgs.runCommandLocal fn { } '' + cp ${format.generate fn yaml} $out sed -i -e "s/'\!\([a-z_]\+\) \(.*\)'/\!\1 \2/;s/^\!\!/\!/;" $out ''; - lovelaceConfigFile = format.generate "ui-lovelace.yaml" cfg.lovelaceConfig; + + # Filter null values from the configuration, so that we can still advertise + # optional options in the config attribute. + filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! elem v [ null ])) (lib.recursiveUpdate customLovelaceModulesResources (cfg.config or {})); + configFile = renderYAMLFile "configuration.yaml" filteredConfig; + + lovelaceConfigFile = renderYAMLFile "ui-lovelace.yaml" cfg.lovelaceConfig; # Components advertised by the home-assistant package availableComponents = cfg.package.availableComponents;