diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..c257133 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,208 @@ +# Agent Guide + +## Directory Structure + +``` +/etc/nixos/ +├── flake.nix # Main flake configuration +├── flake.lock # Locked versions +├── AGENTS.md # This file +├── treefmt.nix # Code formatting config +├── qemu.nix # QEMU testing config +│ +├── systems/ # System configurations by architecture +│ ├── aarch64-linux/ +│ │ ├── macbook-pro-nixos/ # Apple Silicon MacBook +│ │ │ ├── default.nix +│ │ │ ├── boot.nix +│ │ │ ├── services.nix # logind, gdm, gnome, flatpak, etc. +│ │ │ ├── filesystems.nix +│ │ │ ├── hardware-configuration.nix +│ │ │ └── firmware/ # Asahi firmware +│ │ └── pi5/ # Raspberry Pi 5 +│ │ ├── default.nix +│ │ ├── boot.nix +│ │ ├── adguard.nix +│ │ └── sops.nix +│ ├── x86_64-linux/ +│ │ ├── matt-nixos/ # Desktop AMD system +│ │ │ ├── default.nix +│ │ │ ├── boot.nix +│ │ │ ├── filesystems.nix +│ │ │ ├── sops.nix +│ │ │ └── services/ +│ │ │ ├── lsfg-vk/ +│ │ │ ├── ratbagd/ +│ │ │ └── restic/ +│ │ ├── allyx/ # ASUS ROG Ally X +│ │ │ ├── default.nix +│ │ │ └── boot.nix +│ │ ├── nuc-nixos/ # Intel NUC +│ │ ├── jallen-nas/ # NAS server +│ │ └── iso-minimal/ +│ └── aarch64-darwin/ +│ └── macbook-pro/ # macOS (nix-darwin) +│ +├── homes/ # Home-manager configurations +│ ├── aarch64-linux/ +│ │ └── matt@macbook-pro-nixos/ +│ │ └── default.nix +│ ├── x86_64-linux/ +│ └── aarch64-darwin/ +│ +├── modules/ # Shared modules +│ ├── nixos/ # NixOS system modules +│ ├── home/ # Home-manager modules +│ └── darwin/ # nix-darwin modules +│ +├── packages/ # Custom package overlays +│ ├── omnissa/ +│ ├── bcachefs/ +│ ├── raspberrypi/ +│ ├── comfyui/ +│ ├── homeassistant/ +│ ├── librepods-beta/ +│ └── ... +│ +└── secrets/ # SOPS secrets + ├── secrets.yaml # Master key config + └── *-secrets.yaml # Per-host secrets +``` + +## System Configurations + +### macbook-pro-nixos (Apple Silicon MacBook) +- **Path**: `systems/aarch64-linux/macbook-pro-nixos/` +- **Key files**: + - `services.nix:72-81` - logind/sleep settings + - `default.nix` - main config, imports all parts + - `boot.nix` - systemd-boot, kernel params +- **Features**: Asahi Linux, GNOME, Hyprland option, battery management + +### matt-nixos (AMD Desktop) +- **Path**: `systems/x86_64-linux/matt-nixos/` +- **Features**: AMD GPU (LACT), GNOME, gaming, Lanzaboote + +### allyx (ASUS ROG Ally X) +- **Path**: `systems/x86_64-linux/allyx/` +- **Features**: Jovian NixOS, Steam, handheld-daemon, AMD GPU + +### pi5 (Raspberry Pi 5) +- **Path**: `systems/aarch64-linux/pi5/` +- **Features**: Headless, AdGuard, Docker, static IP, UEFI boot + +### jallen-nas (NAS Server) +- **Path**: `systems/x86_64-linux/jallen-nas/` +- **Features**: Headless, VPN, bcachefs, restic backups + +## NixOS Modules (`modules/nixos/`) + +### Desktop Environments +- `desktop/gnome/default.nix` - GNOME configuration +- `desktop/hyprland/default.nix` - Hyprland configuration +- `desktop/cosmic/default.nix` - Cosmic DE configuration + +### Hardware +- `hardware/amd/default.nix` - AMD GPU (LACT) +- `hardware/nvidia/default.nix` - NVIDIA GPU +- `hardware/battery/default.nix` - Battery management +- `hardware/raspberry-pi/` - Raspberry Pi support + +### Boot & System +- `boot/common/` - Common boot settings +- `boot/lanzaboote/` - Lanzaboote (secure boot) +- `boot/systemd-boot/` - Systemd-boot config +- `boot/plymouth/` - Plymouth splash screen + +### Networking +- `network/default.nix` - Network configuration (hostname, firewall, NM) +- `network/options.nix` - Network module options + +### Other Services +- `headless/default.nix` - Headless server config (watchdog, no suspend) +- `gaming/default.nix` - Steam, Gamescope, Gamemode +- `programs/default.nix` - System programs (nix-index, gnupg, etc.) + +## Home-Manager Modules (`modules/home/`) + +### Programs +- `programs/waybar/` - Wayland bar +- `programs/hyprland/` - Hyprland config +- `programs/kitty/` - Kitty terminal +- `programs/wofi/` - Wofi launcher +- `programs/wlogout/` - Logout menu +- `programs/btop/` - System monitor +- `programs/git/` - Git configuration +- `programs/zsh/` - Zsh configuration +- `programs/mako/` - Notification daemon + +### Desktop +- `desktop/gnome/` - GNOME settings +- `desktop/stylix/` - Stylix theming + +### Services +- `services/sops/` - SOPS integration + +## Custom Packages (`packages/`) + +- `omnissa/` - Omnissa Horizon client +- `bcachefs/` - Bcachefs tools +- `raspberrypi/` - Raspberry Pi firmware/tools +- `comfyui/` - ComfyUI packages +- `homeassistant/` - Home Assistant components +- `librepods-beta/` - LibrePODS beta (AirPods support) + +## Common Patterns + +### Enable a desktop environment +```nix +${namespace}.desktop.gnome.enable = true; +${namespace}.desktop.hyprland.enable = true; +``` + +### Enable SOPS +```nix +${namespace}.sops.enable = true; +``` + +### Enable headless mode +```nix +${namespace}.headless.enable = true; +``` + +### System imports +```nix +imports = [ + ./boot.nix + ./filesystems.nix + ./hardware-configuration.nix + ./services.nix +]; +``` + +### Namespace options (flake.nix:253) +```nix +namespace = "mjallen"; +``` + +## SOPS Secrets + +Secrets are encrypted with SOPS. Each system has its own secrets file: +- `secrets/mac-secrets.yaml` - macbook-pro-nixos +- `secrets/pi5-secrets.yaml` - pi5 +- `secrets/allyx-secrets.yaml` - allyx +- `secrets/nuc-secrets.yaml` - nuc-nixos +- `secrets/nas-secrets.yaml` - jallen-nas + +## Flake Inputs (flake.nix) + +Key inputs: +- `nixpkgs-unstable` - Unstable channel +- `nixpkgs-stable` - Stable channel (25.11) +- `home-manager-unstable` - Home-manager +- `nixos-apple-silicon` - Apple Silicon support +- `nixos-hardware` - Common hardware configs +- `disko` - Disk partitioning +- `sops-nix` - Secrets management +- `lanzaboote` - Secure boot +- `jovian` - Steam Deck support (allyx) diff --git a/flake.lock b/flake.lock index 4fe7e4f..5631180 100644 --- a/flake.lock +++ b/flake.lock @@ -151,11 +151,11 @@ "cachyos-kernel": { "flake": false, "locked": { - "lastModified": 1773333570, - "narHash": "sha256-Z+r3HFziyn0ExgJj8qkwoqPZwP8sQMESX6QBWa/8uwM=", + "lastModified": 1773637879, + "narHash": "sha256-hFKu2SaRoqt6+zbmcFW6A0AbBENIX8XooJLXQWa3sLc=", "owner": "CachyOS", "repo": "linux-cachyos", - "rev": "261b59ccef1a9ca6a3a6344f585ee1ff593e4306", + "rev": "fa09a5bc69d3e7feeed9b1402c7df06c8170402a", "type": "github" }, "original": { @@ -167,11 +167,11 @@ "cachyos-kernel-patches": { "flake": false, "locked": { - "lastModified": 1773330205, - "narHash": "sha256-YVASxGrJYFHtL+5D71hlbc74VfgDnQGRpzVu0YiFHtw=", + "lastModified": 1773635524, + "narHash": "sha256-JErpxWTdoHq4JuDerfsbPA60FmWOxK4oX9UL9CcsP/Q=", "owner": "CachyOS", "repo": "kernel-patches", - "rev": "8242bda544657099da69993f019ff3fb23cfe05f", + "rev": "5544a0679fd6f6fb714e275514449c4ab9db2a53", "type": "github" }, "original": { @@ -244,11 +244,11 @@ ] }, "locked": { - "lastModified": 1773025010, - "narHash": "sha256-khlHllTsovXgT2GZ0WxT4+RvuMjNeR5OW0UYeEHPYQo=", + "lastModified": 1773889306, + "narHash": "sha256-PAqwnsBSI9SVC2QugvQ3xeYCB0otOwCacB1ueQj2tgw=", "owner": "nix-community", "repo": "disko", - "rev": "7b9f7f88ab3b339f8142dc246445abb3c370d3d3", + "rev": "5ad85c82cc52264f4beddc934ba57f3789f28347", "type": "github" }, "original": { @@ -568,11 +568,11 @@ ] }, "locked": { - "lastModified": 1773367248, - "narHash": "sha256-FFMc1uAwy2GYasd0rdNDVxKyAgzuoJH2M+GglBQbqf0=", + "lastModified": 1774007980, + "narHash": "sha256-FOnZjElEI8pqqCvB6K/1JRHTE8o4rer8driivTpq2uo=", "owner": "nix-community", "repo": "home-manager", - "rev": "be0c641a6a5564caa33982faa1fe2c60d92131c7", + "rev": "9670de2921812bc4e0452f6e3efd8c859696c183", "type": "github" }, "original": { @@ -588,11 +588,11 @@ ] }, "locked": { - "lastModified": 1773264488, - "narHash": "sha256-rK0507bDuWBrZo+0zts9bCs/+RRUEHuvFE5DHWPxX/Q=", + "lastModified": 1773963144, + "narHash": "sha256-WzBOBfSay3GYilUfKaUa1Mbf8/jtuAiJIedx7fWuIX4=", "owner": "nix-community", "repo": "home-manager", - "rev": "5c0f63f8d55040a7eed69df7e3fcdd15dfb5a04c", + "rev": "a91b3ea73a765614d90360580b689c48102d1d33", "type": "github" }, "original": { @@ -609,11 +609,11 @@ ] }, "locked": { - "lastModified": 1773367248, - "narHash": "sha256-FFMc1uAwy2GYasd0rdNDVxKyAgzuoJH2M+GglBQbqf0=", + "lastModified": 1774007980, + "narHash": "sha256-FOnZjElEI8pqqCvB6K/1JRHTE8o4rer8driivTpq2uo=", "owner": "nix-community", "repo": "home-manager", - "rev": "be0c641a6a5564caa33982faa1fe2c60d92131c7", + "rev": "9670de2921812bc4e0452f6e3efd8c859696c183", "type": "github" }, "original": { @@ -663,11 +663,11 @@ "homebrew-cask": { "flake": false, "locked": { - "lastModified": 1773417963, - "narHash": "sha256-BdilqX31TH5WTRgKVSPNGJUHwOAHHT1xUe3oXC8GPEI=", + "lastModified": 1774016339, + "narHash": "sha256-Jm5bZFPd0GQGvknb9tsqWRh3M/+itroC0vIvoDW0cOE=", "owner": "homebrew", "repo": "homebrew-cask", - "rev": "294c9a01670be07a255cca3b4519ffe37d3130dc", + "rev": "65b8191c7b9355eb2470dbe1eeb2633306064379", "type": "github" }, "original": { @@ -679,11 +679,11 @@ "homebrew-core": { "flake": false, "locked": { - "lastModified": 1773417171, - "narHash": "sha256-QuAxK3GHyx/T8vJuv3Za7mCrUAjfZxsdP0zbkQyDNlE=", + "lastModified": 1774017008, + "narHash": "sha256-kpYHVxgi+nu2H0aHxzY+3HNBDmFmjQYIn+U7ifsTt0Q=", "owner": "homebrew", "repo": "homebrew-core", - "rev": "538b810c144eb4b692c680b2da2dafee9f725e77", + "rev": "5541cf046f2005a02940da8086550ffcfa77da4c", "type": "github" }, "original": { @@ -719,11 +719,11 @@ ] }, "locked": { - "lastModified": 1773380813, - "narHash": "sha256-6GDKki2AIkWgnnTGA1enQB3I1mI6rdPe4rrXafmmIiY=", + "lastModified": 1773949806, + "narHash": "sha256-W25eg57cTQSwey9nEf1AhHy895Yiwq74PgyJl2EuY3Q=", "owner": "Jovian-Experiments", "repo": "Jovian-NixOS", - "rev": "8347eae3a900c26b8223ee98697f30f4e88dc226", + "rev": "425b357e190632600ca2b2daea3bdf28d57e3047", "type": "github" }, "original": { @@ -809,11 +809,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1773339151, - "narHash": "sha256-T4mZqOKMX3bbOKm/KvlkIOznaUPFpBbNKBT5bDMdRkQ=", + "lastModified": 1773804995, + "narHash": "sha256-LL6EG35pbxgjsqYIpwUnpHGDmKFYttE+BILBNhsEaJk=", "owner": "xddxdd", "repo": "nix-cachyos-kernel", - "rev": "a984d014ba87dbefd8868d1fe967cc540d313766", + "rev": "3286b7ecf1d864e2be050af78aa633d4e3ae8fdb", "type": "github" }, "original": { @@ -870,11 +870,11 @@ ] }, "locked": { - "lastModified": 1772945408, - "narHash": "sha256-PMt48sEQ8cgCeljQ9I/32uoBq/8t8y+7W/nAZhf72TQ=", + "lastModified": 1773552174, + "narHash": "sha256-mHSRNrT1rjeYBgkAlj07dW3+1nFEgAd8Gu6lgyfT9DU=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "1c1d8ea87b047788fd7567adf531418c5da321ec", + "rev": "8faeb68130df077450451b6734a221ba0d6cde42", "type": "github" }, "original": { @@ -927,11 +927,11 @@ "nixpkgs": "nixpkgs_7" }, "locked": { - "lastModified": 1773369788, - "narHash": "sha256-32y9nyVU2rmXp/zMTNsVbIWNKMPUuBSj4bIAnaPiCVU=", + "lastModified": 1773974569, + "narHash": "sha256-Y71Afv2mVpus+EqUj0qAwPgyaABIvEtjnUAlw5EUo3A=", "owner": "nix-community", "repo": "nix-vscode-extensions", - "rev": "70e188702ad3b4dcf5de12ff64f0d31c906d6d7a", + "rev": "5b8548f9e2cbe14146df30858bd281404957846f", "type": "github" }, "original": { @@ -961,11 +961,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1772972630, - "narHash": "sha256-mUJxsNOrBMNOUJzN0pfdVJ1r2pxeqm9gI/yIKXzVVbk=", + "lastModified": 1774018263, + "narHash": "sha256-HHYEwK1A22aSaxv2ibhMMkKvrDGKGlA/qObG4smrSqc=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "3966ce987e1a9a164205ac8259a5fe8a64528f72", + "rev": "2d4b4717b2534fad5c715968c1cece04a172b365", "type": "github" }, "original": { @@ -1055,11 +1055,11 @@ }, "nixpkgs-stable_2": { "locked": { - "lastModified": 1773222311, - "narHash": "sha256-BHoB/XpbqoZkVYZCfXJXfkR+GXFqwb/4zbWnOr2cRcU=", + "lastModified": 1773814637, + "narHash": "sha256-GNU+ooRmrHLfjlMsKdn0prEKVa0faVanm0jrgu1J/gY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0590cd39f728e129122770c029970378a79d076a", + "rev": "fea3b367d61c1a6592bc47c72f40a9f3e6a53e96", "type": "github" }, "original": { @@ -1071,11 +1071,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1773389992, - "narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=", + "lastModified": 1773999129, + "narHash": "sha256-YbW6qhVebC8xlQRBxoxctDpzViQb4+6bX7Dbm/UJ44A=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c06b4ae3d6599a672a6210b7021d699c351eebda", + "rev": "c3961540aa9cf997445f11220ff1b3673e864992", "type": "github" }, "original": { @@ -1087,11 +1087,11 @@ }, "nixpkgs_10": { "locked": { - "lastModified": 1772736753, - "narHash": "sha256-au/m3+EuBLoSzWUCb64a/MZq6QUtOV8oC0D9tY2scPQ=", + "lastModified": 1773507054, + "narHash": "sha256-Q8U5VXgrcxmCxPtCCJCIZkcAX3FCZwGh1GNVIXxMND0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "917fec990948658ef1ccd07cef2a1ef060786846", + "rev": "e80236013dc8b77aa49ca90e7a12d86f5d8d64c9", "type": "github" }, "original": { @@ -1135,11 +1135,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1773276312, - "narHash": "sha256-UujcRqoPEyi0Bd77+cqfAxa4aq0SoKOYTcJNWn+0ZvM=", + "lastModified": 1773738184, + "narHash": "sha256-zWRjT5oPabNCiC1A3QkFXpfnsgUjyg6fUZWC+IiiZH0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "87fd45fc9269db8f7197d27c620606323bbf5efa", + "rev": "41a2715cc472025a19bc0eb9dc4ee8b7406bfa6f", "type": "github" }, "original": { @@ -1215,11 +1215,11 @@ }, "nixpkgs_9": { "locked": { - "lastModified": 1773389992, - "narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=", + "lastModified": 1773999129, + "narHash": "sha256-YbW6qhVebC8xlQRBxoxctDpzViQb4+6bX7Dbm/UJ44A=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c06b4ae3d6599a672a6210b7021d699c351eebda", + "rev": "c3961540aa9cf997445f11220ff1b3673e864992", "type": "github" }, "original": { @@ -1453,11 +1453,11 @@ "nixpkgs": "nixpkgs_10" }, "locked": { - "lastModified": 1773096132, - "narHash": "sha256-M3zEnq9OElB7zqc+mjgPlByPm1O5t2fbUrH3t/Hm5Ag=", + "lastModified": 1773889674, + "narHash": "sha256-+ycaiVAk3MEshJTg35cBTUa0MizGiS+bgpYw/f8ohkg=", "owner": "Mic92", "repo": "sops-nix", - "rev": "d1ff3b1034d5bab5d7d8086a7803c5a5968cd784", + "rev": "29b6519f3e0780452bca0ac0be4584f04ac16cc5", "type": "github" }, "original": { @@ -1510,11 +1510,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1772296853, - "narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=", + "lastModified": 1773792048, + "narHash": "sha256-Oy9PCLG3vtflFBWcJd8c/EB3h5RU7ABAIDWn6JrGf6o=", "owner": "nix-community", "repo": "stylix", - "rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf", + "rev": "3f2f9d307fe58c6abe2a16eb9b62c42d53ef5ee1", "type": "github" }, "original": { diff --git a/modules/nixos/homeassistant/dashboards/default.nix b/modules/nixos/homeassistant/dashboards/default.nix new file mode 100644 index 0000000..b236c01 --- /dev/null +++ b/modules/nixos/homeassistant/dashboards/default.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + namespace, + ... +}: +let + cfg = config.${namespace}.services.home-assistant; +in +{ + imports = [ ./options.nix ]; + + config = lib.mkIf (cfg.enable && cfg.dashboards != [ ]) { + ${namespace}.home.file = lib.genAttrs cfg.dashboards ( + dashboard: + let + dashboardFile = "homeassistant/lovelace/${dashboard.title}.yaml"; + in + { + text = lib.generators.toYAML { } dashboard; + force = true; + } + ); + }; +} diff --git a/modules/nixos/homeassistant/dashboards/options.nix b/modules/nixos/homeassistant/dashboards/options.nix new file mode 100644 index 0000000..294d2f9 --- /dev/null +++ b/modules/nixos/homeassistant/dashboards/options.nix @@ -0,0 +1,10 @@ +{ lib, namespace, ... }: +with lib; +let + inherit (lib.${namespace}) mkOpt; +in +{ + options.${namespace}.services.home-assistant.dashboards = + mkOpt (types.listOf types.attrs) [ ] + "Home Assistant dashboards configuration"; +} diff --git a/modules/nixos/homeassistant/default.nix b/modules/nixos/homeassistant/default.nix index 96e417c..9474a3e 100755 --- a/modules/nixos/homeassistant/default.nix +++ b/modules/nixos/homeassistant/default.nix @@ -8,7 +8,10 @@ let cfg = config.${namespace}.services.home-assistant; in { - imports = [ ./options.nix ]; + imports = [ + ./options.nix + ./dashboards + ]; config = lib.mkIf cfg.enable { # This bypasses the component validation and places it directly in HA's data directory diff --git a/packages/homeassistant/ha-mail-and-packages/default.nix b/packages/homeassistant/ha-mail-and-packages/default.nix index 6931c34..d7b85ec 100644 --- a/packages/homeassistant/ha-mail-and-packages/default.nix +++ b/packages/homeassistant/ha-mail-and-packages/default.nix @@ -16,7 +16,7 @@ buildHomeAssistantComponent rec { hash = "sha256-w+7cC/jV+6bQM1aEPlO90Z1o9CcjmPvjNDSG9CduFFw="; }; - buildInputs = with python3Packages; [ + nativeBuildInputs = with python3Packages; [ beautifulsoup4 dateparser pillow diff --git a/systems/aarch64-linux/macbook-pro-nixos/services.nix b/systems/aarch64-linux/macbook-pro-nixos/services.nix index 4434514..d5807c6 100644 --- a/systems/aarch64-linux/macbook-pro-nixos/services.nix +++ b/systems/aarch64-linux/macbook-pro-nixos/services.nix @@ -72,7 +72,7 @@ logind = { settings = { Login = { - HandleLidSwitchExternalPower = "ignore"; + HandleLidSwitchExternalPower = "suspend"; HandleLidSwitch = "suspend"; HandlePowerKeyLongPress = "poweroff"; HandlePowerKey = "suspend"; diff --git a/systems/x86_64-linux/nuc-nixos/default.nix b/systems/x86_64-linux/nuc-nixos/default.nix index d2c7e2d..52998a6 100644 --- a/systems/x86_64-linux/nuc-nixos/default.nix +++ b/systems/x86_64-linux/nuc-nixos/default.nix @@ -84,6 +84,181 @@ services = { home-assistant = { enable = true; + dashboards = [ + { + title = "Pets & Air Quality"; + path = "pets-air"; + icon = "mdi:paw"; + cards = [ + { + type = "markdown"; + title = "🐾 Pets"; + content = "## Pet Management"; + } + { + type = "horizontal-stack"; + cards = [ + { + type = "entity"; + entity = "select.joey_smart_feeder_manual_feed_quantity"; + name = "Joey Feed"; + } + { + type = "entity"; + entity = "select.luci_smart_feeder_manual_feed_quantity"; + name = "Luci Feed"; + } + { + type = "entity"; + entity = "text.joey_smart_feeder_text_on_display"; + name = "Joey Display"; + } + { + type = "entity"; + entity = "text.luci_smart_feeder_text_on_display"; + name = "Luci Display"; + } + ]; + } + { + type = "entities"; + title = "🐱 Litter Robot"; + show_header_toggle = false; + entities = [ + "vacuum.litter_robot_4_litter_box" + { + type = "button"; + entity = "button.garbage_goober_deep"; + name = "Deep Clean"; + } + { + type = "button"; + entity = "button.garbage_goober_pet_area_cleaning"; + name = "Pet Area"; + } + { + type = "button"; + entity = "button.garbage_goober_intensive_sweeping"; + name = "Intensive"; + } + ]; + } + { + type = "markdown"; + title = "🌬️ Air Quality"; + content = "## Air Purifiers & Humidity"; + } + { + type = "horizontal-stack"; + cards = [ + { + type = "tile"; + entity = "fan.living_room_air_purifier"; + name = "Living Room"; + icon = "mdi:air-purifier"; + features = [ + { + type = "fan-speed"; + speed_count = 3; + } + ]; + } + { + type = "tile"; + entity = "fan.bedroom_air_purifier"; + name = "Bedroom"; + icon = "mdi:air-purifier"; + features = [ + { + type = "fan-speed"; + speed_count = 3; + } + ]; + } + { + type = "tile"; + entity = "fan.bedroom_fan"; + name = "Bedroom Fan"; + icon = "mdi:fan"; + features = [ + { + type = "fan-speed"; + speed_count = 4; + presets = [ + { + name = "auto"; + icon = "mdi:fan-auto"; + } + { + name = "low"; + icon = "mdi:fan-speed-1"; + } + { + name = "medium"; + icon = "mdi:fan-speed-2"; + } + { + name = "high"; + icon = "mdi:fan-speed-3"; + } + ]; + } + ]; + } + ]; + } + { + type = "horizontal-stack"; + cards = [ + { + type = "tile"; + entity = "humidifier.bedroom_humidifier"; + name = "Bedroom Humidifier"; + icon = "mdi:water-percent"; + features = [ + { + type = "humidifier-toggle"; + } + { + type = "humidifier-modes"; + modes = [ + { + name = "auto"; + icon = "mdi:refresh-auto"; + } + { + name = "low"; + icon = "mdi:water-percent"; + } + { + name = "medium"; + icon = "mdi:water-percent"; + } + { + name = "high"; + icon = "mdi:water-percent"; + } + ]; + } + { + type = "humidifier-target-humidity"; + } + ]; + } + ]; + } + { + type = "entities"; + title = "⚠️ Status"; + show_header_toggle = false; + entities = [ + "binary_sensor.bedroom_humidifier_low_water" + "binary_sensor.bedroom_humidifier_water_tank_lifted" + ]; + } + ]; + } + ]; automation = { lightswitch = { living-room-lights = {