Merge remote-tracking branch 'prism/master' into master

This commit is contained in:
tv 2020-12-02 00:45:50 +01:00
commit d60b1b793f
120 changed files with 2031 additions and 1797 deletions

View File

@ -1,7 +1,7 @@
{ config, lib, pkgs, ... }:
let
byid = dev: "/dev/disk/by-id/" + dev;
keyFile = byid "usb-SMI_USB_DISK_AA08061700009650-0:0";
keyFile = byid "usb-SMI_USB_DISK_AA08061700009650-0:0";
in
{
imports =
@ -19,7 +19,7 @@ in
boot.tmpOnTmpfs = true;
boot.initrd.availableKernelModules = [
boot.initrd.availableKernelModules = [
"xhci_pci" "ahci" "ohci_pci" "ehci_pci" "usb_storage" "usbhid" "sd_mod"
"raid456"
"usbhid"
@ -77,20 +77,18 @@ in
networking.hostId = "54d97450"; # required for zfs use
boot.initrd.luks.devices = let
usbkey = name: device: {
inherit name device keyFile;
usbkey = device: {
inherit device keyFile;
keyFileSize = 2048;
preLVM = true;
};
in [
((usbkey "swap" (byid "ata-INTEL_SSDSA2M080G2GC_CVPO013300WD080BGN-part2"))
// { allowDiscards = true; } )
((usbkey "root" (byid "ata-INTEL_SSDSA2M080G2GC_CVPO013300WD080BGN-part3"))
// { allowDiscards = true; } )
(usbkey "125" "/dev/md125")
(usbkey "126" "/dev/md126")
(usbkey "127" "/dev/md127")
];
in {
swap = ((usbkey (byid "ata-INTEL_SSDSA2M080G2GC_CVPO013300WD080BGN-part2"))
// { allowDiscards = true; } );
root = ((usbkey (byid "ata-INTEL_SSDSA2M080G2GC_CVPO013300WD080BGN-part3"))
// { allowDiscards = true; } );
md125 = usbkey "/dev/md125";
md126 = usbkey "/dev/md126";
md127 = usbkey "/dev/md127";
};
}

View File

@ -12,7 +12,6 @@
<stockholm/krebs/2configs/buildbot-stockholm.nix>
<stockholm/krebs/2configs/binary-cache/nixos.nix>
<stockholm/krebs/2configs/ircd.nix>
<stockholm/krebs/2configs/nscd-fix.nix>
<stockholm/krebs/2configs/reaktor2.nix>
<stockholm/krebs/2configs/wiki.nix>
];

View File

@ -7,19 +7,109 @@
<stockholm/krebs/2configs/secret-passwords.nix>
<stockholm/krebs/2configs/hw/x220.nix>
## initrd unlocking
# (brain hosts/puyak/luks-ssd;echo) | ssh root@$(brain krebs-secrets/puyak/initrd/hostname) 'cat > /crypt-ramfs/passphrase'
<stockholm/krebs/2configs/tor/initrd.nix>
<stockholm/krebs/2configs/binary-cache/nixos.nix>
<stockholm/krebs/2configs/binary-cache/prism.nix>
### Krebs ###
<stockholm/krebs/2configs/go.nix>
#### NEWS ####
<stockholm/krebs/2configs/ircd.nix>
<stockholm/krebs/2configs/news.nix>
<stockholm/krebs/2configs/news-spam.nix>
#<stockholm/krebs/2configs/news.nix>
#<stockholm/krebs/2configs/news-spam.nix>
### shackspace ###
# handle the worlddomination map via coap
<stockholm/krebs/2configs/shack/worlddomination.nix>
<stockholm/krebs/2configs/shack/ssh-keys.nix>
# drivedroid.shack for shackphone
<stockholm/krebs/2configs/shack/drivedroid.nix>
# <stockholm/krebs/2configs/shack/nix-cacher.nix>
# Say if muell will be collected
<stockholm/krebs/2configs/shack/muell_caller.nix>
# provide muellshack api: muell.shack
<stockholm/krebs/2configs/shack/muellshack.nix>
# send mail if muell was not handled
<stockholm/krebs/2configs/shack/muell_mail.nix>
# provide light control api
<stockholm/krebs/2configs/shack/node-light.nix> # light.shack lounge.light.shack power.light.shack openhab.shack lightapi.shack
# light.shack web-ui
<stockholm/krebs/2configs/shack/light.shack.nix> #light.shack
# powerraw usb serial to mqtt and raw socket
<stockholm/krebs/2configs/shack/powerraw.nix> # powerraw.shack standby.shack
# send power stats to s3
<stockholm/krebs/2configs/shack/s3-power.nix> # powerraw.shack must be available
{ # do not log to /var/spool/log
services.nginx.appendHttpConfig = ''
map $request_method $loggable {
default 1;
GET 0;
}
log_format vhost '$host $remote_addr - $remote_user '
'[$time_local] "$request" $status '
'$body_bytes_sent "$http_referer" '
'"$http_user_agent"';
error_log stderr;
access_log syslog:server=unix:/dev/log vhost;
'';
services.journald.rateLimitBurst = 10000;
}
# create samba share for anonymous usage with the laser and 3d printer pc
<stockholm/krebs/2configs/shack/share.nix>
# mobile.lounge.mpd.shack
<stockholm/krebs/2configs/shack/mobile.mpd.nix>
# hass.shack
<stockholm/krebs/2configs/shack/glados>
# connect to git.shackspace.de as group runner for rz
<stockholm/krebs/2configs/shack/gitlab-runner.nix>
# Statistics collection and visualization
# <stockholm/krebs/2configs/shack/graphite.nix> # graphiteApi is broken and unused(hopefully)
## Collect data from mqtt.shack and store in graphite database
<stockholm/krebs/2configs/shack/mqtt_sub.nix>
## Collect radioactive data and put into graphite
<stockholm/krebs/2configs/shack/radioactive.nix>
## mqtt.shack
<stockholm/krebs/2configs/shack/mqtt.nix>
## influx.shack
<stockholm/krebs/2configs/shack/influx.nix>
## Collect local statistics via collectd and send to collectd
<stockholm/krebs/2configs/stats/shack-client.nix>
<stockholm/krebs/2configs/stats/shack-debugging.nix>
## netbox.shack: Netbox is disabled as nobody seems to be using it anyway
# <stockholm/krebs/2configs/shack/netbox.nix>
# grafana.shack
<stockholm/krebs/2configs/shack/grafana.nix>
# shackdns.shack
# replacement for leases.shack and shackles.shack
<stockholm/krebs/2configs/shack/shackDNS.nix>
# monitoring: prometheus.shack
<stockholm/krebs/2configs/shack/prometheus/node.nix>
<stockholm/krebs/2configs/shack/prometheus/server.nix>
<stockholm/krebs/2configs/shack/prometheus/blackbox.nix>
<stockholm/krebs/2configs/shack/prometheus/unifi.nix>
<stockholm/krebs/2configs/shack/prometheus/alertmanager-telegram.nix>
<stockholm/krebs/2configs/shack/gitlab-runner.nix>
## Collect local statistics via collectd and send to collectd
<stockholm/krebs/2configs/stats/shack-client.nix>

View File

@ -14,85 +14,15 @@ in
<stockholm/krebs/2configs/binary-cache/nixos.nix>
<stockholm/krebs/2configs/binary-cache/prism.nix>
# handle the worlddomination map via coap
<stockholm/krebs/2configs/shack/worlddomination.nix>
<stockholm/krebs/2configs/shack/ssh-keys.nix>
#### shackspace services
<stockholm/krebs/2configs/shack/share.nix> # wolf.shack
# drivedroid.shack for shackphone
<stockholm/krebs/2configs/shack/drivedroid.nix>
# <stockholm/krebs/2configs/shack/nix-cacher.nix>
# Say if muell will be collected
<stockholm/krebs/2configs/shack/muell_caller.nix>
# provide muellshack api
<stockholm/krebs/2configs/shack/muellshack.nix>
# provide light control api
<stockholm/krebs/2configs/shack/node-light.nix>
# light.shack web-ui
<stockholm/krebs/2configs/shack/light.shack.nix>
# send mail if muell was not handled
<stockholm/krebs/2configs/shack/muell_mail.nix>
# send mail if muell was not handled
<stockholm/krebs/2configs/shack/s3-power.nix>
# powerraw usb serial to mqtt and raw socket
<stockholm/krebs/2configs/shack/powerraw.nix>
{ # do not log to /var/spool/log
services.nginx.appendHttpConfig = ''
map $request_method $loggable {
default 1;
GET 0;
}
log_format vhost '$host $remote_addr - $remote_user '
'[$time_local] "$request" $status '
'$body_bytes_sent "$http_referer" '
'"$http_user_agent"';
error_log stderr;
access_log syslog:server=unix:/dev/log vhost;
'';
services.journald.rateLimitBurst = 10000;
}
# create samba share for anonymous usage with the laser and 3d printer pc
<stockholm/krebs/2configs/shack/share.nix>
# mobile.lounge.mpd.shack
<stockholm/krebs/2configs/shack/mobile.mpd.nix>
# hass.shack
<stockholm/krebs/2configs/shack/glados>
# connect to git.shackspace.de as group runner for rz
# gitlab runner
<stockholm/krebs/2configs/shack/gitlab-runner.nix>
# Statistics collection and visualization
# <stockholm/krebs/2configs/shack/graphite.nix> # graphiteApi is broken and unused(hopefully)
## Collect data from mqtt.shack and store in graphite database
<stockholm/krebs/2configs/shack/mqtt_sub.nix>
## Collect radioactive data and put into graphite
<stockholm/krebs/2configs/shack/radioactive.nix>
## mqtt.shack
<stockholm/krebs/2configs/shack/mqtt.nix>
## influx.shack
<stockholm/krebs/2configs/shack/influx.nix>
## Collect local statistics via collectd and send to collectd
<stockholm/krebs/2configs/stats/shack-client.nix>
<stockholm/krebs/2configs/stats/shack-debugging.nix>
<stockholm/krebs/2configs/shack/netbox.nix>
# prometheus.shack
#<stockholm/krebs/2configs/shack/prometheus/server.nix>
<stockholm/krebs/2configs/shack/prometheus/node.nix>
#<stockholm/krebs/2configs/shack/prometheus/unifi.nix>
# grafana.shack
<stockholm/krebs/2configs/shack/grafana.nix>
# shackdns.shack
# replacement for leases.shack and shackles.shack
<stockholm/krebs/2configs/shack/shackDNS.nix>
# misc
<stockholm/krebs/2configs/shack/ssh-keys.nix>
<stockholm/krebs/2configs/save-diskspace.nix>
<stockholm/krebs/2configs/shack/prometheus/node.nix>
];
# use your own binary cache, fallback use cache.nixos.org (which is used by

View File

@ -43,7 +43,6 @@ with import <stockholm/lib>;
];
};
services.cron.enable = false;
services.nscd.enable = false;
services.ntp.enable = false;
users.mutableUsers = false;

View File

@ -1,33 +0,0 @@
{ config, pkgs, ... }:
let
url = "https://git.shackspace.de/";
# generate token from CI-token via:
## gitlab-runner register
## cat /etc/gitlab-runner/config.toml
token = import <secrets/shackspace-gitlab-ci-token.nix> ;
in {
systemd.services.gitlab-runner.path = [
"/run/wrappers" # /run/wrappers/bin/su
"/" # /bin/sh
];
systemd.services.gitlab-runner.serviceConfig.PrivateTmp = true;
virtualisation.docker.enable = true;
services.gitlab-runner = {
enable = true;
# configFile, configOptions and gracefulTimeout not yet in stable
# gracefulTimeout = "120min";
configFile = pkgs.writeText "gitlab-runner.cfg" ''
concurrent = 1
check_interval = 0
[[runners]]
name = "krebs-shell"
url = "${url}"
token = "${token}"
executor = "shell"
shell = "sh"
environment = ["PATH=/bin:/run/wrappers/bin:/etc/per-user/gitlab-runner/bin:/etc/per-user-pkgs/gitlab-runner/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin"]
[runners.cache]
'';
};
}

View File

@ -1,24 +0,0 @@
with import <stockholm/lib>;
{ pkgs, ... }: let
enable = versionOlderThan "19.03";
versionOlderThan = v:
compareVersions
(versions.majorMinor version)
(versions.majorMinor v)
== -1;
warning = ''
Using custom services.nscd.config because
https://github.com/NixOS/nixpkgs/pull/50316
'';
in
optionalAttrs enable (trace warning {
services.nscd.enable = mkForce true;
services.nscd.config = mkForce (readFile (pkgs.fetchurl {
url = https://raw.githubusercontent.com/arianvp/nixpkgs/1d5f4cb/nixos/modules/services/system/nscd.conf;
sha256 = "1jlddk38lyynjn51zx3xi1nc29ahajyh0qg48qbq6dqlsrn3wxqs";
}));
})

View File

@ -95,7 +95,7 @@ let
}
hooks.sed
(generators.command_hook {
inherit (commands) hello random-emoji nixos-version stockholm-issue;
inherit (commands) hello random-emoji nixos-version;
tell = {
filename =
"${pkgs.Reaktor.src}/reaktor/commands/tell-on_privmsg";

View File

@ -1,24 +1,48 @@
{ pkgs, ... }:
let
runner-src = builtins.fetchTarball {
url = "https://gitlab.com/arianvp/nixos-gitlab-runner/-/archive/master/nixos-gitlab-runner-master.tar.gz";
sha256 = "1s0fy5ny2ygcfvx35xws8xz5ih4z4kdfqlq3r6byxpylw7r52fyi";
};
in
{ pkgs,lib, ... }:
{
imports = [
"${runner-src}/gitlab-runner.nix"
];
services.gitlab-runner2 = {
services.gitlab-runner = {
enable = true;
## registrationConfigurationFile contains:
# CI_SERVER_URL=<CI server URL>
# REGISTRATION_TOKEN=<registration secret>
# RUNNER_TAG_LIST=nix,shacklan
# RUNNER_NAME=stockholm-runner-$name
registrationConfigFile = <secrets/shackspace-gitlab-ci>;
#gracefulTermination = true;
services= {
# runner for building in docker via host's nix-daemon
# nix store will be readable in runner, might be insecure
nix = with lib;{
# File should contain at least these two variables:
# `CI_SERVER_URL`
# `REGISTRATION_TOKEN`
registrationConfigFile = toString <secrets/shackspace-gitlab-ci>;
dockerImage = "alpine";
dockerVolumes = [
"/nix/store:/nix/store:ro"
"/nix/var/nix/db:/nix/var/nix/db:ro"
"/nix/var/nix/daemon-socket:/nix/var/nix/daemon-socket:ro"
];
dockerDisableCache = true;
preBuildScript = pkgs.writeScript "setup-container" ''
mkdir -p -m 0755 /nix/var/log/nix/drvs
mkdir -p -m 0755 /nix/var/nix/gcroots
mkdir -p -m 0755 /nix/var/nix/profiles
mkdir -p -m 0755 /nix/var/nix/temproots
mkdir -p -m 0755 /nix/var/nix/userpool
mkdir -p -m 1777 /nix/var/nix/gcroots/per-user
mkdir -p -m 1777 /nix/var/nix/profiles/per-user
mkdir -p -m 0755 /nix/var/nix/profiles/per-user/root
mkdir -p -m 0700 "$HOME/.nix-defexpr"
. ${pkgs.nix}/etc/profile.d/nix.sh
${pkgs.nix}/bin/nix-env -i ${concatStringsSep " " (with pkgs; [ nix cacert git openssh ])}
${pkgs.nix}/bin/nix-channel --add https://nixos.org/channels/nixpkgs-unstable
${pkgs.nix}/bin/nix-channel --update nixpkgs
'';
environmentVariables = {
ENV = "/etc/profile";
USER = "root";
NIX_REMOTE = "daemon";
PATH = "/nix/var/nix/profiles/default/bin:/nix/var/nix/profiles/default/sbin:/bin:/sbin:/usr/bin:/usr/sbin";
NIX_SSL_CERT_FILE = "/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt";
};
tagList = [ "nix" "shacklan" ];
};
};
};
systemd.services.gitlab-runner2.restartIfChanged = false;
systemd.services.gitlab-runner.restartIfChanged = false;
systemd.services.docker.restartIfChanged = false;
}

View File

@ -21,23 +21,10 @@ in {
'';
};
};
services.home-assistant = let
dwd_pollen = pkgs.fetchFromGitHub {
owner = "marcschumacher";
repo = "dwd_pollen";
rev = "0.1";
sha256 = "1af2mx99gv2hk1ad53g21fwkdfdbymqcdl3jvzd1yg7dgxlkhbj1";
};
in {
services.home-assistant =
{
enable = true;
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 {
package = pkgs.home-assistant.override {
extraPackages = ps: with ps; [
python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts
];

View File

@ -1,32 +0,0 @@
{ 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

@ -10,7 +10,7 @@ let
sha256 = "1334jbbzlqizyp7zcn4hdswhhrnkj1p4p435n5nph82lzffrsi44";
};
buildInputs = [
(pkgs.python35.withPackages (pythonPackages: with pythonPackages; [
(pkgs.python3.withPackages (pythonPackages: with pythonPackages; [
docopt
paho-mqtt
]))

View File

@ -37,6 +37,9 @@
# for legacy systems
client min protocol = NT1
server min protocol = NT1
workgroup = WORKGROUP
server string = ${config.networking.hostName}
netbios name = ${config.networking.hostName}
'';
};
}

View File

@ -0,0 +1,50 @@
{config, pkgs, ... }:
## unlock command:
# (brain hosts/puyak/luks-ssd;echo) | ssh root@$(brain krebs-secrets/puyak/initrd/hostname) 'cat > /crypt-ramfs/passphrase'
{
boot.initrd.network.enable = true;
boot.initrd.network.ssh = {
enable = true;
port = 22;
authorizedKeys = [
config.krebs.users.jeschli-brauerei.pubkey
config.krebs.users.lass.pubkey
config.krebs.users.lass-mors.pubkey
config.krebs.users.makefu.pubkey
config.krebs.users.tv.pubkey
];
hostKeys = [ <secrets/initrd/openssh_host_ecdsa_key> ];
};
boot.initrd.availableKernelModules = [ "e1000e" ];
boot.initrd.secrets = {
"/etc/tor/onion/bootup" = <secrets/initrd>;
};
boot.initrd.extraUtilsCommands = ''
copy_bin_and_libs ${pkgs.tor}/bin/tor
'';
# start tor during boot process
boot.initrd.network.postCommands = let
torRc = (pkgs.writeText "tor.rc" ''
DataDirectory /etc/tor
SOCKSPort 127.0.0.1:9050 IsolateDestAddr
SOCKSPort 127.0.0.1:9063
HiddenServiceDir /etc/tor/onion/bootup
HiddenServicePort 22 127.0.0.1:22
'');
in ''
echo "tor: preparing onion folder"
# have to do this otherwise tor does not want to start
chmod -R 700 /etc/tor
echo "make sure localhost is up"
ip a a 127.0.0.1/8 dev lo
ip link set lo up
echo "tor: starting tor"
tor -f ${torRc} --verify-config
tor -f ${torRc} &
'';
}

View File

@ -608,6 +608,10 @@ in {
mail = "joerg@thalheim.io";
pubkey = ssh-for "mic92";
};
shannan = {
mail = "shannan@lekwati.com";
pubkey = ssh-for "shannan";
};
qubasa = {
mail = "luis.nixos@gmail.com";
pubkey = ssh-for "qubasa";

View File

@ -347,7 +347,10 @@ in {
nets = {
retiolum = {
ip4.addr = "10.243.29.171";
aliases = [ "rock.r" ];
aliases = [
"rock.r"
"loki.r"
];
tinc.pubkey = ''
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0uhNk3XXVxQcIVhD1Ime
@ -465,6 +468,7 @@ in {
aliases = [
"eva.r"
"prometheus.r"
"alertmanager.r"
];
tinc.pubkey = ''
-----BEGIN PUBLIC KEY-----
@ -508,5 +512,33 @@ in {
};
};
};
bernie = {
owner = config.krebs.users.mic92;
nets = rec {
retiolum = {
addrs = [
config.krebs.hosts.bernie.nets.retiolum.ip4.addr
config.krebs.hosts.bernie.nets.retiolum.ip6.addr
];
ip4.addr = "10.243.29.169";
aliases = [ "bernie.r" ];
tinc.pubkey = ''
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEApH5nG/Lwe/LiBkdL38vk1QcjOG/kf8dUqifouB56OQqe+MXASTSM
vhipszZqXVGgWRVrSH3WSZt0YAXTQQGEjtnAr6fSSnUek21omRGFgr47LiGJp9R8
OuhGPQs1sykIyl3HNSvDxj2EfWrXO73bKQPYdGIlfJWmsL69akWGlyYdEK1kloLC
ld5+eYICjiTtqAQ8snZQNaPIucW4cGOa0sATUP4H1jbDWtFCKE2/mR/gGo/W/opC
oOcJM7d5mb63blWVp9Zji/Gb64QltR50N3qvwc6W5ANHXIV97jYcNhSGqTsV0CEd
n0cqUqymh2e8fJdmbB4DvwqhWITn6nwuFOWoVCSFMmbiidyTm3RAH9ztZARzsQRL
Nj8OmeAr+plrzNH7AJpSkz30zukawCnbt+qWjqXLULH4kxJfOwzVh+KDfLzy7iLe
OWWrblgJZA2GHKzCC5zntNujW6Nr2AliSY2Hch2XfkLTWeNtclKIEXMkRxif5oxm
XpEJJ3lqdXz9/e37R/mkWVrdhpVfll2/v5c/PlnKMzky2mgkGpzegO0IiQcdJjrl
fuXAsh5UbnE5kt6vKL5aducScatyd5FRkNumKG5ji26eZR4lZmXn380JLDInV4n7
SODZL2fQFBnSD1wTWcq9Q/luPh4FitzJUZzHexvNxR/KBZycZJtdVw8CAwEAAQ==
-----END RSA PUBLIC KEY-----
'';
};
};
};
};
}

View File

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOBXTForyB6oNMK5bbGpALKU4lPsKRGxNLhrE/PnHHq7 shannan@bernie

View File

@ -62,8 +62,8 @@ let
};
};
users.extraUsers = singleton {
inherit (user) name uid;
users.users.${user.name} = {
inherit (user) uid;
home = cfg.dataDir;
};
};

View File

@ -12,6 +12,7 @@ with import <stockholm/lib>;
in {
hosts = mapAttrs hostDefaults {
brauerei = {
ci = false;
nets = {
retiolum = {
ip4.addr = "10.243.27.29";
@ -93,6 +94,7 @@ in {
};
bolide = {
ci = false;
nets = {
retiolum = {
ip4.addr = "10.243.27.31";
@ -130,6 +132,7 @@ in {
};
reagenzglas = {
ci = false;
nets = {
retiolum = {
ip4.addr = "10.243.27.32";

View File

@ -645,6 +645,45 @@ in {
ssh.pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPARXXe0HaP1r0pLqtInhnbYSZsP0g4VC6aaWP7qi5+w";
syncthing.id = "J6PHKTS-2JG5NOL-H5ZWOF6-6L6ENA7-L4RO6DV-BQHU7YL-CHOLDCC-S5YX3AC";
};
styx = {
cores = 1;
nets = {
retiolum = {
ip4.addr = "10.243.11.1";
ip6.addr = r6 "111";
aliases = [
"styx.r"
];
tinc.pubkey = ''
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuMJFklzpbxoDGD8LQ3tn
ETYrLu/TJjq5iSQx/JbbonJriMS3X/0+m8JREzeol67svQDuZEXTEg5EfEldxrrU
aZpNmTSmFbj2NLLCIfNBL/oLOvg9ElzhN+f+4jvakfEKi7Y7LekV25VVGrHbOEVE
3G6XWfHx5qO5Vd6kqNWQKD3LG38aZ/Lx9XYDMbujYxPGCtOsabtAz8BKo/RgOZzi
6A/54RFhdecJm0VoQk3iKpp2YqyCN6dLfJVLil4cREs4sW6nDyF4Y4l3dtZdfskq
m/MoZt6fwOjNIKuI9DGdU4/X1hQelnemstzxY5x1XwG52cz+ww0h7pMF2aggsHqn
Vmaq3b0fXrbn066Ybkbhz3UEIU9zKQGYaANGCnXxbvkd5lWbIN60GEXGE3zYJSAt
EH3FLDTGa27fTNgAnbdnSV40KWKN4FM0iY/xrt3aOXfneTP9S2fqzTVEL9vd04C/
7RWvRjvZ7mlAi+kVKSHkOibFVjeo+Z4Pvw5YxCAavrjXCiWj8zP8o3MNWcq/bMao
Uk9zBMXymm8zX43w5LNnhf59oitBjiY/mzZ3NDI9N3szMvJsaUEnhO4Kq1CWtMs2
6/TpEyRSmen1UmNwgKKFx3rELuctwMmNbOLL8cGLotEBhIk7vnZKD7NvLVX7xtOF
wzhy2N6a3ypB4XqM7dBzzAUCAwEAAQ==
-----END PUBLIC KEY-----
'';
};
wiregrill = {
ip6.addr = w6 "111";
aliases = [
"styx.w"
];
wireguard.pubkey = ''
0BZfd8f0pZMRfyoHrdYZY0cR5zfFvJcS8gQLn6xGuFs=
'';
};
};
ssh.privkey.path = <secrets/ssh.id_ed25519>;
ssh.pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII3OpzRB3382d7c2apdHC+U/R0ZlaWxXZa3GFAj54ZhU ";
};
};
users = rec {
lass = lass-blue;

View File

@ -112,13 +112,15 @@ let
hostsArchive = mkOption {
type = types.package;
default = pkgs.runCommand "retiolum-hosts.tar.bz2" {} ''
default = pkgs.runCommand "retiolum-hosts.tar.bz2" {
nativeBuildInputs = [ pkgs.gnutar pkgs.coreutils ];
} ''
cp \
--no-preserve=mode \
--recursive \
${tinc.config.hostsPackage} \
hosts
${pkgs.gnutar}/bin/tar -cjf $out hosts
tar -cjf $out hosts
'';
readOnly = true;
};

View File

@ -6,13 +6,13 @@
, time, transformers, unagi-chan, unix, unordered-containers
, vector, wai, warp
}:
mkDerivation {
mkDerivation rec {
pname = "reaktor2";
version = "0.3.0";
version = "0.4.0";
src = fetchgit {
url = "https://cgit.krebsco.de/reaktor2";
sha256 = "02hqpq8wcfd6rvi8qk10zy3f3lrzzqnjwqal4cbvksjn3vahz36h";
rev = "a6893c00f78a8acd0a4bfe7da87ab6889eabcf21";
sha256 = "0bnn23hjl57y0a5rf3h8kq078dziby7il7fandz5wh6s4i3psicp";
rev = "v${version}";
fetchSubmodules = true;
};
isLibrary = false;

View File

@ -11,7 +11,7 @@ buildGoModule rec {
sha256 = "09cciml1j8x76jpm2v5v6h2q6j1fkhsz1kswslmx8wl4wk40xgp4";
};
modSha256 = "0nlnxkpcna7g7qslyz5i1619paw4jkb1ma4fgpsgvgx1spwrjm8h";
vendorSha256 = "1v0fgin8dn81b559zz4lqmrl7hikr46g4gb18sci4riql5qs1isj";
postInstall = ''
install -D ./default.tmpl $out/templates/default.tmpl
'';

View File

@ -1,7 +1,10 @@
{
"url": "https://github.com/NixOS/nixpkgs",
"rev": "34ad166a830d3ac1541dcce571c52231f2f0865a",
"date": "2020-11-02T21:18:15-05:00",
"sha256": "1jvi1562x3kq65w642vfimpszv65zbc7c2nv8gakhzcx4n3f47xq",
"fetchSubmodules": false
"rev": "a322b32e9d74fb476944ff6cfb55833dc69cfaaa",
"date": "2020-11-19T01:15:20+01:00",
"path": "/nix/store/cgb65l8rr7v7dd4hk5sv05bnmqkcgl0n-nixpkgs",
"sha256": "1r0mkiqxija75spnyksmh8x5j4smnrxv5f7768s81gsl570kls0l",
"fetchSubmodules": false,
"deepClone": false,
"leaveDotGit": false
}

View File

@ -1,7 +1,7 @@
{
"url": "https://github.com/NixOS/nixpkgs",
"rev": "7c2a362b58a1c2ba72d24aa3869da3b1a91d39e1",
"date": "2020-10-20T09:32:31+02:00",
"sha256": "0gl4xndyahasa9dv5mi3x9w8s457wl2xh9lcldizcn1irjvkrzs4",
"rev": "f41c0fc7d8e49d94220f74495d4d702922df2a67",
"date": "2020-11-15T21:38:00-06:00",
"sha256": "01wim7ayn69y056q28ifw2f0mdypidpc0z15dda54aj5yy5vai09",
"fetchSubmodules": false
}

View File

@ -3,7 +3,7 @@ dir=$(dirname $0)
oldrev=$(cat $dir/nixpkgs.json | jq -r .rev | sed 's/\(.\{7\}\).*/\1/')
nix-shell -p nix-prefetch-git --run 'nix-prefetch-git \
--url https://github.com/NixOS/nixpkgs \
--rev refs/heads/nixos-20.03' \
--rev refs/heads/nixos-20.09' \
> $dir/nixpkgs.json
newrev=$(cat $dir/nixpkgs.json | jq -r .rev | sed 's/\(.\{7\}\).*/\1/')
git commit $dir/nixpkgs.json -m "nixpkgs: $oldrev -> $newrev"

View File

@ -19,7 +19,6 @@ with import <stockholm/lib>;
<stockholm/lass/2configs/syncthing.nix>
<stockholm/lass/2configs/nfs-dl.nix>
#<stockholm/lass/2configs/prism-share.nix>
<stockholm/lass/2configs/ssh-cryptsetup.nix>
<stockholm/lass/2configs/network-manager.nix>
<stockholm/lass/2configs/home-media.nix>
];

View File

@ -34,10 +34,7 @@
};
boot.initrd.luks = {
cryptoModules = [ "aes" "sha512" "sha1" "xts" ];
devices = [{
name = "luksroot";
device = "/dev/nvme0n1p3";
}];
devices.luksroot.device = "/dev/nvme0n1p3";
};
services.udev.extraRules = ''

View File

@ -391,6 +391,15 @@ with import <stockholm/lib>;
{ predicate = "-i wiregrill -p udp --dport 4000:4002"; target = "ACCEPT"; }
];
}
{
users.users.shannan = {
uid = genid_uint31 "shannan";
isNormalUser = true;
openssh.authorizedKeys.keys = [
config.krebs.users.shannan.pubkey
];
};
}
{
nix.trustedUsers = [ "mic92" ];
users.users.mic92 = {

View File

@ -15,7 +15,6 @@ with import <stockholm/lib>;
<stockholm/lass/2configs/bitcoin.nix>
<stockholm/lass/2configs/backup.nix>
<stockholm/lass/2configs/blue-host.nix>
<stockholm/lass/2configs/ssh-cryptsetup.nix>
<stockholm/lass/2configs/nfs-dl.nix>
<stockholm/lass/2configs/gg23.nix>
<stockholm/lass/2configs/hass>

View File

@ -0,0 +1,80 @@
{ config, pkgs, ... }:
with import <stockholm/lib>;
{
imports = [
<stockholm/lass>
<stockholm/lass/2configs/mouse.nix>
<stockholm/lass/2configs/retiolum.nix>
<stockholm/lass/2configs/baseX.nix>
<stockholm/lass/2configs/exim-retiolum.nix>
<stockholm/lass/2configs/browsers.nix>
<stockholm/lass/2configs/programs.nix>
<stockholm/lass/2configs/nfs-dl.nix>
# <stockholm/lass/2configs/gg23.nix>
# <stockholm/lass/2configs/hass>
# <stockholm/lass/2configs/br.nix>
<stockholm/lass/2configs/fetchWallpaper.nix>
<stockholm/lass/2configs/home-media.nix>
# <stockholm/lass/2configs/syncthing.nix>
# <stockholm/lass/2configs/sync/sync.nix>
# <stockholm/lass/2configs/idc.nix>
];
krebs.build.host = config.krebs.hosts.styx;
krebs.iptables.tables.filter.INPUT.rules = [
{ predicate = "-p tcp --dport ${toString config.services.smokeping.port}"; target = "ACCEPT"; }
];
services.smokeping = {
enable = true;
targetConfig = ''
probe = FPing
menu = top
title = top
+ Local
menu = Local
title = Local Network
++ LocalMachine
menu = Local Machine
title = This host
host = localhost
+ Internet
menu = internet
title = internet
++ CloudflareDNS
menu = Cloudflare DNS
title = Cloudflare DNS server
host = 1.1.1.1
++ GoogleDNS
menu = Google DNS
title = Google DNS server
host = 8.8.8.8
+ retiolum
menu = retiolum
title = retiolum
++ gum
menu = gum.r
title = gum.r
host = gum.r
++ ni
menu = ni.r
title = ni.r
host = ni.r
++ prism
menu = prism.r
title = prism.r
host = prism.r
'';
};
}

View File

@ -0,0 +1,34 @@
{ config, lib, pkgs, ... }:
{
imports = [
./config.nix
<nixpkgs/nixos/modules/installer/scan/not-detected.nix>
];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "sd_mod" ];
boot.initrd.kernelModules = [ "dm-snapshot" ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
boot.loader.grub.enable = true;
boot.loader.grub.efiSupport = true;
boot.loader.grub.device = "/dev/disk/by-id/ata-SanDisk_SSD_G5_BICS4_20248F446514";
boot.loader.grub.efiInstallAsRemovable = true;
fileSystems."/" =
{ device = "/dev/disk/by-uuid/ee5c9099-17fa-401e-852e-67cb4ae068f4";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/EAA5-88A9";
fsType = "vfat";
};
swapDevices = [ ];
nix.maxJobs = lib.mkDefault 4;
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
}

View File

@ -15,7 +15,7 @@
loader.systemd-boot.enable = true;
loader.timeout = 5;
initrd.luks.devices = [ { name = "luksroot"; device = "/dev/sda2"; } ];
initrd.luks.devices.luksroot.device = "/dev/sda2";
initrd.luks.cryptoModules = [ "aes" "sha512" "sha1" "xts" ];
initrd.availableKernelModules = [ "xhci_hcd" "ehci_pci" "ahci" "usb_storage" ];
#kernelModules = [ "kvm-intel" "msr" ];

View File

@ -25,9 +25,6 @@ in {
environment = {
DISPLAY = ":${toString config.services.xserver.display}";
};
path = with pkgs; [
qt5.full
];
serviceConfig = {
SyslogIdentifier = "copyq";
ExecStart = "${pkgs.copyq}/bin/copyq";

View File

@ -1,44 +0,0 @@
with import <stockholm/lib>;
{ ... }:
{
users.extraUsers = {
dcsovpn = rec {
name = "dcsovpn";
uid = genid "dcsovpn";
description = "user for running dcso openvpn";
home = "/home/${name}";
};
};
users.extraGroups.dcsovpn.gid = genid "dcsovpn";
services.openvpn.servers = {
dcso = {
config = ''
client
dev tun
tun-mtu 1356
mssfix
proto udp
float
remote 217.111.55.41 1194
nobind
user dcsovpn
group dcsovpn
persist-key
persist-tun
ca ${toString <secrets/dcsovpn/ca.pem>}
cert ${toString <secrets/dcsovpn/cert.pem>}
key ${toString <secrets/dcsovpn/cert.key>}
verb 3
mute 20
auth-user-pass ${toString <secrets/dcsovpn/login.txt>}
route-method exe
route-delay 2
'';
updateResolvConf = true;
};
};
}

View File

@ -2,7 +2,6 @@ with import <stockholm/lib>;
{ config, pkgs, ... }:
{
imports = [
<stockholm/krebs/2configs/nscd-fix.nix>
./binary-cache/client.nix
./backup.nix
./gc.nix
@ -223,4 +222,5 @@ with import <stockholm/lib>;
# use 24:00 time format, the default got sneakily changed around 20.03
i18n.defaultLocale = mkDefault "C.UTF-8";
system.stateVersion = mkDefault "20.03";
}

View File

@ -26,7 +26,7 @@ with import ./lib.nix { inherit lib; };
lovelaceConfigWritable = true;
};
lass.hass.config = let
services.home-assistant.config = let
tasmota_s20 = name: topic: {
platform = "mqtt";
inherit name;

View File

@ -2,38 +2,38 @@
with import ../lib.nix { inherit lib; };
{
lass.hass.config = lib.mkMerge [
services.home-assistant.config = lib.mkMerge [
(lightswitch switches.dimmer.bett lights.bett)
];
lass.hass.love = {
resources = [{
url = "https://raw.githubusercontent.com/ljmerza/light-entity-card/master/dist/light-entity-card.js.map";
type = "js";
}];
views = [{
title = "bett";
cards = [
{
type = "markdown";
title = "hello world";
content = "This is just a test";
}
{
type = "light";
entity = "light.${lights.bett}";
}
{
type = "custom:light-entity-card";
entity = "light.${lights.bett}";
}
{
type = "history-graph";
entities = [
"light.${lights.bett}"
];
}
];
}];
};
# lass.hass.love = {
# resources = [{
# url = "https://raw.githubusercontent.com/ljmerza/light-entity-card/master/dist/light-entity-card.js.map";
# type = "js";
# }];
# views = [{
# title = "bett";
# cards = [
# {
# type = "markdown";
# title = "hello world";
# content = "This is just a test";
# }
# {
# type = "light";
# entity = "light.${lights.bett}";
# }
# {
# type = "custom:light-entity-card";
# entity = "light.${lights.bett}";
# }
# {
# type = "history-graph";
# entities = [
# "light.${lights.bett}"
# ];
# }
# ];
# }];
# };
}

View File

@ -2,7 +2,7 @@
with import ../lib.nix { inherit lib; };
{
lass.hass.config = lib.mkMerge [
services.home-assistant.config = lib.mkMerge [
(detect_movement sensors.movement.essen lights.essen 10)
(lightswitch switches.dimmer.essen lights.essen)
];

View File

@ -2,7 +2,7 @@
with import ../lib.nix { inherit lib; };
{
lass.hass.config = lib.mkMerge [
services.home-assistant.config = lib.mkMerge [
(detect_movement sensors.movement.nass lights.nass 100)
(lightswitch switches.dimmer.nass lights.nass)
];

View File

@ -35,7 +35,7 @@ in {
volumes = ["/var/lib/zigbee2mqtt:/app/data"];
};
lass.hass.config = {
services.home-assistant.config = {
sensor = [
# Sensor for monitoring the bridge state
{

View File

@ -97,7 +97,6 @@ in {
overwriteProtocol = "https";
};
https = true;
nginx.enable = true;
};
services.nginx.virtualHosts."o.xanf.org" = {
enableACME = true;

View File

@ -16,7 +16,6 @@ in {
email = "acme@lassul.us";
acceptTerms = true;
certs."lassul.us" = {
allowKeysForGroup = true;
group = "lasscert";
};
};
@ -78,7 +77,6 @@ in {
email = "lassulus@lassul.us";
webroot = "/var/lib/acme/acme-challenge";
group = "nginx";
user = "nginx";
};

View File

@ -4,7 +4,6 @@ _:
./dnsmasq.nix
./ejabberd
./folderPerms.nix
./hass.nix
./hosts.nix
./klem.nix
./mysql-backup.nix

View File

@ -1,51 +0,0 @@
{ config, lib, pkgs, ... }:
with import <stockholm/lib>;
let
cfg = config.lass.hass;
in {
options.lass.hass = {
config = mkOption {
default = {};
type = with lib.types; let
valueType = nullOr (oneOf [
bool
int
float
str
(attrsOf valueType)
(listOf valueType)
]) // {
description = "Yaml value";
emptyValue.value = {};
};
in valueType;
};
love = mkOption {
default = {};
type = with lib.types; let
valueType = nullOr (oneOf [
bool
int
float
str
(attrsOf valueType)
(listOf valueType)
]) // {
description = "Yaml value";
emptyValue.value = {};
};
in valueType;
};
};
config =
assert versionOlder version "20.09";
mkIf (cfg.config != {})
{
services.home-assistant.config = cfg.config;
# services.home-assistant.lovelaceConfig = cfg.love;
};
}

View File

@ -82,8 +82,12 @@ in {
# ci
# <stockholm/makefu/2configs/exim-retiolum.nix>
<stockholm/makefu/2configs/git/cgit-retiolum.nix>
###### Shack #####
# <stockholm/makefu/2configs/shack/events-publisher>
<stockholm/makefu/2configs/shack/gitlab-runner>
# <stockholm/makefu/2configs/shack/gitlab-runner>
<stockholm/makefu/2configs/remote-build/slave.nix>
<stockholm/makefu/2configs/remote-build/aarch64-community.nix>
<stockholm/makefu/2configs/taskd.nix>

View File

@ -47,6 +47,7 @@ in {
# <stockholm/makefu/2configs/legacy_only.nix>
<stockholm/makefu/2configs/share/omo.nix>
<stockholm/makefu/2configs/share/gum-client.nix>
<stockholm/makefu/2configs/dcpp/airdcpp.nix>
{ krebs.airdcpp.dcpp.shares = let
d = path: "/media/cryptX/${path}";
@ -91,7 +92,6 @@ in {
<stockholm/makefu/2configs/bluetooth-mpd.nix>
<stockholm/makefu/2configs/ham>
<stockholm/makefu/2configs/ham/zigbee2mqtt>
{
makefu.ps3netsrv = {
enable = true;

View File

@ -37,10 +37,11 @@
passwdqc-utils
gnupg
populate
(pkgs.writeScriptBin "tor-browser" ''
#! /bin/sh
TOR_SKIP_LAUNCH=1 ${torbrowser}/bin/tor-browser
'')
# 20.09: torbrowser is broken
#(pkgs.writeScriptBin "tor-browser" ''
# #! /bin/sh
# TOR_SKIP_LAUNCH=1 ${torbrowser}/bin/tor-browser
#'')
];
networking.firewall.allowedTCPPorts = [

View File

@ -17,12 +17,14 @@ in {
PasswordAuthentication no
'';
};
users.users.auphonic = {
uid = genid "auphonic";
group = "nginx";
useDefaultShell = true;
openssh.authorizedKeys.keys = [ ident config.krebs.users.makefu.pubkey ];
};
services.logrotate = {
enable = true;
config = ''
@ -36,6 +38,12 @@ in {
}
'';
};
# 20.09 unharden nginx to write logs
systemd.services.nginx.serviceConfig.ReadWritePaths = [
"/var/spool/nginx/logs/"
];
services.nginx = {
appendHttpConfig = ''
types {
@ -55,15 +63,4 @@ in {
'';
};
};
environment.etc."netdata/python.d/web_log.conf".text = ''
nginx_log3:
name: 'nginx'
path: '/var/spool/nginx/logs/access.log'
nginx_log4:
name: 'bgt'
path: '${bgtaccess}'
'';
users.users.netdata.extraGroups = [ "nginx" ];
}

View File

@ -1,84 +1,87 @@
[
{ alias = "Turn on Fernseher on group home";
trigger = {
platform = "state";
entity_id = "group.team";
from = "not_home";
to = "home";
for.seconds = 30;
};
action = [
{
service = "homeassistant.turn_on";
entity_id = [
"switch.fernseher"
"switch.feuer"
];
}
{
service = "media_player.kodi_call_method";
data = {
entity_id = "media_player.kodi";
method = "Player.Open";
item.partymode = "music";
};
}
{
service = "notify.telegrambot";
data = {
title = "Bureau Startup";
message = "Das Büro wurde eröffnet";
};
}
];
}
{ alias = "Turn off Fernseher after last in group left";
trigger = [
{ # trigger when movement was detected at the time
{
services.home-assistant.config.automation =
[
{ alias = "Turn on Fernseher on group home";
trigger = {
platform = "state";
entity_id = "group.team";
from = "home";
to = "not_home";
}
{ # trigger at 18:00 no matter what
# to avoid 'everybody left before 18:00:00'
platform = "time";
at = "18:00:00";
}
];
action = [
{
service = "homeassistant.turn_off";
entity_id = [
"switch.fernseher"
"switch.feuer"
"light.status_felix"
"light.status_daniel"
];
}
{
service = "notify.telegrambot";
data_template = {
title = "Bureau Shutdown";
message = "All devices are turned off due to {{ trigger.platform }}";
};
}
];
condition =
{ condition = "and";
conditions = [
from = "not_home";
to = "home";
for.seconds = 30;
};
action = [
{
condition = "time";
before = "06:30:00"; #only turn off between 6:30 and 18:00
after = "18:00:00";
# weekday = [ "mon" "tue" "wed" "thu" "fri" ];
service = "homeassistant.turn_on";
entity_id = [
"switch.fernseher"
"switch.feuer"
];
}
{ # if anybody is still there
condition = "state";
entity_id = "group.team";
state = "not_home";
{
service = "media_player.kodi_call_method";
data = {
entity_id = "media_player.kodi";
method = "Player.Open";
item.partymode = "music";
};
}
{
service = "notify.telegrambot";
data = {
title = "Bureau Startup";
message = "Das Büro wurde eröffnet";
};
}
];
};
}
]
}
{ alias = "Turn off Fernseher after last in group left";
trigger = [
{ # trigger when movement was detected at the time
platform = "state";
entity_id = "group.team";
from = "home";
to = "not_home";
}
{ # trigger at 18:00 no matter what
# to avoid 'everybody left before 18:00:00'
platform = "time";
at = "18:00:00";
}
];
action = [
{
service = "homeassistant.turn_off";
entity_id = [
"switch.fernseher"
"switch.feuer"
"light.status_felix"
"light.status_daniel"
];
}
{
service = "notify.telegrambot";
data_template = {
title = "Bureau Shutdown";
message = "All devices are turned off due to {{ trigger.platform }}";
};
}
];
condition =
{ condition = "and";
conditions = [
{
condition = "time";
before = "06:30:00"; #only turn off between 6:30 and 18:00
after = "18:00:00";
# weekday = [ "mon" "tue" "wed" "thu" "fri" ];
}
{ # if anybody is still there
condition = "state";
entity_id = "group.team";
state = "not_home";
}
];
};
}
];
}

View File

@ -1,31 +1,34 @@
[
{ alias = "State on HA start-up";
trigger = {
platform = "homeassistant";
event = "start";
};
action = [
# Startup State
{ service = "mqtt.publish";
data = {
topic = "/bam/sonoffs/cmnd/state";
payload = "";
};
}
# Firmware Version
{ service = "mqtt.publish";
data = {
topic = "/bam/sonoffs/cmnd/status";
payload = "2";
};
}
# Will trigger restart of all devices!
#{ service = "mqtt.publish";
# data = {
# topic = "sonoffs/cmnd/SetOption59"; # configure sending state on power change
# payload = "1";
# };
#}
];
}
]
{
services.home-assistant.config.automation =
[
{ alias = "State on HA start-up";
trigger = {
platform = "homeassistant";
event = "start";
};
action = [
# Startup State
{ service = "mqtt.publish";
data = {
topic = "/bam/sonoffs/cmnd/state";
payload = "";
};
}
# Firmware Version
{ service = "mqtt.publish";
data = {
topic = "/bam/sonoffs/cmnd/status";
payload = "2";
};
}
# Will trigger restart of all devices!
#{ service = "mqtt.publish";
# data = {
# topic = "sonoffs/cmnd/SetOption59"; # configure sending state on power change
# payload = "1";
# };
#}
];
}
];
}

View File

@ -1,35 +1,38 @@
[
# TODO: trigger if it is before dusk and somebody arives but nachtlichter are
# off from last day
# TODO: do not have nachtlicht turned on at night
{
alias = "Turn on Nachtlicht at dusk"; # when it gets dim
trigger =
{ platform = "numeric_state";
entity_id = "sun.sun";
value_template = "{{ state.attributes.elevation }}";
below = 10;
{
services.home-assistant.config.automation =
[
# TODO: trigger if it is before dusk and somebody arives but nachtlichter are
# off from last day
# TODO: do not have nachtlicht turned on at night
{
alias = "Turn on Nachtlicht at dusk"; # when it gets dim
trigger =
{ platform = "numeric_state";
entity_id = "sun.sun";
value_template = "{{ state.attributes.elevation }}";
below = 10;
};
action =
{ service = "homeassistant.turn_on";
entity_id = [ "group.nachtlicht" ];
};
}
{
alias = "Turn off Nachtlicht at dawn";
trigger =
{ platform = "sun";
event = "sunrise";
offset = "01:30:00"; # on dawn
};
# TODO: when somebody is still in the buero
# condition =
#{
#};
action =
{ service = "homeassistant.turn_off";
entity_id = [ "group.nachtlicht" ];
};
}
]
};
action =
{ service = "homeassistant.turn_on";
entity_id = [ "group.nachtlicht" ];
};
}
{
alias = "Turn off Nachtlicht at dawn";
trigger =
{ platform = "sun";
event = "sunrise";
offset = "01:30:00"; # on dawn
};
# TODO: when somebody is still in the buero
# condition =
#{
#};
action =
{ service = "homeassistant.turn_off";
entity_id = [ "group.nachtlicht" ];
};
}
];
}

View File

@ -1,71 +1,75 @@
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";
in
{
services.home-assistant.config.automation =
[
{
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"
];
}
];
};
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";
}
];
}
];
}
{
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";
};
action = [
{ service = "homeassistant.turn_on";
entity_id = [
"script.schlechteluft"
];
}
{ condition = "time";
after = "06:00:00";
before = "20:00:00";
{ 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";
};
}
];
};
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";
};
}
];
}
]
}
];
}

View File

@ -12,6 +12,9 @@ let
# expire_after = "5"; #expire after 5 seconds
qos = 1;
};
in [
(tasmota_button "RedButton" "redbutton")
]
in {
services.home-assistant.config.binary_sensor =
[
(tasmota_button "RedButton" "redbutton")
];
}

View File

@ -1,12 +1,15 @@
[
{ platform = "mqtt";
device_class = "motion";
name = "Motion";
state_topic = "/bam/easy2/movement/Switch";
payload_on = "1";
payload_off = "0";
availability_topic = "/bam/easy2/tele/LWT";
payload_available = "Online";
payload_not_available = "Offline";
}
]
{
services.home-assistant.config.binary_sensor =
[
{ platform = "mqtt";
device_class = "motion";
name = "Motion";
state_topic = "/bam/easy2/movement/Switch";
payload_on = "1";
payload_off = "0";
availability_topic = "/bam/easy2/tele/LWT";
payload_available = "Online";
payload_not_available = "Offline";
}
];
}

View File

@ -1,10 +1,13 @@
[
{ name = "Poorly Drawn Lines";
platform = "generic";
still_image_url = http://127.0.0.1:8123/local/lines.png ;
}
{ name = "XKCD";
platform = "generic";
still_image_url = http://127.0.0.1:8123/local/xkcd.png ;
}
]
{
services.home-assistant.config.camera =
[
{ name = "Poorly Drawn Lines";
platform = "generic";
still_image_url = http://127.0.0.1:8123/local/lines.png ;
}
{ name = "XKCD";
platform = "generic";
still_image_url = http://127.0.0.1:8123/local/xkcd.png ;
}
];
}

View File

@ -5,22 +5,26 @@ let
inherit name still_image_url;
platform = "generic";
};
in [
( cam "Max-Eyth-See" https://www.wav-stuttgart.de/webcam/_/webcam1.jpg )
( cam "Wilhelma" http://webcam.wilhelma.de/webcam02/webcam02.jpg )
( cam "Marktplatz" https://webcam.stuttgart.de/wcam007/current.jpg )
( cam "Schoch Areal" https://webcam.stuttgart.de/wcam004/current.jpg )
( cam "Leuze" https://webcam.stuttgart.de/wcam005/current.jpg )
( cam "Straße Wilhelma" https://webcam.stuttgart.de/wcam006/current.jpg )
( cam "Fernsehturm 1" http://webcam.fernsehturmstuttgart.com/current.jpg )
( cam "Fernsehturm 2" http://webcam.fernsehturmstuttgart.com/current2.jpg )
( cam "Feuerbach Lemberg" http://www.regio7.de/handy/current.jpg )
( cam "Flughafen Stuttgart 1" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam2.jpg )
( cam "Flughafen Stuttgart 2" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam5.jpg )
( cam "Flughafen Stuttgart 3" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam7.jpg )
( cam "S21 1" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-03/s21-turm03.jpg )
( cam "S21 2" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-02/s21-turm-02.jpg )
( cam "S21 3" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-01/s21-turm-01.jpg )
( cam "S21 4" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Jaegerstrasse-Nordkopf/s21-jaegerstrassse-nordkopf.jpg )
( cam "S21 5" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Bahndirektion-Nord/S21-Bundesbahndirektion-Nord.jpg )
]
in
{
services.home-assistant.config.camera =
[
( cam "Max-Eyth-See" https://www.wav-stuttgart.de/webcam/_/webcam1.jpg )
( cam "Wilhelma" http://webcam.wilhelma.de/webcam02/webcam02.jpg )
( cam "Marktplatz" https://webcam.stuttgart.de/wcam007/current.jpg )
( cam "Schoch Areal" https://webcam.stuttgart.de/wcam004/current.jpg )
( cam "Leuze" https://webcam.stuttgart.de/wcam005/current.jpg )
( cam "Straße Wilhelma" https://webcam.stuttgart.de/wcam006/current.jpg )
( cam "Fernsehturm 1" http://webcam.fernsehturmstuttgart.com/current.jpg )
( cam "Fernsehturm 2" http://webcam.fernsehturmstuttgart.com/current2.jpg )
( cam "Feuerbach Lemberg" http://www.regio7.de/handy/current.jpg )
( cam "Flughafen Stuttgart 1" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam2.jpg )
( cam "Flughafen Stuttgart 2" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam5.jpg )
( cam "Flughafen Stuttgart 3" http://webcam.flughafen-stuttgart.de/Flughafen_Stuttgart_Webcam7.jpg )
( cam "S21 1" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-03/s21-turm03.jpg )
( cam "S21 2" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-02/s21-turm-02.jpg )
( cam "S21 3" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Turm-01/s21-turm-01.jpg )
( cam "S21 4" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Jaegerstrasse-Nordkopf/s21-jaegerstrassse-nordkopf.jpg )
( cam "S21 5" http://webcam-bahnprojekt-stuttgart-ulm.de/S21-Bahndirektion-Nord/S21-Bundesbahndirektion-Nord.jpg )
];
}

View File

@ -1,14 +1,17 @@
[
{ name = "Baumarkt";
platform = "generic";
still_image_url = http://t4915209254324-p80-c0-h6jv2afnujcoftrcstsafb45kdrqv4buy.webdirect.mdex.de/oneshotimage ;# baumarkt
}
{ name = "Autobahn Heilbronn";
platform = "generic";
still_image_url = https://api.svz-bw.de/v2/verkehrskameras/kameras/K10 ;
}
{ name = "Autobahn Singen";
platform = "generic";
still_image_url = https://api.svz-bw.de/v2/verkehrskameras/kameras/K11 ;
}
]
{
services.home-assistant.config.camera =
[
{ name = "Baumarkt";
platform = "generic";
still_image_url = http://t4915209254324-p80-c0-h6jv2afnujcoftrcstsafb45kdrqv4buy.webdirect.mdex.de/oneshotimage ;# baumarkt
}
{ name = "Autobahn Heilbronn";
platform = "generic";
still_image_url = https://api.svz-bw.de/v2/verkehrskameras/kameras/K10 ;
}
{ name = "Autobahn Singen";
platform = "generic";
still_image_url = https://api.svz-bw.de/v2/verkehrskameras/kameras/K11 ;
}
];
}

View File

@ -1,44 +1,53 @@
{ config, pkgs, lib, ... }:
let
kodi-host = "192.168.8.11";
ten_hours = import ./multi/10h_timers.nix { inherit lib; }; # provides: timer automation script
mittagessen = import ./multi/mittagessen.nix { inherit lib; }; # provides: automation script
matrix = import ./multi/matrix.nix { inherit lib; }; # provides: matrix automation
frosch = import ./multi/frosch.nix { inherit lib; }; # provides: sensor binary_sensor switch light script automation
aramark = import ./multi/aramark.nix { inherit lib; }; # provides: sensor binary_sensor
standup = import ./multi/daily-standup.nix { inherit lib; }; # provides: automation script
in {
imports = [
./ota.nix
./comic-updater.nix
./puppy-proxy.nix
# hass config
## complex configs
./multi/daily-standup.nix
./multi/aramark.nix
./multi/matrix.nix
./multi/frosch.nix
./multi/mittagessen.nix
./multi/10h_timers.nix
./switch/tasmota_switch.nix
./switch/rfbridge.nix
./light/statuslight.nix
./light/buzzer.nix
./script/multi_blink.nix
./binary_sensor/buttons.nix
./binary_sensor/motion.nix
# ./sensor/pollen.nix requires dwd_pollen
./sensor/espeasy.nix
./sensor/airquality.nix
./sensor/outside.nix
./sensor/tasmota_firmware.nix
./camera/verkehrskamera.nix
./camera/comic.nix
./camera/stuttgart.nix
./automation/bureau-shutdown.nix
./automation/nachtlicht.nix
./automation/schlechteluft.nix
./automation/hass-restart.nix
./device_tracker/openwrt.nix
./person/team.nix
];
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 {
services.home-assistant = {
enable = true;
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.picotts
python-forecastio jsonrpc-async jsonrpc-websocket mpd2
(callPackage ./deps/openwrt-luci-rpc.nix { })
];
};
autoExtraComponents = true;
config = {
config = {};
@ -73,7 +82,6 @@ in {
source = "hass";
};
};
matrix = matrix.matrix;
mqtt = {
discovery = true;
discovery_prefix = "homeassistant";
@ -95,13 +103,6 @@ in {
retain = true;
};
};
switch = (import ./switch/tasmota_switch.nix)
++ frosch.switch
++ (import ./switch/rfbridge.nix);
light = (import ./light/statuslight.nix)
++ (import ./light/buzzer.nix)
++ frosch.light;
timer = ten_hours.timer;
notify = [
{
platform = "kodi";
@ -115,7 +116,7 @@ in {
(builtins.fromJSON (builtins.readFile
<secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
}
] ++ matrix.notify;
];
media_player = [
{ platform = "kodi";
host = kodi-host;
@ -124,37 +125,10 @@ in {
host = "127.0.0.1";
}
];
script = lib.fold lib.recursiveUpdate {} [
((import ./script/multi_blink.nix) {inherit lib;})
frosch.script
ten_hours.script
mittagessen.script
# standup.script
];
binary_sensor =
(import ./binary_sensor/buttons.nix)
++ (import ./binary_sensor/motion.nix)
++ frosch.binary_sensor
++ aramark.binary_sensor;
sensor = []
++ [{ platform = "version"; }] # pyhaversion
++ (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)
++ frosch.sensor
++ aramark.sensor;
sensor = [{ platform = "version"; }]; # pyhaversion
camera =
(import ./camera/verkehrskamera.nix)
++ (import ./camera/comic.nix)
++ (import ./camera/stuttgart.nix);
person =
(import ./person/team.nix );
frontend = { };
http = {
@ -285,16 +259,6 @@ in {
# 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
# ++ standup.automation
++ frosch.automation
++ mittagessen.automation;
device_tracker = (import ./device_tracker/openwrt.nix );
};
};
}

View File

@ -1,32 +0,0 @@
{ 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

@ -1,16 +1,19 @@
# requires `opkg install luci-mod-rpc` on router
# see https://www.home-assistant.io/components/luci/
[
{ platform = "luci";
host = "192.168.8.1";
username = "root";
password = import <secrets/hass/router.nix>;
interval_seconds = 30; # instead of 12seconds
consider_home = 300; # 5 minutes timeout
new_device_defaults = {
track_new_devices = true;
hide_if_away = false;
};
}
]
{
services.home-assistant.config.device_tracker =
[
{ platform = "luci";
host = "192.168.8.1";
username = "root";
password = import <secrets/hass/router.nix>;
interval_seconds = 30; # instead of 12seconds
consider_home = 300; # 5 minutes timeout
new_device_defaults = {
track_new_devices = true;
hide_if_away = false;
};
}
];
}

View File

@ -12,6 +12,9 @@
WorkingDirectory = "/var/lib/kalauerbot";
ExecStart = "${pkgs.kalauerbot}/bin/kalauerbot";
PrivateTmp = true;
Restart = "always";
RuntimeMaxSec = "12h";
};
};
}

View File

@ -21,8 +21,10 @@ let
optimistic = false;
qos = 0;
};
in
[
# (tasmota_pwm "RedButton LED" "redbutton" 1 1023) #LED PWM1
(tasmota_pwm "RedButton Buzzer" "redbutton" 2 512) #buzzer PWM2
]
in {
services.home-assistant.config.light =
[
# (tasmota_pwm "RedButton LED" "redbutton" 1 1023) #LED PWM1
(tasmota_pwm "RedButton Buzzer" "redbutton" 2 512) #buzzer PWM2
];
}

View File

@ -48,9 +48,11 @@ let
12 # fire pattern
];
};
in
[
(tasmota_rgb "Status Felix" "status1")
(tasmota_rgb "Status Daniel" "status2")
(tasmota_rgb "Buslicht" "buslicht")
]
in {
services.home-assistant.config.light =
[
(tasmota_rgb "Status Felix" "status1")
(tasmota_rgb "Status Daniel" "status2")
(tasmota_rgb "Buslicht" "buslicht")
];
}

View File

@ -198,11 +198,13 @@ let
];
in
{
timer =lib.fold lib.recursiveUpdate {}
(map tmr_10h persons);
automation = (lib.flatten (map automation_10h persons));
script = lib.fold lib.recursiveUpdate {} (
(map announce_user persons) ++
(map zu_lange_user persons)
);
services.home-assistant.config = {
timer =lib.fold lib.recursiveUpdate {}
(map tmr_10h persons);
automation = (lib.flatten (map automation_10h persons));
script = lib.fold lib.recursiveUpdate {} (
(map announce_user persons) ++
(map zu_lange_user persons)
);
};
}

View File

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

View File

@ -12,13 +12,16 @@ let
((aramark "${menue}/price" "${menue} Preis") // { unit_of_measurement = ""; })
];
in
{
sensor = (aramark_menue "Menü 1")
++ (aramark_menue "Menü 2")
++ (aramark_menue "Mercato")
++ (aramark_menue "Aktion");
binary_sensor =
[
((aramark "pommes" "Pommes" ) // { payload_on = "True"; payload_off = "False"; })
];
{
services.home-assistant.config =
{
sensor = (aramark_menue "Menü 1")
++ (aramark_menue "Menü 2")
++ (aramark_menue "Mercato")
++ (aramark_menue "Aktion");
binary_sensor =
[
((aramark "pommes" "Pommes" ) // { payload_on = "True"; payload_off = "False"; })
];
};
}

View File

@ -1,4 +1,4 @@
{ lib }:
{lib, ... }:
let
random_daily_text = ''{{ [
"Es ist so weit, es ist Standup Zeit!",
@ -9,46 +9,49 @@ let
"Morgens, halb elf in Deutschland - das Standupchen" ] | random }}'';
in {
script =
{ "random_daily" = {
alias = "Random Daily Introduction";
services.home-assistant.config =
{
script =
{ "random_daily" = {
alias = "Random Daily Introduction";
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_daily_text;
language = "de";
};
}
];
};
};
automation = [
{
alias = "Daily Standup";
trigger = {
platform = "time";
at = "10:35:00";
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_daily_text;
language = "de";
};
}
];
};
action =
[
{ service = "homeassistant.turn_on";
entity_id = [
"script.blitz_10s"
"script.random_daily"
];
}
];
};
automation = [
{
alias = "Daily Standup";
trigger = {
platform = "time";
at = "10:35:00";
};
action =
[
{ service = "homeassistant.turn_on";
entity_id = [
"script.blitz_10s"
"script.random_daily"
];
}
];
}
];
}
];
};
}

View File

@ -1,4 +1,4 @@
{ lib }:
{lib, ... }:
# needs: binary_sensor.pommes
# notify.matrix_notify
let
@ -17,83 +17,87 @@ let
"Der Weltmarktpreis von Pommes ist durch verschiedene Weltkrisen leider so hoch, dass Aramark den Verkaufspreis verdoppeln musste.",
"Vorfreude, schönste Freude, Freude bei Aramark. Pommes in die Schale rein, alle Kunden werden glücklich sein.",
"In 15 Minuten ist es wieder so weit, es ist Pommes Zeit!"] | random }}'';
in {
sensor = [
{ platform = "mqtt";
name = "frosch brightness";
device_class = "illuminance";
state_topic = "/bam/frosch/sensor/brightness/state";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
binary_sensor = [
{ platform = "mqtt";
name = "frosch auge";
state_topic = "/bam/frosch/binary_sensor/froschauge/state";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
switch = [
{ platform = "mqtt";
name = "frosch blasen";
state_topic = "/bam/frosch/switch/blasen/state";
command_topic = "/bam/frosch/switch/blasen/command";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
light = [];
automation = [
{ alias = "Pommeszeit";
trigger = {
platform = "time";
at = "11:00:00";
in
{
services.home-assistant.config =
{
sensor = [
{ platform = "mqtt";
name = "frosch brightness";
device_class = "illuminance";
state_topic = "/bam/frosch/sensor/brightness/state";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
binary_sensor = [
{ platform = "mqtt";
name = "frosch auge";
state_topic = "/bam/frosch/binary_sensor/froschauge/state";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
switch = [
{ platform = "mqtt";
name = "frosch blasen";
state_topic = "/bam/frosch/switch/blasen/state";
command_topic = "/bam/frosch/switch/blasen/command";
availability_topic = "/bam/frosch/status";
payload_available = "online";
payload_not_available = "offline";
}
];
light = [];
automation = [
{ alias = "Pommeszeit";
trigger = {
platform = "time";
at = "11:00:00";
};
condition = {
condition = "state";
entity_id = "binary_sensor.pommes"; # from multi/aramark.nix
state = "on";
};
action = [
{ service = "homeassistant.turn_on";
entity_id = [
"script.pommes_announce"
"script.seifenblasen_30s" # from script/multi_blink.nix
];
}
];
}
];
script = {
pommes_announce = {
alias = "Random Pommes 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_pommes;
language = "de";
};
}
{ service = "notify.matrix_notify";
data_template.message = random_pommes;
}
];
};
condition = {
condition = "state";
entity_id = "binary_sensor.pommes"; # from multi/aramark.nix
state = "on";
};
action = [
{ service = "homeassistant.turn_on";
entity_id = [
"script.pommes_announce"
"script.seifenblasen_30s" # from script/multi_blink.nix
];
}
];
}
];
script = {
pommes_announce = {
alias = "Random Pommes 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_pommes;
language = "de";
};
}
{ service = "notify.matrix_notify";
data_template.message = random_pommes;
}
];
};
};
}

View File

@ -8,58 +8,62 @@
# name: my_command
let
mom_room = "!kTQjvTQvfVsvfEtmth:thales.citadel.team";
in {
matrix =
in
{
services.home-assistant.config =
{
# secrets:
# homeserver, username, password
homeserver = "https://ext01.citadel.team";
rooms = [
mom_room
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";
}
];
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.notizen_temperature.state_with_unit | replace (" ","")}}, Hum:{{states.sensor.notizen_humidity.state_with_unit | replace (" ","")}}, airquality:{{states.sensor.air_quality.state_with_unit}}'';
};
}
} // (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.notizen_temperature.state_with_unit | replace (" ","")}}, Hum:{{states.sensor.notizen_humidity.state_with_unit | replace (" ","")}}, airquality:{{states.sensor.air_quality.state_with_unit}}'';
};
}
];
notify = [{
name = "matrix_notify";
platform = "matrix";
default_room = mom_room;
}];
];
notify = [{
name = "matrix_notify";
platform = "matrix";
default_room = mom_room;
}];
};
}

View File

@ -38,52 +38,55 @@ let
"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";
in
{
services.home-assistant.config = {
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";
};
}
];
};
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,72 +1,81 @@
[
{ name = "Thorsten";
id = 1;
device_trackers = [
"device_tracker.thorsten_phone"
#"device_tracker.thorsten_arbeitphone"
];
}
{ name = "Felix";
id = 2;
device_trackers = [
"device_tracker.felix_phone"
"device_tracker.felix_laptop"
];
}
{ name = "Ecki";
id = 3;
device_trackers = [
"device_tracker.ecki_phone"
"device_tracker.ecki_tablet"
];
}
{ name = "Daniel";
id = 4;
device_trackers = [
"device_tracker.daniel_phone"
];
}
{ name = "Thierry";
id = 5;
device_trackers = [
"device_tracker.thierry_phone"
];
}
{ name = "Frank";
id = 6;
device_trackers = [
"device_tracker.frank_phone"
];
}
{ name = "Carsten";
id = 7;
device_trackers = [
"device_tracker.carsten_phone"
];
}
{ name = "Emeka";
id = 8;
device_trackers = [
"device_tracker.emeka_phone"
];
}
{ name = "Sabine";
id = 9;
device_trackers = [
"device_tracker.sabine_phone"
];
}
{ name = "Tobias";
id = 10;
device_trackers = [
"device_tracker.tobias_phone"
];
}
{ name = "Tancrede";
id = 11;
device_trackers = [
"device_tracker.tancrede_phone"
"device_tracker.tancrede_laptop"
];
}
]
{
services.home-assistant.config.person =
[
{ name = "Thorsten";
id = 1;
device_trackers = [
"device_tracker.thorsten_phone"
#"device_tracker.thorsten_arbeitphone"
];
}
{ name = "Felix";
id = 2;
device_trackers = [
"device_tracker.felix_phone"
"device_tracker.felix_laptop"
];
}
{ name = "Ecki";
id = 3;
device_trackers = [
"device_tracker.ecki_phone"
"device_tracker.ecki_tablet"
];
}
{ name = "Daniel";
id = 4;
device_trackers = [
"device_tracker.daniel_phone"
];
}
{ name = "Thierry";
id = 5;
device_trackers = [
"device_tracker.thierry_phone"
];
}
{ name = "Frank";
id = 6;
device_trackers = [
"device_tracker.frank_phone"
];
}
#{ name = "Carsten";
# id = 7;
# device_trackers = [
# "device_tracker.carsten_phone"
# ];
#}
{ name = "Emeka";
id = 8;
device_trackers = [
"device_tracker.emeka_phone"
];
}
{ name = "Sabine";
id = 9;
device_trackers = [
"device_tracker.sabine_phone"
];
}
#{ name = "Tobias";
# id = 10;
# device_trackers = [
# "device_tracker.tobias_phone"
# ];
#}
#{ name = "Tancrede";
# id = 11;
# device_trackers = [
# "device_tracker.tancrede_phone"
# "device_tracker.tancrede_laptop"
# ];
#}
{ name = "Chris";
id = 12;
device_trackers = [
"device_tracker.chris_phone"
];
}
];
}

View File

@ -19,39 +19,42 @@ let
) count);
};
in {
buzz_red_led = (flash_entity {
entity = "light.redbutton_buzzer";
alias = "Red Button Buzz";
count = 4;
});
buzz_red_led_fast = (flash_entity {
entity = "light.redbutton_buzzer";
delay = 250;
count = 2;
alias = "Red Button Buzz fast";
});
blitz_10s = (flash_entity {
entity = "switch.blitzdings";
delay = 10000;
count = 1;
alias = "blitz for 10 seconds";
});
blasen_10s = (flash_entity {
entity = "switch.frosch_blasen";
delay = 10000;
count = 1;
alias = "blasen for 10 seconds";
});
blasen_30s = (flash_entity {
entity = "switch.frosch_blasen";
delay = 30000;
count = 1;
alias = "blasen for 30 seconds";
});
schlechteluft = (flash_entity {
entity = "switch.bauarbeiterlampe";
alias = "Schlechte Luft Lampe 5 secs";
delay = 5000;
count = 1;
});
services.home-assistant.config.script =
{
buzz_red_led = (flash_entity {
entity = "light.redbutton_buzzer";
alias = "Red Button Buzz";
count = 4;
});
buzz_red_led_fast = (flash_entity {
entity = "light.redbutton_buzzer";
delay = 250;
count = 2;
alias = "Red Button Buzz fast";
});
blitz_10s = (flash_entity {
entity = "switch.blitzdings";
delay = 10000;
count = 1;
alias = "blitz for 10 seconds";
});
blasen_10s = (flash_entity {
entity = "switch.frosch_blasen";
delay = 10000;
count = 1;
alias = "blasen for 10 seconds";
});
blasen_30s = (flash_entity {
entity = "switch.frosch_blasen";
delay = 30000;
count = 1;
alias = "blasen for 30 seconds";
});
schlechteluft = (flash_entity {
entity = "switch.bauarbeiterlampe";
alias = "Schlechte Luft Lampe 5 secs";
delay = 5000;
count = 1;
});
};
}

View File

@ -1,9 +1,12 @@
[
# 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";
}
]
{
services.home-assistant.config.sensor =
[
# 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

@ -24,8 +24,10 @@ let
payload_available = "Online";
payload_not_available = "Offline";
};
in
(espeasy_dht22 "easy1") ++
(espeasy_dht22 "easy2") ++ [
(espeasy_ds18 "easy3" )
]
in {
services.home-assistant.config.sensor =
(espeasy_dht22 "easy1") ++
(espeasy_dht22 "easy2") ++ [
(espeasy_ds18 "easy3" )
];
}

View File

@ -1,18 +0,0 @@
[
#{ platform = "influxdb";
# queries = [
# { name = "mean value of feinstaub P1";
# where = '' "node" = 'esp8266-1355142' '';
# measurement = "feinstaub";
# database = "telegraf";
# field = "P1";
# }
# { name = "mean value of feinstaub P2";
# where = '' "node" = 'esp8266-1355142' '';
# measurement = "feinstaub";
# database = "telegraf";
# field = "P2";
# }
# ];
#}
]

View File

@ -1,25 +1,29 @@
{lib,...}: [
{ platform = "darksky";
api_key = lib.removeSuffix "\n"
(builtins.readFile <secrets/hass/darksky.apikey>);
language = "de";
monitored_conditions = [
"summary" "icon"
"nearest_storm_distance" "precip_probability"
"precip_intensity"
"temperature" # "temperature_high" "temperature_low"
"apparent_temperature"
"hourly_summary" # next 24 hours text
"humidity"
"pressure"
"uv_index"
];
units = "si" ;
scan_interval = "00:30:00";
}
{ platform = "luftdaten";
name = "Ditzingen";
sensorid = "5341";
monitored_conditions = [ "P1" "P2" ];
}
]
{lib,...}:
{
services.home-assistant.config.sensor =
[
{ platform = "darksky";
api_key = lib.removeSuffix "\n"
(builtins.readFile <secrets/hass/darksky.apikey>);
language = "de";
monitored_conditions = [
"summary" "icon"
"nearest_storm_distance" "precip_probability"
"precip_intensity"
"temperature" # "temperature_high" "temperature_low"
"apparent_temperature"
"hourly_summary" # next 24 hours text
"humidity"
"pressure"
"uv_index"
];
units = "si" ;
scan_interval = "00:30:00";
}
{ platform = "luftdaten";
name = "Ditzingen";
sensorid = "5341";
monitored_conditions = [ "P1" "P2" ];
}
];
}

View File

@ -9,8 +9,11 @@ let
payload_not_available= "Offline";
};
in
{
services.home-assistant.config.sensor =
map tasmota_firmware [
"plug" "plug2" "plug3" "plug4" "plug5"
"status1" "status2" "buslicht"
"rfbridge"
]
];
}

View File

@ -8,10 +8,12 @@ let
payload_available= "Online";
payload_not_available= "Offline";
};
in
[
(bridge "Nachtlicht A" "#414551" "#414554")
(bridge "Nachtlicht B" "#415151" "#415154")
(bridge "Nachtlicht C" "#415451" "#415454")
(bridge "Nachtlicht D" "#41551F" "#415514")
]
in {
services.home-assistant.config.switch =
[
(bridge "Nachtlicht A" "#414551" "#414554")
(bridge "Nachtlicht B" "#415151" "#415154")
(bridge "Nachtlicht C" "#415451" "#415454")
(bridge "Nachtlicht D" "#41551F" "#415514")
];
}

View File

@ -13,10 +13,13 @@ let
retain = false;
qos = 1;
};
in [
(tasmota_plug "Bauarbeiterlampe" "plug")
(tasmota_plug "Blitzdings" "plug2")
(tasmota_plug "Fernseher" "plug3")
(tasmota_plug "Feuer" "plug4")
(tasmota_plug "Blaulicht" "plug5")
]
in {
services.home-assistant.config.switch =
[
(tasmota_plug "Bauarbeiterlampe" "plug")
(tasmota_plug "Blitzdings" "plug2")
(tasmota_plug "Fernseher" "plug3")
(tasmota_plug "Feuer" "plug4")
(tasmota_plug "Blaulicht" "plug5")
];
}

View File

@ -43,9 +43,6 @@ with import <stockholm/lib>;
boot.tmpOnTmpfs = true;
systemd.tmpfiles.rules = [
"d /tmp 1777 root root - -"
];
environment.systemPackages = with pkgs; [
jq

View File

@ -14,8 +14,18 @@ with lib;
let
phpPackage = let
base = pkgs.php74;
in
base.buildEnv {
extensions = { enabled, all }: with all;
enabled ++ [
apcu redis memcached imagick
];
};
# TODO: copy-paste from lass/2/websites/util.nix
nextcloud = pkgs.nextcloud18;
nextcloud = pkgs.nextcloud20;
serveCloud = domains:
let
domain = head domains;
@ -126,6 +136,7 @@ let
services.phpfpm.pools."${domain}" = {
user = "nginx";
group = "nginx";
phpPackage = phpPackage;
settings = {
"listen.owner" = "nginx";
"pm" = "dynamic";
@ -138,7 +149,7 @@ let
"php_admin_flag[log_errors]" = "on";
"catch_workers_output" = true;
};
phpEnv."PATH" = lib.makeBinPath [ pkgs.php ];
phpEnv."PATH" = lib.makeBinPath [ phpPackage ];
};
services.phpfpm.phpOptions = ''
opcache.enable=1
@ -149,7 +160,7 @@ let
opcache.save_comments=1
opcache.revalidate_freq=1
opcache.file_cache = .opcache
zend_extension=${pkgs.php}/lib/php/extensions/opcache.so
zend_extension=${phpPackage}/lib/php/extensions/opcache.so
display_errors = on
display_startup_errors = on
@ -157,14 +168,15 @@ let
error_reporting = E_ALL | E_STRICT
html_errors = On
date.timezone = "Europe/Berlin"
# extension=${pkgs.phpPackages.memcached}/lib/php/extensions/memcached.so
extension=${pkgs.phpPackages.redis}/lib/php/extensions/redis.so
extension=${pkgs.phpPackages.apcu}/lib/php/extensions/apcu.so
'';
extension=${phpPackage}/lib/php/extensions/memcached.so
extension=${phpPackage}/lib/php/extensions/redis.so
extension=${phpPackage}/lib/php/extensions/apcu.so
'';
systemd.services."nextcloud-cron-${domain}" = {
serviceConfig = {
User = "nginx";
ExecStart = "${pkgs.php}/bin/php -f ${root}/cron.php";
ExecStart = "${phpPackage}/bin/php -f ${root}/cron.php";
};
startAt = "*:0/15";
};

View File

@ -3,10 +3,8 @@
{
environment.systemPackages = [
pkgs.python27Full # required for youcompleteme
(pkgs.vim_configurable.customize {
((pkgs.vim_configurable.override { python = pkgs.python3; }).customize {
name = "vim";
vimrcConfig.customRC = builtins.readFile ./vimrc;
vimrcConfig.vam.knownPlugins = pkgs.vimPlugins;
vimrcConfig.vam.pluginDictionaries = [

View File

@ -31,8 +31,10 @@ in
awesome.luaModules = [ pkgs.luaPackages.vicious ];
};
displayManager.defaultSession = lib.mkDefault "none+awesome";
displayManager.lightdm = { enable = true; autoLogin.enable = true; autoLogin.user = mainUser; };
desktopManager.xterm.enable = false;
displayManager.autoLogin = {
enable = true;
user = mainUser;
};
};
environment.systemPackages = [ pkgs.gnome3.defaultIconTheme ];
# lid switch is handled via button presses

View File

@ -7,27 +7,31 @@ let
};
};
sec = seconds: { delay.seconds = seconds; };
in [
{
alias = "Nightly reboot of firetv";
trigger = {
platform = "time";
at = "03:00:00";
};
action = [
(cmd "reboot")
(sec 90) # go to my music because apparently select_source does not seem to always work
(cmd "HOME")
(sec 2)
(cmd "DOWN")
(sec 2)
(cmd "DOWN")
(sec 2)
(cmd "ENTER")
(sec 4)
(cmd "RIGHT")
(sec 2)
(cmd "RIGHT")
];
}
]
in
{
services.home-assistant.config.automation =
[
{
alias = "Nightly reboot of firetv";
trigger = {
platform = "time";
at = "03:00:00";
};
action = [
(cmd "reboot")
(sec 90) # go to my music because apparently select_source does not seem to always work
(cmd "HOME")
(sec 2)
(cmd "DOWN")
(sec 2)
(cmd "DOWN")
(sec 2)
(cmd "ENTER")
(sec 4)
(cmd "RIGHT")
(sec 2)
(cmd "RIGHT")
];
}
];
}

View File

@ -2,7 +2,12 @@ let
cred = import <secrets/ham/nextcloud-calendar>;
in
{
platform = "caldav";
inherit (cred) username password;
url = "https://o.euer.krebsco.de/remote.php/dav";
services.home-assistant.config.calendar =
[
{
platform = "caldav";
inherit (cred) username password;
url = "https://o.euer.krebsco.de/remote.php/dav";
}
];
}

View File

@ -4,39 +4,33 @@
## wake-on-lan server
##
let
upkgs = (import <nixpkgs-unstable> {}).pkgs;
hlib = (import ./lib);
prefix = hlib.prefix;
tasmota = hlib.tasmota;
prefix = (import ./lib).prefix;
firetv_stick = "192.168.1.24";
hassdir = "/var/lib/hass";
zigbee = import ./multi/zigbee2mqtt.nix;
#flurlicht = import ./multi/flurlicht.nix;
kurzzeitwecker = import ./multi/kurzzeitwecker.nix;
firetv_restart = import ./multi/firetv_restart.nix;
the_playlist = import ./multi/the_playlist.nix;
fliegen-counter = import ./multi/fliegen-couter.nix;
# switch
# automation
# binary_sensor
# sensor
# input_select
# timer
in {
imports = [
./mqtt.nix
./zigbee2mqtt/default.nix
# hass config
./zigbee2mqtt/hass.nix
# ./multi/flurlicht.nix
./multi/kurzzeitwecker.nix
./multi/the_playlist.nix
./multi/fliegen-couter.nix
./device_tracker/openwrt.nix
./sensor/outside.nix
./calendar/nextcloud.nix
./automation/firetv_restart.nix
./light/groups.nix
];
services.home-assistant = {
package = (upkgs.home-assistant.overrideAttrs (old: {
doCheck = false;
checkPhase = ":";
installCheckPhase = ":";
})).override {
extraPackages = ps: with ps; [
python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts androidtv
];
};
config = {
influxdb = {
database = "ham";
@ -48,8 +42,6 @@ in {
};
config = {};
input_select = zigbee.input_select; # dict
timer = zigbee.timer // kurzzeitwecker.timer; # dict
homeassistant = {
name = "Home"; time_zone = "Europe/Berlin";
latitude = "48.7687";
@ -60,12 +52,10 @@ in {
conversation = {};
history = {};
logbook = {};
counter = fliegen-counter.counter;
logger = {
default = "info";
};
rest_command = {}
// the_playlist.rest_command;
rest_command = {};
tts = [
{ platform = "google_translate";
language = "de";
@ -81,7 +71,7 @@ in {
# "platform": "broadcast",
# "api_key": "", # talk to Botfather /newbot
# "allowed_chat_ids": [ ID ] # curl -X GET # https://api.telegram.org/bot<YOUR_API_TOKEN>/getUpdates
#}
# }
(builtins.fromJSON
(builtins.readFile <secrets/hass/telegram-bot.json>))
];
@ -101,7 +91,6 @@ in {
];
sun.elevation = 247;
recorder = {};
device_tracker = (import ./device_tracker/openwrt.nix);
media_player = [
{ platform = "FireTV Stick kodi";
host = firetv_stick;
@ -149,25 +138,12 @@ in {
monitored_conditions = [ "ping" "download" "upload" ];
}
# https://www.home-assistant.io/cookbook/automation_for_rainy_days/
]
++ ((import ./sensor/outside.nix) {inherit lib;})
++ the_playlist.sensor
++ zigbee.sensor ;
];
frontend = { };
calendar = [ (import ./calendar/nextcloud.nix) ];
# light = flurlicht.light;
http = { };
switch = [];
automation = []
++ (import ./automation/firetv_restart.nix)
++ kurzzeitwecker.automation
#++ flurlicht.automation
++ the_playlist.automation
++ fliegen-counter.automation
++ zigbee.automation;
script =
{ }
// kurzzeitwecker.script; # dict
automation = [];
script = { };
};
enable = true;
configDir = hassdir;

View File

@ -1,10 +1,13 @@
[
{ platform = "luci";
host = "192.168.1.5";
username = "root";
password = import <secrets/hass/router.nix>;
interval_seconds = 30; # instead of 12seconds
consider_home = 300; # 5 minutes timeout
new_device_defaults.track_new_devices = true;
}
]
{
services.home-assistant.config.device_tracker =
[
{ platform = "luci";
host = "192.168.1.5";
username = "root";
password = import <secrets/hass/router.nix>;
interval_seconds = 30; # instead of 12seconds
consider_home = 300; # 5 minutes timeout
new_device_defaults.track_new_devices = true;
}
];
}

View File

@ -0,0 +1,41 @@
let
arbeitszimmer_licht = [
"light.led_wand"
"light.arbeitszimmer_led1_led_strip" # LED-Kreis in cube
"light.arbeitszimmer_flur_osram_light"
"light.arbeitszimmer_schrank_dimmer_light"
"light.arbeitszimmer_schrank_osram_light"
];
wohnzimmer_licht = [
"light.wohnzimmer_fernseher_led_strip" # led um fernseher
"light.wohnzimmer_komode_osram_light"
"light.wohnzimmer_schrank_osram_light"
"light.wohnzimmer_stehlampe_osram_light"
];
schlafzimmer_licht = [
"schlafzimmer_komode_osram_light"
];
in {
services.home-assistant.config.light = [
{
platform = "group";
name = "Arbeitszimmer Lichter";
entities = arbeitszimmer_licht;
}
{
platform = "group";
name = "Wohnzimmer Lichter";
entities = wohnzimmer_licht;
}
{
platform = "group";
name = "Schlafzimmer Lichter";
entities = schlafzimmer_licht;
}
{
platform = "group";
name = "Alle Lichter";
entities = arbeitszimmer_licht ++ wohnzimmer_licht ++ schlafzimmer_licht;
}
];
}

View File

@ -15,53 +15,57 @@ let
data.entity_id = "counter.${for}_fliegen";
}) incr;
};
in {
counter = {
felix_fliegen = {};
misa_fliegen = {};
in
{
services.home-assistant.config =
{
counter = {
felix_fliegen = {};
misa_fliegen = {};
};
automation = [
(fly_swat "misa" "btn1" "single" 1)
(fly_swat "misa" "btn1" "double" 2)
(fly_swat "misa" "btn1" "triple" 3)
(fly_swat "felix" "btn2" "single" 1)
(fly_swat "felix" "btn2" "double" 2)
(fly_swat "felix" "btn2" "triple" 3)
{
alias = "Send Fly Counter Update";
trigger = [
{
platform = "state";
entity_id = "counter.felix_fliegen";
}
{
platform = "state";
entity_id = "counter.misa_fliegen";
#above = -1;
}
];
action = {
service = "mqtt.publish";
data_template = { # gauge-style
payload = "{{ trigger.to_state.state }}";
topic = "${hlib.prefix}/flycounter/{{ trigger.to_state.object_id }}";
};
};
}
{
alias = "Reset Fly counters on midnight";
trigger = {
platform = "time";
at = "01:00:00";
};
action = [
{ service = "counter.reset";
data.entity_id = "counter.misa_fliegen";
}
{ service = "counter.reset";
data.entity_id = "counter.felix_fliegen";
}
];
}
];
};
automation = [
(fly_swat "misa" "btn1" "single" 1)
(fly_swat "misa" "btn1" "double" 2)
(fly_swat "misa" "btn1" "triple" 3)
(fly_swat "felix" "btn2" "single" 1)
(fly_swat "felix" "btn2" "double" 2)
(fly_swat "felix" "btn2" "triple" 3)
{
alias = "Send Fly Counter Update";
trigger = [
{
platform = "state";
entity_id = "counter.felix_fliegen";
}
{
platform = "state";
entity_id = "counter.misa_fliegen";
#above = -1;
}
];
action = {
service = "mqtt.publish";
data_template = { # gauge-style
payload = "{{ trigger.to_state.state }}";
topic = "${hlib.prefix}/flycounter/{{ trigger.to_state.object_id }}";
};
};
}
{
alias = "Reset Fly counters on midnight";
trigger = {
platform = "time";
at = "01:00:00";
};
action = [
{ service = "counter.reset";
data.entity_id = "counter.misa_fliegen";
}
{ service = "counter.reset";
data.entity_id = "counter.felix_fliegen";
}
];
}
];
}

View File

@ -8,125 +8,128 @@
# notify.telegrambot
let
button = "sensor.zigbee_btn2_click";
in {
timer.kurzzeitwecker =
{
name = "Zigbee Kurzzeitwecker";
duration = 300;
};
script.add_5_minutes_to_kurzzeitwecker =
in
{
services.home-assistant.config = {
timer.kurzzeitwecker =
{
alias = "Add 5 minutes to kurzzeitwecker";
sequence = [
{ service = "timer.pause";
entity_id = "timer.kurzzeitwecker";
}
{ service = "timer.start";
data_template = {
name = "Zigbee Kurzzeitwecker";
duration = 300;
};
script.add_5_minutes_to_kurzzeitwecker =
{
alias = "Add 5 minutes to kurzzeitwecker";
sequence = [
{ service = "timer.pause";
entity_id = "timer.kurzzeitwecker";
duration = ''
{% set r = state_attr('timer.kurzzeitwecker', 'remaining') ~ '-0000' %}
{% set t = strptime(r, '%H:%M:%S.%f%z') %}
{{ (as_timestamp(t) + 300) | timestamp_custom('%H:%M:%S', false) }}
'';
}
{ service = "timer.start";
data_template = {
entity_id = "timer.kurzzeitwecker";
duration = ''
{% set r = state_attr('timer.kurzzeitwecker', 'remaining') ~ '-0000' %}
{% set t = strptime(r, '%H:%M:%S.%f%z') %}
{{ (as_timestamp(t) + 300) | timestamp_custom('%H:%M:%S', false) }}
'';
};
}
];
};
automation =
[
{
alias = "Start Timer 5min";
trigger = {
platform = "state";
entity_id = button;
to = "single";
};
condition =
{ condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "idle";
};
action = [
{ service = "timer.start";
entity_id = "timer.kurzzeitwecker";
data.duration = "00:05:00";
}
{
service = "notify.telegrambot";
data.message = "Timer gestartet {{state_attr('timer.kurzzeitwecker', 'remaining') }}, verbleibend ";
}
];
}
{
alias = "Add Timer 5min";
trigger = {
platform = "state";
entity_id = button;
to = "single";
};
condition =
{ condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "active";
};
action = [
{ service = "homeassistant.turn_on";
entity_id = "script.add_5_minutes_to_kurzzeitwecker";
}
{
service = "notify.telegrambot";
data.message = ''Timer um 5 minuten verlängert, {{ state_attr('timer.kurzzeitwecker', 'remaining') | truncate(9,True," ") }} verbleibend '';
}
];
}
{
alias = "Stop timer on double click";
trigger = [
{
platform = "state";
entity_id = button;
to = "double";
}
{
platform = "state";
entity_id = button;
to = "triple";
}
];
condition =
{
condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "active";
};
action = [
{
service = "timer.cancel";
entity_id = "timer.kurzzeitwecker";
}
{
service = "notify.telegrambot";
data.message = "Timer gestoppt, abgebrochen";
}
];
}
{
alias = "Timer Finished";
trigger = {
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.kurzzeitwecker";
};
action = [
{
service = "notify.telegrambot";
data.message = "Timer beendet";
}
];
}
];
};
automation =
[
{
alias = "Start Timer 5min";
trigger = {
platform = "state";
entity_id = button;
to = "single";
};
condition =
{ condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "idle";
};
action = [
{ service = "timer.start";
entity_id = "timer.kurzzeitwecker";
data.duration = "00:05:00";
}
{
service = "notify.telegrambot";
data.message = "Timer gestartet {{state_attr('timer.kurzzeitwecker', 'remaining') }}, verbleibend ";
}
];
}
{
alias = "Add Timer 5min";
trigger = {
platform = "state";
entity_id = button;
to = "single";
};
condition =
{ condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "active";
};
action = [
{ service = "homeassistant.turn_on";
entity_id = "script.add_5_minutes_to_kurzzeitwecker";
}
{
service = "notify.telegrambot";
data.message = ''Timer um 5 minuten verlängert, {{ state_attr('timer.kurzzeitwecker', 'remaining') | truncate(9,True," ") }} verbleibend '';
}
];
}
{
alias = "Stop timer on double click";
trigger = [
{
platform = "state";
entity_id = button;
to = "double";
}
{
platform = "state";
entity_id = button;
to = "triple";
}
];
condition =
{
condition = "state";
entity_id = "timer.kurzzeitwecker";
state = "active";
};
action = [
{
service = "timer.cancel";
entity_id = "timer.kurzzeitwecker";
}
{
service = "notify.telegrambot";
data.message = "Timer gestoppt, abgebrochen";
}
];
}
{
alias = "Timer Finished";
trigger = {
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.kurzzeitwecker";
};
action = [
{
service = "notify.telegrambot";
data.message = "Timer beendet";
}
];
}
];
}

View File

@ -7,77 +7,80 @@
# automation
# sensor
{
rest_command = {
good_song = {
url = "http://prism.r:8001/good";
method = "POST";
};
bad_song = {
url = "http://prism.r:8001/skip";
method = "POST";
services.home-assistant.config =
{
rest_command = {
good_song = {
url = "http://prism.r:8001/good";
method = "POST";
};
bad_song = {
url = "http://prism.r:8001/skip";
method = "POST";
};
};
automation = [
{
alias = "playlist song publish";
trigger = {
#platform = "event";
#event_data.entity_id = "sensor.the_playlist_song";
platform = "state";
entity_id = "sensor.the_playlist_song";
};
action = {
service = "mqtt.publish";
data = {
topic = "/ham/the_playlist/song";
payload_template = "{{ states.sensor.the_playlist_song.state }}";
};
};
}
{
alias = "playlist upvote on button";
trigger = {
platform = "state";
entity_id = "binary_sensor.playlist_button_good";
from = "off";
to = "on";
};
action.service = "rest_command.good_song";
}
{
alias = "playlist downvote on button";
trigger = {
platform = "state";
entity_id = "binary_sensor.playlist_button_bad";
from = "off";
to = "on";
};
action.service = "rest_command.bad_song";
}
];
sensor = [
{ platform = "rest";
name = "pl";
resource = "http://prism.r:8001/current";
scan_interval = 30;
value_template = "1";
json_attributes = [ "name" "filename" "youtube" ];
}
{ platform = "template";
sensors = {
the_playlist_song = {
friendly_name = "Current Song";
value_template = ''{{ states.sensor.pl.attributes['name'] }}'';
};
the_playlist_url = {
friendly_name = "Song Youtube URL";
value_template = ''{{ states.sensor.pl.attributes['youtube'] }}'';
};
the_playlist_filename = {
friendly_name = "Song Filename";
value_template = ''{{ states.sensor.pl.attributes['filename'] }}'';
};
};
}
];
};
automation = [
{
alias = "playlist song publish";
trigger = {
#platform = "event";
#event_data.entity_id = "sensor.the_playlist_song";
platform = "state";
entity_id = "sensor.the_playlist_song";
};
action = {
service = "mqtt.publish";
data = {
topic = "/ham/the_playlist/song";
payload_template = "{{ states.sensor.the_playlist_song.state }}";
};
};
}
{
alias = "playlist upvote on button";
trigger = {
platform = "state";
entity_id = "binary_sensor.playlist_button_good";
from = "off";
to = "on";
};
action.service = "rest_command.good_song";
}
{
alias = "playlist downvote on button";
trigger = {
platform = "state";
entity_id = "binary_sensor.playlist_button_bad";
from = "off";
to = "on";
};
action.service = "rest_command.bad_song";
}
];
sensor = [
{ platform = "rest";
name = "pl";
resource = "http://prism.r:8001/current";
scan_interval = 30;
value_template = "1";
json_attributes = [ "name" "filename" "youtube" ];
}
{ platform = "template";
sensors = {
the_playlist_song = {
friendly_name = "Current Song";
value_template = ''{{ states.sensor.pl.attributes['name'] }}'';
};
the_playlist_url = {
friendly_name = "Song Youtube URL";
value_template = ''{{ states.sensor.pl.attributes['youtube'] }}'';
};
the_playlist_filename = {
friendly_name = "Song Filename";
value_template = ''{{ states.sensor.pl.attributes['filename'] }}'';
};
};
}
];
}

View File

@ -1,127 +0,0 @@
# provides:
# switch
# automation
# binary_sensor
# sensor
# input_select
# timer
let
inherit (import ../lib) zigbee;
prefix = zigbee.prefix;
in {
sensor =
[
# Sensor for monitoring the bridge state
{
platform = "mqtt";
name = "Zigbee2mqtt Bridge state";
state_topic = "${prefix}/bridge/state";
icon = "mdi:router-wireless";
}
# Sensor for Showing the Zigbee2mqtt Version
{
platform = "mqtt";
name = "Zigbee2mqtt Version";
state_topic = "${prefix}/bridge/config";
value_template = "{{ value_json.version }}";
icon = "mdi:zigbee";
}
# Sensor for Showing the Coordinator Version
{
platform = "mqtt";
name = "Coordinator Version";
state_topic = "${prefix}/bridge/config";
value_template = "{{ value_json.coordinator }}";
icon = "mdi:chip";
}
];
switch = [
{
platform = "mqtt";
name = "Zigbee2mqtt Main join";
state_topic = "${prefix}/bridge/config/permit_join";
command_topic = "${prefix}/bridge/config/permit_join";
payload_on = "true";
payload_off = "false";
}
];
automation = [
{
alias = "Zigbee2mqtt Log Level";
initial_state = "on";
trigger = {
platform = "state";
entity_id = "input_select.zigbee2mqtt_log_level";
};
action = [
{
service = "mqtt.publish";
data = {
payload_template = "{{ states('input_select.zigbee2mqtt_log_level') }}";
topic = "${prefix}/bridge/config/log_level";
};
}
];
}
# Automation to start timer when enable join is turned on
{
id = "zigbee_join_enabled";
alias = "Zigbee Join Enabled";
trigger =
{
platform = "state";
entity_id = "switch.zigbee2mqtt_main_join";
to = "on";
};
action =
{
service = "timer.start";
entity_id = "timer.zigbee_permit_join";
};
}
# # Automation to stop timer when switch turned off and turn off switch when timer finished
{
id = "zigbee_join_disabled";
alias = "Zigbee Join Disabled";
trigger = [
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.zigbee_permit_join";
}
{
platform = "state";
entity_id = "switch.zigbee2mqtt_main_join";
to = "off";
}
];
action = [
{ service = "timer.cancel";
data.entity_id = "timer.zigbee_permit_join";
}
{ service = "switch.turn_off";
entity_id = "switch.zigbee2mqtt_main_join";
}
];
}
];
input_select.zigbee2mqtt_log_level =
{
name = "Zigbee2mqtt Log Level";
options = [
"debug"
"info"
"warn"
"error"
];
initial = "info";
icon = "mdi:format-list-bulleted";
};
timer.zigbee_permit_join =
{
name = "Zigbee Time remaining";
duration = 120;
};
}

View File

@ -1,20 +1,25 @@
{lib,...}: [
{ platform = "darksky";
api_key = lib.removeSuffix "\n"
(builtins.readFile <secrets/hass/darksky.apikey>);
language = "de";
monitored_conditions = [
"summary" "icon"
"nearest_storm_distance" "precip_probability"
"precip_intensity"
"temperature" # "temperature_high" "temperature_low"
"apparent_temperature"
"hourly_summary" # next 24 hours text
"humidity"
"pressure"
"uv_index"
];
units = "si" ;
scan_interval = "00:30:00";
}
]
{lib,...}:
{
services.home-assistant.config.sensor =
[
{ platform = "darksky";
api_key = lib.removeSuffix "\n"
(builtins.readFile <secrets/hass/darksky.apikey>);
language = "de";
monitored_conditions = [
"summary" "icon"
"nearest_storm_distance" "precip_probability"
"precip_intensity"
"temperature" # "temperature_high" "temperature_low"
"apparent_temperature"
"hourly_summary" # next 24 hours text
"humidity"
"pressure"
"uv_index"
];
units = "si" ;
scan_interval = "00:30:00";
}
];
}

Some files were not shown because too many files have changed in this diff Show More