This is a automagiduckically updated README.md
Caution
Do not blindly run this flake.
That's my job. ๐งโ๐ฆฏ
QuackHack-McBLindy.com
Here lives all home machines/phone config files,
and home automations, fully reproducible,
crafted as a tiny Nix flake
Glued together by a Nix-flavoured command line utility,
easiy expanded and used to deploy, doc, and duck around
I manage my own homes.
Custom everything.
| โ Home Manager | No ducking way โ I just auto-symlink ./home ---> /home |
| ๐ฌ Grammar & Regex | Compiled at build-time from ./bin <--- |
| โ Home Assistant | Quack no - 19/19 home automations written using the compiled grammar |
This flake holds
| Category | Contents |
|---|---|
| ๐๏ธ Execution | |
| ๐ Network | |
| ๐ฅ๏ธ Infrastructure | |
| ๐ Home Automation | |
| ๐ Security | |
| ๐ Workflows | |
| ๐ ??? |
List would get long, very quackly.
perhaps a more suitable question would be:
"What makes this configuration common?"
honorable mentions in my flake inputs:
| ๐ | sops-nix | awesome secret keepin' |
| ๐ | magnixify | makes me see screen |
| ๐ฃ๏ธ | yo | holds my scripts and grammar, runs the voice pipeline |
| ๐ฆ | zigduck | automates my house |
| ๐ด | PokรฉNix | builds & deploys my Pokรฉmon collection |
Define yourself at `config.this.user.me`.
{
discord = "https://discordapp.com/users/675530282849533952";
dotfilesDir = "/home/pungkula/dotfiles";
email = "isthisrandomenough@protonmail.com";
extraGroups = [ "networkmanager" "wheel" "dialout" "docker" "dockeruser" "zigduck" "users" "pungkula" "adbusers" "audio" "2000" "i2c" "input" "mqtt" ];
hashedPassword = "$y$j9T$m8hPD36i1VMaO5rurbZ4j0$KpzQyat.F6NoWFKpisEj77TvpN2wBGB8ezd26QoKDj6";
matrix = "https://matrix.to/#/@quackhack-mcblindy:matrix.org";
mobileDevices = {
iphone = {
pubkey = "UFB0T1Y/uLZi3UBtEaVhCi+QYldYGcOZiF9KKurC5Hw=";
wgip = "10.0.0.7"
};
tablet = {
pubkey = "ETRh93SQaY+Tz/F2rLAZcW7RFd83eofNcBtfyHCBWE4=";
wgip = "10.0.0.8"
};
watch = {
pubkey = "b28LFIbZSxbCLTaK7qsLp0hAMH+yo93+rVV14qif4hY=";
wgip = "10.0.0.9"
}
};
name = "pungkula";
repo = "git@github.com:QuackHack-McBlindy/dotfiles.git"
}Define each hosts data at `config.this.host`.
{
hostname = "desktop";
interface = [ "enp119s0" ];
ip = "192.168.1.111";
keys = {
privateKeys = {
};
publicKeys = {
adb = "QAAAACEJNfsfRV4PQ9Ah87MbTVbMkbXC6CAMDOR+0K6mIpv/4TSzYMkc2qit3Kryc55IVOjwR3fJRjj/uL549gZ7nEemWtcd3AsYQBp0iIEor8nu1L/V6jfsTY6Xe/pl06xoroy6OwZRWuDbZ4wD2xQRRQjfPd+JtYnMAWneM6r1V15uR67w4ITvjk3ckyfgNeLZMUwahMRjC3wSjaU9sAdKNmg8yPd8uHZ+mK6mstxJFAGEpnnm1lE7Z2r0DF6h6MKY1++dwhU+WM5BRDNiBg+D4i6fDW4+Z1I9ENuFnjT17zAxZXch04SNlG3O94BANYP7jmKp60OvtDL6msfphntuIUzMCkndF9De0Kv4lJdQxe1d+wf+AFpmtd/xtrk45YdMV+eWCJf2OkidaHmSj4ffkAobpun0VrkZN2Z1JymmdsvUbyMjAsby3Zun0xr3EocUS8Jy5TcsK/dcpD6CB5dqzlHhsHSAWt2TDwPzZYXgV1xc+q+PqM09OVN1xActJu75UMkg5b84U15hwQvYdwB8UaopMWWk6p064c7gxYSfH7fSxwkW2Jy1CElgJa55Pp4SZG9b/3B+VcNL1WSf6v/lvJqPbrRvBqvS0+e9wcFMNZtQKTX3n5X0wW1/czZPCQX+hmM8Uu1qrtaz4rKViIEGf4YR0/9eUGYQVfuAxAh8ZmsroJlnAAEAAQA= pungkula@desktop";
age = "age16utg7mmk73cn3glrwthtm0p7mf6g3vrd48h3ucpn6wnf28pgxvcsh4rjjp";
borg = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMVYczAOBSeS7WfSvzYDOS4Q9Ss+yxCf2G5MVfAALOx/";
builder = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINQ7c/AeIpmJS6cWQkHOe4ZEq3DXVRnjtTWuWfx6L46n";
cache = "cache:/pbj1Agw2OoSSDZcClS69RHa1aNcwwTOX3GIEGKYwPc=";
host = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILdwPkRQxlbrbRGwEO5zMJ4m+7QqUQPZg1iqbd5HRP34";
iPhone = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMcmr+z7k/yCbrFg+JDgo8JCuWqNVYn10ajRbNTp8fq";
ssh = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwZL27kGTQDIlSe03abT9F24nSAizORyjo5cI3BD92s";
wireguard = "Oq0ZaYAnOo5sLpV//OEFwLgjVCxPyeQqf8cZBASluWk="
}
};
modules = {
hardware = [ "cpu/intel" "audio" ];
networking = [ "default" "pool" ];
programs = [ "default" "thunar" "firefox" "vesktop" ];
services = [ "ssh" "default" "yo" "yo-client" "adb" "openrgb" "backup" "cache" "keyd" "jelly" "duckdns" "sunshine" ];
system = [ "nix" "pkgs" "gnome" "crossEnv" "gtk" ];
virtualisation = [ "docker" "vm" ]
};
system = "x86_64-linux";
wgip = "10.0.0.2"
}Define any optional theme configuration at `config.this.theme`.
{
cursorTheme = {
name = "Bibata-Modern-Classic";
package = "/nix/store/qf0hqvlf7falfxxx8vs67adk6m08qdmd-bibata-cursors-2.0.7";
size = 32
};
enable = false;
fonts = {
monospace = "Fira Code";
packages = [ "/nix/store/n0x0mrlx0j63ak5slnvp5m21xpb0k50q-fira-code-6.2" ];
system = "Fira Sans"
};
gtkSettings = {
gtk-application-prefer-dark-theme = "1";
gtk-cursor-theme-name = "Bibata-Modern-Classic";
gtk-icon-theme-name = "elementary-xfce-icon-theme"
};
iconTheme = {
name = "Papirus-Dark";
package = "/nix/store/48m37bqwn88nj55zszg6nla57qqmm07i-papirus-icon-theme-20260801"
};
name = "gtk3.css";
styles = "/nix/store/wg23gpsvsws9j5r5r1v9369pa4vfyv15-gtk3.css"
}Define Zigbee-devices, scenes, automations, tv's, channels etc at `config.house`.
dotfiles/modules/myHouse.nix โฎ https://github.com/quackhack-mcblindy/dotfiles
# dotfiles/modules/myHouse.nix โฎ https://github.com/quackhack-mcblindy/dotfiles
# ยป โ
QuackHack-McBLindy.com โ
ยซ
# ๐ฆ โฎ my house - qwack! entire home automation in natural language!
{ # ยป โ
github.com/QuackHack-McBlindy/zigduck โ
ยซ
config,
lib,
self,
zigduck,
hosts,
devices,
icons,
pkgs,
...
} : let
# ๐ฆ says โฎ load custom pages for da dashboard
customPages = import ./dashboard.nix { inherit lib config pkgs; };
pages = customPages.pages;
# ๐ฆ says โฎ import ma devicez
houseDevices = import ./devices.nix { inherit lib config pkgs icons hosts zigduck; };
myDevices = houseDevices.devices;
myZigbeeDevices = houseDevices.zigbee;
# ๐ฆ says โฎ load css files
css.tv = builtins.readFile ./themes/css/duckdash/tv.css;
css.chat = builtins.readFile ./themes/css/duckdash/chat.css;
# ๐ฆ says โฎ auto detect summer/winter time (for EPG)
flakeEpoch =
if self ? lastModified then toString self.lastModified
else throw "flake has no lastModified โ needs to be a git-backed flake";
tzProbe = pkgs.runCommand "tz-probe" {
nativeBuildInputs = [ pkgs.tzdata ];
env.TZDIR = "${pkgs.tzdata}/share/zoneinfo";
env.EPOCH = flakeEpoch;
} ''
TZ=Europe/Stockholm date -d "@$EPOCH" +%z > $out
'';
tzOffset = lib.strings.trim (builtins.readFile tzProbe);
timezone_offset_hours = {
"+0100" = -1;
"+0200" = -2;
}.${tzOffset} or (throw "unexpected TZ offset from tzdata: ${tzOffset}");
# ๐ฆ says โฎ now we can stream tts yo - from zigduck yo
yoClientsJson = pkgs.writeText "yo-clients.json" (builtins.toJSON (
map (c: c // { connected_at = 0; })
[
{ room = "livingroom"; ip = hosts.desktop.ip; gain = 1.0; }
{ room = "esp"; ip = devices.ESP32-S3-BOX-3.ip; gain = 1.0; }
]
));
in { # ๐ฆ duck say โฎ house config
house = {
# ๐ฆ says โฎ ROOM CONFIGURATION
rooms = {
bedroom = {
icon = icons.room.bedroom;
aliases = [ "sovrum" "sovrummet" ];
};
hallway = {
icon = icons.room.hallway;
aliases = [ "hall" "hallen" "entren" ];
};
kitchen = {
icon = icons.room.kitchen;
aliases = [ "kรถk" "kรถket" "matsal" "matsalen" ];
};
livingroom = {
icon = icons.room.livingroom;
aliases = [ "vardagsrum" "vardagsrummet" ];
};
wc = {
icon = icons.room.wc;
aliases = [ "toa" "toan" "toaletten" "dass" "skithuset" ];
};
tv-area = {
entertainment = true;
icon = icons.tv;
};
other.icon = icons.room.other;
};
# ๐ฆ says โฎ presence home/away state
# ๐ฆ โฎ collected in various ways for successful detection
presence = {
probes = [ devices.iphone.ip ];
homeActions = [ "skicka en notis om ๐ โ๏ธ BACK HOME!" ];
awayActions = [ "skicka en notis om ๐ โ LEFT HOME! samt slรคck alla lampor" ];
};
# ๐ฆ says โฎ media
https.media.urlFile = config.sops.secrets.webserver.path;
media.root = "/Pool"; # ๐ฆ โฎ i like pools!
media.youtubePasswordFile = config.sops.secrets.youtube_api_key.path;
media = {
movies = "${config.house.media.root}/Movies";
tv = "${config.house.media.root}/TV";
music = "${config.house.media.root}/Music";
musicVideos = "${config.house.media.root}/Music_Videos";
otherVideos = "${config.house.media.root}/Other_Videos";
podcasts = "${config.house.media.root}/Podcasts";
audiobooks = "${config.house.media.root}/Audiobooks";
};
# ๐ฆ โฎ DEVICES (non zigbee/NixOS) imported devices.nix โฎ
devices = myDevices;
# ๐ฆ โฎ ZIGBEE โฎ ๐
zigbee = {
# ๐ฆ โฎ DEVICES (loaded from devices.nix) โฎ
devices = myZigbeeDevices;
# ๐ฆ says โฎ encrypted zigbee network key
networkKeyFile = config.sops.secrets.z2m_network_key.path;
# ๐ฆ says โฎ mosquitto authentication
mosquitto = {
host = (lib.findFirst
(h: lib.elem "zigduck" h.modules.services)
(throw "NO ZIGDUCK HOST")
(lib.attrValues hosts)).ip;
username = "mqtt";
passwordFile = config.sops.secrets.mosquitto.path;
baseTopic = "zigduck";
};
# ๐ฆ says โฎ TV light syncin'
hueSyncBox = {
enable = true;
# ๐ฆ says โฎ sadly needed (i disable itz internet access - u should too)
bridge = {
passwordFile = config.sops.secrets.hueBridgeAPI.path;
# ๐ฆ says โฎ run the following to get api token:
# curl -X POST http://192.168.1.33/api -d '{"devicetype":"house#nixos"}'
ip = devices.hue-bridge.ip;
};
syncBox = { # C42996020AAE
# ๐ฆ says โฎ run the following to get api token for the sync box:
# curl -k -sS -X POST "https://192.168.1.34/api/v1/registrations" -H "Content-Type: application/json" -d '{"appName": "zigduck", "instanceName": "zigduck"}'
passwordFile = config.sops.secrets.hueSyncAPI.path;
ip = devices.hue-sync.ip;
tv = "shield";
};
};
# ๐ฆsaysโฎ coordinator configuration
coordinator = {
vendorId = "10c4";
productId = "ea60";
symlink = "zigbee"; # ๐ฆ says โฎ diz symlinkz da serial port to /dev/zigbee
};
# ๐ฆ says โฎ optional dimmer config
dimmer.message = "action";
# ๐ฆ โฎ clickin' fast cyclez scnes in da dimmers room!
dimmer.doubleClickTimeout = 500;
# ๐ฆ says โฎ when motion triggers lights on
motion = {
when.dark.enable = true;
trigger.lights = {
after = 14;
before = 9;
duration = 700;
transition = true;
};
};
# ๐ฆ says โฎ when no motion triggers ALL lights off
no.motion.trigger = {
all.lights.off = {
enable = true;
after = 90; # ๐ฆ says โฎ min
exclude = [ ]; # ๐ฆ says โฎ list of strings, devices to exclude (friendly name/alias, leaves their states as-is)
};
};
# ๐ฆ โฎ AUTOMATIONS โฎ
automations = { # ๐ฆ says โฎ here we start quackin'
string.prefix = "yo do";
# ๐ฆ says โฎ there are 6 different automation types
# ๐ฆ โฎ + a greeting automation
greeting = {
enable = true;
awayDuration = 7200;
door = "Door Sensor Hall";
delay = 10; # ๐ฆ โฎ welcome back home idiot
actions = [ "sรคg vรคlkommen hem idiot" ];
};
# ๐ฆ says โฎ 1. MQTT triggered automations
mqtt_triggered = {
flash_lights = {
enable = true;
description = "Flash lights";
topic = "${zigduck.baseTopic}/effects/flash";
actions = [
# ๐ฆ โฎ create a state snapshot and name it before flash & wait two seconds
# ๐ฆ โฎ activate different color rich slow transition scene & wait seven seconds
# ๐ฆ โฎ turn on all lights & wait four seconds & turn off all lights quickly as fuck & wait three secs
# ๐ฆ โฎ turn on all lights & wait four secs & turn off all lights again quick af & wait three secs
# ๐ฆ โฎ turn lights back on again & sleep five sec and finally restore system state to before flash
"skapa en snapshot och dรถp den till innan flashen samt vรคnta tvรฅ sekunder"
"tรคnd alla lampor samt vรคnta fyra sekunder"
"slรคck alla lampor fort som fan samt vรคnta tre sekunder"
"tรคnd alla lampor samt vรคnta fyra sekunder"
"slรคck allt igen fort utav helvete samt vรคnta tre sekunder"
"tรคnd allt samt vรคnta fem sekunder och slutligen รฅterstรคll systemet till innan flashen"
];
};
living_cealing = {
enable = true;
description = "Give the cealing life. Life in colors.";
topic = "${zigduck.baseTopic}/effects/living/cealing";
actions = [
# ๐ฆ โฎ activate color rich slow transition scene & wait five seconds
# ๐ฆ โฎ activate different color rich slow transition scene & wait seven seconds
# ๐ฆ โฎ activate different color rich slow transition scene & wait eleven seconds
"aktivera scen levande tak ett samt vรคnta fem sekunder"
"aktivera scen levande tak tvรฅ samt vรคnta sju sekunder"
"aktivera scen levande tak tre samt vรคnta elva sekunder"
];
};
loop_cealing = {
enable = true;
description = "Give the cealing life. Life in colors.";
topic = "${zigduck.baseTopic}/effects/living/cealing/loop";
actions = [
# ๐ฆ โฎ loop living cealing until state changes
"loopa levande taket tills den รคndrar tillstรฅnd"
];
};
alarm_wakeup = {
enable = true;
description = "Time to wake up!";
conditions = [ { type = "someone_home"; } ];
topic = "${zigduck.baseTopic}/alarm/triggered";
actions = [ # ๐ฆ say โฎ GOOD LUCK STAYING IN BED
# ๐ฆ โฎ notify, flash lights, TTS scream, raise the beds head & feet parts upwards at max
# ๐ฆ โฎ wait then start blinking lights like raveparty, play sounds on all ESP32,
# ๐ฆ โฎ wait & roll up blindz & play sum moar sounds, check motion sensors & if no motion - call the TV remote!
"skicka en notis om โฐ ALARM: Wake up! samt flasha ljuset"
"sรคg UPP MED DIG LATMASK!!! sedan styr sรคngens fรถtter upp samt styr sรคngens huvud uppรฅt"
"vรคnta tio sekunder sedan blinkepartaj"
"pinga boxen samt pinga klockan sedan vรคnta tio sekunder"
"rulla upp persiennerna samt pinga boxen"
"om det inte รคr nรฅgon i sovrummet sรฅ ring fjรคrrkontrollen"
];
};
timer_finish = {
enable = true;
description = "a timer is ringing";
conditions = [ { type = "someone_home"; } ];
topic = "${zigduck.baseTopic}/timer/finished";
actions = [ # ๐ฆ says โฎ notify, flash lights, TTS, wait and play sound on ESP32
"skicka en notis om โฐ TIMER finish!! samt flasha ljuset"
"sรคg timern ringer!! timern ringer!! sedan vรคnta sju sekunder samt pinga boxen"
];
};
# ๐ฆ says โฎ below are used to create cards
# ๐ฆ says โฎ cards are read & displayed by the frontend
# ๐ฆsayโฎ crypto tickers
xmr = {
enable = true;
description = "Updating XMR price data on dashboard";
topic = "${zigduck.baseTopic}/crypto/xmr/price";
actions = [ "spara current_price i xmr.json" ];
};
btc = {
enable = true;
description = "Updating BTC price data on dashboard";
topic = "${zigduck.baseTopic}/crypto/btc/price";
actions = [ "spara current_price i btc.json" ];
};
# ๐ฆsayโฎ energy tracking
energyPrice = {
enable = true;
description = "Updating energy data on dashboard";
topic = "${zigduck.baseTopic}/tibber/energy";
actions = [ "spara current_price i energy_price.json" ];
};
energyUsage = {
enable = true;
description = "Updating energy data on dashboard";
topic = "${zigduck.baseTopic}/tibber/energy";
actions = [ "spara monthly_usage i energy_usage.json" ];
};
# ๐ฆsayโฎ hallway temperature
temperature = {
enable = true;
description = "Updating temperature data on dashboard";
topic = "${zigduck.baseTopic}/Motion Sensor Hall";
actions = [ "spara temperature i temperature.json" ];
};
# ๐ฆsayโฎ calendar
calendar = {
enable = true;
description = "Updated calendar events";
topic = "${zigduck.baseTopic}/calendar";
actions = [
{ type = "shell"; command = ''
iso_date=$(echo "$MQTT_PAYLOAD" | jq -r '.today_date')
formatted_date=$(date -d "$iso_date" +"%b %d")
MQTT_PAYLOAD=$(echo "$MQTT_PAYLOAD" | jq --arg d "$formatted_date" '.today_date = $d')
echo "$MQTT_PAYLOAD" > ${zigduck.stateDir}/calendar.json
''; }
];
};
};
# ๐ฆ says โฎ 2. room action automations
room_actions = {
hallway = { # ๐ฆ says โฎ while door is open say something fun until door closes.
door_opened = [ "skicka en notis om ๐ช DรRR รPPEN! sedan medans dรถrren รคr รถppen sรฅ sรคg tittut! tittut!" ];
door_closed = [];
};
kitchen = {
motion_not_detected = [
# ๐ฆ โฎ if fan is on and consuming power, start countdown to turn fan off. and slowly fade off lights.
"om flรคkten drar mer รคn tjugo watt sรฅ stรคng flรคkten om etthundraรฅttio sekunder sedan slรคck kรถket lรฅngsamt"
];
motion_detected = [
# ๐ฆ โฎ "big" 20ms win - worth it here
{ type = "scene"; scene = "kitchenInstant"; }
# ๐ฆ โฎ 1: start lights.
# ๐ฆ โฎ 2: cancel the off-countdown on fan.
# ๐ฆ โฎ 3: if my team is playin' NOW activate scene & if tv is off start the game on TV and TTS dat the game is on now
"stรคng flรคkten om noll sekunder samt om flรคkten รคr av sรฅ sรคtt pรฅ flรคkten"
"om bjรถrklรถven spelar just nu sรฅ aktivera scenen lรถven och om tvn รคr av sรฅ slรคng igรฅng lajv bjรถrklรถven fรถr fan plus sรคg nu bรถrjar match klant"
];
};
};
# ๐ฆ says โฎ 3. global actions automations
global_actions = {
leak_detected = [
# ๐ฆ โฎ flash lights, notify and TTS and pling all devices with sound
"flasha ljuset samt vรคnta sju sekunder samt tรคnd alla lampor"
"notifiera ๐ง ๐จ WATER LEAK DETECTED! samt plinga klockan samt plinga boxen"
"sรคg VATTEN VATTEN VATTEN VATTEN samt vรคnta femton sekunder sedan sรคg VATTEN VATTEN VATTEN!"
];
smoke_detected = [
"flasha ljuset sedan vรคnta sju sekunder samt tรคnd alla lampor"
"notifiera ๐ฅ ๐ฅ FIRE DETECTED! ๐ฅ ๐ฅ samt plinga klockan samt plinga boxen"
"sรคg ELD ELD ELD ELD samt vรคnta femton sekunder sedan sรคg ELD ELD ELD ELD!"
];
};
# ๐ฆ says โฎ 4. dimmer actions automations
dimmer_actions = {
bedroom = {
off_hold_release = {
enable = true;
description = "Turn off all configured light devices and turn of kitchen fan";
extra_actions = [];
override_actions = [ "slรคck alla lampor sedan stรคng av flรคkten" ];
};
};
kitchen = {
on_press_release = {
enable = true;
description = "Turn on kitchen fan (+ lights)";
extra_actions = [ "starta flรคkten" ];
override_actions = [ ];
};
};
livingroom = {
on_press_release = {
enable = true;
description = "Turn on kitchen fan (+ lights).";
extra_actions = [ "starta flรคkten" ];
};
};
};
# ๐ฆ says โฎ 5. time based automations
time_based = {
morning_wakeup = {
enable = true;
description = "set morning wakeup alarm (dont miss lunch)";
conditions = [ { type = "someone_home"; } ];
# ๐ฆ says โฎ create da alarm at 01 AM mon-fri
schedule = {
start = "01:00";
days = ["mon" "tue" "wed" "thu" "fri"];
}; # ๐ฆ โฎ but we set da alarm to:
# ๐ฆ says โฎ 11.30 AM (i like to sleep in)
actions = [ "vรคck mig klockan elva och trettio'" ];
};
cacel_weekend = {
enable = true;
description = "No wakeup on weekends";
schedule = { start = "04:00"; days = ["sat" "sun"]; };
actions = [ "vรคck mig inte klockan elva och trettio'" ];
};
# ๐ฆ says โฎ daily tv scraper
tv_scraping = {
enable = true;
description = "Scrape TV-guide";
# ๐ฆ says โฎ 03:30 AM everyday
schedule = {
start = "03:30";
days = ["mon" "tue" "wed" "thu" "fri" "sat" "sun"];
};
# ๐ฆ says โฎ scrape & save so frontend can read it (from zigduck user)
actions = [ "skrapa webben efter tv guiden och spara i ${zigduck.stateDir}" ];
};
battery_check = {
enable = true;
description = "Check battery driven devices and send notification if any is really low.";
schedule = {
start = "12:30";
days = ["mon" "wed" "sat" ];
}; # ๐ฆ says โฎ if any battery driven device has less battery than six send a notification
actions = [ "om nรฅgon batteridriven enhet har mindre batteri รคn sex sรฅ skicka en notis om ๐ชซ BATTERY!!" ];
};
};
# ๐ฆ says โฎ 6. presence based automations
presence_based = {};
};
# ๐ฆ โฎ SCENES โฎ
scenes = {
# ๐ฆ says โฎ Scene name
"Chill Scene" = {
# ๐ฆ says โฎ alternative wordz for da scene
_aliases = [ "chill" ];
# ๐ฆ says โฎ device friendly name & state
"PC" = { state = "ON"; brightness = 200; color = { hex = "#8A2BE2"; }; };
"Golvet" = { state = "ON"; brightness = 200; color = { hex = "#40E0D0"; }; };
"Uppe" = { state = "ON"; brightness = 200; color = { hex = "#FF69B4"; }; };
"Spotlight kรถk 1" = { state = "OFF"; brightness = 200; color = { hex = "#FFD700"; }; };
"Spotlight Kรถk 2" = { state = "OFF"; brightness = 200; color = { hex = "#FF8C00"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 200; color = { hex = "#00CED1"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 200; color = { hex = "#9932CC"; }; };
"Bloom" = { state = "ON"; brightness = 200; color = { hex = "#FFB6C1"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 200; color = { hex = "#7FFFD4"; }; };
"Takkrona 1" = { state = "ON"; brightness = 200; color = { hex = "#7FFFD4"; }; };
"Takkrona 2" = { state = "ON"; brightness = 200; color = { hex = "#7FFFD4"; }; };
"Takkrona 3" = { state = "ON"; brightness = 200; color = { hex = "#7FFFD4"; }; };
"Takkrona 4" = { state = "ON"; brightness = 200; color = { hex = "#7FFFD4"; }; };
};
"Green D" = {
_aliases = [ "devil" "devils" "lรถven" ];
"Golvet" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Uppe" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Spotlight kรถk 1" = { state = "OFF"; brightness = 200; color = { hex = "#00FF00"; }; };
"Spotlight Kรถk 2" = { state = "OFF"; brightness = 200; color = { hex = "#00FF00"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Bloom" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Takkrona 1" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Takkrona 2" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Takkrona 3" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
"Takkrona 4" = { state = "ON"; brightness = 200; color = { hex = "#00FF00"; }; };
};
"kitchenInstant" = {
_aliases = [ "instant" "direkt" ];
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#7852A9"; }; };
"Kรถk Bรคnk Slinga" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Spotlight Kรถk 2" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Spotlight kรถk 1" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
};
"kitchenGreenInstant" = {
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#00FF00"; }; };
"Kรถk Bรคnk Slinga" = { state = "ON"; brightness = 254; color = { hex = "#00FF00"; }; };
"Spotlight Kรถk 2" = { state = "ON"; brightness = 254; color = { hex = "#00FF00"; }; };
"Spotlight kรถk 1" = { state = "ON"; brightness = 254; color = { hex = "#00FF00"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
};
# ๐ฆ says โฎ veeeery slow turn off kitchen
"kitchenFadeOff" = {
_aliases = [ "fade" "tona" ];
"Golvet" = { state = "OFF"; transition = 180; };
"Kรถk Bรคnk Slinga" = { state = "OFF"; transition = 180; };
"PC" = { state = "OFF"; transition = 180; };
"Spotlight Kรถk 2" = { state = "OFF"; transition = 180; };
"Spotlight kรถk 1" = { state = "OFF"; transition = 180; };
"Uppe" = { state = "OFF"; transition = 180; };
};
"dark" = { # ๐ฆ says โฎ eat darkness... lol YO! You're as blind as me now! HA HA!
"Bloom" = { state = "OFF"; transition = 13; };
"Dรถrrslinga" = { state = "OFF"; transition = 13; };
"Golvet" = { state = "OFF"; transition = 13; };
"Kรถk Bรคnk Slinga" = { state = "OFF"; transition = 13; };
"PC" = { state = "OFF"; transition = 13; };
"Rustning" = { state = "OFF"; transition = 13; };
"Spotlight Kรถk 2" = { state = "OFF"; transition = 13; };
"Spotlight kรถk 1" = { state = "OFF"; transition = 13; };
"Sรคnggavel" = { state = "OFF"; transition = 13; };
"Tak Hall" = { state = "OFF"; transition = 13; };
"Taket Sovrum 1" = { state = "OFF"; transition = 13; };
"Taket Sovrum 2" = { state = "OFF"; transition = 13; };
"Uppe" = { state = "OFF"; transition = 13; };
"Vรคgg" = { state = "OFF"; transition = 13; };
"WC 1" = { state = "OFF"; transition = 13; };
"WC 2" = { state = "OFF"; transition = 13; };
"Takkrona 1" = { state = "OFF"; transition = 13; };
"Takkrona 2" = { state = "OFF"; transition = 13; };
"Takkrona 3" = { state = "OFF"; transition = 13; };
"Takkrona 4" = { state = "OFF"; transition = 13; };
"TV Play Strip" = { state = "OFF"; transition = 13; };
"TV Play 1" = { state = "OFF"; transition = 13; };
"TV Play 2" = { state = "OFF"; transition = 13; };
"TV Play 3" = { state = "OFF"; transition = 13; };
"TV Play 4" = { state = "OFF"; transition = 13; };
"Play Top L" = { state = "OFF"; transition = 13; };
"Play Top R" = { state = "OFF"; transition = 13; };
};
"dark-fast" = { # ๐ฆ says โฎ eat darkness... NAO!
"Bloom" = { state = "OFF"; };
"Dรถrrslinga" = { state = "OFF"; };
"Golvet" = { state = "OFF"; };
"Kรถk Bรคnk Slinga" = { state = "OFF"; };
"PC" = { state = "OFF"; };
"Rustning" = { state = "OFF"; };
"Spotlight Kรถk 2" = { state = "OFF"; };
"Spotlight kรถk 1" = { state = "OFF"; };
"Sรคnggavel" = { state = "OFF"; };
"Tak Hall" = { state = "OFF"; };
"Taket Sovrum 1" = { state = "OFF"; };
"Taket Sovrum 2" = { state = "OFF"; };
"Uppe" = { state = "OFF"; };
"Vรคgg" = { state = "OFF"; };
"WC 1" = { state = "OFF"; };
"WC 2" = { state = "OFF"; };
"Takkrona 1" = { state = "OFF"; };
"Takkrona 2" = { state = "OFF"; };
"Takkrona 3" = { state = "OFF"; };
"Takkrona 4" = { state = "OFF"; };
"TV Play Strip" = { state = "OFF"; };
"TV Play 1" = { state = "OFF"; };
"TV Play 2" = { state = "OFF"; };
"TV Play 3" = { state = "OFF"; };
"TV Play 4" = { state = "OFF"; };
"Play Top L" = { state = "OFF"; };
"Play Top R" = { state = "OFF"; };
};
"max" = { # ๐ฆ says โฎ let there be light
_aliases = [ "maxa" ];
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#7852A9"; }; };
"Kรถk Bรคnk Slinga" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"PC" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Rustning" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Spotlight Kรถk 2" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Spotlight kรถk 1" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Tak Hall" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Vรคgg" = { state = "ON"; brightness = 1; }; # ๐ฆ says โฎ 1% bright enuff on dis qwackit...
"WC 1" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"WC 2" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Takkrona 1" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Takkrona 2" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Takkrona 3" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"Takkrona 4" = { state = "ON"; brightness = 254; color = { hex = "#FFFFFF"; }; };
"TV Play Strip" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"TV Play 1" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"TV Play 2" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"TV Play 3" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"TV Play 4" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"Play Top L" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
"Play Top R" = { state = "ON"; brightness = 254; color = { xy = [ 0.3127 0.3290 ]; }; };
};
"Living Cealing 1" = { # ๐ฆ says โฎ makin' living scene dat eazy ?!
_aliases = [ "ett" ];
"Takkrona 1" = { state = "ON"; brightness = 240; transition = 12; color = { hex = "#FF1744"; }; };
"Takkrona 2" = { state = "ON"; brightness = 220; transition = 17; color = { hex = "#FFEA00"; }; };
"Takkrona 3" = { state = "ON"; brightness = 200; transition = 22; color = { hex = "#00E676"; }; };
"Takkrona 4" = { state = "ON"; brightness = 180; transition = 27; color = { hex = "#2979FF"; }; };
};
"Living Cealing 2" = { # ๐ฆโฎcall "Living Cealing 1", sleep 15, "Living Cealing 2", sleep 15. "Living Cealing 3"
_aliases = [ "tvรฅ" ];
"Takkrona 1" = { state = "ON"; brightness = 182; transition = 9; color = { hex = "#2979FF"; }; };
"Takkrona 2" = { state = "ON"; brightness = 200; transition = 11; color = { hex = "#00E676"; }; };
"Takkrona 3" = { state = "ON"; brightness = 220; transition = 18; color = { hex = "#FFEA00"; }; };
"Takkrona 4" = { state = "ON"; brightness = 240; transition = 26; color = { hex = "#FF1744"; }; };
};
"Living Cealing 3" = {
_aliases = [ "tre" ];
"Takkrona 1" = { state = "ON"; brightness = 200; transition = 8; color = { hex = "#B71C1C"; }; };
"Takkrona 2" = { state = "ON"; brightness = 220; transition = 14; color = { hex = "#1B5E20"; }; };
"Takkrona 3" = { state = "ON"; brightness = 240; transition = 20; color = { hex = "#0D47A1"; }; };
"Takkrona 4" = { state = "ON"; brightness = 200; transition = 26; color = { hex = "#4A148C"; }; };
};
"Rainforest" = {
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FF1744"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 180; color = { hex = "#2E7D32"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#1B5E20"; }; };
"PC" = { state = "ON"; brightness = 220; color = { hex = "#00ACC1"; }; };
"Rustning" = { state = "ON"; brightness = 254; color = { hex = "#FF6D00"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 254; color = { hex = "#FF4081"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 160; color = { hex = "#2E7D32"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 120; color = { hex = "#1B5E20"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFD54F"; }; };
"Takkrona 1" = { state = "ON"; brightness = 220; color = { hex = "#81C784"; }; };
"Takkrona 2" = { state = "ON"; brightness = 200; color = { hex = "#66BB6A"; }; };
"Takkrona 3" = { state = "ON"; brightness = 180; color = { hex = "#43A047"; }; };
"Takkrona 4" = { state = "ON"; brightness = 160; color = { hex = "#2E7D32"; }; };
};
"Galaxy" = {
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FFD54F"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 140; color = { hex = "#4A148C"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#12002B"; }; };
"PC" = { state = "ON"; brightness = 200; color = { hex = "#7B1FA2"; }; };
"Rustning" = { state = "ON"; brightness = 120; color = { hex = "#0D47A1"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 220; color = { hex = "#FF80AB"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 120; color = { hex = "#4A148C"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 100; color = { hex = "#311B92"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#E1BEE7"; }; };
"Takkrona 1" = { state = "ON"; brightness = 200; color = { hex = "#7B1FA2"; }; };
"Takkrona 2" = { state = "ON"; brightness = 180; color = { hex = "#6A1B9A"; }; };
"Takkrona 3" = { state = "ON"; brightness = 160; color = { hex = "#4A148C"; }; };
"Takkrona 4" = { state = "ON"; brightness = 140; color = { hex = "#311B92"; }; };
};
"Festival" = {
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FF1744"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 254; color = { hex = "#FF9100"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#FFEA00"; }; };
"PC" = { state = "ON"; brightness = 254; color = { hex = "#00E676"; }; };
"Rustning" = { state = "ON"; brightness = 254; color = { hex = "#00E5FF"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 254; color = { hex = "#D500F9"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 220; color = { hex = "#FF1744"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 220; color = { hex = "#FF9100"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFEA00"; }; };
"Takkrona 1" = { state = "ON"; brightness = 254; color = { hex = "#651FFF"; }; };
"Takkrona 2" = { state = "ON"; brightness = 254; color = { hex = "#D500F9"; }; };
"Takkrona 3" = { state = "ON"; brightness = 254; color = { hex = "#F50057"; }; };
"Takkrona 4" = { state = "ON"; brightness = 254; color = { hex = "#FF1744"; }; };
};
"Sunset" = {
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FF3D00"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 200; color = { hex = "#FF6E40"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#4E342E"; }; };
"PC" = { state = "ON"; brightness = 240; color = { hex = "#FFAB40"; }; };
"Rustning" = { state = "ON"; brightness = 254; color = { hex = "#FFC107"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 254; color = { hex = "#FF4081"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 160; color = { hex = "#7E57C2"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 120; color = { hex = "#3F51B5"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#FFD180"; }; };
"Takkrona 1" = { state = "ON"; brightness = 240; color = { hex = "#FF8A80"; }; };
"Takkrona 2" = { state = "ON"; brightness = 220; color = { hex = "#FF80AB"; }; };
"Takkrona 3" = { state = "ON"; brightness = 200; color = { hex = "#CE93D8"; }; };
"Takkrona 4" = { state = "ON"; brightness = 180; color = { hex = "#9FA8DA"; }; };
};
"Underwater" = {
"Bloom" = { state = "ON"; brightness = 254; color = { hex = "#FF6E40"; }; };
"Dรถrrslinga" = { state = "ON"; brightness = 160; color = { hex = "#006064"; }; };
"Golvet" = { state = "ON"; brightness = 124; color = { hex = "#002F4A"; }; };
"PC" = { state = "ON"; brightness = 220; color = { hex = "#0091EA"; }; };
"Rustning" = { state = "ON"; brightness = 254; color = { hex = "#18FFFF"; }; };
"Sรคnggavel" = { state = "ON"; brightness = 240; color = { hex = "#64FFDA"; }; };
"Taket Sovrum 1" = { state = "ON"; brightness = 140; color = { hex = "#01579B"; }; };
"Taket Sovrum 2" = { state = "ON"; brightness = 110; color = { hex = "#003366"; }; };
"Uppe" = { state = "ON"; brightness = 254; color = { hex = "#84FFFF"; }; };
"Takkrona 1" = { state = "ON"; brightness = 220; color = { hex = "#00ACC1"; }; };
"Takkrona 2" = { state = "ON"; brightness = 200; color = { hex = "#00838F"; }; };
"Takkrona 3" = { state = "ON"; brightness = 180; color = { hex = "#00695C"; }; };
"Takkrona 4" = { state = "ON"; brightness = 160; color = { hex = "#26A69A"; }; };
};
"tv-area1" = {
_aliases = [ "tv1" "tv area 1" "tv area ett" ];
"TV Play Strip" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.6321 0.2678 ]; }; transition = 15; };
"TV Play 1" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.1491 0.3012 ]; }; transition = 15; };
"TV Play 2" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.2654 0.6680 ]; }; transition = 15; };
"TV Play 3" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.4995 0.4697 ]; }; transition = 15; };
"TV Play 4" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.2293 0.0945 ]; }; transition = 15; };
"Play Top L" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.6187 0.3687 ]; }; transition = 15; };
"Play Top R" = { state = "ON"; brightness = 254; hue = 49460; sat = 242; color = { xy = [ 0.1611 0.5294 ]; }; transition = 15; };
};
"tv-area2" = {
_aliases = [ "tv2" "tv area 2" "tv area tvรฅ" ];
"TV Play Strip" = { state = "ON"; brightness = 254; hue = 56100; sat = 250; color = { xy = [ 0.3824 0.1600 ]; }; transition = 15; };
"TV Play 1" = { state = "ON"; brightness = 240; hue = 56100; sat = 250; color = { xy = [ 0.1682 0.0410 ]; }; transition = 15; };
"TV Play 2" = { state = "ON"; brightness = 240; hue = 56100; sat = 250; color = { xy = [ 0.1532 0.0475 ]; }; transition = 15; };
"TV Play 3" = { state = "ON"; brightness = 240; hue = 56100; sat = 250; color = { xy = [ 0.2746 0.1320 ]; }; transition = 15; };
"TV Play 4" = { state = "ON"; brightness = 240; hue = 56100; sat = 250; color = { xy = [ 0.4088 0.5170 ]; }; transition = 15; };
"Play Top L" = { state = "ON"; brightness = 254; hue = 56100; sat = 250; color = { xy = [ 0.2255 0.3299 ]; }; transition = 15; };
"Play Top R" = { state = "ON"; brightness = 254; hue = 56100; sat = 250; color = { xy = [ 0.1670 0.3520 ]; }; transition = 15; };
};
"tv-area3" = {
_aliases = [ "tv3" "tv area 3" "tv area tre" ];
"TV Play Strip" = { state = "ON"; brightness = 254; color = { xy = [ 0.7006 0.2993 ]; }; transition = 2; };
"TV Play 1" = { state = "ON"; brightness = 210; color = { xy = [ 0.5530 0.4100 ]; }; transition = 4; };
"TV Play 2" = { state = "ON"; brightness = 254; color = { xy = [ 0.4432 0.5151 ]; }; transition = 6; };
"TV Play 3" = { state = "ON"; brightness = 200; color = { xy = [ 0.1700 0.7000 ]; }; transition = 8; };
"TV Play 4" = { state = "ON"; brightness = 254; color = { xy = [ 0.1700 0.3400 ]; }; transition = 10; };
"Play Top L" = { state = "ON"; brightness = 220; color = { xy = [ 0.1350 0.0400 ]; }; transition = 12; };
"Play Top R" = { state = "ON"; brightness = 254; color = { xy = [ 0.2654 0.1080 ]; }; transition = 14; };
};
};
};
# ๐ฆ โฎ TV โฎ
# ๐ฆsaysโฎ configure TV devices with: room, ip, apps & channel information
tv = {
# ๐ฆ says โฎ Livingroom
shield = {
#privateKeyFile = config.sops.secrets.adb.path;
#publicKey = "QAAAACEJNfsfRV4PQ9Ah87MbTVbMkbXC6CAMDOR+0K6mIpv/4TSzYMkc2qit3Kryc55IVOjwR3fJRjj/uL549gZ7nEemWtcd3AsYQBp0iIEor8nu1L/V6jfsTY6Xe/pl06xoroy6OwZRWuDbZ4wD2xQRRQjfPd+JtYnMAWneM6r1V15uR67w4ITvjk3ckyfgNeLZMUwahMRjC3wSjaU9sAdKNmg8yPd8uHZ+mK6mstxJFAGEpnnm1lE7Z2r0DF6h6MKY1++dwhU+WM5BRDNiBg+D4i6fDW4+Z1I9ENuFnjT17zAxZXch04SNlG3O94BANYP7jmKp60OvtDL6msfphntuIUzMCkndF9De0Kv4lJdQxe1d+wf+AFpmtd/xtrk45YdMV+eWCJf2OkidaHmSj4ffkAobpun0VrkZN2Z1JymmdsvUbyMjAsby3Zun0xr3EocUS8Jy5TcsK/dcpD6CB5dqzlHhsHSAWt2TDwPzZYXgV1xc+q+PqM09OVN1xActJu75UMkg5b84U15hwQvYdwB8UaopMWWk6p064c7gxYSfH7fSxwkW2Jy1CElgJa55Pp4SZG9b/3B+VcNL1WSf6v/lvJqPbrRvBqvS0+e9wcFMNZtQKTX3n5X0wW1/czZPCQX+hmM8Uu1qrtaz4rKViIEGf4YR0/9eUGYQVfuAxAh8ZmsroJlnAAEAAQA= pungkula@desktop";
enable = true;
room = "tv-area";
ip = devices.shield.ip;
apps = {
telenor = "se.telenor.stream/.MainActivity";
tv4 = "se.tv4.tv4playtab/se.tv4.tv4play.ui.mobile.main.BottomNavigationActivity";
};
# ๐ฆ says โฎ EPG scraper/builder (can be overridden per-channel too)
scraper = {
row_xpath = ''//table[@id="channel-schedule"]//tr'';
time_xpath = ".//time";
time_attr = "datetime";
title_xpath = ''.//a[contains(@class, "program-title")]'';
desc_xpath = ".//p";
time_formats = [ "%H:%M" "%H.%M" ];
time_strip_pattern = ''[^\d:\.]'';
default_duration_minutes = 30;
timezone_offset_hours = timezone_offset_hours;
pm_heuristic_after_hour = null;
};
# ๐ฆ says โฎ channels on diz TV!
channels = {
"1" = {
name = "SVT1";
id = 1; # ๐ฆ says โฎ adb channel ID
# ๐ฆ says โฎ OR
# stream_url = "https://url.com/";
# ๐ฆ โฎ commandz to start this channel!
cmd = "open_telenor && wait 5 && start_channel_1";
# ๐ฆ says โฎ automagi generated tv-guide web & EPG
icon = ./themes/icons/tv/1.png;
scrape_url = "https://tv-tabla.se/tabla/svt1/";
# ๐ฆ says โฎ tv-scraper PER-CHANNEL overrides
# scraper = {};
};
"2" = {
id = 2;
name = "SVT2";
cmd = "open_telenor && wait 5 && start_channel_2";
icon = ./themes/icons/tv/2.png;
scrape_url = "https://tv-tabla.se/tabla/svt2/";
};
"3" = {
id = 3;
name = "Kanal 3";
cmd = "open_telenor && wait 5 && start_channel_3";
icon = ./themes/icons/tv/3.png;
scrape_url = "https://tv-tabla.se/tabla/tv3/";
};
"4" = {
id = 4;
name = "TV4";
cmd = "open_telenor && wait 5 && start_channel_4";
icon = ./themes/icons/tv/4.png;
scrape_url = "https://tv-tabla.se/tabla/tv4/";
};
"5" = {
id = 5;
name = "Kanal 5";
cmd = "open_telenor && wait 5 && start_channel_5";
icon = ./themes/icons/tv/5.png;
scrape_url = "https://tv-tabla.se/tabla/kanal_5/";
};
"6" = {
id = 6;
name = "Kanal 6";
cmd = "open_telenor && wait 5 && start_channel_6";
icon = ./themes/icons/tv/6.png;
scrape_url = "https://tv-tabla.se/tabla/tv6/";
};
"7" = {
id = 7;
name = "Sjuan";
cmd = "open_telenor && wait 5 && start_channel_7";
icon = ./themes/icons/tv/7.png;
scrape_url = "https://tv-tabla.se/tabla/sjuan/";
};
"8" = {
id = 8;
name = "TV8";
icon = ./themes/icons/tv/8.png;
scrape_url = "https://tv-tabla.se/tabla/tv8/";
};
"9" = {
id = 9;
name = "Kanal 9";
icon = ./themes/icons/tv/9.png;
scrape_url = "https://tv-tabla.se/tabla/kanal_9/";
};
"10" = {
id = 10;
name = "Kanal 10";
icon = ./themes/icons/tv/10.png;
scrape_url = "https://tv-tabla.se/tabla/tv10/";
};
"11" = {
id = 11;
name = "Kanal 11";
icon = ./themes/icons/tv/11.png;
scrape_url = "https://tv-tabla.se/tabla/tv11/";
};
"12" = {
id = 12;
name = "Kanal 12";
icon = ./themes/icons/tv/12.png;
scrape_url = "https://tv-tabla.se/tabla/tv12/";
};
"13" = {
id = 13;
name = "TV4 Hockey";
icon = ./themes/icons/tv/13.png;
cmd = "open_tv4 && nav_select && nav_left && nav_down && nav_down && nav_down && nav_select && wait 3 && nav_down && nav_down && nav_down && nav_down && nav_down && nav_select";
scrape_url = "https://tv-tabla.se/tabla/tv4_hockey/";
};
"14" = {
id = 14;
name = "TV4 Sport Live 1";
icon = ./themes/icons/tv/14.png;
cmd = "open_tv4 && nav_left && nav_down && nav_down && nav_down && nav_select && wait 3 && nav_down && nav_down && nav_down && nav_down && nav_down && nav_right && nav_right && nav_select";
scrape_url = "https://tv-tabla.se/tabla/tv4_sport_live_1/";
};
"15" = {
id = 15;
name = "TV4 Sport Live 2";
icon = ./themes/icons/tv/15.png;
cmd = "open_tv4 && nav_select && nav_left && nav_down && nav_down && nav_down && nav_select && wait 3 && nav_down && nav_down && nav_down && nav_down && nav_down && nav_down && nav_select";
scrape_url = "https://tv-tabla.se/tabla/tv4_sport_live_2/";
};
"16" = {
id = 16;
name = "TV4 Sport Live 3";
icon = ./themes/icons/tv/16.png;
cmd = "open_tv4 && nav_down && nav_right && nav_right && nav_center";
scrape_url = "https://tv-tabla.se/tabla/tv4_sport_live_3/";
};
"17" = {
id = 17;
name = "TV4 Sport Live 4";
icon = ./themes/icons/tv/17.png;
cmd = "open_tv4 && nav_left && nav_down && nav_down && nav_down && nav_select && wait 3 && nav_down && nav_down && nav_down && nav_down && nav_down && nav_down && nav_right && nav_right && nav_select";
scrape_url = "https://tv-tabla.se/tabla/tv4_sport_live_4/";
};
};
};
};
# ๐ฆ says โฎ DASHBOARD CONFIOGURATION
https.dashboard.urlFile = config.sops.secrets.dashboard.path;
dashboard = {
# ๐ฆ says โฎ home page information cards
statusCards = {
calendar = {
enable = true;
title = "๐ช๐จ๐ณ๐ฌ๐ต๐ซ๐จ๐น";
group = "1";
icon = "fas fa-calendar";
color = "#ff0000";
theme = "glass";
filePath = "${zigduck.stateDir}/calendar.json";
jsonField = "today_date";
format = "{value}";
detailsJsonField = "today_events";
detailsFormat = "{value}";
chart = false;
};
# ๐ฆ says โฎ Monero USD price ticker
xmr = {
enable = true;
title = "๐ฟ๐ด๐น";
group = "tickers";
icon = "fab fa-monero";
color = "#a78bfa";
theme = "colorful";
filePath = "${zigduck.stateDir}/xmr.json";
jsonField = "current_price";
format = "{value}";
detailsJsonField = "7d_change";
detailsFormat = "7d: {value}%";
chart = true;
historyField = "history";
};
# ๐ฆ says โฎ Bitcoin USD price ticker
btc = {
enable = true;
title = "๐ฉ๐ป๐ช";
group = "tickers";
icon = "fab fa-bitcoin";
color = "#ff6600";
filePath = "${zigduck.stateDir}/btc.json";
jsonField = "current_price";
format = "{value}";
detailsJsonField = "7d_change";
detailsFormat = "7d: {value}%";
chart = true;
historyField = "history";
};
# ๐ฆ says โฎ kWh/price chart card
energyPrice = {
enable = true;
title = "๐ท๐น๐ฐ๐ช๐ฌ";
group = "energy";
icon = "fas fa-bolt";
color = "#ffff00";
filePath = "${zigduck.stateDir}/energy_price.json";
jsonField = "current_price";
format = "{value} SEK/kWh";
chart = true;
historyField = "history";
};
# ๐ฆ says โฎ energy usage card
energyUsage = {
enable = true;
title = "USAGE";
group = "energy";
icon = "fas fa-bolt";
color = "#ffff00";
filePath = "${zigduck.stateDir}/energy_usage.json";
jsonField = "monthly_usage";
format = "{value} kWh";
chart = true;
historyField = "history";
};
# ๐ฆ says โฎ show indoor temperature
temperature = {
enable = true;
title = "TEMPERATURE C";
group = "sensors";
icon = "fas fa-thermometer-half";
color = "#e74c3c";
theme = "glass";
filePath = "${zigduck.stateDir}/temperature.json";
jsonField = "temperature";
format = "{value} ยฐC";
detailsFormat = "Temperature in Hallway";
chart = true;
historyField = "history";
};
};
# ๐ฆ says โฎ DASHBOARD PAGES (extra tabs)
pages = {
# ๐ฆsaysโฎ ChatBot (no LLM) - Less thinkin', more doin'!
"4" = {
icon = "fas fa-comments";
title = "chat";
css = css.chat;
# ๐ฆ says โฎ symlink TTS audio to frontend webserver
files = { tts = "${zigduck.stateDir}/tts"; };
code = pages.chat;
};
};
};
};
systemd.tmpfiles.rules = lib.mkIf (lib.elem "zigduck" config.this.host.modules.services) [
"d ${zigduck.stateDir}/.config/yo 0700 zigduck zigduck - -"
"C ${zigduck.stateDir}/.config/yo/clients.json 0600 zigduck zigduck - ${yoClientsJson}"
];
users.users.zigduck = { extraGroups = [ "zigbee2mqtt" ]; };
# ๐ฆ says โฎ hush little duckie don't say a word....
sops = {
secrets = {
api = {
sopsFile = ./../secrets/api.yaml;
owner = "zigduck";
group = "zigduck";
mode = "0440"; # Read-only for owner and group
};
hueBridgeAPI = {
sopsFile = ./../secrets/hueBridgeAPI.yaml;
owner = "zigduck";
group = "zigduck";
mode = "0440"; # Read-only for owner and group
};
hueSyncAPI = {
sopsFile = ./../secrets/hueSyncAPI.yaml;
owner = "zigduck";
group = "zigduck";
mode = "0440"; # Read-only for owner and group
};
mosquitto = { # ๐ฆ says โฎ quack, stupid!
sopsFile = ./../secrets/mosquitto.yaml;
owner = config.this.user.me.name;
group = config.this.user.me.name;
mode = "0444"; # ๐ฆ says โฎ Read-only for owner and group
}; # ๐ฆ says โฎ Z2MQTT encryption key - if changed needs re-pairing devices
z2m_network_key = {
sopsFile = ./../secrets/z2m_network_key.yaml;
owner = "zigbee2mqtt";
group = "zigbee2mqtt";
mode = "0440"; # ๐ฆ says โฎ Read-only for owner and group
};
webserver = { # ๐ฆ says โฎ https required
sopsFile = ./../secrets/webserver.yaml;
owner = config.this.user.me.name;
group = "zigduck";
mode = "0440";
};
dashboard = { # ๐ฆ says โฎ i likez TLS
sopsFile = ./../secrets/dashboard.yaml;
owner = config.this.user.me.name;
group = "zigduck";
mode = "0440";
}; # ๐ฆ says โฎ required for youtube
youtube_api_key = {
sopsFile = ./../secrets/youtube.yaml;
owner = config.this.user.me.name;
group = "zigduck";
mode = "0440";
};
z2m_mosquitto = {
sopsFile = ./../secrets/z2m_mosquitto.yaml;
owner = "zigbee2mqtt";
group = "zigbee2mqtt";
mode = "0440"; # ๐ฆ says โฎ Read-only for owner and group
};
};
# ๐ฆ says โฎ BYEEEEEEEEE
};}I like my flakes tiny & ny modules dynamically loaded,
# dotfiles/flake.nix โฎ https://github.com/quackhack-mcblindy/dotfiles
# ยป โ
QuackHack-McBLindy.com โ
ยซ
{
description = "โ๏ธ๐ฆ โฎ QuackHack-McBLindy's NixOS flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
sops-nix.url = "github:Mic92/sops-nix";
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
ducktrace-python.url = "github:QuackHack-McBlindy/ducktrace-python";
yo.url = "github:QuackHack-McBlindy/yo?ref=dev";
zigduck.url = "github:QuackHack-McBlindy/zigduck?ref=dev";
pokenix.url = "github:QuackHack-McBlindy/pokenix";
magnixify.url = "github:QuackHack-McBlindy/magnixify-gnome-shell-extension";
caddy-duckdns.url = "github:QuackHack-McBlindy/nix-caddy-duckdns";
installer.url = "github:QuackHack-McBlindy/auto-installer-nixos";
#yo.url = "path:/home/pungkula/new/yo";
#zigduck.url = "path:/home/pungkula/zigduck2mqttnix";
#pokenix.url = "path:/home/pungkula/new/pokenix";
#magnixify.url = "path:/home/pungkula/new/magnixify-gnome-shell-extension";
# ๐ฆ โฎ mobile specific inputs
mobile-pkgs.url = "nixpkgs/dfd82985c273aac6eced03625f454b334daae2e8";
mobile-nixos = {
url = "github:nixos/mobile-nixos/efbe2c3c5409c868309ae0770852638e623690b5";
flake = false;
};
};
outputs = inputs @ { self, systems, nixpkgs, mobile-pkgs, mobile-nixos, ... }:
let
lib = import ./lib {
inherit self inputs;
lib = nixpkgs.lib;
};
in lib.makeFlake {
systems = [ "x86_64-linux" "aarch64-linux" ];
overlays = lib.mapOverlays ./overlays { inherit lib self inputs; };
hosts = lib.mapHosts ./hosts;
packages = lib.mapModules ./packages import;
devShells = lib.mapModules ./devShells (path: import path);
specialArgs = { pkgs = system: nixpkgs.legacyPackages.${system}; };
};} # ๐ฆ duck say โฎ flakes all set, with no debating โ next nix file awaiting, ducks be there waitin'View Flake Outputs
git+file:///home/pungkula/dotfiles
โโโโdevShells
โ โโโโaarch64-linux
โ โ โโโโandroid omitted (use '--all-systems' to show)
โ โ โโโโdefault omitted (use '--all-systems' to show)
โ โ โโโโesp32-rs omitted (use '--all-systems' to show)
โ โ โโโโesphome omitted (use '--all-systems' to show)
โ โ โโโโgo omitted (use '--all-systems' to show)
โ โ โโโโjava omitted (use '--all-systems' to show)
โ โ โโโโnode omitted (use '--all-systems' to show)
โ โ โโโโpython312 omitted (use '--all-systems' to show)
โ โ โโโโpython38 omitted (use '--all-systems' to show)
โ โ โโโโrust omitted (use '--all-systems' to show)
โ โ โโโโsimple omitted (use '--all-systems' to show)
โ โโโโx86_64-linux
โ โโโโandroid: development environment 'nix-shell'
โ โโโโdefault: development environment 'nix-shell'
โ โโโโesp32-rs: development environment 'nix-shell'
โ โโโโesphome: development environment 'nix-shell'
โ โโโโgo: development environment 'nix-shell'
โ โโโโjava: development environment 'nix-shell'
โ โโโโnode: development environment 'nix-shell'
โ โโโโpython312: development environment 'nix-shell'
โ โโโโpython38: development environment 'nix-shell'
โ โโโโrust: development environment 'nix-shell'
โ โโโโsimple: development environment 'nix-shell'
โโโโnixosConfigurations
โ โโโโdesktop: NixOS configuration
โ โโโโhomie: NixOS configuration
โ โโโโlaptop: NixOS configuration
โ โโโโnasty: NixOS configuration
โ โโโโpinephone: NixOS configuration
โโโโoverlays
โ โโโโnoisereduce: Nixpkgs overlay
โ โโโโquackhack-mcpkgs: Nixpkgs overlay
โโโโpackages
โโโโaarch64-linux
โ โโโโhealth-rs omitted (use '--all-systems' to show)
โ โโโโkagi omitted (use '--all-systems' to show)
โโโโx86_64-linux
โโโโhealth-rs: package 'health-rs-0.1.0'
โโโโinstaller: package 'nixos-auto-installer-24.05.20240406.ff0dbd9-x86_64-linux.iso'
โโโโkagi: package 'kagi'Build automated, offline USB NixOS installer
$ sudo bash usb-installer \
--user "pungkula" \
--host "laptop" \
--ssid "IfYouDontHaveEthernet" \
--wifipass "CanBeOmitted" \
--publickey "ssh-ed25519 AAAAC3FoRSsHCoNnEcTiOn..."# dd result to flash drive (replace sdX)
$ sudo dd if="$(readlink -f ./result/iso/*.iso)" of=/dev/sdX bs=4M status=progress oflag=syncPlug in flash drive into laptop and boot. Let it work and wait until it powers down. Remove flash drive, boot it up again and deploy configuration from your main machine:
# ๐ฆ๐ First deploy? Get your Yubikey: PIN+Touch unlocks host specific AGE key for sops-nix
$ yo deploy laptopAny builds after first deployment will use local cached binaries for enhanced build time.
The `yo` CLI is a framework designed to execute scripts defined in the `./bin` directory. It provides a unified interface for script execution, centralizes all help commands, and automatically validates parametrs and updates the documentation.
Usage: `yo [arguments]`
The yo CLI supports flexible parameter parsing through two primary mechanisms:
# Named Parameters
$ yo deploy --host pinephone --flake /home/pungkula/dotfiles
# Positional Parameters
$ yo deploy pinephone /home/pungkula/dotfiles
# Scripts can also be executed with natural language text by typing:
$ yo do "is pinephone overheating"
# Natural language voice commands are also supported, say:
"yo bitch reboot the pinephone"
# If the server is not running, it can be manually started with:
$ yo-rsSet default values for your parameters to have them marked [optional] Add `?` to any command to run it in DEBUG mode
| Command Syntax | Aliases | Description | VoiceReady |
|---|---|---|---|
| ๐ฅ๏ธ System Management | |||
| yo deploy --host [--flake] [--user] [--repo] [--port] [--test] [--watchdog] [--watchdog-timer] [--all] | Build and deploy a NixOS configuration to a remote host. Bootstraps, builds locally, activates remotely, and auto-tags the generation. | โ | |
| yo dev [--devShell] [--list] | Start development enviorment with local flake inputs | ๐ | |
| yo dry | Build and deploy a NixOS configuration to a remote host. Bootstraps, builds locally, activates remotely, and auto-tags the generation. | ๐ | |
| yo pkgs [--host] --pkgs [--file] | Add system package to specified hosts nixosConfiguration. | ๐ | |
| yo reboot [--host] | restart | Force reboot and wait for host | โ |
| yo rollback --host [--flake] [--user] | Rollback a host to a previous NixOS generation. Fetches Git tags and reverts system+config to a synced, tagged state. | ๐ | |
| yo services --operation --service --host [--user] [--port] [--!] | Systemd service handler. | โ | |
| yo switch [--flake] [--!] | rb | Rebuild and switch with dry runs as default ('!' to save new system generation) | โ |
| yo watch [--device] --setting [--value] | API controller for ESP32-S3-WATCH-rs. | โ | |
| yo zoom [--action] | Magnify the display enough even a blind duck can see a little.. | โ | |
| โ๏ธ Phone | |||
| yo call --contactName --contactFile | Calls phone number from contact list | โ | |
| yo text --contactName --contactFile | Text message a phone number from contact list | โ | |
| โก Productivity | |||
| yo calculator --expression | calc | Calculate math expressions | โ |
| yo calendar [--operation] [--calenders] | kal | Calendar assistant. Provides easy calendar access. Interactive terminal calendar, or manage the calendar through yo commands or with voice. | โ |
| yo clip2phone --copy | Send clipboard to an iPhone, for quick copy paste | โ | |
| yo fr --find --replace | find and replace in .nix files and subdirs | โ | |
| yo fzf | f | Interactive fzf search for file content with quick edit & jump to line | ๐ |
| yo hitta --search | Locate a persons address with help of Hitta.se | โ | |
| yo img2phone --image | Send images to an iPhone | ๐ | |
| yo pr-release [--confirm] | Creates PR dev > main to release, changelog as description. | ๐ | |
| yo pull [--flake] [--host] | Pull the latest changes from your dotfiles repo. Resets tracked files to origin/main but keeps local extras. | โ | |
| yo pull-request | pr | Copies git diff to clipboard for summarizing | ๐ |
| yo push [--flake] [--repo] [--host] [--generation] | ps | Commit, tag, and push dotfiles and system state to GitHub. Tags based on host + generation, auto-updates README, and preserves history. | ๐ |
| yo release [--confirm] | Bumps project version & commit, tag, and push to Git. | ๐ | |
| yo scp --host [--path] [--username] [--downloadPath] | Move files between hosts interactively | ๐ | |
| yo search --search [--token-file] [--num-results] | Perform web search using Kagi with Quick Answer | โ | |
| yo sum-pr | Copies git diff to clipboard for summarizing | ๐ | |
| yo update-readme [--readmePath] | Updates documentation in README.md with current system state (uses build-time config) | ๐ | |
| ๐ Localization | |||
| yo stores --store_name [--location] [--radius] | store, shop | Finds nearby stores using OpenStreetMap data with fuzzy name matching. Returns results with opening hours. | โ |
| yo travel [--to] [--from] [--type] [--apikeyPath] | Public transportation helper. Fetches current bus, boat, train and air travel schedules. (Sweden) | โ | |
| yo weather [--location] [--day] [--condition] [--locationPath] | weat | Weather Assistant. Ask anything weather related (3 day forecast) | โ |
| ๐ Networking | |||
| yo block --url [--blocklist] | ad | Block URLs using DNS | ๐ |
| yo esp-get | get-esp | Microcontroller control script - enabling full device configuration on the fly with voice commands. | ๐ |
| yo ip-updater [--token1] [--token2] [--token3] | DDNS updater | โ | |
| yo notify-me [--address] [--port] [--dataDir] | Notification server for iOS devices | ๐ | |
| yo shareWiFi [--ssidFile] [--passwordFile] | creates a QR code of guest WiFi and push image to iPhone | โ | |
| yo speed | st | Test internet download speed | โ |
| ๐ง Media Management | |||
| yo call-remote | Used to call the tv remote, for easy localization. | โ | |
| yo hacker-news [--show] [--item] [--user] [--clear] [--number] | hn | Hacker news API controller | ๐ |
| yo news [--apis] [--clear] | API caller and playlist manager for latest Swedish news from SR. | โ | |
| yo transcode [--directory] | trans | Transcode media files | ๐ |
| yo tv [--typ] [--search] [--room] [--season] [--shuffle] | Android TV Controller. Fuzzy search all media types and creates playlist and serves over webserver for casting. | โ | |
| yo tv-guide [--search] [--channel] [--jsonFilePath] | tvg | TV-guide assistant.. | โ |
| yo tv-rs [--type] [--search] [--dir] [--build] | High performance Media Management written in Rust. | ๐ | |
| yo tv-scrape [--dir] | Scrape the web for TV-guide data and save data for frontend. | โ | |
| yo tv-scraper [--epgFilePath] [--jsonFilePath] [--htmlOutPath] [--flake] | tvs | Scrapes web for tv-listing data. Builds EPG and generates HTML. | ๐ |
| yo vlc [--add] [--addDir] [--remove] [--list] [--shuffle] [--clear] [--playlist] | Playlist management for the local machine | ๐ | |
| ๐ File Operations | |||
| yo copy --from --to | cp | Copy a file or directory to a new location | โ |
| yo list [--path] | ls | List directory contents with details | โ |
| yo makedir --path | mkd | Create a new directory with parents if needed | โ |
| yo move --from --to | mv | Move a file or directory to a new location | โ |
| yo nano --file --content | Write content to filepath | โ | |
| yo remove --target | rm, delete | Remove files or directories safely | โ |
| ๐ Security & Encryption | |||
| yo sops --input [--operation] [--value] [--output] [--agePub] | e | Encrypts a file with sops-nix | ๐ |
| yo yubi --operation --input | yk | Encrypts and decrypts files using a Yubikey and AGE | ๐ |
| ๐ฃ๏ธ Voice | |||
| yo do [--input] [--room] | do is a natural language to shell script translator that runs exact and fuzzy pattern matching at runtime with automatic parameter resolution and seamless shell script execution | ๐ | |
| yo say --text [--model] [--blocking] [--path] [--length-scale] | Text to speech with baked in model and full duplex audio streaming | ๐ | |
| ๐ Home Automation | |||
| yo alarm [--hours] [--minutes] [--minuteWord] [--prep] [--list] [--cancel] | wakeup | Set an alarm for a specified time | โ |
| yo bed [--part] [--state] | Bed controller | โ | |
| yo chair [--part] [--state] | Chair controller | โ | |
| yo compare [--device] [--scope] [--metric] [--above] [--below] | Return true/false whether a device's numeric metric (power, battery, temperature, humidity, brightness, signal, lux) is above or below a threshold. | โ | |
| yo countdown --device [--seconds] | Set a (nedrรคkning | countdown) on a Zigbee device (turns off after N seconds). | |
| yo display --path | Creates a HTML image that can be displayed on the chat frontend. | โ | |
| yo findPhone | Helper for locating Phone | โ | |
| yo flash_lights | Flash lights 3 times then restore previous state. | โ | |
| yo house [--device] [--state] [--brightness] [--color] [--temperature] [--scene] [--room] [--blinds] [--all-lights] [--get-state] | High-performance unified CLI for controlling all smart home devices. | โ | |
| yo if --condition --then [--efter] [--plus] [--annars] | Run a command when a condition holds. Condition is any natural-language query that returns true/false. | โ | |
| yo kitchenFan [--state] | Turns kitchen fan on/off | โ | |
| yo leaving | Run when leaving house to set away state | ๐ | |
| yo loop [--action] [--name] | Handle a configured device loop โ repeatedly fires an MQTT topic until the watched device leaves its fingerprint. | โ | |
| yo mqtt2history --field --file | Save an MQTT payload field into a JSON history file for the frontend. | โ | |
| yo notify [--message] [--tag] | Send a desktop notification. | โ | |
| yo ping [--device] | Turns kitchen fan on/off | โ | |
| yo returned | Run when returned home to set home state | ๐ | |
| yo robobot --device [--mode] [--state] [--delay] [--reverse] [--lower] [--upper] [--touch] [--user] [--passwordfile] | Designed to simplify configuring the Zigbee Fingerbot Plus | ๐ | |
| yo scene [--name] | Activate a scene by name. | โ | |
| yo snapshot --action --name | Create or restore a named snapshot of the Zigduck light/device states. | โ | |
| yo state [--device] [--room] [--state] [--reverse] | High-performance unified CLI for controlling all smart home devices. | โ | |
| yo tibber [--mode] [--homeIDFile] [--APIKeyFile] [--filePath] [--user] [--pwfile] | el | Fetches home electricity price data | โ |
| yo timer [--minutes] [--seconds] [--hours] [--list] [--sound] | Set a timer | โ | |
| yo toilet | Flush the toilet | โ | |
| ๐งฉ Miscellaneous | |||
| yo btc [--filePath] [--user] [--pwfile] | Crypto currency BTC price tracker | โ | |
| yo chain --a --b [--c] [--d] | Chain commands with 'samt'. Splits and dispatches each part sequentially. | โ | |
| yo chat --text | No fwendz? Let's chat yo! | โ | |
| yo duckPUCK-ha [--mode] [--team] [--stat] [--count] [--dataDir] | puck-ha | [๐๐ฆ] - Your Personal Hockey Assistant! - Expert commentary and analyzer specialized on Hockey Allsvenskan (SWE). Analyzing games, scraping scoreboards and keeping track of all dates and numbers. | โ |
| yo duckPUCK-shl [--mode] [--team] [--stat] [--count] [--dataDir] | puck, shl | [๐๐ฆ] - Your Personal Hockey Assistant! - Expert commentary and analyzer specialized on Swedish Hockey League (SHL). Analyzing games, scraping scoreboards and keeping track of all dates and numbers. | โ |
| yo hockeyGames [--type] [--days] [--league] [--team] [--home] [--away] [--json] [--dataDir] [--debug] [--check] | hag | Hockey Assistant. Provides Hockey Allsvenskan data and deliver analyzed natural language responses (TTS). | โ |
| yo invokeai --prompt [--host] [--port] [--outputDir] [--width] [--height] [--steps] [--cfgScale] [--seed] [--model] | genimg | AI generated images powered by InvokeAI | โ |
| yo joke [--jokeFile] | Duck says s funny joke. | โ | |
| yo pokemon [--pokemon] [--ball] [--dex] [--iv] [--ev] [--stats] [--level] [--many] [--question] [--ribbon] [--eggMoves] [--move] [--ability] [--shiny] [--ha] [--em] [--ribbons] [--listMissing] [--shinyLeft] [--speak] | Search user defined Pokรฉmon using PokรฉNix. | โ | |
| yo post [--postalCodeFile] [--postalCode] | Check for the next postal delivery day. (Sweden) | โ | |
| yo qr --input [--icon] [--output] | Create fun randomized QR codes from input. | ๐ | |
| yo reminder [--about] [--list] [--clear] [--user] [--pwfile] | remind | Reminder Assistant | โ |
| yo shop-list [--operation] [--item] [--list] [--mqttUser] [--mqttPWFile] | Shopping list management | โ | |
| yo suno --prompt [--genre] | mg | AI generated lyrics and music files powered by Suno | โ |
| yo time | Tells time, day, date & week | โ | |
| yo until [--condition] [--body] [--every] [--max_minutes] | Repeat a command until a condition becomes true. | โ | |
| yo wait [--duration] | Sleep before continue. | โ | |
| yo while --condition --body [--every] [--max_minutes] | Repeat a command while a condition holds. | โ | |
| yo xmr [--filePath] [--user] [--pwfile] | Crypto currency XMR price tracker | โ | |
| yo yo --phrase | Say after me | โ | |
| ๐งน Maintenance | |||
| yo clean | gc | Run a total garbage collection: Removes old NixOS generations, empty trash, flush tmp files, whipes cache and runs a docker prune | ๐ |
| yo duckTrace [--script] [--host] [--errors] [--monitor] | log | View duckTrace logs quick and quack, unified logging system | โ |
| yo health | hc | Check system health report for tihs host & ESP32 devices. Returns JSON structured response and forwards to zigduck. | โ |
For specific command help: `yo --help` `yo -h`
Nix Talk? Or just say tiny flake sucks?
That's cool!
I am all ears. ๐
Note
Im not blind.
I just can't see. ๐งโ๐ฆฏ
๐ฆ๐งโ๐ฆฏ says โฎ Hi! I'm QuackHack-McBlindy!
๐ฆ๐งโ๐ฆฏ says โฎ Like my work?
Buy me a coffee, or become a sponsor.
Thanks for supporting open source/hungry developersโฅ๏ธ ๐ฆ!
I'll stop qwackin' here, qwack..

