From d266bdb450940709ba97d767394c14b5e01474f4 Mon Sep 17 00:00:00 2001 From: kat Date: Mon, 26 Sep 2022 15:25:21 -0700 Subject: [PATCH] feat(esphome): init --- darwin/systems/sumireko.nix | 3 + esphome/bedroom-sensor.nix | 54 ++++++++ modules/esphome/genesis.nix | 2 + modules/meta/imports.nix | 16 ++- modules/meta/network.nix | 184 ++++++++++++++++---------- nixos/systems/tewi/configuration.json | 1 + outputs.nix | 15 ++- tf | 2 +- 8 files changed, 204 insertions(+), 73 deletions(-) create mode 100644 esphome/bedroom-sensor.nix create mode 100644 modules/esphome/genesis.nix create mode 100644 nixos/systems/tewi/configuration.json diff --git a/darwin/systems/sumireko.nix b/darwin/systems/sumireko.nix index 64c285e0..a6d7599b 100644 --- a/darwin/systems/sumireko.nix +++ b/darwin/systems/sumireko.nix @@ -60,6 +60,9 @@ "bitwarden" "telegram" "deluge" + "alt-tab" + "kicad" + "disk-inventory-x" "element" "discord" "firefox" diff --git a/esphome/bedroom-sensor.nix b/esphome/bedroom-sensor.nix new file mode 100644 index 00000000..3f355bea --- /dev/null +++ b/esphome/bedroom-sensor.nix @@ -0,0 +1,54 @@ +{ config, ... }: { + api = { + password = "!secret api_password"; + }; + esp8266 = { + board = "d1_mini"; + }; + wifi = { + ssid = "Gensokyo"; + password = "!secret wifi_password"; + }; + i2c = { + sda = "D2"; + scl = "D1"; + scan = true; + }; + logger = { + level = "DEBUG"; + }; + ota = { + safe_mode = true; + password = "!secret ota_password"; + }; + sensor = [ + { + platform = "dht"; + model = "dht22"; + update_interval = "60s"; + pin = "D0"; + temperature = { + name = "Bedroom Temperature"; + id = "bedtemp"; + }; + humidity = { + name = "Bedroom Humidity"; + id = "bedhum"; + }; + } + { + platform = "ccs811"; + update_interval = "60s"; + address = "0x5A"; + temperature = "bedtemp"; + humidity = "bedhum"; + baseline = "0x2BBB"; + eco2 = { + name = "Bedroom eCO2"; + }; + tvoc = { + name = "Bedroom Total Volatile Organic Compound"; + }; + } + ]; +} diff --git a/modules/esphome/genesis.nix b/modules/esphome/genesis.nix new file mode 100644 index 00000000..efe70297 --- /dev/null +++ b/modules/esphome/genesis.nix @@ -0,0 +1,2 @@ +{ config, ... }: { +} diff --git a/modules/meta/imports.nix b/modules/meta/imports.nix index b025b590..7b76e11f 100644 --- a/modules/meta/imports.nix +++ b/modules/meta/imports.nix @@ -14,6 +14,9 @@ with lib; darwinImports = mkOption { type = types.listOf types.str; }; + esphomeImports = mkOption { + type = types.listOf types.str; + }; homeImports = mkOption { type = types.listOf types.str; }; @@ -27,12 +30,14 @@ with lib; nixosImports = mkDefault (map (path: toString path) [ (root + "/nixos/systems/HN.nix") (root + "/nixos/systems/HN/nixos.nix") - (root + "/trusted/nixos/systems/HN/nixos.nix") + ]); + esphomeImports = mkDefault (map (path: toString path) [ + (root + "/esphome/HN.nix") + (root + "/esphome/HN/esphome.nix") ]); darwinImports = mkDefault (map (path: toString path) [ (root + "/darwin/systems/HN.nix") (root + "/darwin/systems/HN/darwin.nix") - (root + "/trusted/darwin/systems/HN/darwin.nix") ]); homeImports = []; users = mkDefault (singleton "kat"); @@ -42,6 +47,13 @@ with lib; profiles = meta.nixos; inherit hostName; }; + lib.kw.esphomeImport = hostName: lib.nodeImport { + nixosImports = config.network.importing.esphomeImports; + homeImports = []; + users = []; + profiles = { base = { }; }; + inherit hostName; + }; lib.kw.darwinImport = hostName: lib.nodeImport { nixosImports = config.network.importing.darwinImports; profiles = meta.darwin; diff --git a/modules/meta/network.nix b/modules/meta/network.nix index 389c918a..f721b72f 100644 --- a/modules/meta/network.nix +++ b/modules/meta/network.nix @@ -1,11 +1,11 @@ { pkgs, inputs, lib, meta, config, ... }: /* - This module: - * Makes hosts nixosModules. - * Manages module imports and specialArgs. - * Builds network.nodes. -*/ + This module: + * Makes hosts nixosModules. + * Manages module imports and specialArgs. + * Builds network.nodes. + */ with lib; @@ -39,91 +39,137 @@ with lib; default = toString (inputs.darwin + "/modules"); }; }; - nodes.all = mkOption { + esphome = { + extraModules = mkOption { + type = types.listOf types.unspecified; + default = [ ]; + }; + specialArgs = mkOption { + type = types.attrsOf types.unspecified; + default = { }; + }; + }; + union = mkOption { type = types.attrsOf types.unspecified; - default = config.network.nodes.nixos // config.network.nodes.darwin; + default = config.network.nodes.nixos // config.network.nodes.darwin // config.network.nodes.esphome; + }; + nodes.esphome = let + esphomeModule = { name, config, meta, lib, ... }: with lib; + let + settings = config.settings; + closureConfig = pkgs.writeText "${settings.esphome.name}.json" builtins.toJSON settings; + closure = pkgs.runCommand "${settings.esphome.name}" {} '' + ${pkgs.esphome}/bin/esphome compile ${closureConfig} + mv .esphome/build/${settings.esphome.name}/.pioenvs/${settings.esphome.name}/firmware.bin $out + ''; + in { + options.out = mkOption { + type = types.unspecified; + default = closure; + }; + options.settings = mkOption { + type = types.unspecified; + }; + }; + esphomeType = types.submoduleWith { + modules = [ + esphomeModule + ] ++ config.network.esphome.extraModules; + inherit (config.network.esphome) specialArgs; + }; + in mkOption { + type = types.attrsOf esphomeType; + default = { }; }; nodes.nixos = let - nixosModule = { name, config, meta, modulesPath, lib, ... }: with lib; { - options = { - nixpkgs.crossOverlays = mkOption { - type = types.listOf types.unspecified; - default = [ ]; - }; - }; - config = { - nixpkgs = { - system = mkDefault "x86_64-linux"; - pkgs = - let - pkgsReval = import pkgs.path { - inherit (config.nixpkgs) localSystem crossSystem crossOverlays; - inherit (pkgs) overlays config; - }; - in - mkDefault (if config.nixpkgs.config == pkgs.config && config.nixpkgs.system == pkgs.targetPlatform.system then pkgs else pkgsReval); - }; + nixosModule = { name, config, meta, modulesPath, lib, ... }: with lib; { + options = { + nixpkgs.crossOverlays = mkOption { + type = types.listOf types.unspecified; + default = [ ]; }; }; - nixosType = - let - baseModules = import (config.network.nixos.modulesPath + "/module-list.nix"); - in - types.submoduleWith { - modules = baseModules - ++ singleton nixosModule - ++ config.network.nixos.extraModules; - - specialArgs = { - inherit baseModules; - inherit (config.network.nixos) modulesPath; - } // config.network.nixos.specialArgs; + config = { + nixpkgs = { + system = mkDefault "x86_64-linux"; + pkgs = + let + pkgsReval = import pkgs.path { + inherit (config.nixpkgs) localSystem crossSystem crossOverlays; + inherit (pkgs) overlays config; + }; + in + mkDefault (if config.nixpkgs.config == pkgs.config && config.nixpkgs.system == pkgs.targetPlatform.system then pkgs else pkgsReval); }; - in + }; + }; + nixosType = + let + baseModules = import (config.network.nixos.modulesPath + "/module-list.nix"); + in + types.submoduleWith { + modules = baseModules + ++ singleton nixosModule + ++ config.network.nixos.extraModules; + + specialArgs = { + inherit baseModules; + inherit (config.network.nixos) modulesPath; + } // config.network.nixos.specialArgs; + }; + in mkOption { type = types.attrsOf nixosType; default = { }; }; nodes.darwin = let - darwinModule = { name, config, meta, modulesPath, lib, ... }: with lib; { - config = { - _module.args.pkgs = pkgs; - nixpkgs = { - system = mkDefault pkgs.system; - }; + darwinModule = { name, config, meta, modulesPath, lib, ... }: with lib; { + config = { + _module.args.pkgs = pkgs; + nixpkgs = { + system = mkDefault pkgs.system; }; }; - darwinType = - let - baseModules = import (config.network.darwin.modulesPath + "/module-list.nix"); - flakeModule = (config.network.darwin.modulesPath + "/system/flake-overrides.nix"); - in - types.submoduleWith { - modules = baseModules - ++ singleton darwinModule - ++ singleton flakeModule - ++ config.network.darwin.extraModules; + }; + darwinType = + let + baseModules = import (config.network.darwin.modulesPath + "/module-list.nix"); + flakeModule = (config.network.darwin.modulesPath + "/system/flake-overrides.nix"); + in + types.submoduleWith { + modules = baseModules + ++ singleton darwinModule + ++ singleton flakeModule + ++ config.network.darwin.extraModules; - specialArgs = { - inherit baseModules; - inherit (config.network.darwin) modulesPath; - } // config.network.darwin.specialArgs; - }; - in + specialArgs = { + inherit baseModules; + inherit (config.network.darwin) modulesPath; + } // config.network.darwin.specialArgs; + }; + in mkOption { type = types.attrsOf darwinType; default = { }; }; }; config.network = { + esphome = { + extraModules = [ + ]; + specialArgs = { + inherit (config.network) nodes; + inherit inputs meta; + }; + }; darwin = { extraModules = [ inputs.home-manager.darwinModules.home-manager - meta.modules.darwin - meta.modules.system - meta.system + meta.modules.darwin + meta.modules.system + meta.system ]; specialArgs = { inherit (config.network) nodes; @@ -133,10 +179,10 @@ with lib; nixos = { extraModules = [ inputs.home-manager.nixosModules.home-manager - meta.modules.nixos - meta.modules.system - meta.nixos.network - meta.system + meta.modules.nixos + meta.modules.system + meta.nixos.network + meta.system ]; specialArgs = { inherit (config.network) nodes; diff --git a/nixos/systems/tewi/configuration.json b/nixos/systems/tewi/configuration.json new file mode 100644 index 00000000..b4637475 --- /dev/null +++ b/nixos/systems/tewi/configuration.json @@ -0,0 +1 @@ +{"automation":"automations.yaml","config":null,"counter":null,"dhcp":null,"device_tracker":[{"platform":"luci","host":"192.168.1.1","username":"root","password":"suitable-anemia-boggle","new_device_defaults":{"track_new_devices":true}}],"energy":null,"frontend":{"themes":"themes"},"group":"groups.yaml","google_assistant":{"project_id":"integration-9e79d","service_account":"integration-9e79d-a60665a0b920.json"},"http":{"cors_allowed_origins":["https://google.com","https://www.home-assistant.io"],"use_x_forwarded_for":true,"trusted_proxies":["127.0.0.0/24","200::/7"]},"history":null,"image":null,"input_boolean":null,"input_datetime":null,"input_number":null,"input_select":null,"input_text":null,"logbook":null,"logger":{"default":"info"},"map":null,"media_source":null,"mobile_app":null,"my":null,"person":null,"scene":"scenes.yaml","script":"scripts.yaml","ssdp":null,"switch":[{"platform":"wake_on_lan","mac":"00:D8:61:C7:F4:9D"}],"stream":null,"sun":null,"system_health":null,"tag":null,"template":null,"timer":null,"webhook":null,"wake_on_lan":null,"zeroconf":null,"zone":null,"recorder":{"auto_purge":true,"purge_keep_days":14,"commit_interval":1,"exclude":{"domains":["automation","updater"],"entity_globs":["sensor.weather_*","sensor.date_*"],"entities":["sun.sun","sensor.last_boot","sensor.date","sensor.time"],"event_types":["call_service"]}},"tts":[{"platform":"google_translate","service_name":"google_say"}],"homeassistant":{"packages":"packages","customize":"customize.yaml","external_url":"https://home.kittywit.ch"}} diff --git a/outputs.nix b/outputs.nix index 8813606c..54ba7a69 100644 --- a/outputs.nix +++ b/outputs.nix @@ -122,6 +122,18 @@ nixfiles = tree.impure; eval = let + esphomeNodes = (map + (node: { + network.nodes.esphome.${node} = { + settings = { + imports = config.lib.kw.esphomeImport node; + esphome = { + name = node; + }; + }; + }; + }) + (lib.attrNames nixfiles.esphome)); nixosNodes = (map (node: { network.nodes.nixos.${node} = { @@ -147,7 +159,8 @@ ++ lib.singleton nixfiles.modules.meta ++ lib.attrValues nixfiles.targets ++ nixosNodes - ++ darwinNodes; + ++ darwinNodes + ++ esphomeNodes; specialArgs = { inherit root tree; diff --git a/tf b/tf index 19085b06..856827e2 160000 --- a/tf +++ b/tf @@ -1 +1 @@ -Subproject commit 19085b061685d726090c2b5fdc3afe536ad43dd7 +Subproject commit 856827e23fd7f1ef1d07dea9c5be26c0a0f7dee8