Merge remote-tracking branch 'prism/master'
This commit is contained in:
commit
4e72a6b726
1
0tests/data/secrets/hass/citadel-bot.json
Normal file
1
0tests/data/secrets/hass/citadel-bot.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
0
0tests/data/secrets/hass/voicerss.apikey
Normal file
0
0tests/data/secrets/hass/voicerss.apikey
Normal file
|
@ -5,14 +5,14 @@ in {
|
|||
imports = [
|
||||
<stockholm/makefu>
|
||||
./hardware-config.nix
|
||||
{ environment.systemPackages = with pkgs;[ rsync screen curl git tmux picocom mosh ];}
|
||||
# <stockholm/makefu/2configs/tools/core.nix>
|
||||
{ environment.systemPackages = with pkgs;[ rsync screen curl git ];}
|
||||
<stockholm/makefu/2configs/binary-cache/nixos.nix>
|
||||
#<stockholm/makefu/2configs/support-nixos.nix>
|
||||
<stockholm/makefu/2configs/homeautomation/default.nix>
|
||||
<stockholm/makefu/2configs/homeautomation/google-muell.nix>
|
||||
# configure your hw:
|
||||
# <stockholm/makefu/2configs/save-diskspace.nix>
|
||||
# configure your hw:
|
||||
# <stockholm/makefu/2configs/save-diskspace.nix>
|
||||
];
|
||||
krebs = {
|
||||
enable = true;
|
||||
|
@ -24,5 +24,4 @@ in {
|
|||
documentation.man.enable = false;
|
||||
services.nixosManual.enable = false;
|
||||
sound.enable = false;
|
||||
|
||||
}
|
||||
|
|
|
@ -48,7 +48,6 @@ in {
|
|||
hardware.cpu.amd.updateMicrocode = true;
|
||||
|
||||
zramSwap.enable = true;
|
||||
zramSwap.numDevices = 2;
|
||||
|
||||
makefu.snapraid = let
|
||||
toMedia = name: "/media/" + name;
|
||||
|
|
25
1systems/firecracker/config.nix
Normal file
25
1systems/firecracker/config.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
let
|
||||
primaryInterface = "eth0";
|
||||
in {
|
||||
imports = [
|
||||
<stockholm/makefu>
|
||||
./hardware-config.nix
|
||||
# <stockholm/makefu/2configs/tools/core.nix>
|
||||
{ environment.systemPackages = with pkgs;[ rsync screen curl git ];}
|
||||
<stockholm/makefu/2configs/binary-cache/nixos.nix>
|
||||
#<stockholm/makefu/2configs/support-nixos.nix>
|
||||
# configure your hw:
|
||||
# <stockholm/makefu/2configs/save-diskspace.nix>
|
||||
];
|
||||
krebs = {
|
||||
enable = true;
|
||||
tinc.retiolum.enable = true;
|
||||
build.host = config.krebs.hosts.firecracker;
|
||||
};
|
||||
networking.firewall.trustedInterfaces = [ primaryInterface ];
|
||||
documentation.info.enable = false;
|
||||
documentation.man.enable = false;
|
||||
services.nixosManual.enable = false;
|
||||
sound.enable = false;
|
||||
}
|
30
1systems/firecracker/hardware-config.nix
Normal file
30
1systems/firecracker/hardware-config.nix
Normal file
|
@ -0,0 +1,30 @@
|
|||
{ pkgs, lib, ... }:
|
||||
{
|
||||
boot.kernelParams = lib.mkForce ["console=ttyS2,1500000n8" "earlycon=uart8250,mmio32,0xff1a0000" "earlyprintk"];
|
||||
boot.loader.grub.enable = false;
|
||||
boot.loader.generic-extlinux-compatible.enable = true;
|
||||
boot.loader.generic-extlinux-compatible.configurationLimit = 1;
|
||||
boot.loader.generationsDir.enable = lib.mkDefault false;
|
||||
boot.supportedFilesystems = lib.mkForce [ "vfat" ];
|
||||
|
||||
boot.tmpOnTmpfs = lib.mkForce false;
|
||||
boot.cleanTmpDir = true;
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
## wifi not working, will be fixed with https://github.com/NixOS/nixpkgs/pull/53747
|
||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
networking.wireless.enable = true;
|
||||
# File systems configuration for using the installer's partition layout
|
||||
swapDevices = [ { device = "/var/swap"; size = 4096; } ];
|
||||
fileSystems = {
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-label/NIXOS_BOOT";
|
||||
fsType = "vfat";
|
||||
};
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/NIXOS_SD";
|
||||
fsType = "ext4";
|
||||
};
|
||||
};
|
||||
|
||||
}
|
4
1systems/firecracker/source.nix
Normal file
4
1systems/firecracker/source.nix
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
name="cake";
|
||||
full = true;
|
||||
}
|
|
@ -97,6 +97,24 @@ in {
|
|||
# sharing
|
||||
<stockholm/makefu/2configs/share/gum.nix>
|
||||
<stockholm/makefu/2configs/torrent.nix>
|
||||
{ services.sickbeard = {
|
||||
enable = true;
|
||||
package = pkgs.sickgear;
|
||||
user = "sickbeard";
|
||||
group = "download";
|
||||
port = 8280;
|
||||
};
|
||||
services.nginx.virtualHosts."sick.makefu.r" = {
|
||||
locations."/".proxyPass = http://localhost:8280;
|
||||
extraConfig = ''
|
||||
if ( $server_addr = "${external-ip}" ) {
|
||||
return 403;
|
||||
}
|
||||
'';
|
||||
};
|
||||
users.users.sickbeard.extraGroups = [ "nginx" ];
|
||||
}
|
||||
{ nixpkgs.config.allowUnfree = true; }
|
||||
#<stockholm/makefu/2configs/retroshare.nix>
|
||||
## <stockholm/makefu/2configs/ipfs.nix>
|
||||
#<stockholm/makefu/2configs/syncthing.nix>
|
||||
|
@ -111,6 +129,7 @@ in {
|
|||
<stockholm/makefu/2configs/iodined.nix>
|
||||
<stockholm/makefu/2configs/bitlbee.nix>
|
||||
<stockholm/makefu/2configs/wireguard/server.nix>
|
||||
<stockholm/makefu/2configs/wireguard/wiregrill.nix>
|
||||
|
||||
# Removed until move: no extra mails
|
||||
<stockholm/makefu/2configs/urlwatch>
|
||||
|
@ -153,11 +172,17 @@ in {
|
|||
|
||||
makefu.dl-dir = "/var/download";
|
||||
|
||||
services.openssh.hostKeys = [
|
||||
services.openssh.hostKeys = lib.mkForce [
|
||||
{ bits = 4096; path = (toString <secrets/ssh_host_rsa_key>); type = "rsa"; }
|
||||
{ path = (toString <secrets/ssh_host_ed25519_key>); type = "ed25519"; } ];
|
||||
###### stable
|
||||
services.nginx.virtualHosts.cgit.serverAliases = [ "cgit.euer.krebsco.de" ];
|
||||
|
||||
services.nginx.virtualHosts."cgit.euer.krebsco.de" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/".proxyPass = "http://cgit.gum.r";
|
||||
};
|
||||
|
||||
krebs.build.host = config.krebs.hosts.gum;
|
||||
|
||||
# Network
|
||||
|
|
|
@ -41,7 +41,7 @@ in {
|
|||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.version = 2;
|
||||
boot.loader.grub.devices = [ main-disk ];
|
||||
boot.initrd.kernelModules = [ "dm-raid" "dm_cache" ];
|
||||
boot.initrd.kernelModules = [ "dm-raid" "dm_cache" "dm-thin-pool" ];
|
||||
boot.initrd.availableKernelModules = [
|
||||
"ata_piix" "vmw_pvscsi" "virtio_pci" "sd_mod" "ahci"
|
||||
"xhci_pci" "ehci_pci" "ahci" "sd_mod"
|
||||
|
@ -67,7 +67,7 @@ in {
|
|||
fileSystems."/var/www/binaergewitter" = {
|
||||
device = "/dev/nixos/binaergewitter";
|
||||
fsType = "ext4";
|
||||
options = [ "nofail" "x-systemd.automount" "x-systemd.device-timeout=5s" "x-systemd.mount-timeout=5s" ];
|
||||
options = [ "nofail" ];
|
||||
};
|
||||
fileSystems."/var/lib/borgbackup" = {
|
||||
device = "/dev/nixos/backup";
|
||||
|
|
40
1systems/sdcard/config.nix
Normal file
40
1systems/sdcard/config.nix
Normal file
|
@ -0,0 +1,40 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
kernel = pkgs.callPackage ./kernel.nix {
|
||||
kernelPatches = with pkgs.kernelPatches; [
|
||||
# kernelPatches.bridge_stp_helper
|
||||
# kernelPatches.modinst_arg_list_too_long
|
||||
];
|
||||
};
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
<nixpkgs/nixos/modules/installer/cd-dvd/sd-image-aarch64.nix>
|
||||
# <stockholm/makefu/2configs/minimal.nix>
|
||||
];
|
||||
# TODO: NIX_PATH and nix.nixPath are being set by default.nix right now
|
||||
# cd ~/stockholm ; nix build config.system.build.sdImage -I nixos-config=makefu/1systems/sdcard/config.nix -f /home/makefu/nixpkgs/nixos
|
||||
|
||||
boot.kernelParams = ["console=ttyS2,1500000" "earlycon=uart8250,mmio32,0xff1a0000"];
|
||||
# boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||
boot.kernelPackages = pkgs.linuxPackagesFor kernel;
|
||||
boot.supportedFilesystems = lib.mkForce [ "vfat" "f2fs" "xfs" "ntfs" "cifs" ];
|
||||
|
||||
# krebs.hidden-ssh.enable = true;
|
||||
environment.systemPackages = with pkgs; [
|
||||
aria2
|
||||
ddrescue
|
||||
];
|
||||
environment.extraInit = ''
|
||||
EDITOR=vim
|
||||
'';
|
||||
# iso-specific
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
hostKeys = [
|
||||
{ bits = 8192; type = "ed25519"; path = "/etc/ssh/ssh_host_ed25519_key"; }
|
||||
];
|
||||
};
|
||||
# enable ssh in the iso boot process
|
||||
systemd.services.sshd.wantedBy = lib.mkForce [ "multi-user.target" ];
|
||||
}
|
15
1systems/sdcard/kernel.nix
Normal file
15
1systems/sdcard/kernel.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ fetchFromGitLab, buildLinux, ... } @ args:
|
||||
buildLinux (args // rec {
|
||||
version = "4.4.55";
|
||||
modDirVersion = "4.4.55";
|
||||
extraMeta.branch = "4.4";
|
||||
defconfig = "firefly_linux_defconfig";
|
||||
|
||||
src = fetchFromGitLab {
|
||||
owner = "TeeFirefly";
|
||||
repo = "linux-kernel";
|
||||
rev = "firefly_0821_release";
|
||||
sha256 = "1fwj9cm5ysz286znrr3fyrhfn903m84i7py4rv3y3h9avxb3zl1r";
|
||||
};
|
||||
extraMeta.platforms = [ "aarch64-linux" ];
|
||||
} // (args.argsOverride or {}))
|
3
1systems/sdcard/source.nix
Normal file
3
1systems/sdcard/source.nix
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
name="iso";
|
||||
}
|
|
@ -16,15 +16,16 @@ in {
|
|||
<stockholm/makefu/2configs/tools/core-gui.nix>
|
||||
<stockholm/makefu/2configs/tools/extra-gui.nix>
|
||||
<stockholm/makefu/2configs/tools/media.nix>
|
||||
<stockholm/makefu/2configs/virtualisation/libvirt.nix>
|
||||
# <stockholm/makefu/2configs/virtualisation/libvirt.nix>
|
||||
# <stockholm/makefu/2configs/virtualisation/virtualbox.nix>
|
||||
<stockholm/makefu/2configs/tinc/retiolum.nix>
|
||||
<stockholm/makefu/2configs/mqtt.nix>
|
||||
<stockholm/makefu/2configs/gui/wbob-kiosk.nix>
|
||||
|
||||
# <stockholm/makefu/2configs/gui/studio-virtual.nix>
|
||||
# <stockholm/makefu/2configs/audio/jack-on-pulse.nix>
|
||||
# <stockholm/makefu/2configs/audio/realtime-audio.nix>
|
||||
# <stockholm/makefu/2configs/vncserver.nix>
|
||||
<stockholm/makefu/2configs/logging/server.nix>
|
||||
|
||||
# Services
|
||||
# <stockholm/makefu/2configs/hydra/stockholm.nix>
|
||||
|
@ -33,7 +34,7 @@ in {
|
|||
<stockholm/makefu/2configs/bluetooth-mpd.nix>
|
||||
|
||||
# Sensors
|
||||
<stockholm/makefu/2configs/stats/client.nix>
|
||||
# <stockholm/makefu/2configs/stats/client.nix>
|
||||
<stockholm/makefu/2configs/stats/collectd-client.nix>
|
||||
<stockholm/makefu/2configs/stats/telegraf>
|
||||
<stockholm/makefu/2configs/stats/telegraf/airsensor.nix>
|
||||
|
@ -44,16 +45,10 @@ in {
|
|||
# <stockholm/makefu/2configs/stats/telegraf/bamstats.nix>
|
||||
{ environment.systemPackages = [ pkgs.vlc ]; }
|
||||
|
||||
{
|
||||
# Risikoübernahme
|
||||
nixpkgs.config.permittedInsecurePackages = [
|
||||
"homeassistant-0.77.2"
|
||||
];
|
||||
}
|
||||
<stockholm/makefu/2configs/bureautomation>
|
||||
<stockholm/makefu/2configs/bureautomation> # new hass entry point
|
||||
<stockholm/makefu/2configs/bureautomation/led-fader.nix>
|
||||
<stockholm/makefu/2configs/bureautomation/mpd.nix>
|
||||
<stockholm/makefu/2configs/bureautomation/hass.nix>
|
||||
# <stockholm/makefu/2configs/bureautomation/mpd.nix> #mpd is only used for TTS
|
||||
<stockholm/makefu/2configs/mqtt.nix>
|
||||
(let
|
||||
collectd-port = 25826;
|
||||
influx-port = 8086;
|
||||
|
@ -85,6 +80,7 @@ in {
|
|||
'';
|
||||
})
|
||||
|
||||
<stockholm/makefu/2configs/backup/state.nix>
|
||||
# temporary
|
||||
# <stockholm/makefu/2configs/temp/rst-issue.nix>
|
||||
];
|
||||
|
@ -106,6 +102,7 @@ in {
|
|||
|
||||
LoadPlugin curl
|
||||
<Plugin curl>
|
||||
Interval 300
|
||||
TotalTime true
|
||||
NamelookupTime true
|
||||
ConnectTime true
|
||||
|
|
15
2configs/Reaktor/bgt.nix
Normal file
15
2configs/Reaktor/bgt.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
krebs.Reaktor.reaktor-bgt = {
|
||||
nickname = "Reaktor|bgt";
|
||||
workdir = "/var/lib/Reaktor/bgt";
|
||||
channels = [ "#binaergewitter" ];
|
||||
plugins = with pkgs.ReaktorPlugins;
|
||||
[ titlebot
|
||||
# stockholm-issue
|
||||
nixos-version
|
||||
# shack-correct
|
||||
# sed-plugin
|
||||
random-emoji ];
|
||||
};
|
||||
}
|
|
@ -1,154 +0,0 @@
|
|||
[
|
||||
{ alias = "start Felix 10h";
|
||||
trigger = {
|
||||
platform = "state";
|
||||
entity_id = [ "device_tracker.felix_phone" "device_tracker.felix_laptop" ];
|
||||
from = "not_home";
|
||||
to = "home";
|
||||
};
|
||||
condition = {
|
||||
condition = "and";
|
||||
conditions = [
|
||||
{
|
||||
condition = "state";
|
||||
entity_id = "timer.felix_10h";
|
||||
state = "idle";
|
||||
}
|
||||
{
|
||||
condition = "time";
|
||||
after = "06:00:00";
|
||||
before = "12:00:00";
|
||||
}
|
||||
];
|
||||
};
|
||||
action = [
|
||||
{ service = "timer.start";
|
||||
entity_id = [ "timer.felix_10h" "timer.felix_8_30h" "timer.felix_7h" ] ;
|
||||
}
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.buzz_red_led_fast"
|
||||
"script.blitz_10s"
|
||||
];
|
||||
}
|
||||
{ service = "light.turn_on";
|
||||
data = {
|
||||
effect = "2";
|
||||
entity_id = [ "light.status_felix" ];
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
{ alias = "Disable Felix timer at button press";
|
||||
trigger = {
|
||||
platform = "state";
|
||||
entity_id = "binary_sensor.redbutton";
|
||||
to = "on";
|
||||
};
|
||||
condition = {
|
||||
condition = "and";
|
||||
conditions = [
|
||||
{
|
||||
condition = "state";
|
||||
entity_id = "timer.felix_10h";
|
||||
state = "active";
|
||||
}
|
||||
{
|
||||
condition = "time";
|
||||
after = "12:00:00";
|
||||
before = "22:00:00";
|
||||
}
|
||||
];
|
||||
};
|
||||
action =
|
||||
[
|
||||
{
|
||||
service = "timer.cancel";
|
||||
entity_id = [ "timer.felix_10h" "timer.felix_8_30h" "timer.felix_7h" ];
|
||||
}
|
||||
{
|
||||
service = "homeassistant.turn_on";
|
||||
entity_id = [ "script.buzz_red_led_fast" ];
|
||||
}
|
||||
{
|
||||
service = "homeassistant.turn_off";
|
||||
entity_id = [ "light.status_felix" ];
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
{
|
||||
alias = "Genug gearbeitet Felix";
|
||||
trigger =
|
||||
{
|
||||
platform = "event";
|
||||
event_type = "timer.finished";
|
||||
event_data.entity_id = "timer.felix_7h";
|
||||
};
|
||||
action =
|
||||
[
|
||||
{ service = "light.turn_on";
|
||||
data = {
|
||||
rgb_color= [0 255 0];
|
||||
# effect = "0";
|
||||
entity_id = [ "light.status_felix" ];
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
{
|
||||
alias = "nun aber nach hause";
|
||||
trigger =
|
||||
{
|
||||
platform = "event";
|
||||
event_type = "timer.finished";
|
||||
event_data.entity_id = "timer.felix_8_30h";
|
||||
};
|
||||
action =
|
||||
[
|
||||
{ service = "light.turn_on";
|
||||
data = {
|
||||
rgb_color= [255 255 0];
|
||||
# effect = "0";
|
||||
entity_id = [ "light.status_felix" ];
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
{
|
||||
alias = "Zu lange Felix!";
|
||||
trigger =
|
||||
{
|
||||
platform = "event";
|
||||
event_type = "timer.finished";
|
||||
event_data.entity_id = "timer.felix_10h";
|
||||
};
|
||||
action =
|
||||
[
|
||||
{
|
||||
service = "notify.telegrambot";
|
||||
data = {
|
||||
title = "Zu lange Felix!";
|
||||
message = "Du bist schon 10 Stunden auf Arbeit, geh jetzt gefälligst nach Hause!";
|
||||
};
|
||||
}
|
||||
{
|
||||
service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.buzz_red_led"
|
||||
"script.blitz_10s"
|
||||
];
|
||||
}
|
||||
{ service = "light.turn_on";
|
||||
data = {
|
||||
rgb_color= [255 0 0];
|
||||
effect = "0";
|
||||
entity_id = [ "light.status_felix" ];
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
|
@ -23,19 +23,11 @@
|
|||
item.partymode = "music";
|
||||
};
|
||||
}
|
||||
{
|
||||
service = "tts.google_say";
|
||||
entity_id = "media_player.kodi";
|
||||
data = {
|
||||
message = "Willkommen in deinem Lieblingsbüro";
|
||||
language = "de";
|
||||
};
|
||||
}
|
||||
{
|
||||
service = "notify.telegrambot";
|
||||
data = {
|
||||
title = "Bureau Startup";
|
||||
message = "Willkommen {{ trigger.platform }}";
|
||||
message = "Das Büro wurde eröffnet";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
|
74
2configs/bureautomation/automation/schlechteluft.nix
Normal file
74
2configs/bureautomation/automation/schlechteluft.nix
Normal file
|
@ -0,0 +1,74 @@
|
|||
let
|
||||
long_threshold = 30;
|
||||
in [
|
||||
{
|
||||
alias = "Bad Air Alarm 60 seconds";
|
||||
trigger =
|
||||
{ platform = "numeric_state";
|
||||
entity_id = "sensor.air_quality";
|
||||
above = 1523;
|
||||
for.seconds = 60;
|
||||
};
|
||||
condition = {
|
||||
condition = "and";
|
||||
conditions = [
|
||||
{ condition = "state";
|
||||
entity_id = "group.team";
|
||||
state = "home";
|
||||
}
|
||||
{ condition = "time";
|
||||
after = "06:00:00";
|
||||
before = "20:00:00";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
action = [
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.schlechteluft"
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
alias = "Bad Air Alarm ${toString long_threshold} Minutes";
|
||||
trigger =
|
||||
{ platform = "numeric_state";
|
||||
entity_id = "sensor.air_quality";
|
||||
above = 1523;
|
||||
for.minutes = long_threshold;
|
||||
};
|
||||
condition = {
|
||||
condition = "and";
|
||||
conditions = [
|
||||
{ condition = "state";
|
||||
entity_id = "group.team";
|
||||
state = "home";
|
||||
}
|
||||
{ condition = "time";
|
||||
after = "06:00:00";
|
||||
before = "20:00:00";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
action = [
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.schlechteluft"
|
||||
];
|
||||
}
|
||||
{ service = "tts.google_say";
|
||||
entity_id = "media_player.mpd";
|
||||
data_template = {
|
||||
message = "BEEP BEEP - Die luft ist schon ${toString long_threshold} Minuten schlecht! Student Nummer {{ range(1,500) | random }}, öffne ein Fenster.";
|
||||
language = "de";
|
||||
};
|
||||
}
|
||||
{ service = "notify.matrix_notify";
|
||||
data_template.message = "Schlechte Luft Alarm seit ${toString long_threshold} Minuten ({{states.sensor.air_quality.state_with_unit}})!";
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
194
2configs/bureautomation/combination/10h_timers.nix
Normal file
194
2configs/bureautomation/combination/10h_timers.nix
Normal file
|
@ -0,0 +1,194 @@
|
|||
{lib, ... }:
|
||||
let
|
||||
persons = [ "frank" "daniel" "thorsten" "carsten" "thierry" "ecki" "felix"
|
||||
"anthony" # antony
|
||||
"thierry" # tjeri
|
||||
];
|
||||
random_zu_lange = name: ''{{ [
|
||||
"Du musst jetzt endlich nach Hause gehen ${name}!",
|
||||
"${name} - 10 Stunden sind rum, bald schenkst du den Franzosen deine Lebenszeit",
|
||||
"Nur eine Minute über 10 Stunden kann zu einer Stunde Arbeit für Thorsten werden, ${name}.",
|
||||
"In 10 Minuten kommt dich der Security Mann holen, ${name}",
|
||||
"Das Sandmännchen ist schon vorbei, gleich fallen dir die Augen zu ${name}.",
|
||||
"Wenn ${name} sofort los geht, dann ist er noch rechtzeitig für den Tatort zu Hause.",
|
||||
"${name} muss jetzt gehen, sonst verpasst er die Tagesschau!",
|
||||
"Es ist spät ${name}. Ausstempeln hilft zwar kurzfristig, kann aber zu langfristigen Problemen führen.",
|
||||
"${name}, wenn du nach zehn Stunden nach Hause gehst, muss dir dein Vorgesetzter ein Taxi bestellen",
|
||||
"${name}, wenn du nach zehn Stunden nach Hause gehst, bist du auf dem Rückweg nicht mehr versichert!",
|
||||
"Zu lange, ${name}!" ] | random }}'' ;
|
||||
|
||||
|
||||
random_announce = name: ''{{ [
|
||||
"${name} is in da House",
|
||||
"Ahoi ${name}",
|
||||
"Moinsen ${name}",
|
||||
"Moin Moin ${name}",
|
||||
"Palim, Palim ${name}",
|
||||
"Vorwärts Genosse ${name}",
|
||||
"Gemeinsame Grüße, Genosse ${name}",
|
||||
"Sozialistische Grüße, Genosse ${name}",
|
||||
"Konzentrierte Grüße, Genosse ${name}",
|
||||
"Ach, der ${name} ist auch wieder da...",
|
||||
"Nicht ${name} schon wieder",
|
||||
"Tri tra tralala, der ${name} ist wieder da.",
|
||||
"Na sieh mal einer an, ${name} hat es auch her geschafft",
|
||||
"Wer ist im Büro eingetroffen? ${name} ist es!",
|
||||
"Willkommen in deinem Lieblingsbüro, ${name}.",
|
||||
"Klopf, Klopf, wer ist da? ${name} ist da!",
|
||||
"Messer, Gabel, Schere, Licht sind für kleinen ${name} nicht.",
|
||||
"Ich kenne ein Geheimnis, ${name} ist angekommen",
|
||||
"Wir sind ${name}. Sie werden assimiliert werden",
|
||||
"Achtung, es erfolgt eine Durchsage. ${name} ist eingetroffen",
|
||||
"Die Scanner haben eine dem System bekannte Lebensform mit dem Namen ${name} detektiert",
|
||||
"Das Büro sieht dich, ${name}",
|
||||
"Das Büro riecht dich, ${name}",
|
||||
"Im Kalender von ${name} sind heute acht Meetings eingeplant, von denen zwei bereits verpasst wurden",
|
||||
"Das Postfach von ${name} beinhaltet einhundertachtundzwanzig ungelesene E-Mails.",
|
||||
"Nachricht von Serge: ${name}, bitte melden Sie sich Umgehend bei mir im Büro!",
|
||||
"Luftqualität hat sich durch das Eintreffen von ${name} um zweihunder Punkte verschlechtert, bitte alle Fenster öffnen.",
|
||||
"Die Tür geht auf, wer mag das sein? Schon schreitet hier der ${name} ein. Das Volk, es jubelt, Dirnen schmachten. Fürs Festmahl beginnt man schon zu schlachten. Er wird nur nach dem besten streben! Der ${name}, er soll lange leben!",
|
||||
"${name} arbeitet gern für seinen Konzern",
|
||||
"${name} ist nur froh im Großraumbüro",
|
||||
"Für ${name} ist die schönste Zeit ... die Arbeit",
|
||||
"Ein Fleißbienchen für ${name} zum rechtzeitigen Erscheinen im Büro",
|
||||
"${name} ist heute wohl doch nicht im Office Home",
|
||||
"${name} ist bereit für einen Tag voller Meetings",
|
||||
"Und es startet für ${name} wieder ein Tag im Paradies",
|
||||
"Lieber ${name}, Markus Keck hat dich bereits drei mal Versucht anzurufen!",
|
||||
"Trotz schwerer Männergrippe ist ${name} heute im Büro erschienen.",
|
||||
"${name} kenne keine Parteien mehr, ${name} kenne nur noch Arbeitsplätze",
|
||||
"${name}, Frage nicht, was dein Arbeitsplatz für dich tun kann. Frage, was du für deinen Arbeitsplatz tun kannst",
|
||||
"${name} läuft bis in den Jemen - für sein Unternehmen. ${name} schwimmt bis nach Birma - für meine Firma",
|
||||
"Der Cyberian ${name} ist gekommen um die Bahnwelt vor Cyber-Angriffen zu schützen",
|
||||
"Alles paletto im Ghetto, ${name}?",
|
||||
"Hach, ${name}, wenn du hier rein kommst fühlt es sich gleich wieder an wie Montag.",
|
||||
"Oh nein, nicht schon wieder ${name}",
|
||||
"Wer wohnt in der Ananas ganz tief im Meer? ${name} Schwammkopf!",
|
||||
"Arbeit ist Freizeit! Wachstum ist Fortschritt! Sicherheit ist Freiheit! Eine kleine Erinnerung für ${name}"] | random }}'' ;
|
||||
tmr_10h = name: {
|
||||
"${name}_10h" = {
|
||||
name = "${name} 10h Timer";
|
||||
duration = "10:00:00";
|
||||
};
|
||||
};
|
||||
|
||||
zu_lange_user = name:
|
||||
{ "zu_lange_${name}" = {
|
||||
alias = "Random Zu Lange ${name}";
|
||||
|
||||
sequence = [
|
||||
{ service = "media_player.play_media";
|
||||
data = {
|
||||
entity_id = "media_player.mpd";
|
||||
media_content_type = "playlist";
|
||||
media_content_id = "ansage";
|
||||
};
|
||||
}
|
||||
{ delay.seconds = 5; }
|
||||
{ service = "tts.google_say";
|
||||
entity_id = "media_player.mpd";
|
||||
data_template = {
|
||||
message = random_zu_lange name;
|
||||
language = "de";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
announce_user = name:
|
||||
{ "announce_${name}" = {
|
||||
alias = "Random Announce ${name}";
|
||||
sequence = [
|
||||
{ delay.seconds = 7; }
|
||||
{ service = "media_player.play_media";
|
||||
data = {
|
||||
entity_id = "media_player.mpd";
|
||||
media_content_type = "playlist";
|
||||
media_content_id = "ansage";
|
||||
};
|
||||
}
|
||||
{ delay.seconds = 4; }
|
||||
{ service = "tts.google_say";
|
||||
entity_id = "media_player.mpd";
|
||||
data_template = {
|
||||
message = random_announce name;
|
||||
language = "de";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
automation_10h = name: [
|
||||
{ alias = "start ${name} 10h";
|
||||
trigger = {
|
||||
platform = "state";
|
||||
# TODO: ecki
|
||||
entity_id = [ "device_tracker.${name}_phone"];
|
||||
from = "not_home";
|
||||
to = "home";
|
||||
};
|
||||
condition = {
|
||||
condition = "and";
|
||||
conditions = [
|
||||
{
|
||||
condition = "state";
|
||||
entity_id = "timer.${name}_10h";
|
||||
state = "idle";
|
||||
}
|
||||
{
|
||||
condition = "time";
|
||||
after = "06:00:00";
|
||||
before = "12:00:00";
|
||||
}
|
||||
];
|
||||
};
|
||||
action = [
|
||||
{ service = "timer.start";
|
||||
entity_id = [ "timer.${name}_10h" ] ;
|
||||
}
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
# "script.buzz_${name}"
|
||||
"script.blitz_10s"
|
||||
"script.announce_${name}"
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
{ alias = "Zu lange ${name}!";
|
||||
trigger =
|
||||
{
|
||||
platform = "event";
|
||||
event_type = "timer.finished";
|
||||
event_data.entity_id = "timer.${name}_10h";
|
||||
};
|
||||
|
||||
condition =
|
||||
{
|
||||
condition = "state";
|
||||
entity_id = "device_tracker.${name}_phone";
|
||||
state = "home";
|
||||
};
|
||||
|
||||
action =
|
||||
[
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.blitz_10s"
|
||||
"script.zu_lange_${name}"
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
in
|
||||
{
|
||||
timer =lib.fold lib.recursiveUpdate {}
|
||||
(map tmr_10h persons);
|
||||
automation = (lib.flatten (map automation_10h persons));
|
||||
script = lib.fold lib.recursiveUpdate {} (
|
||||
(map (p: announce_user p) persons) ++
|
||||
(map (p: zu_lange_user p) persons)
|
||||
);
|
||||
}
|
3
2configs/bureautomation/combination/README.md
Normal file
3
2configs/bureautomation/combination/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Combination Folder
|
||||
files return a dictionary of different types used in home-assistant instead of
|
||||
a single thing.
|
65
2configs/bureautomation/combination/matrix.nix
Normal file
65
2configs/bureautomation/combination/matrix.nix
Normal file
|
@ -0,0 +1,65 @@
|
|||
{ lib, ... }:
|
||||
#matrix:
|
||||
# password: supersecurepassword
|
||||
# rooms:
|
||||
# - "#hasstest:matrix.org"
|
||||
# commands:
|
||||
# - word: my_command
|
||||
# name: my_command
|
||||
let
|
||||
mom_room = "!kTQjvTQvfVsvfEtmth:thales.citadel.team";
|
||||
in {
|
||||
matrix =
|
||||
{
|
||||
# secrets:
|
||||
# homeserver, username, password
|
||||
homeserver = "https://ext01.citadel.team";
|
||||
rooms = [
|
||||
mom_room
|
||||
];
|
||||
commands = [
|
||||
{
|
||||
# alternative: expression for regexp
|
||||
word = "version";
|
||||
name = "version";
|
||||
}
|
||||
{
|
||||
word = "luftqualität";
|
||||
name = "luftqualitaet";
|
||||
}
|
||||
];
|
||||
} // (builtins.fromJSON (builtins.readFile
|
||||
<secrets/hass/citadel-bot.json>));
|
||||
automation = [
|
||||
{
|
||||
alias = "React to !version";
|
||||
trigger = {
|
||||
platform = "event";
|
||||
event_type = "matrix_command";
|
||||
event_data.command = "version";
|
||||
};
|
||||
action = {
|
||||
service = "notify.matrix_notify";
|
||||
data_template.message = "Running home-assistant {{states.sensor.current_version.state}}";
|
||||
};
|
||||
}
|
||||
{
|
||||
alias = "React to !luftqualität";
|
||||
trigger = {
|
||||
platform = "event";
|
||||
event_type = "matrix_command";
|
||||
event_data.command = "luftqualitaet";
|
||||
};
|
||||
action = {
|
||||
service = "notify.matrix_notify";
|
||||
data_template.message = "Temp: {{states.sensor.easy2_dht22_temperature.state_with_unit}} Hum:{{states.sensor.easy2_dht22_humidity.state_with_unit}} airquality:{{states.sensor.air_quality.state_with_unit}}";
|
||||
};
|
||||
}
|
||||
|
||||
];
|
||||
notify = [{
|
||||
name = "matrix_notify";
|
||||
platform = "matrix";
|
||||
default_room = mom_room;
|
||||
}];
|
||||
}
|
89
2configs/bureautomation/combination/mittagessen.nix
Normal file
89
2configs/bureautomation/combination/mittagessen.nix
Normal file
|
@ -0,0 +1,89 @@
|
|||
{ lib, ... }:
|
||||
let
|
||||
# TODO: remove redundant code (from multi_blink) via lib
|
||||
flash_entity = { entity, delay ? 500, count ? 4, alias ? "${entity}_blink_${toString count}_${toString delay}" }:
|
||||
{
|
||||
inherit alias;
|
||||
sequence = lib.flatten (builtins.genList (i: [
|
||||
{ service = "homeassistant.turn_on";
|
||||
data.entity_id = entity;
|
||||
}
|
||||
{ delay.milliseconds = delay; }
|
||||
{ service = "homeassistant.turn_off";
|
||||
data.entity_id = entity;
|
||||
}
|
||||
{ delay.milliseconds = delay; }
|
||||
]
|
||||
) count);
|
||||
};
|
||||
# TODO: use influxdb and check if pommes
|
||||
random_mittagessen = '' {{ [
|
||||
"Es ist 12 uhr 30. Der Aramark Gourmettempel hat, wie jeden Tag, wieder die feinsten Köstlichkeiten für euch Vorbereitet",
|
||||
"Heute bei Aramark: Rezepte aus Ländern, von denen Ihr noch nie gehört habt, Deutsch zubereitet",
|
||||
"Heute bei Aramark im Angebot: Scheiss mit Reis oder Reste von Freitag",
|
||||
"MHHHH es ist wieder mal so weit, lecker Bayerisch Kraut mit asiatischen Nudeln",
|
||||
"Es ist 12 Uhr 30 und Heute gibt es Pommes - vielleicht",
|
||||
"Heute gibt es Pommes - leider nicht einzeln zu verkaufen, da die Schälchen alle sind",
|
||||
"Heute gibt es Pommes - verarscht! Natürlich gibt es nur salzlosen Reis, oder salzlose Nudeln.",
|
||||
"Heute auf dem Speiseplan: Sushi vom Vortag",
|
||||
"Aramark Kantinenessen: Der Hunger treibt es rein, der Geiz hält es drin.",
|
||||
"Das Essen in der Snackeria sieht heute wie die bessere Alternative aus",
|
||||
"Heute ist wohl wieder ein Beilagen-Tag",
|
||||
"Lunch time! Good luck, you will need it!",
|
||||
"Heute vielleicht lieber doch nur einen Salat?",
|
||||
"Im Büro ist es eh gerade viel zu warm, also ab zur Kantine",
|
||||
"Im Büro ist es eh gerade viel zu kalt, also ab zur Kantine",
|
||||
"Heute scheint die Auswahl wieder sehr schwierig zu sein. Vielleicht doch lieber ein Brötchen mit Fleischkäse vom Bäcker beim Baumarkt?",
|
||||
"Wer hat hier schon wieder ein Meeting auf 12 Uhr gelegt? Skandal!",
|
||||
"Jetzt nur noch kurz die Mail fertig schreiben und schon kann es los gehen.",
|
||||
"Es ist 13 Uhr und die Mittagspause ist bald vorbei .... Kleiner Scherz, es ist erst 12:30, aber Ihr hättet auch nicht wirklich etwas verpasst.",
|
||||
"Hallo, es ist nun 12 Uhr 30! Dies entspricht der Essenszeit aller Büroinsassen. Bitte begebt euch zur Aramark Essensausgabe um euren menschlichen Bedürfnissen nachzukommen."] | random }}'';
|
||||
in {
|
||||
automation = [
|
||||
{ alias = "Mittagessen";
|
||||
trigger = {
|
||||
platform = "time";
|
||||
at = "12:30:00";
|
||||
};
|
||||
action = [
|
||||
{ service = "homeassistant.turn_on";
|
||||
entity_id = [
|
||||
"script.mittagessen_announce"
|
||||
"script.blitz_10s"
|
||||
"script.mittagessenlicht"
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
script = {
|
||||
mittagessenlicht = (flash_entity {
|
||||
entity = "switch.bauarbeiterlampe";
|
||||
alias = "Bauarbeiterlampe Mittagessenlicht";
|
||||
delay = 1000;
|
||||
count = 5;
|
||||
});
|
||||
mittagessen_announce = {
|
||||
alias = "Random Mittagessen announce";
|
||||
sequence = [
|
||||
{
|
||||
service = "media_player.play_media";
|
||||
data = {
|
||||
entity_id = "media_player.mpd";
|
||||
media_content_type = "playlist";
|
||||
media_content_id = "ansage";
|
||||
};
|
||||
}
|
||||
{ delay.seconds = 5; }
|
||||
{
|
||||
service = "tts.google_say";
|
||||
entity_id = "media_player.mpd";
|
||||
data_template = {
|
||||
message = random_mittagessen;
|
||||
language = "de";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,45 +1,251 @@
|
|||
{ pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
port = 3001;
|
||||
runit = pkgs.writeDash "runit" ''
|
||||
set -xeuf
|
||||
PATH=${pkgs.mosquitto}/bin:${pkgs.coreutils}/bin
|
||||
name=''${1?must provide name as first arg}
|
||||
state=''${2?must provide state as second arg}
|
||||
# val=''${3?must provide val as third arg}
|
||||
|
||||
# we ignore non-alerting events
|
||||
test $state = alerting || exit 0
|
||||
|
||||
echo $name - $state
|
||||
topic=plug
|
||||
mosquitto_pub -t /bam/$topic/cmnd/POWER -m ON
|
||||
sleep 5
|
||||
mosquitto_pub -t /bam/$topic/cmnd/POWER -m OFF
|
||||
'';
|
||||
kodi-host = "192.168.8.11";
|
||||
ten_hours = import ./combination/10h_timers.nix { inherit lib; }; # provides: timer automation script
|
||||
mittagessen = import ./combination/mittagessen.nix { inherit lib; }; # provides: automation script
|
||||
matrix = import ./combination/matrix.nix { inherit lib; }; # provides: matrix automation
|
||||
in {
|
||||
imports = [
|
||||
./ota.nix
|
||||
];
|
||||
services.logstash = {
|
||||
package = pkgs.logstash5;
|
||||
networking.firewall.allowedTCPPorts = [ 8123 ];
|
||||
state = [ "/var/lib/hass/known_devices.yaml" ];
|
||||
services.home-assistant = let
|
||||
dwd_pollen = pkgs.fetchFromGitHub {
|
||||
owner = "marcschumacher";
|
||||
repo = "dwd_pollen";
|
||||
rev = "0.1";
|
||||
sha256 = "1af2mx99gv2hk1ad53g21fwkdfdbymqcdl3jvzd1yg7dgxlkhbj1";
|
||||
};
|
||||
in {
|
||||
enable = true;
|
||||
inputConfig = ''
|
||||
http {
|
||||
port => ${toString port}
|
||||
host => "127.0.0.1"
|
||||
}
|
||||
'';
|
||||
filterConfig = ''
|
||||
'';
|
||||
outputConfig = ''
|
||||
stdout { codec => json }
|
||||
exec { command => "${runit} '%{ruleName}' '%{state}'" }
|
||||
'';
|
||||
extraSettings = ''
|
||||
path.plugins: [ "${pkgs.logstash-output-exec}" ]
|
||||
'';
|
||||
package = (pkgs.home-assistant.overrideAttrs (old: {
|
||||
# TODO: find correct python package
|
||||
installCheckPhase = ''
|
||||
echo LOLLLLLLLLLLLLLL
|
||||
'';
|
||||
postInstall = ''
|
||||
cp -r ${dwd_pollen} $out/lib/python3.7/site-packages/homeassistant/components/dwd_pollen
|
||||
'';
|
||||
})).override {
|
||||
extraPackages = ps: with ps; [
|
||||
pkgs.pico2wave
|
||||
python-forecastio jsonrpc-async jsonrpc-websocket mpd2
|
||||
(callPackage ./deps/gtts-token.nix { })
|
||||
(callPackage ./deps/pyhaversion.nix { })
|
||||
];
|
||||
};
|
||||
autoExtraComponents = true;
|
||||
config = {
|
||||
homeassistant = {
|
||||
name = "Bureautomation";
|
||||
time_zone = "Europe/Berlin";
|
||||
latitude = "48.8265";
|
||||
longitude = "9.0676";
|
||||
elevation = 303;
|
||||
auth_providers = [
|
||||
{ type = "homeassistant";}
|
||||
{ type = "legacy_api_password";}
|
||||
{ type = "trusted_networks";
|
||||
# allow_bypass_login = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
# https://www.home-assistant.io/components/influxdb/
|
||||
influxdb = {
|
||||
database = "hass";
|
||||
tags = {
|
||||
instance = "wbob";
|
||||
source = "hass";
|
||||
};
|
||||
};
|
||||
matrix = matrix.matrix;
|
||||
mqtt = {
|
||||
broker = "localhost";
|
||||
port = 1883;
|
||||
client_id = "home-assistant";
|
||||
keepalive = 60;
|
||||
protocol = 3.1;
|
||||
birth_message = {
|
||||
topic = "/bam/hass/tele/LWT";
|
||||
payload = "Online";
|
||||
qos = 1;
|
||||
retain = true;
|
||||
};
|
||||
will_message = {
|
||||
topic = "/bam/hass/tele/LWT";
|
||||
payload = "Offline";
|
||||
qos = 1;
|
||||
retain = true;
|
||||
};
|
||||
};
|
||||
switch = (import ./switch/tasmota_switch.nix) ++
|
||||
(import ./switch/rfbridge.nix);
|
||||
light = (import ./light/statuslight.nix) ++
|
||||
(import ./light/buzzer.nix);
|
||||
timer = ten_hours.timer;
|
||||
notify = [
|
||||
{
|
||||
platform = "kodi";
|
||||
name = "wbob-kodi";
|
||||
host = kodi-host;
|
||||
}
|
||||
{
|
||||
platform = "telegram";
|
||||
name = "telegrambot";
|
||||
chat_id = builtins.elemAt
|
||||
(builtins.fromJSON (builtins.readFile
|
||||
<secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
|
||||
}
|
||||
] ++ matrix.notify;
|
||||
media_player = [
|
||||
{ platform = "kodi";
|
||||
host = kodi-host;
|
||||
}
|
||||
{ platform = "mpd";
|
||||
host = "127.0.0.1";
|
||||
}
|
||||
];
|
||||
script = lib.fold lib.recursiveUpdate {} [
|
||||
((import ./script/multi_blink.nix) {inherit lib;})
|
||||
ten_hours.script
|
||||
mittagessen.script
|
||||
];
|
||||
binary_sensor =
|
||||
(import ./binary_sensor/buttons.nix) ++
|
||||
(import ./binary_sensor/motion.nix);
|
||||
|
||||
sensor =
|
||||
[{ platform = "version"; }] ++
|
||||
(import ./sensor/pollen.nix) ++
|
||||
(import ./sensor/espeasy.nix) ++
|
||||
(import ./sensor/airquality.nix) ++
|
||||
((import ./sensor/outside.nix) {inherit lib;}) ++
|
||||
(import ./sensor/influxdb.nix) ++
|
||||
(import ./sensor/tasmota_firmware.nix);
|
||||
|
||||
camera =
|
||||
(import ./camera/verkehrskamera.nix);
|
||||
|
||||
# not yet released
|
||||
#person =
|
||||
# (import ./person/team.nix );
|
||||
|
||||
frontend = { };
|
||||
http = {
|
||||
# TODO: https://github.com/home-assistant/home-assistant/issues/16149
|
||||
base_url = "http://192.168.8.11:8123";
|
||||
api_password = "sistemas";
|
||||
trusted_networks = [
|
||||
"127.0.0.1/32"
|
||||
"192.168.8.0/24"
|
||||
"::1/128"
|
||||
"fd00::/8"
|
||||
];
|
||||
};
|
||||
conversation = {};
|
||||
history = {};
|
||||
logbook = {};
|
||||
tts = [
|
||||
{ platform = "google";
|
||||
language = "de";
|
||||
}
|
||||
{ platform = "voicerss";
|
||||
api_key = builtins.readFile <secrets/hass/voicerss.apikey>;
|
||||
language = "de-de";
|
||||
}
|
||||
{ platform = "picotts";
|
||||
language = "de-DE";
|
||||
}
|
||||
];
|
||||
recorder = {};
|
||||
sun = {};
|
||||
telegram_bot = [
|
||||
(builtins.fromJSON
|
||||
(builtins.readFile <secrets/hass/telegram-bot.json>))
|
||||
];
|
||||
group =
|
||||
{ default_view =
|
||||
{ view = "yes";
|
||||
entities = [
|
||||
"group.sensors"
|
||||
"group.camera"
|
||||
"group.outside"
|
||||
"group.team"
|
||||
"group.nachtlicht"
|
||||
"group.switches"
|
||||
];
|
||||
};
|
||||
automation = [];
|
||||
|
||||
switches = [
|
||||
"switch.bauarbeiterlampe"
|
||||
"switch.blitzdings"
|
||||
"switch.fernseher"
|
||||
"switch.feuer"
|
||||
"light.status_felix"
|
||||
"light.status_daniel"
|
||||
"light.buslicht"
|
||||
];
|
||||
team = [
|
||||
"device_tracker.thorsten_phone"
|
||||
"device_tracker.felix_phone"
|
||||
"device_tracker.ecki_tablet"
|
||||
"device_tracker.daniel_phone"
|
||||
"device_tracker.carsten_phone"
|
||||
"device_tracker.thierry_phone"
|
||||
"device_tracker.frank_phone"
|
||||
"device_tracker.anthony_phone"
|
||||
# "person.thorsten"
|
||||
# "person.felix"
|
||||
# "person.ecki"
|
||||
# "person.daniel"
|
||||
];
|
||||
camera = [
|
||||
"camera.Baumarkt"
|
||||
"camera.Autobahn_Heilbronn"
|
||||
"camera.Autobahn_Singen"
|
||||
];
|
||||
nachtlicht = [
|
||||
"switch.nachtlicht_a"
|
||||
"switch.nachtlicht_b"
|
||||
"switch.nachtlicht_c"
|
||||
"switch.nachtlicht_d"
|
||||
];
|
||||
sensors = [
|
||||
"media_player.kodi"
|
||||
"script.blitz_10s"
|
||||
"script.buzz_red_led_fast"
|
||||
"timer.felix_10h"
|
||||
"timer.frank_10h"
|
||||
"sensor.easy2_dht22_humidity"
|
||||
"sensor.easy2_dht22_temperature"
|
||||
"sensor.air_quality"
|
||||
# "binary_sensor.redbutton"
|
||||
];
|
||||
outside = [
|
||||
# "sensor.ditzingen_pm10"
|
||||
# "sensor.ditzingen_pm25"
|
||||
"sensor.dark_sky_icon"
|
||||
"sensor.dark_sky_temperature"
|
||||
"sensor.dark_sky_humidity"
|
||||
"sensor.dark_sky_uv_index"
|
||||
# "sensor.dark_sky_pressure"
|
||||
"sensor.dark_sky_hourly_summary"
|
||||
];
|
||||
};
|
||||
# only for automation
|
||||
# feedreader.urls = [ "http://www.heise.de/security/rss/news-atom.xml" ];
|
||||
# we don't use imports because the expressions do not merge in
|
||||
# home-assistant
|
||||
automation = (import ./automation/bureau-shutdown.nix) ++
|
||||
(import ./automation/nachtlicht.nix) ++
|
||||
(import ./automation/schlechteluft.nix) ++
|
||||
(import ./automation/hass-restart.nix) ++
|
||||
ten_hours.automation ++
|
||||
matrix.automation ++
|
||||
mittagessen.automation;
|
||||
device_tracker = (import ./device_tracker/openwrt.nix );
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
32
2configs/bureautomation/deps/dwd_pollen.nix
Normal file
32
2configs/bureautomation/deps/dwd_pollen.nix
Normal file
|
@ -0,0 +1,32 @@
|
|||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchFromGitHub
|
||||
, python
|
||||
, voluptuous
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
format = "other";
|
||||
pname = "dwd_pollen";
|
||||
version = "0.1";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "marcschumacher";
|
||||
repo = "dwd_pollen";
|
||||
rev = version;
|
||||
sha256 = "1af2mx99gv2hk1ad53g21fwkdfdbymqcdl3jvzd1yg7dgxlkhbj1";
|
||||
};
|
||||
propagatedBuildInputs = [
|
||||
voluptuous
|
||||
];
|
||||
installPhase = ''
|
||||
install -D -t $out/${python.sitePackages}/homeassistant/components/sensor/dwd_pollen *
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
description = "Home Assistant component to retrieve Pollen data from DWD (Germany)";
|
||||
homepage = https://github.com/marcschumacher/dwd_pollen;
|
||||
license = licenses.mit;
|
||||
maintainers = [ maintainers.makefu ];
|
||||
};
|
||||
}
|
27
2configs/bureautomation/deps/gtts-token.nix
Normal file
27
2configs/bureautomation/deps/gtts-token.nix
Normal file
|
@ -0,0 +1,27 @@
|
|||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchPypi
|
||||
, requests
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "gtts-token";
|
||||
version = "1.1.3";
|
||||
|
||||
src = fetchPypi {
|
||||
pname = "gTTS-token";
|
||||
inherit version;
|
||||
sha256 = "9d6819a85b813f235397ef931ad4b680f03d843c9b2a9e74dd95175a4bc012c5";
|
||||
};
|
||||
|
||||
propagatedBuildInputs = [
|
||||
requests
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "Calculates a token to run the Google Translate text to speech";
|
||||
homepage = https://github.com/boudewijn26/gTTS-token;
|
||||
license = licenses.mit;
|
||||
# maintainers = [ maintainers. ];
|
||||
};
|
||||
}
|
33
2configs/bureautomation/deps/pyhaversion.nix
Normal file
33
2configs/bureautomation/deps/pyhaversion.nix
Normal file
|
@ -0,0 +1,33 @@
|
|||
{ lib
|
||||
, buildPythonPackage
|
||||
, fetchpatch
|
||||
, fetchPypi
|
||||
, aiohttp
|
||||
, async-timeout
|
||||
}:
|
||||
|
||||
buildPythonPackage rec {
|
||||
pname = "pyhaversion";
|
||||
version = "2.2.1";
|
||||
|
||||
src = fetchPypi {
|
||||
inherit pname version;
|
||||
sha256 = "72b65aa25d7b2dbb839a4d0218df2005c2335e93526035904d365bb668030b9f";
|
||||
};
|
||||
patches = [
|
||||
(fetchpatch { url = "https://github.com/makefu/pyhaversion/commit/f3bdc38970272cd345c2cfbde3037ea492ca27c4.patch";
|
||||
sha256 =
|
||||
"1rhq4z7mdgnwhwpf5fmarnbc1ba3qysk1wqjdr0hvbzi8vmvbfcc";})
|
||||
];
|
||||
doCheck = false;
|
||||
propagatedBuildInputs = [
|
||||
aiohttp
|
||||
async-timeout
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
description = "";
|
||||
homepage = https://github.com/ludeeus/pyhaversion;
|
||||
# maintainers = [ maintainers. ];
|
||||
};
|
||||
}
|
|
@ -1,3 +1,6 @@
|
|||
# requires `opkg install luci-mod-rpc` on router
|
||||
# see https://www.home-assistant.io/components/luci/
|
||||
|
||||
[
|
||||
{ platform = "luci";
|
||||
name = "router";
|
||||
|
|
|
@ -1,198 +0,0 @@
|
|||
{ pkgs, lib, ... }:
|
||||
let
|
||||
kodi-host = "192.168.8.11";
|
||||
in {
|
||||
networking.firewall.allowedTCPPorts = [ 8123 ];
|
||||
state = [ "/var/lib/hass/known_devices.yaml" ];
|
||||
services.home-assistant = {
|
||||
enable = true;
|
||||
package = pkgs.home-assistant.override { python3 = pkgs.python36; };
|
||||
config = {
|
||||
homeassistant = {
|
||||
name = "Bureautomation";
|
||||
time_zone = "Europe/Berlin";
|
||||
latitude = "48.8265";
|
||||
longitude = "9.0676";
|
||||
elevation = 303;
|
||||
auth_providers = [
|
||||
{ type = "homeassistant";}
|
||||
{ type = "legacy_api_password";}
|
||||
{ type = "trusted_networks";
|
||||
# allow_bypass_login = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
mqtt = {
|
||||
broker = "localhost";
|
||||
port = 1883;
|
||||
client_id = "home-assistant";
|
||||
keepalive = 60;
|
||||
protocol = 3.1;
|
||||
birth_message = {
|
||||
topic = "/bam/hass/tele/LWT";
|
||||
payload = "Online";
|
||||
qos = 1;
|
||||
retain = true;
|
||||
};
|
||||
will_message = {
|
||||
topic = "/bam/hass/tele/LWT";
|
||||
payload = "Offline";
|
||||
qos = 1;
|
||||
retain = true;
|
||||
};
|
||||
};
|
||||
switch = (import ./switch/tasmota_switch.nix) ++
|
||||
(import ./switch/rfbridge.nix);
|
||||
light = (import ./light/statuslight.nix) ++
|
||||
(import ./light/buzzer.nix);
|
||||
timer = {
|
||||
felix_10h = {
|
||||
name = "Felix 10h Timer";
|
||||
duration = "10:00:00";
|
||||
};
|
||||
felix_8_30h = {
|
||||
name = "Felix 8_30h Timer";
|
||||
duration = "08:30:00";
|
||||
};
|
||||
felix_7h = {
|
||||
name = "Felix 7h Timer";
|
||||
duration = "07:00:00";
|
||||
};
|
||||
};
|
||||
notify = [
|
||||
{
|
||||
platform = "kodi";
|
||||
name = "wbob-kodi";
|
||||
host = kodi-host;
|
||||
}
|
||||
{
|
||||
platform = "telegram";
|
||||
name = "telegrambot";
|
||||
chat_id = builtins.elemAt
|
||||
(builtins.fromJSON (builtins.readFile
|
||||
<secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
|
||||
}
|
||||
];
|
||||
media_player = [
|
||||
{ platform = "kodi";
|
||||
host = kodi-host;
|
||||
}
|
||||
];
|
||||
script = (import ./script/multi_blink.nix) {inherit lib;};
|
||||
binary_sensor =
|
||||
(import ./binary_sensor/buttons.nix) ++
|
||||
(import ./binary_sensor/motion.nix);
|
||||
|
||||
sensor =
|
||||
(import ./sensor/espeasy.nix) ++
|
||||
((import ./sensor/outside.nix) {inherit lib;}) ++
|
||||
(import ./sensor/influxdb.nix) ++
|
||||
(import ./sensor/tasmota_firmware.nix);
|
||||
|
||||
camera =
|
||||
(import ./camera/verkehrskamera.nix);
|
||||
|
||||
# not yet released
|
||||
#person =
|
||||
# (import ./person/team.nix );
|
||||
|
||||
frontend = { };
|
||||
http = {
|
||||
# TODO: https://github.com/home-assistant/home-assistant/issues/16149
|
||||
api_password = "sistemas";
|
||||
trusted_networks = [
|
||||
"127.0.0.1/32"
|
||||
"192.168.8.0/24"
|
||||
"::1/128"
|
||||
"fd00::/8"
|
||||
];
|
||||
};
|
||||
conversation = {};
|
||||
history = {};
|
||||
logbook = {};
|
||||
tts = [ { platform = "google";} ];
|
||||
recorder = {};
|
||||
sun = {};
|
||||
telegram_bot = [
|
||||
(builtins.fromJSON
|
||||
(builtins.readFile <secrets/hass/telegram-bot.json>))
|
||||
];
|
||||
group =
|
||||
{ default_view =
|
||||
{ view = "yes";
|
||||
entities = [
|
||||
"group.sensors"
|
||||
"group.camera"
|
||||
"group.outside"
|
||||
"group.team"
|
||||
"group.nachtlicht"
|
||||
"group.switches"
|
||||
];
|
||||
};
|
||||
automation = [
|
||||
];
|
||||
switches = [
|
||||
"switch.bauarbeiterlampe"
|
||||
"switch.blitzdings"
|
||||
"switch.fernseher"
|
||||
"switch.feuer"
|
||||
"light.status_felix"
|
||||
"light.status_daniel"
|
||||
"light.buslicht"
|
||||
];
|
||||
team = [
|
||||
"device_tracker.thorsten_phone"
|
||||
"device_tracker.felix_phone"
|
||||
"device_tracker.ecki_tablet"
|
||||
"device_tracker.daniel_phone"
|
||||
"device_tracker.carsten_phone"
|
||||
"device_tracker.thierry_phone"
|
||||
# "person.thorsten"
|
||||
# "person.felix"
|
||||
# "person.ecki"
|
||||
# "person.daniel"
|
||||
];
|
||||
camera = [
|
||||
"camera.Baumarkt"
|
||||
"camera.Autobahn_Heilbronn"
|
||||
"camera.Autobahn_Singen"
|
||||
];
|
||||
nachtlicht = [
|
||||
"switch.nachtlicht_a"
|
||||
"switch.nachtlicht_b"
|
||||
"switch.nachtlicht_c"
|
||||
"switch.nachtlicht_d"
|
||||
];
|
||||
sensors = [
|
||||
"media_player.kodi"
|
||||
"script.blitz_10s"
|
||||
"script.buzz_red_led_fast"
|
||||
"timer.felix_10h"
|
||||
"sensor.easy2_dht22_humidity"
|
||||
"sensor.easy2_dht22_temperature"
|
||||
# "binary_sensor.redbutton"
|
||||
];
|
||||
outside = [
|
||||
# "sensor.ditzingen_pm10"
|
||||
# "sensor.ditzingen_pm25"
|
||||
"sensor.dark_sky_icon"
|
||||
"sensor.dark_sky_temperature"
|
||||
"sensor.dark_sky_humidity"
|
||||
"sensor.dark_sky_uv_index"
|
||||
# "sensor.dark_sky_pressure"
|
||||
"sensor.dark_sky_hourly_summary"
|
||||
"device_tracker.router"
|
||||
];
|
||||
};
|
||||
# only for automation
|
||||
# feedreader.urls = [ "http://www.heise.de/security/rss/news-atom.xml" ];
|
||||
# we don't use imports because the expressions do not merge in
|
||||
# home-assistant
|
||||
automation = (import ./automation/bureau-shutdown.nix) ++
|
||||
(import ./automation/nachtlicht.nix) ++
|
||||
(import ./automation/hass-restart.nix) ++
|
||||
(import ./automation/10h_timer.nix);
|
||||
device_tracker = (import ./device_tracker/openwrt.nix );
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
{lib, ... }:
|
||||
let
|
||||
# TODO: flash with different delay
|
||||
|
||||
# let an entity blink for X times with a delay of Y milliseconds
|
||||
flash_entity = { entity, delay ? 500, count ? 4, alias ? "${entity}_blink_${toString count}_${toString delay}" }:
|
||||
{
|
||||
|
@ -34,4 +36,10 @@ in {
|
|||
count = 1;
|
||||
alias = "blitz for 10 seconds";
|
||||
});
|
||||
schlechteluft = (flash_entity {
|
||||
entity = "switch.bauarbeiterlampe";
|
||||
alias = "Schlechte Luft Lampe 5 secs";
|
||||
delay = 5000;
|
||||
count = 1;
|
||||
});
|
||||
}
|
||||
|
|
9
2configs/bureautomation/sensor/airquality.nix
Normal file
9
2configs/bureautomation/sensor/airquality.nix
Normal file
|
@ -0,0 +1,9 @@
|
|||
[
|
||||
# coming from 2configs/stats/telegraf/
|
||||
{ platform = "mqtt";
|
||||
name = "Air Quality";
|
||||
state_topic = "/telegraf/wbob/airquality";
|
||||
value_template = "{{ value_json.fields.value }}";
|
||||
unit_of_measurement = "VOC";
|
||||
}
|
||||
]
|
7
2configs/bureautomation/sensor/pollen.nix
Normal file
7
2configs/bureautomation/sensor/pollen.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
[ {
|
||||
platform = "dwd_pollen";
|
||||
partsregion_ids = [
|
||||
112
|
||||
];
|
||||
}
|
||||
]
|
|
@ -1,7 +1,11 @@
|
|||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
(builtins.fetchTarball "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/v2.2.1/nixos-mailserver-v2.2.1.tar.gz")
|
||||
(builtins.fetchTarball {
|
||||
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/v2.2.1/nixos-mailserver-v2.2.1.tar.gz";
|
||||
sha256 = "03d49v8qnid9g9rha0wg2z6vic06mhp0b049s3whccn1axvs2zzx";
|
||||
}
|
||||
)
|
||||
];
|
||||
|
||||
mailserver = {
|
||||
|
|
|
@ -14,6 +14,6 @@
|
|||
saleae-logic
|
||||
gitAndTools.gitFull
|
||||
signal-desktop
|
||||
rambox
|
||||
# rambox
|
||||
];
|
||||
}
|
||||
|
|
46
2configs/wireguard/wiregrill.nix
Normal file
46
2configs/wireguard/wiregrill.nix
Normal file
|
@ -0,0 +1,46 @@
|
|||
with import <stockholm/lib>;
|
||||
{ config, pkgs, ... }: let
|
||||
|
||||
self = config.krebs.build.host.nets.wiregrill;
|
||||
isRouter = !isNull self.via; # via "internet" is not set
|
||||
ext-if = config.makefu.server.primary-itf;
|
||||
|
||||
in mkIf (hasAttr "wiregrill" config.krebs.build.host.nets) {
|
||||
#hack for modprobe inside containers
|
||||
systemd.services."wireguard-wiregrill".path = mkIf config.boot.isContainer (mkBefore [
|
||||
(pkgs.writeDashBin "modprobe" ":")
|
||||
]);
|
||||
|
||||
boot.kernel.sysctl = mkIf isRouter {
|
||||
"net.ipv6.conf.all.forwarding" = 1;
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
allowedUDPPorts = [ self.wireguard.port ];
|
||||
extraCommands = ''
|
||||
iptables -A FORWARD -i wiregrill -o wiregrill -j ACCEPT
|
||||
'';
|
||||
};
|
||||
|
||||
networking.wireguard.interfaces.wiregrill = {
|
||||
ips =
|
||||
(optional (!isNull self.ip4) self.ip4.addr) ++
|
||||
(optional (!isNull self.ip6) self.ip6.addr);
|
||||
listenPort = self.wireguard.port;
|
||||
privateKeyFile = (toString <secrets>) + "/wiregrill.key";
|
||||
allowedIPsAsRoutes = true;
|
||||
peers = mapAttrsToList
|
||||
(_: host: {
|
||||
allowedIPs = if isRouter then
|
||||
(optional (!isNull host.nets.wiregrill.ip4) host.nets.wiregrill.ip4.addr) ++
|
||||
(optional (!isNull host.nets.wiregrill.ip6) host.nets.wiregrill.ip6.addr)
|
||||
else
|
||||
host.nets.wiregrill.wireguard.subnets
|
||||
;
|
||||
endpoint = mkIf (!isNull host.nets.wiregrill.via) (host.nets.wiregrill.via.ip4.addr + ":${toString host.nets.wiregrill.wireguard.port}");
|
||||
persistentKeepalive = mkIf (!isNull host.nets.wiregrill.via) 61;
|
||||
publicKey = (replaceStrings ["\n"] [""] host.nets.wiregrill.wireguard.pubkey);
|
||||
})
|
||||
(filterAttrs (_: h: hasAttr "wiregrill" h.nets) config.krebs.hosts);
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue