diff --git a/nixos/modules/services/misc/home-assistant.nix b/nixos/modules/services/misc/home-assistant.nix
index ac37c11106e..1dc7b44ee37 100644
--- a/nixos/modules/services/misc/home-assistant.nix
+++ b/nixos/modules/services/misc/home-assistant.nix
@@ -5,7 +5,10 @@ with lib;
let
cfg = config.services.home-assistant;
- configFile = pkgs.writeText "configuration.yaml" (builtins.toJSON cfg.config);
+ # cfg.config != null can be assumed here
+ configFile = pkgs.writeText "configuration.json"
+ (builtins.toJSON (if cfg.applyDefaultConfig then
+ (lib.recursiveUpdate defaultConfig cfg.config) else cfg.config));
availableComponents = pkgs.home-assistant.availableComponents;
@@ -38,6 +41,12 @@ let
then (cfg.package.override { inherit extraComponents; })
else cfg.package;
+ # If you are changing this, please update the description in applyDefaultConfig
+ defaultConfig = {
+ homeassistant.time_zone = config.time.timeZone;
+ http.server_port = (toString cfg.port);
+ };
+
in {
meta.maintainers = with maintainers; [ dotlambda ];
@@ -50,6 +59,26 @@ in {
description = "The config directory, where your configuration.yaml is located.";
};
+ port = mkOption {
+ default = 8123;
+ type = types.int;
+ description = "The port on which to listen.";
+ };
+
+ applyDefaultConfig = mkOption {
+ default = true;
+ type = types.bool;
+ description = ''
+ Setting this option enables a few configuration options for HA based on NixOS configuration (such as time zone) to avoid having to manually specify configuration we already have.
+
+
+ Currently one side effect of enabling this is that the http component will be enabled.
+
+
+ This only takes effect if config != null in order to ensure that a manually managed configuration.yaml is not overwritten.
+ '';
+ };
+
config = mkOption {
default = null;
type = with types; nullOr attrs;
@@ -106,19 +135,20 @@ in {
description = "Home Assistant";
after = [ "network.target" ];
preStart = lib.optionalString (cfg.config != null) ''
- rm -f ${cfg.configDir}/configuration.yaml
- ln -s ${configFile} ${cfg.configDir}/configuration.yaml
+ config=${cfg.configDir}/configuration.yaml
+ rm -f $config
+ ${pkgs.remarshal}/bin/json2yaml -i ${configFile} -o $config
+ chmod 444 $config
'';
serviceConfig = {
- ExecStart = ''
- ${package}/bin/hass --config "${cfg.configDir}"
- '';
+ ExecStart = "${package}/bin/hass --config '${cfg.configDir}'";
User = "hass";
Group = "hass";
Restart = "on-failure";
ProtectSystem = "strict";
ReadWritePaths = "${cfg.configDir}";
PrivateTmp = true;
+ RemoveIPC = true;
};
path = [
"/run/wrappers" # needed for ping
diff --git a/nixos/tests/home-assistant.nix b/nixos/tests/home-assistant.nix
index 2e45dc78471..4ebccb7ab86 100644
--- a/nixos/tests/home-assistant.nix
+++ b/nixos/tests/home-assistant.nix
@@ -51,9 +51,9 @@ in {
startAll;
$hass->waitForUnit("home-assistant.service");
- # Since config is specified using a Nix attribute set,
- # configuration.yaml is a link to the Nix store
- $hass->succeed("test -L ${configDir}/configuration.yaml");
+ # The config is specified using a Nix attribute set,
+ # but then converted from JSON to YAML
+ $hass->succeed("test -f ${configDir}/configuration.yaml");
# Check that Home Assistant's web interface and API can be reached
$hass->waitForOpenPort(8123);
diff --git a/pkgs/development/tools/remarshal/default.nix b/pkgs/development/tools/remarshal/default.nix
index baba4fd75ea..23c9768f7e0 100644
--- a/pkgs/development/tools/remarshal/default.nix
+++ b/pkgs/development/tools/remarshal/default.nix
@@ -1,7 +1,7 @@
-{ stdenv, pythonPackages, fetchFromGitHub }:
+{ stdenv, python3Packages, fetchFromGitHub }:
-pythonPackages.buildPythonApplication rec {
- name = "remarshal-${version}";
+python3Packages.buildPythonApplication rec {
+ pname = "remarshal";
version = "0.7.0";
src = fetchFromGitHub {
@@ -11,10 +11,8 @@ pythonPackages.buildPythonApplication rec {
sha256 = "1wsgvzfp40lvly7nyyhv9prip4vi32rfc8kdji587jpw28zc1dfb";
};
- propagatedBuildInputs = with pythonPackages; [
- dateutil
- pytoml
- pyyaml
+ propagatedBuildInputs = with python3Packages; [
+ dateutil pytoml pyyaml
];
meta = with stdenv.lib; {