Compare commits

...
Sign in to create a new pull request.

1 commit
main ... hass

Author SHA1 Message Date
Jakob Lechner
172c75baa8
Add home-assistant 2023-11-30 10:16:59 +00:00
6 changed files with 279 additions and 3 deletions

View file

@ -1,6 +1,8 @@
{ lib, custom-utils, ... }:
custom-utils.validatePortAttrset {
esphome.tcp = 6052;
home-assistant.tcp = 8123;
jellyfin.tcp = 8096;
matrix-synapse.tcp = 8008;
navidrome.tcp = 4533;

View file

@ -9,6 +9,7 @@ dkim-keys:
radicale-htpasswd: ENC[AES256_GCM,data:Q0WnleP9I4xozsL/H+5oV3Ag7khfalV40A6ub+DA07U8UKna3/ju533RmjWOnETzSNa6XK140nfCcfGZCiqGyF9tfuuXcKFu+j4=,iv:87PSvHyKF7QUQZmEuxM+IT0VKSGnS0MjoUmCqJ+6tzI=,tag:yrP3TgxE8aSZf0MrCF9dsQ==,type:str]
synapse-turn-shared-secret: ENC[AES256_GCM,data:Q1XRds3Zud1kYkvD6s9WUzP+kNDNsxB5SHd6oCAaLCHhHhYENSAYTZOF+rGjCPNyKFL0e/A=,iv:zScRQrz+pXHNUh/BGOaV+TVnDR3wu1Z/UO1zXarKwtA=,tag:ckpVziE+yb0FjctcT7tAkg==,type:str]
rmfakecloud: ENC[AES256_GCM,data:ktKBKb6cRv1VF8tRvXIpxIy9hPinVPKK05mgvYzz18PEdcrCLpldm5xf7ffHtY5XzDOAMXDCiz6x4xyv7071frrF0spOEPnIzVhxwG8H2Ck=,iv:qJdHjv0RziAs4G9UGeRwGQ4GE5kaObJWpIYWpRKhr9c=,tag:PXgvU1hZK/gvWGyFJaHekg==,type:str]
esphome: ENC[AES256_GCM,data:BvQ5vUP2i/OtuKIWfZyHpZFjYK8E9AG0t1R6p7z4wbcyKmJLnvIvqwj5jgVZWfMKbnkX1fh3RJJtgW98tMkW8HhUGjapKsMsroHvnUNfGIDm04NKWI+Fql6EH0vlQAnNZ7kHDAOPMjCJSGBAKg9H7jagbJCXSZByP0l6ducippyFpmx9qsMETsjG4xFqG4/QsgjlkI2kF3rgvpYxCYc8exrHlIc6Ci9BPzC8SVjz8WQd1Mvq9N0elcVifWcr,iv:Tm3Uiod6rL92RNyds+dOs4kN6nNRZvfXNbB4CwXK0lY=,tag:QJ0OKxaBaXN7/LzsmkSn1A==,type:str]
sops:
kms: []
gcp_kms: []
@ -24,8 +25,8 @@ sops:
TjdZRldhSzVtMkVoTzY1NjdGbCswRVUK0pi+8UuLqRmytcR2ikxOAM02iccl8P1y
ixv0PKPLd+vQ23QeeQy/TfoGx16XttaDUnUrPLZR3TUKtAcld8+m6w==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2023-11-15T22:26:56Z"
mac: ENC[AES256_GCM,data:cFb5BwiT6WIAuPmYD0wQZLy+DyS7+uZk81aNWDV8stnOdBEBJoiG+jVG585u1Cl3cp2d2TWTlg5lYJSIbk0Rxp3/typg+C31VxTKffTf6iS3r93mAUVsrN51QPn8DIJ7G6Rrf3JCNI+nTJ4LKH472QMd7da6atYb1TmFmLEmWrs=,iv:sqqQz38aThr4M8nxHu/VdvCkbQOZYUzJAtVvnBjNNsU=,tag:HiXOZBjznGrgKo6MjH51FQ==,type:str]
lastmodified: "2023-11-30T00:55:33Z"
mac: ENC[AES256_GCM,data:90gY/9S+ci/8EQphHnxpJ2t38L6Ii3oSwfYsGkKQdkUC7lsGrUmmHS7SGy9wVKOhkiQBQGgQLRqEnXE8c/fmXaQ8kg4wA7LFhnEGykyVZ1tQqYsLaXr+HIlFZG6APahYX5geKUokc3L0k/Mxe0cT9XGTxkD8EYdKgFnZCISJ1WY=,iv:axggMJ0cYCuXT2FTjJRUntgUafO7bwh7aq9btdU+Vyc=,tag:fW9PAKwVcZSR1akRgXr1tA==,type:str]
pgp:
- created_at: "2023-05-02T19:30:42Z"
enc: |
@ -39,4 +40,4 @@ sops:
-----END PGP MESSAGE-----
fp: 66FB54F6081375106EEBF651A222365EB448F934
unencrypted_suffix: _unencrypted
version: 3.7.3
version: 3.8.1

View file

@ -2,6 +2,8 @@
imports = [
./dnsmasq.nix
./dyndns.nix
./home-assistant.nix
./esphome
./jellyfin.nix
./mail.nix
./matrix

View file

@ -0,0 +1,50 @@
args@{ lib, pkgs, config, custom-utils, ... }:
let
ports = import ../../ports.nix args;
cfg = config.services.esphome;
stateDir = "/var/lib/esphome";
devices = [
./yeelight-meteorite.yaml
];
cfgdir = pkgs.stdenvNoCC.mkDerivation {
name = "esphome-config";
src = ./devices;
dontBuild = true;
installPhase = ''
mkdir $out
cp -r * $out
ln -snf "${config.sops.secrets.esphome.path}" "$out/secrets.yaml"
ln -snf "${stateDir}/.esphome" "$out/.esphome"
ln -snf "${stateDir}/.gitignore" "$out/.gitignore"
'';
};
esphomeParams =
if cfg.enableUnixSocket
then "--socket /run/esphome/esphome.sock"
else "--address ${cfg.address} --port ${toString cfg.port}";
in
{
sops.secrets.esphome = {
sopsFile = ../../secrets.yaml;
owner = "esphome";
group = "esphome";
mode = "0400";
};
services.esphome = {
enable = true;
address = "127.0.0.1";
port = ports.esphome.tcp;
};
systemd.services.esphome.serviceConfig = {
WorkingDirectory = lib.mkForce cfgdir;
ExecStart = lib.mkForce "${cfg.package}/bin/esphome dashboard ${esphomeParams} ${cfgdir}";
};
system.activationScripts.esphome-custom.text = ''
mkdir -p "${stateDir}/.esphome"
touch "${stateDir}/.gitignore"
chown esphome:esphome "${stateDir}/.esphome" "${stateDir}/.gitignore"
'';
}

View file

@ -0,0 +1,89 @@
esphome:
name: "yeelight-meteorite"
friendly_name: "Yeelight Meteorite"
esp32:
board: esp32dev
framework:
type: esp-idf
sdkconfig_options:
CONFIG_FREERTOS_UNICORE: y
advanced:
ignore_efuse_mac_crc: true
logger:
api:
encryption:
key: !secret apikey_yeelight_meteorite
ota:
password: !secret otapass_yeelight_meteorite
wifi:
ssid: !secret wifi_ssid_bw
password: !secret wifi_password_bw
output:
- platform: ledc
pin: GPIO19
id: output_warm
power_supply: power
# min_power: 0.13
max_power: 0.82
- platform: ledc
pin: GPIO21
id: output_cold
power_supply: power
# min_power: 0.13
max_power: 0.82
- platform: ledc
pin: GPIO23
id: output_nightlight
power_supply: power
- platform: ledc
pin: GPIO33
id: output_red
power_supply: power
- platform: ledc
pin: GPIO26
id: output_green
power_supply: power
- platform: ledc
pin: GPIO27
id: output_blue
power_supply: power
power_supply:
- id: power
pin: GPIO22
enable_time: 0s
keep_on_time: 0s
light:
- platform: monochromatic
name: "${name} night light"
id: night_light
output: output_nightlight
gamma_correct: 0
on_turn_on:
- light.turn_off: ceiling_light
- platform: cwww
name: "${name} ceiling light"
id: ceiling_light
cold_white: output_cold
warm_white: output_warm
cold_white_color_temperature: 6500 K
warm_white_color_temperature: 2700 K
constant_brightness: true
gamma_correct: 0
on_turn_on:
- light.turn_off: night_light
- platform: rgb
name: "${name} ambient light"
red: output_red
green: output_green
blue: output_blue
gamma_correct: 0

View file

@ -0,0 +1,132 @@
args@{ lib, pkgs, config, custom-utils, ... }:
let
ports = import ../ports.nix args;
in
{
services.home-assistant = {
enable = true;
lovelaceConfig = { };
extraComponents = [
# See https://www.home-assistant.io/integrations
"esphome"
];
lovelaceConfigWritable = false;
configWritable = false;
config = {
http = {
server_host = [ "127.0.0.1" ];
server_port = ports.home-assistant.tcp;
use_x_forwarded_for = true;
trusted_proxies = [ "127.0.0.1" ];
};
homeassistant = {
unit_system = "metric";
time_zone = "Europe/Berlin";
temperature_unit = "C";
longitude = config.location.longitude;
latitude = config.location.latitude;
};
default_config = { };
"automation solar_color_temperature" = {
variables = {
target_lights = "!input target_lights";
target_on_lights = "'{{states.light | selectattr(''state'',''eq'',''on'') | selectattr(''attributes.supported_color_modes'',''match'',\".*color_temp.*\") | map(attribute=''entity_id'') | select(\"in\",target_lights) | list }}'";
min_color_temp = "!input min_color_temp";
max_color_temp = "!input max_color_temp";
color_temp = "{{ [([(((4791.67 - 3290.66/(1 + 0.222 * ([([0,state_attr(''sun.sun'', ''elevation'')]|max),90]|min**0.81))))|int),max_color_temp]|max),min_color_temp]|min}}";
};
trigger = [
{
platform = "state";
entity_id = "!input target_lights";
to = "on";
id = "single_light_on";
}
{
platform = "state";
entity_id = [ "sun.sun" ];
attribute = "elevation";
id = "elevation_change";
}
{
platform = "time_pattern";
minutes = "5";
id = "every_5_min";
}
];
condition = [
{
condition = "template";
value_template = "{{ (states.light | selectattr(''state'',''eq'',''on'') | map(attribute=''entity_id'') | list)!= [] }}";
}
];
action = [
{
choose = [
{
conditions = [
{
condition = "trigger";
id = "single_light_on";
}
];
sequence = [
{
service = "light.turn_on";
data.kelvin = "{{color_temp}}";
target.entity_id = "{{trigger.entity_id}}";
}
{
delay.milliseconds = 500;
}
{
choose.default = "!input brightness_action";
}
];
}
{
conditions = [
{
condition = "or";
conditions = [
{
condition = "trigger";
id = "every_5_min";
}
{
condition = "trigger";
id = "elevation_change";
}
];
}
];
sequence = [
{
service = "light.turn_on";
data = {
kelvin = "{{color_temp}}";
transition = 5;
};
target.entity_id = "{{target_on_lights}}";
}
];
}
];
}
];
mode = "parallel";
};
};
};
services.nginx.virtualHosts."hass.jalr.de" = {
enableACME = true;
forceSSL = true;
kTLS = true;
locations."/" = {
proxyPass = "http://127.0.0.1:${toString ports.home-assistant.tcp}/";
recommendedProxySettings = true;
proxyWebsockets = true;
};
};
}