Merge remote-tracking branch 'gum/master'

This commit is contained in:
lassulus 2020-03-23 10:15:42 +01:00
commit 8c27f12f86
84 changed files with 1634 additions and 692 deletions

View File

@ -8,7 +8,7 @@ before_script:
# prepare git fetching of secrets
- echo "$gitlab_deploy_privkey" > ~/.ssh/gitlab_deploy.key
- chmod 600 ~/.ssh/gitlab_deploy.key
- ssh-keyscan -H 'ssh.git.shackspace.de' >> ~/.ssh/known_hosts
- echo "$ssh_git_shackspace_serverkey" >> ~/.ssh/known_hosts
# import secret key for secrets
- echo "$secrets_gpg_key" | gpg --import
deployment test:

View File

@ -0,0 +1 @@
LOL

View File

@ -6,12 +6,13 @@
platform = "homeassistant";
event = "start";
};
# trigger good/bad air
action = [
{ service = "light.turn_on";
data = {
entity_id = "light.fablab_led";
effect = "Rainbow";
color_name = "yellow";
color_name = "purple";
};
}
];

View File

@ -0,0 +1,82 @@
# needs:
# binary_sensor.portal_lock
# sensor.keyholder
# media_player.lounge
let
glados = import ../lib;
in
[
{
alias = "Greet new keyholder for key exchange";
initial_state = true;
trigger = {
platform = "state";
entity_id = "sensor.keyholder";
};
condition = {
condition = "template";
value_template = "{{ trigger.from_state.state != 'No Keyholder' }}";
};
action = glados.say.kiosk "Danke {{trigger.to_state.state}} für das Übernehmen des Keys von {{trigger.from_state.state}}";
# action = [];
}
{
alias = "Start Music on portal lock on";
# TODO: use "power" trigger
trigger = {
platform = "state";
entity_id = "binary_sensor.portal_lock";
to = "on";
for.seconds = 30;
};
condition = {
condition = "and";
conditions =
[
{ # only start if a keyholder opened the door and if the lounge mpd is currently not playing anything
condition = "template";
value_template = "{{ state('sensor.keyholder') != 'No Keyholder' }}";
}
{
condition = "state";
entity_id = "media_player.lounge";
state = "idle";
}
];
};
action = [
{
service = "media_player.volume_set";
data = {
entity_id = "media_player.lounge";
volume_level = 1.0;
};
}
{
service = "media_player.play_media";
data = {
entity_id = "media_player.lounge";
media_content_type = "playlist";
media_content_id = "ansage";
};
}
{ delay.seconds = 8; }
{
service = "media_player.volume_set";
data = {
entity_id = "media_player.lounge";
volume_level = 0.6;
};
}
{
service = "media_player.play_media";
data = {
entity_id = "media_player.lounge";
media_content_type = "playlist";
media_content_id = "lassulus superradio";
};
}
];
}
]

View File

@ -39,7 +39,7 @@ in {
'';
})).override {
extraPackages = ps: with ps; [
python-forecastio jsonrpc-async jsonrpc-websocket mpd2
python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts
];
};
autoExtraComponents = true;
@ -76,6 +76,8 @@ in {
client_id = "home-assistant";
keepalive = 60;
protocol = 3.1;
discovery = true; #enable esphome discovery
discovery_prefix = "homeassistant";
birth_message = {
topic = "glados/hass/status/LWT";
payload = "Online";
@ -89,21 +91,34 @@ in {
retain = true;
};
};
switch = wasser.switch;
light = badair.light;
switch =
wasser.switch
++ (import ./switch/power.nix)
;
light = [];
media_player = [
{ platform = "mpd";
name = "lounge";
host = "lounge.mpd.shack";
}
{ platform = "mpd";
name = "kiosk";
host = "lounge.kiosk.shack";
}
];
sensor =
(import ./sensors/hass.nix)
++ (import ./sensors/power.nix)
(import ./sensors/power.nix)
++ (import ./sensors/mate.nix)
++ (import ./sensors/darksky.nix { inherit lib;})
++ shackopen.sensor
++ badair.sensor;
;
air_quality = (import ./sensors/sensemap.nix );
binary_sensor = shackopen.binary_sensor;
binary_sensor =
shackopen.binary_sensor
++ (import ./sensors/spaceapi.nix)
;
camera = [];
@ -117,19 +132,27 @@ in {
#conversation = {};
history = {};
logbook = {};
logger = {
default = "info";
};
recorder = {};
tts = [
{ platform = "google_translate";
service_name = "say";
language = "de";
cache = true;
time_memory = 57600;
}
{ platform = "picotts";
language = "de-DE";
service_name = "pico";
}
#{ platform = "picotts";
# language = "de-DE";
#}
];
sun = {};
automation = wasser.automation
++ badair.automation
automation = wasser.automation
++ badair.automation
++ (import ./automation/shack-startup.nix)
++ (import ./automation/hass-restart.nix);
device_tracker = [];

View File

@ -2,89 +2,48 @@ let
prefix = "glados";
in
{
esphome =
say = let
# returns a list of actions to be performed on an mpd to say something
tts = { message, entity }:
[
{
service = "media_player.turn_on";
data.entity_id = "media_player.${entity}";
}
{ service = "media_player.play_media";
data = {
entity_id = "media_player.${entity}";
media_content_type = "playlist";
media_content_id = "ansage";
};
}
{
service = "media_player.turn_on";
data.entity_id = "media_player.${entity}";
}
{ delay.seconds = 8; }
{ service = "tts.say";
entity_id = "media_player.${entity}";
data_template = {
inherit message;
language = "de";
};
}
];
in
{
temp = {host, topic ? "temperature" }:
{
platform = "mqtt";
name = "${host} Temperature";
device_class = "temperature";
unit_of_measurement = "°C";
icon = "mdi:thermometer";
state_topic = "${prefix}/${host}/sensor/${topic}/state";
availability_topic = "${prefix}/${host}/status";
payload_available = "online";
payload_not_available = "offline";
lounge = message: tts {
inherit message;
entity = "lounge";
};
hum = {host, topic ? "humidity" }:
{
platform = "mqtt";
unit_of_measurement = "%";
icon = "mdi:water-percent";
device_class = "humidity";
name = "${host} Humidity";
state_topic = "${prefix}/${host}/sensor/${topic}/state";
availability_topic = "${prefix}/${host}/status";
payload_available = "online";
payload_not_available = "offline";
herrenklo = message: tts {
inherit message;
entity = "herrenklo";
};
# copied from "homeassistant/light/fablab_led/led_ring/config"
led = {host, topic ? "led", name ? host}:
{ # name: fablab_led
# topic: led_ring
platform = "mqtt";
inherit name;
schema = "json";
brightness = true;
rgb = true;
effect = true;
effect_list = [ # TODO: may be different
"Random"
"Strobe"
"Rainbow"
"Color Wipe"
"Scan"
"Twinkle"
"Fireworks"
"Addressable Flicker"
"None"
];
state_topic = "${prefix}/${host}/light/${topic}/state";
command_topic = "${prefix}/${host}/light/${topic}/command";
availability_topic = "${prefix}/${host}/status";
payload_available = "online";
payload_not_available = "offline";
qos = 1;
};
# Feinstaub
dust_25m = { host, name ? "${host} < 2.5µm", topic ? "particulate_matter_25m_concentration" }:
{
platform = "mqtt";
unit_of_measurement = "µg/m³";
icon = "mdi:chemical-weapon";
inherit name;
state_topic = "${prefix}/${host}/sensor/${topic}/state";
availability_topic = "${prefix}/${host}/status";
};
dust_100m = {host, name ? "${host} < 10µm", topic ? "particulate_matter_100m_concentration" }:
{
platform = "mqtt";
unit_of_measurement = "µg/m³";
icon = "mdi:chemical-weapon";
inherit name;
state_topic = "${prefix}/${host}/sensor/${topic}/state";
availability_topic = "${prefix}/${host}/status";
};
switch = {host, name ? "${host} Button", topic ? "btn" }:
# host: ampel
# name: Button 1
# topic: btn1
{
inherit name;
platform = "mqtt";
state_topic = "${prefix}/${host}/sensor/${topic}/state";
command_topic = "${prefix}/${host}/switch/${topic}/state";
availability_topic = "${prefix}/${host}/status";
kiosk = message: tts {
inherit message;
entity = "kiosk";
};
};
tasmota =

View File

@ -0,0 +1,13 @@
let
glados = import ../lib;
in
{
# LED
light = [
];
sensor = [
];
automation =
[
];
}

View File

@ -2,20 +2,6 @@ let
glados = import ../lib;
in
{
# LED
light = [
(glados.esphome.led { name = "Fablab LED"; host = "fablab_led"; topic = "led_ring"; })
(glados.esphome.led { name = "Fablab LED Part A"; host = "fablab_led"; topic = "A";})
(glados.esphome.led { name = "Fablab LED Part B"; host = "fablab_led"; topic = "B";})
(glados.esphome.led { name = "Fablab LED Part C"; host = "fablab_led"; topic = "C";})
(glados.esphome.led { name = "Fablab LED Part D"; host = "fablab_led"; topic = "D";})
];
sensor = [
(glados.esphome.temp { host = "fablab_feinstaub";})
(glados.esphome.dust_25m { host = "fablab_feinstaub";})
(glados.esphome.dust_100m { host = "fablab_feinstaub";})
];
automation =
[
{ alias = "Gute Luft Fablab";

View File

@ -0,0 +1,21 @@
{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:15:00";
}
]

View File

@ -1,5 +0,0 @@
let
glados = import ../lib;
in
(map (host: glados.esphome.temp {inherit host;}) [ "lounge" "werkstatt" "herrenklo" "dusche" "fablab" "whc" ])
++ (map (host: glados.esphome.hum {inherit host;}) [ "lounge" "werkstatt" "herrenklo" "dusche" "fablab" "whc" ])

View File

@ -0,0 +1,16 @@
let
fuellstand = name: id: {
platform = "rest";
resource = "https://ora5.tutschonwieder.net/ords/lick_prod/v1/get/fuellstand/1/${toString id}";
method = "GET";
name = "Füllstand ${name}";
value_template = "{{ value_json.fuellstand }}";
};
in [
(fuellstand "Wasser" 1)
(fuellstand "Mate Cola" 2)
(fuellstand "Apfelschorle" 3)
(fuellstand "Zitronensprudel" 4)
(fuellstand "Mate 1" 26)
(fuellstand "Mate 2" 27)
]

View File

@ -2,7 +2,6 @@ let
power_x = name: phase:
{ platform = "mqtt";
name = "${phase} ${name}";
# device_class = "power";
state_topic = "/power/total/${phase}/${name}";
availability_topic = "/power/lwt";
payload_available = "Online";
@ -11,17 +10,17 @@ let
power_consumed =
{ platform = "mqtt";
name = "Power Consumed";
#device_class = "power";
device_class = "power";
state_topic = "/power/total/consumed";
availability_topic = "/power/lwt";
payload_available = "Online";
payload_not_available = "Offline";
};
power_volt = power_x "Voltage";
power_watt = power_x "Power";
power_watt = (power_x "Power") ;
power_curr = power_x "Current";
in
(map power_volt [ "L1" "L2" "L3" ])
++ (map power_watt [ "L1" "L2" "L3" ])
++ (map (x: ((power_watt x) // { device_class = "power"; })) [ "L1" "L2" "L3" ])
++ (map power_curr [ "L1" "L2" "L3" ])
++ [ power_consumed ]

View File

@ -0,0 +1,6 @@
[
{
platform = "opensensemap";
station_id = "56a0de932cb6e1e41040a68b";
}
]

View File

@ -0,0 +1,52 @@
[
{
platform = "rest";
resource = "https://spaceapi.afra-berlin.de/v1/status.json";
method = "GET";
name = "Door AFRA Berlin";
device_class = "door";
value_template = "{{ value_json.open }}";
}
{
platform = "rest";
resource = "http://club.entropia.de/spaceapi";
method = "GET";
name = "Door Entropia";
device_class = "door";
value_template = "{{ value_json.open }}";
}
{
platform = "rest";
resource = "http://www.c-base.org/status.json";
method = "GET";
name = "Door C-Base Berlin";
device_class = "door";
value_template = "{{ value_json.open }}";
}
{
platform = "rest";
resource = "https://status.raumzeitlabor.de/api/full.json";
method = "GET";
name = "Door RZL";
device_class = "door";
value_template = "{{ value_json.status }}";
}
{
platform = "rest";
resource = "https://datenobservatorium.de/";
method = "GET";
name = "Door Datenobservatorium";
device_class = "door";
value_template = "false";
scan_interval = 2592000;
}
{
platform = "rest";
resource = "https://infuanfu.de/";
method = "GET";
name = "Door Infuanfu";
device_class = "door";
value_template = "false";
scan_interval = 2592000;
}
]

View File

@ -0,0 +1,6 @@
{
controllers = {
host = "unifi.shack";
site = "shackspace";
};
}

View File

@ -0,0 +1,32 @@
# 1 - haupt
# 2 - dusche
# 3 - warmwasser
# 4 - or
# 5 - kueche
let
nodelight = type: ident: name: {
platform = "mqtt";
name = "${type} ${name}";
command_topic = "${type}/${toString ident}/command";
state_topic = "${type}/${toString ident}/state";
payload_on = "on";
payload_off = "off";
};
power = nodelight "power";
light = ident: name: { icon = "mdi:lightbulb";} // nodelight "light" ident name;
in
[
(power 1 "Hauptschalter")
(power 2 "Dusche")
(power 3 "Warmwasser")
(power 4 "Optionsräume")
(power 5 "Küche")
(light 1 "Decke Lounge 1")
(light 2 "Decke Lounge 2")
(light 3 "Decke Lounge 3")
(light 4 "Decke Lounge 4")
(light 5 "Decke Lounge 5")
(light 6 "Decke Lounge 6")
(light 7 "Decke Lounge 7")
(light 8 "Decke Lounge 8")
]

View File

@ -4,8 +4,9 @@ let
pkg = pkgs.callPackage (
pkgs.fetchgit {
url = "https://git.shackspace.de/rz/muellshack";
rev = "c3d1f70325e5b90f280c5be60110e14f4de653ae";
sha256 = "1dd4kqwdr4v413rmkvmyjzzvw8id9747nifp96pg0c2cy6bhzj24";
rev = "dc80cf1edaa3d86ec2bebae8596ad1d4c4e3650a";
sha256 = "1yipr66zhrg5m20pf3rzvgvvl78an6ddkq6zc45rxb2r0i7ipkyh";
}) { mkYarnPackage = pkgs.yarn2nix-moretea.mkYarnPackage; };
home = "/var/lib/muellshack";
port = "8081";

View File

@ -4,9 +4,9 @@ let
pkg = pkgs.callPackage (
pkgs.fetchgit {
url = "https://git.shackspace.de/rz/node-light.git";
rev = "9c3fe451897cf170fb192a2643180fdfe22388e8";
sha256 = "1zsc38idg452r8wpcna5m3yqx0ri11bd1bw60bl0kpz96dqqnyba";
}) { mkYarnPackage = pkgs.yarn2nix-moretea.mkYarnPackage; };
rev = "90a9347b73af3a9960bd992e6293b357226ef6a0";
sha256 = "1av9w3w8aknlra25jw6gqxzbb01i9kdlfziy29lwz7mnryjayvwk";
}) { };
home = "/var/lib/node-light";
port = "8082";
in {

View File

@ -164,12 +164,14 @@ in {
ci = true;
extraZones = {
"krebsco.de" = ''
bookmark.euer IN A ${nets.internet.ip4.addr}
boot IN A ${nets.internet.ip4.addr}
boot.euer IN A ${nets.internet.ip4.addr}
cache.euer IN A ${nets.internet.ip4.addr}
cache.gum IN A ${nets.internet.ip4.addr}
cgit.euer IN A ${nets.internet.ip4.addr}
dl.euer IN A ${nets.internet.ip4.addr}
dns.euer IN A ${nets.internet.ip4.addr}
dockerhub IN A ${nets.internet.ip4.addr}
euer IN A ${nets.internet.ip4.addr}
euer IN MX 1 aspmx.l.google.com.
@ -178,7 +180,11 @@ in {
gold IN A ${nets.internet.ip4.addr}
graph IN A ${nets.internet.ip4.addr}
gum IN A ${nets.internet.ip4.addr}
io IN NS gum.krebsco.de.
iso.euer IN A ${nets.internet.ip4.addr}
board.euer IN A ${nets.internet.ip4.addr}
rss.euer IN A ${nets.internet.ip4.addr}
mediengewitter IN CNAME over.dose.io.
mon.euer IN A ${nets.internet.ip4.addr}
netdata.euer IN A ${nets.internet.ip4.addr}
nixos.unstable IN CNAME krebscode.github.io.
@ -189,9 +195,6 @@ in {
wg.euer IN A ${nets.internet.ip4.addr}
wiki.euer IN A ${nets.internet.ip4.addr}
wikisearch IN A ${nets.internet.ip4.addr}
bookmark.euer IN A ${nets.internet.ip4.addr}
io IN NS gum.krebsco.de.
mediengewitter IN CNAME over.dose.io.
'';
};
cores = 8;
@ -201,7 +204,6 @@ in {
ip6.addr = "2a01:4f8:191:12f6::2";
aliases = [
"gum.i"
"nextgum.i"
];
};
wiregrill = {
@ -237,6 +239,7 @@ in {
"tracker.makefu.r"
"wiki.gum.r"
"wiki.makefu.r"
"warrior.gum.r"
"sick.makefu.r"
];
};

View File

@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPTBGboU/P00yYiwYje53G0oqDFWmcSJ+hIpMsl4f/HH
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIujMZ3ZFxKpWeB/cjfKfYRr77+VRZk0Eik+92t03NoA

View File

@ -21,11 +21,12 @@ in {
];
};
}
<stockholm/makefu/2configs/nur.nix>
<stockholm/makefu/2configs/support-nixos.nix>
<stockholm/makefu/2configs/home-manager>
<stockholm/makefu/2configs/home-manager/cli.nix>
# <stockholm/makefu/2configs/stats/client.nix>
<stockholm/makefu/2configs/stats/netdata-server.nix>
# <stockholm/makefu/2configs/stats/netdata-server.nix>
<stockholm/makefu/2configs/headless.nix>
<stockholm/makefu/2configs/smart-monitor.nix>
@ -89,8 +90,8 @@ in {
# services
# <stockholm/makefu/2configs/sabnzbd.nix>
<stockholm/makefu/2configs/mail/mail.euer.nix>
{ krebs.exim.enable = mkForce false; }
# <stockholm/makefu/2configs/mail/mail.euer.nix>
{ krebs.exim.enable = mkDefault true; }
# sharing
<stockholm/makefu/2configs/share/gum.nix>
@ -119,7 +120,7 @@ in {
<stockholm/makefu/2configs/urlwatch>
# Removed until move: avoid letsencrypt ban
### Web
#<stockholm/makefu/2configs/nginx/share-download.nix>
<stockholm/makefu/2configs/nginx/dl.euer.krebsco.de.nix>
#<stockholm/makefu/2configs/nginx/euer.test.nix>
<stockholm/makefu/2configs/nginx/euer.mon.nix>
<stockholm/makefu/2configs/nginx/euer.wiki.nix>
@ -131,10 +132,14 @@ in {
# <stockholm/makefu/2configs/nginx/gold.krebsco.de.nix>
# <stockholm/makefu/2configs/nginx/iso.euer.nix>
<stockholm/makefu/2configs/deployment/photostore.krebsco.de.nix>
# <stockholm/makefu/2configs/deployment/photostore.krebsco.de.nix>
<stockholm/makefu/2configs/deployment/graphs.nix>
<stockholm/makefu/2configs/deployment/owncloud.nix>
<stockholm/makefu/2configs/deployment/board.euer.krebsco.de.nix>
<stockholm/makefu/2configs/deployment/rss.euer.krebsco.de.nix>
<stockholm/makefu/2configs/deployment/boot-euer.nix>
<stockholm/makefu/2configs/deployment/gecloudpad>
<stockholm/makefu/2configs/deployment/docker/archiveteam-warrior.nix>
<stockholm/makefu/2configs/shiori.nix>
<stockholm/makefu/2configs/bgt/download.binaergewitter.de.nix>
@ -171,7 +176,8 @@ in {
services.nginx.virtualHosts."cgit.euer.krebsco.de" = {
forceSSL = true;
enableACME = true;
locations."/".proxyPass = "http://cgit.gum.r";
locations."/".proxyPass = "http://localhost/";
locations."/".extraConfig = ''proxy_set_header Host cgit;'';
};
krebs.build.host = config.krebs.hosts.gum;

View File

@ -57,7 +57,7 @@ in {
<stockholm/makefu/2configs/stats/telegraf>
# <stockholm/makefu/2configs/stats/telegraf/europastats.nix>
<stockholm/makefu/2configs/stats/telegraf/hamstats.nix>
<stockholm/makefu/2configs/stats/arafetch.nix>
# <stockholm/makefu/2configs/stats/arafetch.nix>
# services
{
@ -71,14 +71,9 @@ in {
<stockholm/makefu/2configs/virtualisation/docker.nix>
<stockholm/makefu/2configs/bluetooth-mpd.nix>
{
# Risikoübernahme
nixpkgs.config.permittedInsecurePackages = [
"homeassistant-0.77.2"
];
}
<stockholm/makefu/2configs/homeautomation>
<stockholm/makefu/2configs/homeautomation/google-muell.nix>
<stockholm/makefu/2configs/ham>
<stockholm/makefu/2configs/ham/google-muell.nix>
<stockholm/makefu/2configs/ham/zigbee2mqtt>
{
makefu.ps3netsrv = {
enable = true;
@ -90,7 +85,6 @@ in {
makefu.mpd.musicDirectory = "/media/cryptX/music";
}
# security
<stockholm/makefu/2configs/sshd-totp.nix>
# <stockholm/makefu/2configs/logging/central-logging-client.nix>
@ -120,7 +114,7 @@ in {
gid = (import <stockholm/lib>).genid "share";
members = [ "makefu" "misa" ];
};
networking.firewall.trustedInterfaces = [ primaryInterface ];
networking.firewall.trustedInterfaces = [ primaryInterface "docker0" ];
@ -141,18 +135,18 @@ in {
sed-plugin
random-emoji ];
};
krebs.Reaktor.reaktor-bgt = {
nickname = "Reaktor|bgt";
workdir = "/var/lib/Reaktor/bgt";
channels = [ "#binaergewitter" ];
plugins = with pkgs.ReaktorPlugins;
[ titlebot
# stockholm-issue
nixos-version
shack-correct
sed-plugin
random-emoji ];
};
#krebs.Reaktor.reaktor-bgt = {
# nickname = "Reaktor|bgt";
# workdir = "/var/lib/Reaktor/bgt";
# channels = [ "#binaergewitter" ];
# plugins = with pkgs.ReaktorPlugins;
# [ titlebot
# # stockholm-issue
# nixos-version
# shack-correct
# sed-plugin
# random-emoji ];
#};
krebs.build.host = config.krebs.hosts.omo;
}

View File

@ -26,9 +26,10 @@ let
# |_______|
# cryptDisk0 = byid "ata-ST2000DM001-1CH164_Z240XTT6";
cryptDisk0 = byid "ata-ST8000DM004-2CX188_ZCT01PLV";
cryptDisk1 = byid "ata-TP02000GB_TPW151006050068";
cryptDisk2 = byid "ata-ST4000DM000-1F2168_Z303HVSG";
cryptDisk1 = byid "ata-WDC_WD80EZAZ-11TDBA0_7SJPVLYW";
cryptDisk3 = byid "ata-ST8000DM004-2CX188_ZCT01SG4";
cryptDisk2 = byid "ata-WDC_WD80EZAZ-11TDBA0_7SJPWT5W";
# cryptDisk3 = byid "ata-WDC_WD20EARS-00MVWB0_WD-WMAZA1786907";
# all physical disks
@ -48,8 +49,8 @@ in {
makefu.snapraid = {
enable = true;
disks = map toMapper [ 0 2 3 ];
parity = toMapper 1;
disks = map toMapper [ 0 1 3 ];
parity = toMapper 2; # find -name PARITY_PARTITION
};
fileSystems = let
cryptMount = name:
@ -102,6 +103,8 @@ in {
"firewire_ohci"
"usb_storage"
"usbhid"
"raid456"
"megaraid_sas"
];
kernelModules = [ "kvm-intel" ];

View File

@ -1,4 +1,5 @@
{
name="omo";
torrent = true;
unstable = true;
}

View File

@ -58,7 +58,7 @@
# Krebs
<stockholm/makefu/2configs/tinc/retiolum.nix>
<stockholm/makefu/2configs/share/gum-client.nix>
# <stockholm/makefu/2configs/share/gum-client.nix>
# <stockholm/makefu/2configs/share/temp-share-samba.nix>
@ -103,6 +103,7 @@
# <stockholm/makefu/2configs/hw/malduino_elite.nix>
<stockholm/makefu/2configs/hw/switch.nix>
# <stockholm/makefu/2configs/hw/rad1o.nix>
<stockholm/makefu/2configs/hw/cc2531.nix>
<stockholm/makefu/2configs/hw/smartcard.nix>
<stockholm/makefu/2configs/hw/upower.nix>
@ -142,7 +143,6 @@
];
};
}
];
makefu.server.primary-itf = "wlp3s0";

View File

@ -0,0 +1,20 @@
[
{
alias = "Daily news for Felix";
trigger = {
platform = "time";
at = "07:35:00";
};
action =
[
{
service = "notify.telegrambot";
data_template = {
title = "Daily News";
# TODO
message = "";
};
}
];
}
]

View File

@ -0,0 +1,4 @@
# heiss
Lieber Freund, was für ein Sommer! Ich denke Sie mir im Zimmer sitzend, mehr Omelette als Mensch.
Sommer ist die Zeit, in der es zu heiß ist, um das zu tun, wozu es im Winter zu kalt war.

View File

@ -66,9 +66,6 @@ in [
language = "de";
};
}
{ service = "notify.matrix_notify";
data_template.message = "Schlechte Luft Alarm seit ${toString long_threshold} Minuten ({{states.sensor.air_quality.state_with_unit}})!";
}
];
}
]

View File

@ -0,0 +1,26 @@
let
cam = name: still_image_url:
{
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 )
]

View File

@ -11,6 +11,7 @@ in {
imports = [
./ota.nix
./comic-updater.nix
./puppy-proxy.nix
];
networking.firewall.allowedTCPPorts = [ 8123 ];
state = [ "/var/lib/hass/known_devices.yaml" ];
@ -33,13 +34,14 @@ in {
'';
})).override {
extraPackages = ps: with ps; [
pkgs.pico2wave
pkgs.picotts
python-forecastio jsonrpc-async jsonrpc-websocket mpd2
(callPackage ./deps/openwrt-luci-rpc.nix { })
];
};
autoExtraComponents = true;
config = {
discovery = {};
homeassistant = {
name = "Bureautomation";
time_zone = "Europe/Berlin";
@ -72,6 +74,8 @@ in {
};
matrix = matrix.matrix;
mqtt = {
discovery = true;
discovery_prefix = "homeassistant";
broker = "localhost";
port = 1883;
client_id = "home-assistant";
@ -124,7 +128,7 @@ in {
frosch.script
ten_hours.script
mittagessen.script
standup.script
# standup.script
];
binary_sensor =
(import ./binary_sensor/buttons.nix)
@ -145,7 +149,8 @@ in {
camera =
(import ./camera/verkehrskamera.nix)
++ (import ./camera/comic.nix);
++ (import ./camera/comic.nix)
++ (import ./camera/stuttgart.nix);
person =
(import ./person/team.nix );
@ -198,9 +203,10 @@ in {
"switch.blitzdings"
"switch.fernseher"
"switch.feuer"
"switch.frosch_blasen"
"light.status_felix"
"light.status_daniel"
"light.buslicht"
# "light.status_daniel"
# "light.buslicht"
];
team = [
"person.thorsten"
@ -212,6 +218,7 @@ in {
"person.thierry"
"person.frank"
"person.emeka"
"person.tancrede"
#"device_tracker.felix_phone"
#"device_tracker.ecki_tablet"
#"device_tracker.daniel_phone"
@ -228,6 +235,7 @@ in {
"camera.Baumarkt"
"camera.Autobahn_Heilbronn"
"camera.Autobahn_Singen"
"camera.puppies"
"camera.poorly_drawn_lines"
];
nachtlicht = [
@ -264,7 +272,6 @@ in {
outside = [
# "sensor.ditzingen_pm10"
# "sensor.ditzingen_pm25"
"sensor.dark_sky_icon"
"sensor.dark_sky_temperature"
"sensor.dark_sky_humidity"
"sensor.dark_sky_uv_index"
@ -282,7 +289,7 @@ in {
++ (import ./automation/hass-restart.nix)
++ ten_hours.automation
++ matrix.automation
++ standup.automation
# ++ standup.automation
++ frosch.automation
++ mittagessen.automation;
device_tracker = (import ./device_tracker/openwrt.nix );

View File

@ -0,0 +1,38 @@
{ lib
, buildPythonPackage
, fetchPypi
# propagatedBuildInputs
, aiohttp
# buildInputs
, pytest
, pytest-asyncio
}:
buildPythonPackage rec {
pname = "aresponses";
version = "1.1.1";
src = fetchPypi {
inherit pname version;
sha256 = "d1d6ef52b9a97142d106688cf9b112602ef3dc66f6368de8f91f47241d8cfc9c";
};
propagatedBuildInputs = [
aiohttp
];
buildInputs = [
pytest
pytest-asyncio
];
# tests only distributed via git repository, not pypi
doCheck = false;
meta = with lib; {
description = "Asyncio testing server";
homepage = "https://github.com/circleup/aresponses";
license = licenses.mit;
maintainers = [ maintainers.makefu ];
};
}

View File

@ -2,6 +2,8 @@
let
persons = [ "frank" "daniel" "thorsten" "carsten" "ecki" "felix"
"thierry" # tjeri
"emeka"
"tancrede"
];
random_zu_lange = name: ''{{ [
"Du musst jetzt endlich nach Hause gehen ${name}!",
@ -20,6 +22,7 @@ let
random_announce = name: ''{{ [
"${name} is in da House",
"Ahoi ${name}",
"Hallöchen Popöchen ${name}",
"Moinsen ${name}",
"Moin Moin ${name}",
"Palim, Palim ${name}",
@ -55,7 +58,7 @@ let
"Und es startet für ${name} wieder ein Tag im Paradies",
"Lieber ${name}, Markus Keck hat dich bereits drei mal Versucht anzurufen!",
"Trotz schwerer Männergrippe ist ${name} heute im Büro erschienen.",
"${name} kenne keine Parteien mehr, ${name} kenne nur noch Arbeitsplätze",
"${name} kennt keine Parteien mehr, ${name} kennt nur noch Arbeitsplätze",
"${name}, Frage nicht, was dein Arbeitsplatz für dich tun kann. Frage, was du für deinen Arbeitsplatz tun kannst",
"${name} läuft bis in den Jemen - für sein Unternehmen. ${name} schwimmt bis nach Birma - für seine Firma",
"Der Cyberian ${name} ist gekommen um die Bahnwelt vor Cyber-Angriffen zu schützen",
@ -121,7 +124,6 @@ let
{ alias = "start ${name} 10h";
trigger = {
platform = "state";
# TODO: ecki
entity_id = [ "person.${name}"];
from = "not_home";
to = "home";
@ -129,13 +131,11 @@ let
condition = {
condition = "and";
conditions = [
{
condition = "state";
{ condition = "state";
entity_id = "timer.${name}_10h";
state = "idle";
}
{
condition = "time";
{ condition = "time";
after = "06:00:00";
before = "12:00:00";
}
@ -146,8 +146,8 @@ let
entity_id = [ "timer.${name}_10h" ] ;
}
{ service = "homeassistant.turn_on";
entity_id = [
# "switch.fernseher"
entity_id =
[ "switch.fernseher"
"script.blitz_10s"
"script.announce_${name}"
];
@ -155,30 +155,45 @@ let
];
}
{ alias = "pommes announce ${name}";
trigger =
{ platform = "event";
event_type = "timer.started";
event_data.entity_id = "timer.${name}_10h";
};
condition =
{ condition = "state";
entity_id = "binary_sensor.pommes";
state = "on";
};
action =
{ service = "homeassistant.turn_on";
entity_id = "script.blasen_10s" ;
};
}
{ alias = "Zu lange ${name}!";
trigger =
{
platform = "event";
{ platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.${name}_10h";
};
condition =
{
condition = "state";
{ condition = "state";
entity_id = "person.${name}";
state = "home";
};
action =
[
{ service = "homeassistant.turn_on";
entity_id = [
"script.blitz_10s"
"script.zu_lange_${name}"
];
}
];
{ service = "homeassistant.turn_on";
entity_id = [
"script.blitz_10s"
"script.zu_lange_${name}"
];
};
}
];
in
@ -187,7 +202,7 @@ in
(map tmr_10h persons);
automation = (lib.flatten (map automation_10h persons));
script = lib.fold lib.recursiveUpdate {} (
(map (p: announce_user p) persons) ++
(map (p: zu_lange_user p) persons)
(map announce_user persons) ++
(map zu_lange_user persons)
);
}

View File

@ -3,9 +3,9 @@ let
random_daily_text = ''{{ [
"Es ist so weit, es ist Standup Zeit!",
"Zehn Uhr Fünfunddreissig ist genau die richtige Zeit für ein Standup!",
"Hat jeder seine Hausaufgaben gemacht? Bitte einmal aufstehen und den Zettel nach rechts geben",
"Hat jeder seine zum Standup seine Hausaufgaben gemacht. Bitte einmal aufstehen und den Zettel nach rechts geben",
"Aufstehen zum Appell, es wird die Anwesenheit kontrolliert!",
"Hallo Kinder, wisst ihr welche Zeit es ist??? ... Genau! ... Standup Zeit!",
"Hallo Kinder, wisst ihr welche Zeit es ist ... Genau ... Standup Zeit!",
"Morgens, halb elf in Deutschland - das Standupchen" ] | random }}'';
in {

View File

@ -1,5 +1,6 @@
{ lib }:
# needs: binary_sensor.pommes
# notify.matrix_notify
let
random_pommes = '' {{ [
"Nur ein Pommes Tag ist ein guter Tag",
@ -51,7 +52,7 @@ in {
{ alias = "Pommeszeit";
trigger = {
platform = "time";
at = "12:15:00";
at = "11:00:00";
};
condition = {
condition = "state";
@ -89,6 +90,9 @@ in {
language = "de";
};
}
{ service = "notify.matrix_notify";
data_template.message = random_pommes;
}
];
};
};

View File

@ -22,9 +22,9 @@ let
"Heute bei Aramark: Rezepte aus Ländern, von denen Ihr noch nie gehört habt, Deutsch zubereitet",
"Heute bei Aramark im Angebot: Scheiss mit Reis oder Reste von Freitag",
"MHHHH es ist wieder mal so weit, lecker Bayerisch Kraut mit asiatischen Nudeln",
"Es ist 12 Uhr 30 und Heute gibt es Pommes - vielleicht",
"Heute gibt es Pommes - leider nicht einzeln zu verkaufen, da die Schälchen alle sind",
"Heute gibt es Pommes - verarscht! Natürlich gibt es nur salzlosen Reis, oder salzlose Nudeln.",
"Es ist 12 Uhr 30 und Heute gibt es nur Pommes, wenn der Pommesfrosch Blasen gespuckt hat.",
"Heute gibt es Pommes leider nicht einzeln zu verkaufen, da die Schälchen alle sind",
"Heute gibt es Pommes, verarscht! Natürlich gibt es nur salzlosen Reis, oder salzlose Nudeln.",
"Heute auf dem Speiseplan: Sushi vom Vortag",
"Aramark Kantinenessen: Der Hunger treibt es rein, der Geiz hält es drin.",
"Das Essen in der Snackeria sieht heute wie die bessere Alternative aus",

View File

@ -50,16 +50,23 @@
"device_tracker.emeka_phone"
];
}
#{ name = "Sabine";
# id = 9;
# device_trackers = [
# "device_tracker.sabine_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"
];
}
]

View File

@ -0,0 +1,5 @@
{ pkgs, ... }:
# streamlink 'https://www.ustream.tv/channel/maximilian-schnauzers-cam4' worst --player-external-http --player-external-http-port 15321 --player-passthrough rtsp --retry-streams 60
{
environment.systemPackages = [ pkgs.liveproxy ];
}

View File

@ -36,6 +36,18 @@ in {
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";

View File

@ -0,0 +1,4 @@
[
{ stream_source = "http://127.0.0.1:53422/base64/c3RyZWFtbGluayBodHRwczovL3d3dy51c3RyZWFtLnR2L2NoYW5uZWwvbWF4aW1pbGlhbi1zY2huYXV6ZXJzLWNhbTIgd29yc3Q=/";
}
]

View File

@ -28,6 +28,7 @@ with import <stockholm/lib>;
openssh.authorizedKeys.keys = [ config.krebs.users.makefu.pubkey ];
};
};
nix.trustedUsers = [ config.krebs.build.user.name ];
boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
@ -41,8 +42,6 @@ with import <stockholm/lib>;
};
boot.tmpOnTmpfs = true;
systemd.tmpfiles.rules = [
"d /tmp 1777 root root - -"
@ -61,7 +60,7 @@ with import <stockholm/lib>;
environment.shellAliases = {
# TODO: see .aliases
lsl = "ls -lAtr";
dmesg = "journalctl -kb | cat";
dmesg = "dmesg -L --reltime";
psg = "ps -ef | grep";
nmap = "nmap -oN $HOME/loot/scan-`date +\%s`.nmap -oX $HOME/loot/scan-`date +%s`.xml";
grep = "grep --color=auto";

View File

@ -0,0 +1,15 @@
let
fqdn = "board.euer.krebsco.de";
port = 13113;
in {
services.restya-board = {
enable = true;
virtualHost.listenPort = port;
};
services.nginx.virtualHosts."${fqdn}" = {
enableACME = true;
forceSSL = true;
locations."/".proxyPass = "http://localhost:${toString port}";
};
}

View File

@ -0,0 +1,39 @@
{ lib, ... }:
with lib;
let
port = ident: toString (28000 + ident);
instances = [ 1 2 3 4 5 6 7 8 9 ];
in {
services.nginx.recommendedProxySettings = true;
services.nginx.virtualHosts."warrior.gum.r".locations = let
# TODO location "/" shows all warrior instances
proxy = ident:
{
"/warrior${toString ident}/" = {
proxyPass = "http://localhost:${port ident}/";
# rewrite ^/info /warrior${toString ident}/info;
extraConfig = ''
sub_filter "http://warrior.gum.r/info" "http://warrior.gum.r/warrior${toString ident}/info";
sub_filter_once off;
'';
};
};
in
foldl' mergeAttrs {} (map proxy instances);
docker-containers = let
container = ident:
{ "archiveteam-warrior${toString ident}" = {
image = "archiveteam/warrior-dockerfile";
ports = [ "127.0.0.1:${port ident}:8001" ];
environment = {
DOWNLOADER = "makefu";
SELECTED_PROJECT = "auto";
CONCURRENT_ITEMS = "6";
WARRIOR_ID = toString ident;
};
};
};
in
foldl' mergeAttrs {} (map container instances);
}

View File

@ -0,0 +1,43 @@
{ config, lib, pkgs, ... }:
# more than just nginx config but not enough to become a module
let
wsgi-sock = "${workdir}/uwsgi-gecloudpad.sock";
workdir = config.services.uwsgi.runDir;
gecloudpad = pkgs.python3Packages.callPackage ./gecloudpad.nix {};
in {
services.uwsgi = {
enable = true;
user = "nginx";
# runDir = "/var/lib/photostore";
plugins = [ "python3" ];
instance = {
type = "emperor";
vassals = {
gecloudpad = {
type = "normal";
pythonPackages = self: with self; [ gecloudpad ];
socket = wsgi-sock;
};
};
};
};
services.nginx = {
enable = lib.mkDefault true;
virtualHosts."pad.binaergewitter.de" = {
enableACME = true;
forceSSL = true;
locations = {
"/".extraConfig = ''
expires -1;
uwsgi_pass unix://${wsgi-sock};
uwsgi_param UWSGI_CHDIR ${gecloudpad}/${pkgs.python.sitePackages};
uwsgi_param UWSGI_MODULE gecloudpad.main;
uwsgi_param UWSGI_CALLABLE app;
include ${pkgs.nginx}/conf/uwsgi_params;
'';
};
};
};
}

View File

@ -0,0 +1,24 @@
{ lib, pkgs, fetchFromGitHub, ... }:
with pkgs.python3Packages;buildPythonPackage rec {
name = "gecloudpad-${version}";
version = "0.2.3";
propagatedBuildInputs = [
flask requests
];
src = fetchFromGitHub {
owner = "binaergewitter";
repo = "gecloudpad";
rev = "master";
sha256 = "0p9lcphp3r7hyypxadzw4x9ix6d0anmspxnjnj0v2jjll8gxqlhf";
};
meta = {
homepage = https://github.com/binaergeiwtter/gecloudpad;
description = "server side for gecloudpad";
license = lib.licenses.wtfpl;
};
}

View File

@ -0,0 +1,14 @@
let
fqdn = "rss.euer.krebsco.de";
in {
services.tt-rss = {
enable = true;
virtualHost = fqdn;
selfUrlPath = "https://${fqdn}";
};
services.nginx.virtualHosts."${fqdn}" = {
enableACME = true;
forceSSL = true;
};
}

View File

@ -0,0 +1,38 @@
{ lib
, buildPythonPackage
, fetchPypi
, cryptography
, pyasn1
, rsa
, pycryptodome
}:
buildPythonPackage rec {
pname = "adb_shell";
version = "0.0.8";
src = fetchPypi {
inherit pname version;
sha256 = "01f9jinhfyjldg9793gz2i7gcd9xyx0a62r7a5ijssklcnn2rwnm";
};
propagatedBuildInputs = [
cryptography
pyasn1
rsa
];
# tests are not part of pypi package
doCheck = false;
checkInputs = [
pycryptodome
];
meta = with lib; {
description = "A Python implementation of ADB with shell and FileSync functionality";
homepage = https://github.com/JeffLIrion/adb_shell/;
license = licenses.mit;
# maintainers = [ maintainers. ];
};
}

View File

@ -0,0 +1,30 @@
{ lib
, buildPythonPackage
, callPackage
, fetchPypi
}:
buildPythonPackage rec {
pname = "androidtv";
version = "0.0.34";
src = fetchPypi {
inherit pname version;
sha256 = "13078i2a9hglpv4ldycph5n5485np21vs6z2qn830hybmx8kfxsw";
};
propagatedBuildInputs = [
(callPackage ./adbshell.nix {})
(callPackage ./purepythonadb.nix {})
];
# tests are not packaged in pypi release
doCheck = false;
meta = with lib; {
description = "Communicate with an Android TV or Fire TV device via ADB over a network";
homepage = https://github.com/JeffLIrion/python-androidtv/;
license = licenses.mit;
# maintainers = [ maintainers. ];
};
}

View File

@ -0,0 +1,21 @@
{ lib
, buildPythonPackage
, fetchPypi
}:
buildPythonPackage rec {
pname = "pure-python-adb";
version = "0.2.3.dev0";
src = fetchPypi {
inherit pname version;
sha256 = "88e5a4578435197799aa368fb1a5d87fe43e02a888cb7e85c2ad66173b383c89";
};
meta = with lib; {
description = "Pure python implementation of the adb client";
homepage = https://github.com/Swind/pure-python-adb;
license = licenses.mit;
# maintainers = [ maintainers. ];
};
}

View File

@ -0,0 +1,33 @@
let
cmd = command: {
service = "androidtv.adb_command";
data = {
entity_id = "media_player.firetv_stick";
inherit command;
};
};
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")
];
}
]

View File

@ -0,0 +1,152 @@
{ pkgs, lib, config, ... }:
# Ideas:
## wake-on-lan server
##
let
upkgs = (import <nixpkgs-unstable> {}).pkgs;
hlib = (import ./lib);
prefix = hlib.prefix;
tasmota = hlib.tasmota;
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;
# switch
# automation
# binary_sensor
# sensor
# input_select
# timer
in {
imports = [
./mqtt.nix
];
services.home-assistant = {
package = (upkgs.home-assistant.overrideAttrs (old: {
})).override {
extraPackages = ps: with ps; [
python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts
(ps.callPackage ./androidtv {})
];
};
config = {
input_select = zigbee.input_select; # dict
timer = zigbee.timer // kurzzeitwecker.timer; # dict
homeassistant = {
name = "Home"; time_zone = "Europe/Berlin";
latitude = "48.7687";
longitude = "9.2478";
elevation = 247;
};
discovery = {};
conversation = {};
history = {};
logbook = {};
logger = {
default = "info";
};
tts = [
{ platform = "google_translate";
language = "de";
time_memory = 57600;
service_name = "google_say";
}
];
telegram_bot = [
# secrets file: {
# "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>))
];
notify = [
{
platform = "kodi";
name = "wohnzimmer";
host = firetv_stick;
}
{
platform = "telegram";
name = "telegrambot";
chat_id = builtins.elemAt
(builtins.fromJSON (builtins.readFile
<secrets/hass/telegram-bot.json>)).allowed_chat_ids 0;
}
];
sun.elevation = 247;
recorder = {};
media_player = [
{ platform = "FireTV Stick kodi";
host = firetv_stick;
}
{ platform = "androidtv";
name = "FireTV Stick";
device_class = "firetv";
# adb_server_ip = firetv_stick;
host = firetv_stick;
port = 5555;
}
];
mqtt = {
broker = "localhost";
discovery = true; #enable esphome discovery
discovery_prefix = "homeassistant";
port = 1883;
client_id = "home-assistant";
username = "hass";
password = lib.removeSuffix "\n" (builtins.readFile <secrets/mqtt/hass>);
keepalive = 60;
protocol = 3.1;
birth_message = {
topic = "${prefix}/hass/tele/LWT";
payload = "Online";
qos = 1;
retain = true;
};
will_message = {
topic = "${prefix}/hass/tele/LWT";
payload = "Offline";
qos = 1;
retain = true;
};
};
luftdaten = {
show_on_map = true;
sensor_id = 679;
sensors.monitored_conditions = [ "P1" "P2" ];
};
#binary_sensor =
# flurlicht.binary_sensor;
sensor = [
{ platform = "speedtest";
monitored_conditions = [ "ping" "download" "upload" ];
}
# https://www.home-assistant.io/cookbook/automation_for_rainy_days/
]
++ ((import ./sensor/outside.nix) {inherit lib;})
++ zigbee.sensor ;
frontend = { };
# light = flurlicht.light;
http = { };
switch = [];
automation = []
++ (import ./automation/firetv_restart.nix)
++ kurzzeitwecker.automation
#++ flurlicht.automation
++ zigbee.automation;
script =
{ }
// kurzzeitwecker.script; # dict
};
enable = true;
configDir = hassdir;
};
}

View File

@ -0,0 +1,44 @@
let
prefix = "/ham";
in
{
inherit prefix;
say = let
# returns a list of actions to be performed on an mpd to say something
tts = { message, entity }:
[
{
service = "media_player.turn_on";
data.entity_id = entity;
}
{
service = "media_player.play_media";
data = {
entity_id = entity;
media_content_type = "playlist";
media_content_id = "ansage";
};
}
{
service = "media_player.turn_on";
data.entity_id = entity;
}
{ delay.seconds = 8; }
{
service = "tts.say";
entity_id = entity;
data_template = {
inherit message;
language = "de";
};
}
];
in
{
firetv = message: tts {
inherit message;
entity = "firetv";
};
};
zigbee.prefix = "/ham/zigbee";
}

View File

@ -0,0 +1,57 @@
# provides:
# light
# automation
# binary_sensor
let
hlib = (import ../lib);
tasmota = hlib.tasmota;
in
{
binary_sensor = [
(tasmota.motion { name = "Flur Bewegung"; host = "flurlicht";})
];
light = [ (tasmota.rgb { name = "Flurlicht"; host = "flurlicht";} ) ];
automation = [
{ alias = "Dunkel bei Sonnenuntergang";
trigger = {
platform = "sun";
event = "sunset";
# offset: "-00:45:00"
};
action = [
{
service= "light.turn_on";
data = {
entity_id= "light.flurlicht";
# rgb_color = [ 0,0,0 ]; <-- TODO default color
brightness_pct = 15;
};
}
{
service= "light.turn_off";
entity_id= "light.flurlicht";
}
];
}
{ alias = "Hell bei Sonnenaufgang";
trigger = {
platform = "sun";
event = "sunrise";
# offset: "-00:00:00"
};
action = [
{
service= "light.turn_on";
data = {
entity_id= "light.flurlicht";
brightness_pct = 85;
};
}
{
service= "light.turn_off";
entity_id= "light.flurlicht";
}
];
}
];
}

View File

@ -0,0 +1,132 @@
# Provides:
# timer
# automation
# script
# Needs:
# sensor.zigbee_btn1_click
# notify.telegrambot
let
button = "sensor.zigbee_btn2_click";
in {
timer.kurzzeitwecker =
{
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";
}
{ 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";
}
];
}
];
}

View File

@ -0,0 +1,129 @@
# 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";
hide_entity = "true";
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";
hide_entity = "true";
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

@ -0,0 +1,20 @@
{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";
}
]

View File

@ -0,0 +1,20 @@
{config, pkgs, lib, ...}:
{
# symlink the zigbee controller
services.udev.extraRules = ''
SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dailout"
'';
system.activationScripts.installZigbee = ''
install -d /var/lib/zigbee2mqtt
'';
docker-containers.zigbee2mqtt = {
image = "koenkk/zigbee2mqtt";
extraDockerOptions = [ "--device=/dev/cc2531:/dev/cc2531" ];
volumes = ["/var/lib/zigbee2mqtt:/app/data"];
};
state = [ "/var/lib/zigbee2mqtt/configuration.yaml" "/var/lib/zigbee2mqtt/state.json" ];
}

View File

@ -1,6 +1,8 @@
{
home-manager.users.makefu = {
programs.mbsync.enable = true;
accounts.email.maildirBasePath = "/home/makefu/Mail";
accounts.email.certificatesFile = "/etc/ssl/certs/ca-certificates.crt";
accounts.email.accounts.syntaxfehler = {
address = "felix.richter@syntax-fehler.de";
userName = "Felix.Richter@syntax-fehler.de";
@ -10,18 +12,34 @@
enable = true;
};
};
mbsync = {
enable = true;
create = "both";
remove = "both";
expunge = "both";
patterns = [ "*" "!INBOX.Sent*"];
};
smtp = {
host = "syntax-fehler.de";
tls = {
enable = true;
};
};
folders = {
sent = "Sent";
trash = "Trash";
inbox = "INBOX";
drafts = "Drafts";
};
msmtp.enable = true;
notmuch.enable = true;
offlineimap = {
enable = true;
postSyncHookCommand = "notmuch new";
extraConfig.remote = {
auth_mechanisms = "LOGIN";
tls_level = "tls_secure";
ssl_version = "tls1_2";
holdconnectionopen = true;
idlefolders = "['INBOX']";
};

View File

@ -2,65 +2,8 @@
{
imports = [
{ #direnv
home-manager.users.makefu.home.packages = [ pkgs.direnv ];
home-manager.users.makefu.home.file.".direnvrc".text = ''
use_nix() {
local path="$(nix-instantiate --find-file nixpkgs)"
if [ -f "$${path}/.version-suffix" ]; then
local version="$(< $path/.version-suffix)"
elif [ -f "$path/.version" ]; then
local version="$(< $path/.version)"
else
local version="$(< $(< $path/.git/HEAD))"
fi
local cache=".direnv/cache-''${version:-unknown}"
if [[ ! -e "$cache" ]] || \
[[ "$HOME/.direnvrc" -nt "$cache" ]] || \
[[ .envrc -nt "$cache" ]] || \
[[ default.nix -nt "$cache" ]] || \
[[ shell.nix -nt "$cache" ]];
then
[ -d .direnv ] || mkdir .direnv
local tmp=$(nix-shell --show-trace "$@" \
--run "\"$direnv\" dump zsh")
echo "$tmp" > "$cache"
fi
local path_backup=$PATH term_backup=$TERM
. "$cache"
export PATH=$PATH:$path_backup TERM=$term_backup
if [[ $# = 0 ]]; then
watch_file default.nix
watch_file shell.nix
fi
}
'';
home-manager.users.makefu.programs.zsh.initExtra = ''
nixify() {
if [ ! -e ./.envrc ]; then
echo "use nix" > .envrc
direnv allow
fi
if [ ! -e default.nix ]; then
cat > default.nix <<'EOF'
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "env";
buildInputs = [
bashInteractive
];
}
EOF
''${EDITOR:-vim} default.nix
fi
}
eval "$(direnv hook zsh)"
'';
home-manager.users.makefu.home.packages = [ pkgs.direnv pkgs.nur.repos.kalbasit.nixify ];
# home-manager.users.makefu.home.file.".direnvrc".text = '''';
}
{ # bat
home-manager.users.makefu.home.packages = [ pkgs.bat ];

View File

@ -1,305 +0,0 @@
{ pkgs, lib, config, ... }:
# Ideas:
## wake-on-lan server
##
let
tasmota_rgb = name: topic:
# LED WS2812b
# effect_state_topic: "stat/led/Scheme"
# effect_command_topic: "cmnd/led/Scheme"
# effect_value_template: "{{ value_json.Scheme }}"
{ platform = "mqtt";
inherit name;
retain = false;
qos = 1;
optimistic = false;
# state
# TODO: currently broken, will not use the custom state topic
#state_topic = "/ham/${topic}/stat/POWER";
state_topic = "/ham/${topic}/stat/POWER";
command_topic = "/ham/${topic}/cmnd/POWER";
availability_topic = "/ham/${topic}/tele/LWT";
payload_on= "ON";
payload_off= "OFF";
payload_available= "Online";
payload_not_available= "Offline";
# brightness
brightness_state_topic = "/ham/${topic}/stat/Dimmer";
brightness_command_topic = "/ham/${topic}/cmnd/Dimmer";
brightness_value_template = "{{ value_json.Dimmer }}";
brightness_scale = 100;
# color
rgb_state_topic = "/ham/${topic}/stat/Color";
rgb_command_topic = "/ham/${topic}/cmnd/MEM1"; # use enabled tasmota rule
rgb_command_mode = "hex";
rgb_command_template = "{{ '%02x%02x%02x' | format(red, green, blue)}}";
# effects
effect_state_topic = "/ham/${topic}/stat/Scheme";
effect_command_topic = "/ham/${topic}/cmnd/Scheme";
effect_value_template = "{{ value_json.Scheme }}";
effect_list = [ 0 1 2 3 4 5 6 7 8 9 10 11 12 ];
};
# switchmode 1 - also toggle power
# switchtopic flurlicht
tasmota_motion = name: topic:
{ platform = "mqtt";
device_class = "motion";
inherit name;
# TODO: currently broken, will not use the custom state topic
state_topic = "/ham/${topic}/stat/POWER";
payload_on = "ON";
payload_off = "OFF";
availability_topic = "/ham/${topic}/tele/LWT";
payload_available = "Online";
payload_not_available = "Offline";
};
firetv = "192.168.1.183";
hassdir = "/var/lib/hass";
tasmota_plug = name: topic:
{ platform = "mqtt";
inherit name;
state_topic = "/ham/${topic}/stat/POWER1";
command_topic = "/ham/${topic}/cmnd/POWER1";
availability_topic = "/ham/${topic}/tele/LWT";
payload_on= "ON";
payload_off= "OFF";
payload_available= "Online";
payload_not_available= "Offline";
};
tasmota_bme = name: topic:
[ { platform = "mqtt";
name = "${name} Temperatur";
state_topic = "/ham/${topic}/tele/SENSOR";
value_template = "{{ value_json.BME280.Temperature }}";
unit_of_measurement = "°C";
}
{ platform = "mqtt";
name = "${name} Luftfeuchtigkeit";
state_topic = "/ham/${topic}/tele/SENSOR";
value_template = "{{ value_json.BME280.Humidity }}";
unit_of_measurement = "%";
}
{ platform = "mqtt";
name = "${name} Luftdruck";
state_topic = "/ham/${topic}/tele/SENSOR";
value_template = "{{ value_json.BME280.Pressure }}";
unit_of_measurement = "hPa";
}
];
tasmota_am2301 = name: topic:
[ { platform = "mqtt";
name = "${name} Temperatur";
state_topic = "/ham/${topic}/tele/SENSOR";
value_template = "{{ value_json.AM2301.Temperature }}";
unit_of_measurement = "°C";
}
{ platform = "mqtt";
name = "${name} Luftfeuchtigkeit";
state_topic = "/ham/${topic}/tele/SENSOR";
value_template = "{{ value_json.AM2301.Humidity }}";
unit_of_measurement = "%";
}
];
in {
imports = [
./mqtt.nix
];
services.home-assistant = {
config = {
homeassistant = {
name = "Home"; time_zone = "Europe/Berlin";
latitude = "48.7687";
longitude = "9.2478";
elevation = 247;
};
#discovery = {};
conversation = {};
history = {};
logbook = {};
tts = [
{ platform = "google";}
];
sun.elevation = 247;
recorder = {};
media_player = [
{ platform = "kodi";
host = firetv;
}
{ platform = "firetv";
name = "FireTV Stick";
host = firetv;
adbkey = <secrets/hass/adbkey>;
}
];
mqtt = {
broker = "localhost";
port = 1883;
client_id = "home-assistant";
username = "hass";
password = lib.removeSuffix "\n" (builtins.readFile <secrets/mqtt/hass>);
keepalive = 60;
protocol = 3.1;
birth_message = {
topic = "/ham/hass/tele/LWT";
payload = "Online";
qos = 1;
retain = true;
};
will_message = {
topic = "/ham/hass/tele/LWT";
payload = "Offline";
qos = 1;
retain = true;
};
};
binary_sensor = [
(tasmota_motion "Flur Bewegung" "flurlicht")
];
sensor = [
# broken
#{ platform = "speedtest";
# monitored_conditions = [ "ping" "download" "upload" ];
#}
{ platform = "luftdaten";
name = "Wangen";
sensorid = "663";
monitored_conditions = [ "P1" "P2" ];
}
# https://www.home-assistant.io/cookbook/automation_for_rainy_days/
{ 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"
"apparent_temperature"
"hourly_summary"
"humidity"
"pressure"
"uv_index" ];
units = "si" ;
update_interval = {
days = 0;
hours = 0;
minutes = 30;
seconds = 0;
};
}
]
++ (tasmota_bme "Schlafzimmer" "schlafzimmer")
++ (tasmota_am2301 "Arbeitszimmer" "arbeitszimmer");
frontend = { };
group =
{ default_view =
{ view = "yes";
entities = [
"group.flur"
"group.schlafzimmer"
"group.draussen"
"group.wohnzimmer"
"group.arbeitszimmer"
];
};
flur = [
"light.flurlicht"
"binary_sensor.flur_bewegung"
"automation.dunkel_bei_sonnenuntergang"
"automation.hell_bei_sonnenaufgang"
];
wohnzimmer = [
"media_player.kodi"
"media_player.firetv_stick"
];
draussen = [
"sensor.dark_sky_temperature"
"sensor.dark_sky_hourly_summary"
"sensor.wangen_pm10"
"sensor.wangen_pm25"
];
schlafzimmer = [
"sensor.schlafzimmer_temperatur"
"sensor.schlafzimmer_luftdruck"
"sensor.schlafzimmer_luftfeuchtigkeit"
"switch.lichterkette_schlafzimmer"
];
arbeitszimmer = [
"switch.strom_staubsauger"
"sensor.arbeitszimmer_temperatur"
"sensor.arbeitszimmer_luftfeuchtigkeit"
];
};
http = { };
switch = [
(tasmota_plug "Lichterkette Schlafzimmer" "schlafzimmer")
(tasmota_plug "Strom Staubsauger" "arbeitszimmer")
];
light = [ (tasmota_rgb "Flurlicht" "flurlicht" ) ];
automation = [
{ alias = "Dunkel bei Sonnenuntergang";
trigger = {
platform = "sun";
event = "sunset";
# offset: "-00:45:00"
};
action = [
{
service= "light.turn_on";
data = {
entity_id= "light.flurlicht";
# rgb_color = [ 0,0,0 ]; <-- TODO default color
brightness_pct = 15;
};
}
{
service= "light.turn_off";
entity_id= "light.flurlicht";
}
];
}
{ alias = "Hell bei Sonnenaufgang";
trigger = {
platform = "sun";
event = "sunrise";
# offset: "-00:00:00"
};
action = [
{
service= "light.turn_on";
data = {
entity_id= "light.flurlicht";
brightness_pct = 85;
};
}
{
service= "light.turn_off";
entity_id= "light.flurlicht";
}
];
}
{ alias = "Staubsauger Strom aus nach 6h";
trigger = {
platform = "state";
entity_id = "switch.strom_staubsauger";
to = "on";
for.hours = 6;
};
action = {
service= "homeassistant.turn_off";
entity_id= "switch.strom_staubsauger";
};
}
];
};
enable = true;
configDir = hassdir;
};
nixpkgs.config.permittedInsecurePackages = [
"homeassistant-0.77.2"
];
}

View File

@ -40,10 +40,4 @@
'';
};
services.dbus.packages = [ pkgs.blueman ];
nixpkgs.overlays = [
(self: super: {
blueman = super.blueman.overrideAttrs (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ self.gnome3.adwaita-icon-theme ];
});
})];
}

View File

@ -0,0 +1,10 @@
{ config, lib, pkgs, ... }:
{
users.users.${config.krebs.build.user.name}.extraGroups = [ "dialout" ];
services.udev.extraRules = ''
SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531", MODE="0660", GROUP="dailout"
'';
}

View File

@ -68,11 +68,10 @@ in {
};
security.sudo.extraConfig = "${config.krebs.power-action.user} ALL= (root) NOPASSWD: ${pkgs.systemd}/bin/systemctl suspend";
services.redshift = {
enable = true;
latitude = "48.7";
longitude = "9.1";
};
services.redshift.enable = true;
location.latitude = 48.7;
location.longitude = 9.1;
systemd.services.look-up = {
startAt = "*:30";
serviceConfig = {

View File

@ -74,11 +74,7 @@
};
# suppress chrome autit event messages
security.audit = {
rules = [
"-a task,never"
];
};
security.audit.rules = [ "-a task,never" ];
# Enable IPv6 Privacy Extensions
boot.kernel.sysctl = {

View File

@ -6,7 +6,7 @@
users = {};
# TODO: secure that shit
aclExtraConf = ''
pattern readwrite /#
pattern readwrite #
'';
allowAnonymous = true;
};

View File

@ -15,7 +15,6 @@ let
in {
services.phpfpm = {
# phpfpm does not have an enable option
poolConfigs = {
mpd = ''
user = ${user}

View File

@ -1,6 +1,10 @@
{ pkgs, ... }:{
nixpkgs.config.packageOverrides = pkgs: {
nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") {
nur = import (builtins.fetchTarball {
url = "https://github.com/nix-community/NUR/archive/7bfd0117b359d0f72d086ff7e1f0ba3aeaf8d91e.tar.gz";
sha256 = "0gb2np1r2m9kkz1s374gxdqrwhkzx48iircy00y6mjr7h14rhyxk";
}
){
inherit pkgs;
};
};

View File

@ -0,0 +1,25 @@
{ lib
, buildPythonPackage
, fetchPypi
}:
buildPythonPackage rec {
pname = "cheetah3";
version = "3.2.4";
src = fetchPypi {
pname = "Cheetah3";
inherit version;
sha256 = "caabb9c22961a3413ac85cd1e5525ec9ca80daeba6555f4f60802b6c256e252b";
};
doCheck = false;
meta = with lib; {
description = "Cheetah is a template engine and code generation tool";
homepage = https://cheetahtemplate.org/;
license = licenses.mit;
# maintainers = [ maintainers. ];
};
}

View File

@ -0,0 +1,91 @@
diff --git a/SickBeard.py b/SickBeard.py
index 31cfd1e1..10a4ef5e 100755
--- a/SickBeard.py
+++ b/SickBeard.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
#
# This file is part of SickGear.
#
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index 5c1f7bfe..8999b468 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -1203,6 +1203,7 @@ class GenericProvider(object):
ep_num = None
if 1 == len(ep_obj_results):
ep_num = ep_obj_results[0].episode
+ logger.log(f'{ep_obj_results[0]}',logger.DEBUG)
logger.log(u'Single episode result.', logger.DEBUG)
elif 1 < len(ep_obj_results):
ep_num = MULTI_EP_RESULT
diff --git a/sickbeard/providers/horriblesubs.py b/sickbeard/providers/horriblesubs.py
index 870e8461..dbdeacc8 100644
--- a/sickbeard/providers/horriblesubs.py
+++ b/sickbeard/providers/horriblesubs.py
@@ -98,6 +98,7 @@ class HorribleSubsProvider(generic.TorrentProvider):
results = self._sort_seeding(mode, results + items[mode])
+ logger.log(f"{results}",logger.DEBUG)
return results
def _season_strings(self, *args, **kwargs):
@@ -131,6 +132,7 @@ class HorribleSubsProvider(generic.TorrentProvider):
.find_all('a', href=re.compile('(?i)(torrent$|^magnet:)'))))[0]
except (BaseException, Exception):
pass
+ logger.log(f"{result}",logger.DEBUG)
return result
diff --git a/sickbeard/search.py b/sickbeard/search.py
index f4957c3a..dd3a352d 100644
--- a/sickbeard/search.py
+++ b/sickbeard/search.py
@@ -986,22 +986,26 @@ def search_providers(
best_result = pick_best_result(found_results[provider_id][cur_search_result], show_obj, quality_list,
filter_rls=orig_thread_name)
-
+ logger.log(f"Best result: {best_result}",logger.DEBUG)
# if all results were rejected move on to the next episode
if not best_result:
continue
-
+
# filter out possible bad torrents from providers
if 'torrent' == best_result.resultType:
+ logger.log(f"Best result is torrent {best_result.url}",logger.DEBUG)
if not best_result.url.startswith('magnet') and None is not best_result.get_data_func:
best_result.url = best_result.get_data_func(best_result.url)
best_result.get_data_func = None # consume only once
if not best_result.url:
continue
if best_result.url.startswith('magnet'):
+ logger.log("url is magnet link",logger.DEBUG)
if 'blackhole' != sickbeard.TORRENT_METHOD:
+ logger.log(f"Setting content to None because TORRENT_METHODD is not blackhole ({sickbeard.TORRENT_METHOD} instead)",logger.DEBUG)
best_result.content = None
else:
+ logger.log("url is torrent link",logger.DEBUG)
cache_file = ek.ek(os.path.join, sickbeard.CACHE_DIR or helpers.get_system_temp_dir(),
'%s.torrent' % (helpers.sanitize_filename(best_result.name)))
if not helpers.download_file(best_result.url, cache_file, session=best_result.provider.session):
@@ -1044,6 +1048,7 @@ def search_providers(
best_result.after_get_data_func(best_result)
best_result.after_get_data_func = None # consume only once
+ logger.log(f"After torrent detection",logger.DEBUG)
# add result if its not a duplicate
found = False
for i, result in enumerate(final_results):
@@ -1054,6 +1059,7 @@ def search_providers(
else:
found = True
if not found:
+ logger.log(f"Not already found, adding to best_result to final_results",logger.DEBUG)
final_results += [best_result]
# check that we got all the episodes we wanted first before doing a match and snatch

View File

@ -1,16 +1,19 @@
{ stdenv, fetchFromGitHub, python2, makeWrapper }:
{ stdenv, fetchFromGitHub, python3, makeWrapper }:
let
pythonEnv = python2.withPackages(ps: with ps; [ cheetah ]);
pythonEnv = python3.withPackages(ps: with ps; [
(python3.pkgs.callPackage ./cheetah3.nix {})
]);
in stdenv.mkDerivation rec {
pname = "sickgear";
version = "0.20.0";
#version = "0.21.6";
version = "0.21.21";
src = fetchFromGitHub {
owner = "SickGear";
repo = "SickGear";
rev = "release_${version}";
sha256 = "1zg95szvfbmwinx1z5nlbmyck7ximvyna0x71yflmadkgf88nv0k";
sha256 = "15nlxg2867l846qqxklmfyqmn5nc01ksd4lpwbrbjdzpk4y3xi78";
};
dontBuild = true;
@ -18,12 +21,13 @@ in stdenv.mkDerivation rec {
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ pythonEnv ];
patches = [ ./debug.patch ];
installPhase = ''
mkdir -p $out/bin
cp -R {autoProcessTV,gui,lib,sickbeard,sickgear.py,SickBeard.py} $out/
makeWrapper $out/SickBeard.py $out/bin/sickgear
makeWrapper $out/sickgear.py $out/bin/sickgear
'';
meta = with stdenv.lib; {

View File

@ -2,7 +2,7 @@
with import <stockholm/lib>;
let
pkg = with pkgs.python3Packages;buildPythonPackage rec {
rev = "cce2394";
rev = "56d41de8219adc";
name = "arafetch-${rev}";
propagatedBuildInputs = [
requests
@ -14,7 +14,7 @@ let
src = pkgs.fetchgit {
url = "http://cgit.euer.krebsco.de/arafetch";
inherit rev;
sha256 = "sha256:0zdz8sqn9n8i69rqngcg7nakmvahf1i5dwajzjpylsh1x5csv2gs";
sha256 = "0hnwbmj0plynhv3h2idhrzf2zcqx3qnw6lq8zzyn9am74pmvza39";
};
};
home = "/var/lib/arafetch";

View File

@ -1,14 +1,13 @@
{ config, lib, pkgs, ... }:
with import <stockholm/lib>;
let
pkg = pkgs.stdenv.mkDerivation {
name = "aralast-master";
src = pkgs.fetchFromGitHub {
owner = "makefu";
repo = "aralast";
rev = "7121598";
sha256 = "0vw027c698h9b69ksid5p3pji9960hd7n9xi4arrax0vfkwryb4m";
rev = "a0d3aeaa109e219fb6fc57170e59020c23413718";
sha256 = "0bi0nc51z5wk72lnjhg1gfzr5yvvsshyzq924yjbbqpqw08v7i4p";
};
installPhase = ''
install -m755 -D aralast.sh $out/bin/aralast

View File

@ -4,6 +4,7 @@
users.users.makefu.packages = with pkgs;[
# media
gimp
mirage
inkscape
libreoffice
# skype

View File

@ -11,5 +11,6 @@
opensc pcsctools libu2f-host
];
# boot.extraModulePackages = [ config.boot.kernelPackages.exfat-nofuse ];
boot.extraModulePackages = [ config.boot.kernelPackages.exfat-nofuse ];
boot.supportedFilesystems = [ "exfat" ];
}

View File

@ -11,7 +11,7 @@
pactl load-module module-null-sink sink_name=stream sink_properties=device.description="Streaming"
pactl load-module module-loopback source=alsa_output.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo.monitor sink=stream
pactl load-module module-loopback source=alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo sink=stream
darkice -c ~/lol.conf
darkice -c ./lol.conf
'')
];
}

View File

@ -0,0 +1,32 @@
{ stdenv, lib, pkgs, autoreconfHook ,libtool, fetchFromGitHub, boost, libusb1,
pkgconfig,file }:
stdenv.mkDerivation rec {
pname = "cc-tool";
version = "407fd7e";
name = "${pname}-${version}";
src = fetchFromGitHub {
owner = "dashesy";
repo = "cc-tool";
rev = version;
sha256 = "1q7zqib4rn5l8clk2hj7078rfyrjdwxzpyg4r10is31lq22zhxqj";
};
buildInputs = [ boost libtool libusb1 pkgconfig autoreconfHook ];
preConfigure = ''
substituteInPlace configure \
--replace /usr/bin/file ${file}/bin/file
'';
postInstall = ''
install -m755 -D ./udev/90-cc-debugger.rules $out/etc/udev/rules.d/90-cc-debugger.rules
'';
meta = {
homepage = https://github.com/AKuHAK/hdl-dump ;
description = "copy isos to psx hdd";
license = lib.licenses.gpl2;
};
}

View File

@ -0,0 +1,19 @@
{ docopt, requests, beautifulsoup4, fetchFromGitHub, buildPythonPackage }:
buildPythonPackage rec {
name = "hydra-check";
version = "1.1.0";
src = fetchFromGitHub {
owner = "nix-community";
repo = "hydra-check";
rev = version;
sha256 = "1q4n5l238lnzcms3z1ax4860inaliawqlxv7nf1wb4knl4wr26fk";
};
propagatedBuildInputs = [
docopt
requests
beautifulsoup4
];
doCheck = false; # no tests
}

View File

@ -0,0 +1,30 @@
{ lib
, buildPythonPackage
, fetchPypi
, streamlink
}:
buildPythonPackage rec {
pname = "liveproxy";
version = "0.3.0";
src = fetchPypi {
inherit pname version;
sha256 = "70ba2f7b57cdf19c6d971a434ed47cccb5fdfe4621baa76a3f6221e75b7f2729";
};
# # Package conditions to handle
# # might have to sed setup.py and egg.info in patchPhase
# # sed -i "s/<package>.../<package>/"
# streamlink (>=1.1.1)
propagatedBuildInputs = [
streamlink
];
meta = with lib; {
description = "LiveProxy is a local Proxyserver between Streamlink and an URL";
homepage = https://github.com/back-to/liveproxy;
license = lib.licenses.bsd2;
# maintainers = [ maintainers. ];
};
}

View File

@ -40,6 +40,8 @@ in {
qcma = super.pkgs.libsForQt5.callPackage ./custom/qcma { };
inherit (callPackage ./devpi {}) devpi-web ;
nodemcu-uploader = super.pkgs.callPackage ./nodemcu-uploader {};
liveproxy = super.pkgs.python3Packages.callPackage ./custom/liveproxy {};
hydra-check = super.pkgs.python3Packages.callPackage ./custom/hydra-check {};
}
// (mapAttrs (_: flip callPackage {})

View File

@ -1,27 +0,0 @@
{ lib, stdenv, fetchFromGitHub, autoreconfHook, autoconf-archive, pkgconfig,
gettext, asciidoc, doxygen, libxml2, libxslt, docbook_xsl, ... }:
stdenv.mkDerivation rec {
name = "libcoap-${version}";
version = "4.1.2";
src = fetchFromGitHub {
owner = "obgm";
repo = "libcoap";
rev = "v${version}";
sha256 = "0f0qq15480ja1s03vn8lzw4b3mzdgy46hng4aigi6i6qbzf29kf5";
};
patchPhase = ''
sed -i 's/$(A2X)/& --no-xmllint/' examples/Makefile.am
'';
buildInputs = [ gettext asciidoc doxygen libxml2.bin libxslt docbook_xsl];
nativeBuildInputs = [ autoreconfHook autoconf-archive pkgconfig ];
meta = {
description = "";
homepage = http://coap.technology;
license = stdenv.lib.licenses.gpl2;
platforms = stdenv.lib.platforms.linux;
maintainers = with stdenv.lib.maintainers; [ makefu ];
};
}

View File

@ -1,51 +0,0 @@
{ stdenv, lib, fetchurl
, popt
, libredirect
, dpkg
, makeWrapper
, autoPatchelfHook
, ...
}:
# https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=svox-pico-bin
let
pkgrel="8";
_arch = "amd64";
in
stdenv.mkDerivation rec {
name = "pico2wave"; # svox-pico-bin
version = "1.0+git20130326";
srcs = [
(fetchurl { url = "http://mirrors.kernel.org/ubuntu/pool/multiverse/s/svox/libttspico0_${version}-${pkgrel}_${_arch}.deb"; sha256 = "0b8r7r8by5kamnm960bsicimnj1a40ghy3475nzy1jvwj5xgqhrj"; })
(fetchurl { url = "http://mirrors.kernel.org/ubuntu/pool/multiverse/s/svox/libttspico-dev_${version}-${pkgrel}_${_arch}.deb"; sha256 = "1knjiwi117h02nbf7k6ll080vl65gxwx3rpj0fq5xkvxbqpjjbvz"; })
(fetchurl { url = "http://mirrors.kernel.org/ubuntu/pool/multiverse/s/svox/libttspico-data_${version}-${pkgrel}_all.deb"; sha256 = "0k0x5jh5qzzasrg766pfmls3ksj18wwdbssysvpxkq98aqg4fgmx"; })
(fetchurl { url = "http://mirrors.kernel.org/ubuntu/pool/multiverse/s/svox/libttspico-utils_${version}-${pkgrel}_${_arch}.deb"; sha256 = "11yk25fh4n7qz4xjg0dri68ygc3aapj1bk9cvhcwkfvm46j5lrjv"; })
] ;
nativeBuildInputs = [ dpkg makeWrapper autoPatchelfHook ];
dontBuild = true;
buildInputs = [ popt ];
unpackPhase = lib.concatMapStringsSep ";" (src: "dpkg-deb -x ${src} .") srcs;
installPhase = ''
mkdir -p $out
cp -r usr/. $out/
mv $out/lib/*-linux-gnu/* $out/lib/
rmdir $out/lib/*-linux-gnu
wrapProgram "$out/bin/pico2wave" \
--set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
--set NIX_REDIRECTS /usr/share/pico/lang=$out/share/pico/lang
'';
meta = with stdenv.lib; {
description = "Text-to-speech engine";
homepage = https://android.googlesource.com/platform/external/svox;
platforms = platforms.linux;
license = licenses.asl20;
maintainers = with maintainers; [ abbradar ];
};
}

View File

@ -11,17 +11,22 @@
stdenv.mkDerivation rec {
name = "studio-link-${version}";
version = "17.03.1-beta";
src = fetchurl {
url = "https://github.com/Studio-Link-v2/backend/releases/download/v${version}/studio-link-standalone-linux.zip";
sha256 = "1y21nymin7iy64hcffc8g37fv305b1nvmh944hkf7ipb06kcx6r9";
};
nativeBuildInputs = [ unzip autoPatchelfHook ];
buildInputs = [
alsaLib
openssl_1_0_2
zlib
libjack2
nativeBuildInputs = [
unzip
autoPatchelfHook
];
buildInputs = [
alsaLib
openssl_1_0_2
zlib
libjack2
];
unpackPhase = ''
@ -29,9 +34,7 @@ stdenv.mkDerivation rec {
'';
installPhase = ''
mkdir -p $out/bin
cp studio-link-standalone $out/bin/studio-link
chmod +x $out/bin/studio-link
install -m755 -D studio-link-standalone $out/bin/studio-link
'';
meta = with stdenv.lib; {

View File

@ -46,6 +46,12 @@
};
};
}
(lib.mkIf (host-src.unstable) {
nixpkgs-unstable.git = {
url = "https://github.com/nixos/nixpkgs-channels";
ref = (lib.importJSON ../krebs/nixpkgs-unstable.json).rev;
};
})
(lib.mkIf (host-src.torrent) {
torrent-secrets = if test then {
file = toString ./0tests/data/secrets;
@ -71,7 +77,7 @@
(lib.mkIf ( host-src.home-manager ) {
home-manager.git = {
url = https://github.com/rycee/home-manager;
ref = "f856c78a4a220f44b64ce5045f228cbb9d4d9f31";
ref = "9781f37";
};
})
];