Merge remote-tracking branch 'prism/master'

This commit is contained in:
tv 2019-09-11 10:34:02 +02:00
commit 4e72a6b726
33 changed files with 1014 additions and 421 deletions

View file

@ -0,0 +1 @@
{}

View file

View 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;
}

View file

@ -48,7 +48,6 @@ in {
hardware.cpu.amd.updateMicrocode = true;
zramSwap.enable = true;
zramSwap.numDevices = 2;
makefu.snapraid = let
toMedia = name: "/media/" + name;

View 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;
}

View 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";
};
};
}

View file

@ -0,0 +1,4 @@
{
name="cake";
full = true;
}

View file

@ -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

View file

@ -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";

View 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" ];
}

View 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 {}))

View file

@ -0,0 +1,3 @@
{
name="iso";
}

View file

@ -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
View 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 ];
};
}

View file

@ -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" ];
};
}
];
}
]

View file

@ -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";
};
}
];

View 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}})!";
}
];
}
]

View 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)
);
}

View file

@ -0,0 +1,3 @@
# Combination Folder
files return a dictionary of different types used in home-assistant instead of
a single thing.

View 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;
}];
}

View 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";
};
}
];
};
};
}

View file

@ -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 );
};
};
}

View 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 ];
};
}

View 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. ];
};
}

View 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. ];
};
}

View file

@ -1,3 +1,6 @@
# requires `opkg install luci-mod-rpc` on router
# see https://www.home-assistant.io/components/luci/
[
{ platform = "luci";
name = "router";

View file

@ -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 );
};
};
}

View file

@ -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;
});
}

View 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";
}
]

View file

@ -0,0 +1,7 @@
[ {
platform = "dwd_pollen";
partsregion_ids = [
112
];
}
]

View file

@ -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 = {

View file

@ -14,6 +14,6 @@
saleae-logic
gitAndTools.gitFull
signal-desktop
rambox
# rambox
];
}

View 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);
};
}