diff --git a/modules/nixos/boot/common/default.nix b/modules/nixos/boot/common/default.nix index d394e37..1732bf6 100644 --- a/modules/nixos/boot/common/default.nix +++ b/modules/nixos/boot/common/default.nix @@ -43,7 +43,7 @@ in }; }; - supportedFilesystems = lib.mkDefault [ "bcachefs" ]; + supportedFilesystems = lib.mkOverride 90 [ "bcachefs" ]; consoleLogLevel = lib.mkDefault 0; bootspec.enable = (!isArm); diff --git a/modules/nixos/homeassistant/automations/default.nix b/modules/nixos/homeassistant/automations/lightswitch/default.nix similarity index 98% rename from modules/nixos/homeassistant/automations/default.nix rename to modules/nixos/homeassistant/automations/lightswitch/default.nix index a3a77b7..b1cf19a 100644 --- a/modules/nixos/homeassistant/automations/default.nix +++ b/modules/nixos/homeassistant/automations/lightswitch/default.nix @@ -139,7 +139,7 @@ in )) { } "lightswitch automations"; }; - config = { + config = lib.mkIf config.${namespace}.services.home-assistant.enable { environment.etc."hass/lightswitch-automations.yaml" = { text = lightswitchAutomations; user = "hass"; diff --git a/modules/nixos/homeassistant/automations/motion-light/default.nix b/modules/nixos/homeassistant/automations/motion-light/default.nix new file mode 100644 index 0000000..c3b9f80 --- /dev/null +++ b/modules/nixos/homeassistant/automations/motion-light/default.nix @@ -0,0 +1,162 @@ +{ + config, + lib, + namespace, + ... +}: +with lib; +let + inherit (lib.${namespace}) mkOpt mkBoolOpt; + cfg = config.${namespace}.services.home-assistant.automation; + + automationToYaml = mlcfg: '' + - id: '${toString mlcfg.id}' + alias: ${mlcfg.alias} + description: '${mlcfg.description}' + triggers: + - device_id: ${mlcfg.motion-sensor.mqttDeviceId} + entity_id: ${mlcfg.motion-sensor.mqttEntityId} + domain: binary_sensor + id: occupied + subtype: on_press + trigger: device + type: occupied + for: + hours: 0 + minutes: 0 + seconds: 0 + - device_id: ${mlcfg.motion-sensor.mqttDeviceId} + entity_id: ${mlcfg.motion-sensor.mqttEntityId} + domain: binary_sensor + id: vacant + subtype: off_press + trigger: device + type: not_occupied + for: + hours: 0 + minutes: 0 + seconds: 5 + conditions: [] + actions: + - choose: + - conditions: + - condition: trigger + id: + - occupied + sequence: + - action: light.turn_on + data: + brightness_pct: ${toString mlcfg.light.brightnessPercent} + kelvin: ${toString mlcfg.light.lightTemperature} + transition: ${toString mlcfg.light.transitionTime} + metadata: {} + target: + entity_id: + - ${mlcfg.light.entityId} + - conditions: + - condition: trigger + id: + - vacant + sequence: + - action: light.turn_off + data: + transition: ${toString mlcfg.light.transitionTime} + metadata: {} + target: + entity_id: + - ${mlcfg.light.entityId} + mode: single + ''; + + automationToYamlSwitch = mlcfg: '' + - id: '${toString mlcfg.id}' + alias: ${mlcfg.alias} + description: '${mlcfg.description}' + triggers: + - device_id: ${mlcfg.motion-sensor.mqttDeviceId} + entity_id: ${mlcfg.motion-sensor.mqttEntityId} + domain: binary_sensor + id: occupied + subtype: on_press + trigger: device + type: occupied + for: + hours: 0 + minutes: 0 + seconds: 0 + - device_id: ${mlcfg.motion-sensor.mqttDeviceId} + entity_id: ${mlcfg.motion-sensor.mqttEntityId} + domain: binary_sensor + id: vacant + subtype: off_press + trigger: device + type: not_occupied + for: + hours: 0 + minutes: 0 + seconds: 5 + conditions: [] + actions: + - choose: + - conditions: + - condition: trigger + id: + - occupied + sequence: + - type: turn_on + device_id: ${mlcfg.switch.deviceId} + entity_id: ${mlcfg.switch.entityId} + domain: switch + - conditions: + - condition: trigger + id: + - vacant + sequence: + - type: turn_off + device_id: ${mlcfg.switch.deviceId} + entity_id: ${mlcfg.switch.entityId} + domain: switch + mode: single + ''; + + motionLightAutomations = concatStringsSep "\n" ( + mapAttrsToList (_: automationToYaml) cfg.motion-light + ); +in +{ + options.${namespace}.services.home-assistant.automation = { + motion-light = mkOpt (types.attrsOf ( + types.submodule { + options = { + id = mkOpt types.int 0 "Automation Id"; + alias = mkOpt types.str "" "Alias/Friendly Name"; + description = mkOpt types.str "" "Automation Description"; + motion-sensor = { + mqttDeviceId = mkOpt types.str "" "mqtt device id of the motion sensor"; + mqttEntityId = mkOpt types.str "" "mqtt entity id of the motion sensor"; + }; + light = { + entityId = mkOpt types.str "" "home assistant entity id for the lights"; + transitionTime = mkOpt types.int 2 "light transition time in seconds"; + brightnessPercent = mkOpt types.int 100 "brightness percentage when turned on"; + lightTemperature = mkOpt types.int 6000 "light temperature when turned on"; + brightnessStepPercent = mkOpt types.int 10 "dimmer step in brightness percent"; + }; + switch = { + enable = mkBoolOpt false "is it a binary switch light"; + deviceId = mkOpt types.str "" "device id of the switch"; + entityId = mkOpt types.str "" "entity id of the switch"; + }; + }; + } + )) { } "motion light automations"; + }; + + config = lib.mkIf config.${namespace}.services.home-assistant.enable { + environment.etc."hass/motion-light-automations.yaml" = { + text = motionLightAutomations; + user = "hass"; + group = "hass"; + }; + }; +} diff --git a/systems/x86_64-linux/nuc-nixos/configuration.nix b/systems/x86_64-linux/nuc-nixos/configuration.nix deleted file mode 100644 index 4183857..0000000 --- a/systems/x86_64-linux/nuc-nixos/configuration.nix +++ /dev/null @@ -1,119 +0,0 @@ -# Edit this configuration file to define what should be installed on -# your system. Help is available in the configuration.nix(5) man page, on -# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). - -{ ... }: - -{ - imports = [ - # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; - - # Use the systemd-boot EFI boot loader. - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - - # networking.hostName = "nixos"; # Define your hostname. - - # Configure network connections interactively with nmcli or nmtui. - networking.networkmanager.enable = true; - - # Set your time zone. - # time.timeZone = "Europe/Amsterdam"; - - # Configure network proxy if necessary - # networking.proxy.default = "http://user:password@proxy:port/"; - # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; - - # Select internationalisation properties. - # i18n.defaultLocale = "en_US.UTF-8"; - # console = { - # font = "Lat2-Terminus16"; - # keyMap = "us"; - # useXkbConfig = true; # use xkb.options in tty. - # }; - - # Enable the X11 windowing system. - # services.xserver.enable = true; - - # Configure keymap in X11 - # services.xserver.xkb.layout = "us"; - # services.xserver.xkb.options = "eurosign:e,caps:escape"; - - # Enable CUPS to print documents. - # services.printing.enable = true; - - # Enable sound. - # services.pulseaudio.enable = true; - # OR - # services.pipewire = { - # enable = true; - # pulse.enable = true; - # }; - - # Enable touchpad support (enabled default in most desktopManager). - # services.libinput.enable = true; - - # Define a user account. Don't forget to set a password with ‘passwd’. - # users.users.alice = { - # isNormalUser = true; - # extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user. - # packages = with pkgs; [ - # tree - # ]; - # }; - - # programs.firefox.enable = true; - - # List packages installed in system profile. - # You can use https://search.nixos.org/ to find more packages (and options). - # environment.systemPackages = with pkgs; [ - # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. - # wget - # ]; - - # Some programs need SUID wrappers, can be configured further or are - # started in user sessions. - # programs.mtr.enable = true; - # programs.gnupg.agent = { - # enable = true; - # enableSSHSupport = true; - # }; - - # List services that you want to enable: - - # Enable the OpenSSH daemon. - # services.openssh.enable = true; - - # Open ports in the firewall. - # networking.firewall.allowedTCPPorts = [ ... ]; - # networking.firewall.allowedUDPPorts = [ ... ]; - # Or disable the firewall altogether. - # networking.firewall.enable = false; - - # Copy the NixOS configuration file and link it from the resulting system - # (/run/current-system/configuration.nix). This is useful in case you - # accidentally delete configuration.nix. - # system.copySystemConfiguration = true; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . - system.stateVersion = "25.11"; # Did you read the comment? - -} diff --git a/systems/x86_64-linux/nuc-nixos/default.nix b/systems/x86_64-linux/nuc-nixos/default.nix index 0d2732d..777d337 100644 --- a/systems/x86_64-linux/nuc-nixos/default.nix +++ b/systems/x86_64-linux/nuc-nixos/default.nix @@ -4,7 +4,6 @@ ... }: { - # imports = [ ./hardware-configuration.nix ]; ${namespace} = { # ################################################### # # Boot # # @@ -97,6 +96,32 @@ lightEntityId = "light.bedroom_lights"; }; }; + + motion-light = { + bedroom-closet-lights = { + id = 1769548321857; + alias = "Bedroom Closet Lights"; + motion-sensor = { + mqttDeviceId = "fd73c1f3dfe08ab13d187fb49d781060"; + mqttEntityId = "33b83e8db95b213b16b4b8c1f591ec92"; + }; + switch = { + deviceId = "a3dfab0c8d91554a7c92c65cdf655c86"; + entityId = "645855b6f4347d65f5a54c33b3a9a1d0"; + }; + }; + front-closet-lights = { + id = 1769548321857; + alias = "Front Closet Lights"; + motion-sensor = { + mqttDeviceId = "7eb61ed09e48c1dcef8bcc0f7765c459"; + mqttEntityId = "a8b48ad080e70a0cdbb991b79c607ca1"; + }; + light = { + entityId = "light.front_closet_lights"; + }; + }; + }; }; }; otbr = { diff --git a/systems/x86_64-linux/nuc-nixos/hardware-configuration.nix b/systems/x86_64-linux/nuc-nixos/hardware-configuration.nix deleted file mode 100644 index 65ddcfb..0000000 --- a/systems/x86_64-linux/nuc-nixos/hardware-configuration.nix +++ /dev/null @@ -1,99 +0,0 @@ -# Do not modify this file! It was generated by ‘nixos-generate-config’ -# and may be overwritten by future invocations. Please make changes -# to /etc/nixos/configuration.nix instead. -{ - config, - lib, - modulesPath, - ... -}: - -{ - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - ]; - - boot.initrd.availableKernelModules = [ - "ahci" - "nvme" - "xhci_pci" - "thunderbolt" - "uas" - ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; - - boot.initrd.luks.devices."nuc-nixos-cryptroot".device = - "/dev/disk/by-uuid/6564be77-2b7f-4078-a791-cc74ffccc561"; - - fileSystems."/" = { - device = "none"; - fsType = "tmpfs"; - }; - - fileSystems."/boot" = { - device = "/dev/disk/by-uuid/08E3-88DB"; - fsType = "vfat"; - options = [ - "fmask=0022" - "dmask=0022" - ]; - }; - - fileSystems."/nix" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ - "noatime" - "X-mount.subdir=nix" - ]; - }; - - fileSystems."/etc" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ - "noatime" - "X-mount.subdir=etc" - ]; - }; - - fileSystems."/var/log" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ - "noatime" - "X-mount.subdir=log" - ]; - }; - - fileSystems."/root" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ - "noatime" - "X-mount.subdir=root" - ]; - }; - - fileSystems."/persist" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ - "noatime" - "X-mount.subdir=persist" - ]; - }; - - fileSystems."/home" = { - device = "UUID=12dc0336-37fa-497c-bc4c-8e4eb8a2fab8"; - fsType = "bcachefs"; - options = [ "X-mount.subdir=home" ]; - }; - - swapDevices = [ ]; - - nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; -}