nixos-configuration/hosts/iron/services/esphome/default.nix
2024-11-08 22:19:44 +01:00

62 lines
1.6 KiB
Nix

args@{ lib, pkgs, config, custom-utils, ... }:
let
ports = import ../../ports.nix args;
cfg = config.services.esphome;
cfgdir = pkgs.stdenvNoCC.mkDerivation {
name = "esphome-config";
src = ./devices;
dontBuild = true;
installPhase = ''
mkdir $out
cp -r * $out
'';
};
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;
restartUnits = [ config.systemd.services.esphome.name ];
};
services.esphome = {
enable = true;
address = "127.0.0.1";
port = ports.esphome.tcp;
package = pkgs.esphome;
};
systemd.services.esphome = {
environment = {
"PLATFORMIO_CORE_DIR" = lib.mkForce "/tmp/.platformio";
};
serviceConfig = {
BindReadOnlyPaths = [
"/nix/store"
cfgdir
"%d/secrets.yaml:/var/lib/esphome/secrets.yaml"
];
BindPaths = [
"/var/lib/esphome"
];
DeviceAllow = [
"char-ttyACM rw"
"char-ttyAMA rw"
"char-ttyUSB rw"
];
ExecStartPre = [
"${pkgs.rsync}/bin/rsync -a --delete --checksum --exclude secrets.yaml --exclude=.esphome --exclude=.platformio --exclude=.gitignore '${cfgdir}/' '/var/lib/esphome/'"
];
LoadCredential = "secrets.yaml:${config.sops.secrets.esphome.path}";
PrivateTmp = true;
RootDirectory = "/run/esphome";
RuntimeDirectory = "esphome";
StateDirectory = "esphome";
SupplementaryGroups = [ "dialout" ];
WorkingDirectory = lib.mkForce "/tmp";
};
};
}