nixos/modules/services/home-automation/default.nix

172 lines
4.2 KiB
Nix
Raw Permalink Normal View History

2023-04-16 16:56:36 +02:00
# home automation
2024-07-28 21:08:02 +02:00
{
config,
lib,
pkgs,
...
}:
2023-04-16 16:56:36 +02:00
let
cfg = config.my.services.home-automation;
2023-11-07 23:13:51 +01:00
inherit (config.networking) domain;
2023-04-16 16:56:36 +02:00
in
{
options.my.services.home-automation = with lib; {
2023-04-16 16:56:36 +02:00
enable = mkEnableOption "home-assistant server";
package = lib.mkPackageOption pkgs "home-assistant" { };
extraComponents = mkOption {
type = types.listOf (types.enum cfg.package.availableComponents);
example = literalExpression ''
[
"analytics"
"default_config"
"esphome"
"my"
"wled"
]
'';
default = [ ];
2024-12-30 12:01:57 +01:00
description = ''
2023-04-16 16:56:36 +02:00
List
of [ components ]
(https://www.home-assistant.io/integrations/)
that
have
their
dependencies
included in the package.
The component name can be found in the URL, for example `https://www.home-assistant.io/integrations/ffmpeg/` would map to `ffmpeg`.
'';
};
latitude = mkOption {
type = types.nullOr (types.either types.float types.str);
default = null;
example = 52.3;
2024-12-30 12:01:57 +01:00
description = ''
2023-04-16 16:56:36 +02:00
your location latitude. Impacts sunrise data.
'';
};
longitude = mkOption {
type = types.nullOr (types.either types.float types.str);
default = null;
example = 4.9;
2024-12-30 12:01:57 +01:00
description = ''
2023-04-16 16:56:36 +02:00
your location longitude. Impacts sunrise data.
'';
};
elevation = mkOption {
type = types.nullOr (types.either types.float types.str);
default = null;
2024-12-30 12:01:57 +01:00
description = ''
2023-04-16 16:56:36 +02:00
your location elevation. Impacts sunrise data.
'';
};
timezone = mkOption {
type = types.str;
default = "GMT";
2024-12-30 12:01:57 +01:00
description = ''
2023-04-16 16:56:36 +02:00
your timezone.
'';
};
};
config = lib.mkIf cfg.enable {
2023-11-26 16:27:53 +01:00
services = {
home-assistant = {
enable = true;
inherit (cfg) package;
config = {
default_config = { };
homeassistant = {
name = "Home";
inherit (cfg) latitude longitude elevation;
unit_system = "metric";
time_zone = cfg.timezone;
external_url = "https://automation.${domain}";
internal_url = "http://localhost:${toString config.services.home-assistant.config.http.server_port}";
2023-11-26 16:27:53 +01:00
};
http = {
use_x_forwarded_for = true;
trusted_proxies = [
"127.0.0.1"
"::1"
];
};
prometheus.requires_auth = false;
2023-04-16 16:56:36 +02:00
};
2023-11-26 16:27:53 +01:00
extraComponents = [
"backup"
"esphome"
"shelly"
2023-11-26 16:27:53 +01:00
"prometheus"
] ++ cfg.extraComponents;
2023-04-16 16:56:36 +02:00
};
2023-11-26 16:27:53 +01:00
prometheus.scrapeConfigs = [
{
job_name = "home-assistant";
metrics_path = "/api/prometheus";
static_configs = [
{
targets = [ "localhost:${toString config.services.home-assistant.config.http.server_port}" ];
2023-11-26 16:27:53 +01:00
labels = {
instance = config.networking.hostName;
};
}
];
}
];
2023-04-16 16:56:36 +02:00
2023-11-26 16:27:53 +01:00
esphome.enable = true;
};
my.services.prometheus.rules = {
homeassistant = {
condition = ''homeassistant_entity_available{domain="persistent_notification", entity!~"persistent_notification.http_login|persistent_notification.recorder_database_migration"} >= 0'';
description = "homeassistant notification {{$labels.entity}} ({{$labels.friendly_name}}): {{$value}}";
};
};
my.services.webserver.virtualHosts = [
2023-04-16 16:56:36 +02:00
{
subdomain = "automation";
port = config.services.home-assistant.config.http.server_port;
2023-04-16 16:56:36 +02:00
}
2023-11-26 16:27:53 +01:00
{
subdomain = "esphome";
inherit (config.services.esphome) port;
}
2023-04-16 16:56:36 +02:00
];
2023-11-26 16:27:53 +01:00
webapps.apps = {
home-assistant = {
dashboard = {
name = "Home-Automation";
category = "infra";
icon = "house-signal";
url = "https://automation.${domain}";
method = "get";
};
};
esphome = {
dashboard = {
name = "Home-Firmware";
category = "infra";
icon = "house-laptop";
url = "https://esphome.${domain}";
method = "get";
};
2023-04-16 16:56:36 +02:00
};
};
};
}