Merge remote-tracking branch 'gum/master'
This commit is contained in:
commit
8c27f12f86
.gitlab-ci.yml
krebs
0tests/data/secrets/hass
2configs/shack
3modules/makefu
makefu
1systems
2configs
bureautomation
default.nixdeployment
ham
home-manager
homeautomation
hw
main-laptop.nixminimal.nixmqtt.nixnginx
nur.nixsickbeard
stats
tools
5pkgs
krops.nix
|
@ -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:
|
||||
|
|
1
krebs/0tests/data/secrets/hass/darksky.apikey
Normal file
1
krebs/0tests/data/secrets/hass/darksky.apikey
Normal file
|
@ -0,0 +1 @@
|
|||
LOL
|
|
@ -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";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
|
82
krebs/2configs/shack/glados/automation/shack-startup.nix
Normal file
82
krebs/2configs/shack/glados/automation/shack-startup.nix
Normal 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";
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
|
@ -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 = [];
|
||||
|
|
|
@ -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 =
|
||||
|
|
13
krebs/2configs/shack/glados/multi/rollos.nix
Normal file
13
krebs/2configs/shack/glados/multi/rollos.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
let
|
||||
glados = import ../lib;
|
||||
in
|
||||
{
|
||||
# LED
|
||||
light = [
|
||||
];
|
||||
sensor = [
|
||||
];
|
||||
automation =
|
||||
[
|
||||
];
|
||||
}
|
|
@ -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";
|
||||
|
|
21
krebs/2configs/shack/glados/sensors/darksky.nix
Normal file
21
krebs/2configs/shack/glados/sensors/darksky.nix
Normal 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";
|
||||
}
|
||||
]
|
|
@ -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" ])
|
16
krebs/2configs/shack/glados/sensors/mate.nix
Normal file
16
krebs/2configs/shack/glados/sensors/mate.nix
Normal 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)
|
||||
]
|
|
@ -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 ]
|
||||
|
|
6
krebs/2configs/shack/glados/sensors/sensemap.nix
Normal file
6
krebs/2configs/shack/glados/sensors/sensemap.nix
Normal file
|
@ -0,0 +1,6 @@
|
|||
[
|
||||
{
|
||||
platform = "opensensemap";
|
||||
station_id = "56a0de932cb6e1e41040a68b";
|
||||
}
|
||||
]
|
52
krebs/2configs/shack/glados/sensors/spaceapi.nix
Normal file
52
krebs/2configs/shack/glados/sensors/spaceapi.nix
Normal 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;
|
||||
}
|
||||
]
|
6
krebs/2configs/shack/glados/sensors/unifi.nix
Normal file
6
krebs/2configs/shack/glados/sensors/unifi.nix
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
controllers = {
|
||||
host = "unifi.shack";
|
||||
site = "shackspace";
|
||||
};
|
||||
}
|
32
krebs/2configs/shack/glados/switch/power.nix
Normal file
32
krebs/2configs/shack/glados/switch/power.nix
Normal 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")
|
||||
]
|
|
@ -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";
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
];
|
||||
};
|
||||
|
|
|
@ -1 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPTBGboU/P00yYiwYje53G0oqDFWmcSJ+hIpMsl4f/HH
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIujMZ3ZFxKpWeB/cjfKfYRr77+VRZk0Eik+92t03NoA
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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" ];
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
name="omo";
|
||||
torrent = true;
|
||||
unstable = true;
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
20
makefu/2configs/bureautomation/automation/daily-news.nix
Normal file
20
makefu/2configs/bureautomation/automation/daily-news.nix
Normal 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 = "";
|
||||
};
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
4
makefu/2configs/bureautomation/automation/quotes.nix
Normal file
4
makefu/2configs/bureautomation/automation/quotes.nix
Normal 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.
|
||||
|
|
@ -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}})!";
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
||||
|
|
26
makefu/2configs/bureautomation/camera/stuttgart.nix
Normal file
26
makefu/2configs/bureautomation/camera/stuttgart.nix
Normal 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 )
|
||||
]
|
|
@ -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 );
|
||||
|
|
38
makefu/2configs/bureautomation/deps/aresponses.nix
Normal file
38
makefu/2configs/bureautomation/deps/aresponses.nix
Normal 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 ];
|
||||
};
|
||||
}
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
];
|
||||
}
|
||||
]
|
||||
|
|
5
makefu/2configs/bureautomation/puppy-proxy.nix
Normal file
5
makefu/2configs/bureautomation/puppy-proxy.nix
Normal 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 ];
|
||||
}
|
|
@ -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";
|
||||
|
|
4
makefu/2configs/bureautomation/stream/puppies.nix
Normal file
4
makefu/2configs/bureautomation/stream/puppies.nix
Normal file
|
@ -0,0 +1,4 @@
|
|||
[
|
||||
{ stream_source = "http://127.0.0.1:53422/base64/c3RyZWFtbGluayBodHRwczovL3d3dy51c3RyZWFtLnR2L2NoYW5uZWwvbWF4aW1pbGlhbi1zY2huYXV6ZXJzLWNhbTIgd29yc3Q=/";
|
||||
}
|
||||
]
|
|
@ -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";
|
||||
|
|
15
makefu/2configs/deployment/board.euer.krebsco.de.nix
Normal file
15
makefu/2configs/deployment/board.euer.krebsco.de.nix
Normal 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}";
|
||||
};
|
||||
}
|
||||
|
39
makefu/2configs/deployment/docker/archiveteam-warrior.nix
Normal file
39
makefu/2configs/deployment/docker/archiveteam-warrior.nix
Normal 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);
|
||||
}
|
43
makefu/2configs/deployment/gecloudpad/default.nix
Normal file
43
makefu/2configs/deployment/gecloudpad/default.nix
Normal 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;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
24
makefu/2configs/deployment/gecloudpad/gecloudpad.nix
Normal file
24
makefu/2configs/deployment/gecloudpad/gecloudpad.nix
Normal 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;
|
||||
};
|
||||
}
|
||||
|
14
makefu/2configs/deployment/rss.euer.krebsco.de.nix
Normal file
14
makefu/2configs/deployment/rss.euer.krebsco.de.nix
Normal 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;
|
||||
};
|
||||
}
|
||||
|
38
makefu/2configs/ham/androidtv/adbshell.nix
Normal file
38
makefu/2configs/ham/androidtv/adbshell.nix
Normal 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. ];
|
||||
};
|
||||
}
|
30
makefu/2configs/ham/androidtv/default.nix
Normal file
30
makefu/2configs/ham/androidtv/default.nix
Normal 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. ];
|
||||
};
|
||||
}
|
21
makefu/2configs/ham/androidtv/purepythonadb.nix
Normal file
21
makefu/2configs/ham/androidtv/purepythonadb.nix
Normal 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. ];
|
||||
};
|
||||
}
|
33
makefu/2configs/ham/automation/firetv_restart.nix
Normal file
33
makefu/2configs/ham/automation/firetv_restart.nix
Normal 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")
|
||||
];
|
||||
}
|
||||
]
|
152
makefu/2configs/ham/default.nix
Normal file
152
makefu/2configs/ham/default.nix
Normal 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;
|
||||
};
|
||||
|
||||
}
|
44
makefu/2configs/ham/lib/default.nix
Normal file
44
makefu/2configs/ham/lib/default.nix
Normal 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";
|
||||
}
|
57
makefu/2configs/ham/multi/flurlicht.nix
Normal file
57
makefu/2configs/ham/multi/flurlicht.nix
Normal 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";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
132
makefu/2configs/ham/multi/kurzzeitwecker.nix
Normal file
132
makefu/2configs/ham/multi/kurzzeitwecker.nix
Normal 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";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
129
makefu/2configs/ham/multi/zigbee2mqtt.nix
Normal file
129
makefu/2configs/ham/multi/zigbee2mqtt.nix
Normal 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;
|
||||
};
|
||||
}
|
20
makefu/2configs/ham/sensor/outside.nix
Normal file
20
makefu/2configs/ham/sensor/outside.nix
Normal 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";
|
||||
}
|
||||
]
|
20
makefu/2configs/ham/zigbee2mqtt/default.nix
Normal file
20
makefu/2configs/ham/zigbee2mqtt/default.nix
Normal 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" ];
|
||||
}
|
|
@ -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']";
|
||||
};
|
||||
|
|
|
@ -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 ];
|
||||
|
|
|
@ -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"
|
||||
];
|
||||
|
||||
}
|
|
@ -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 ];
|
||||
});
|
||||
})];
|
||||
}
|
||||
|
|
10
makefu/2configs/hw/cc2531.nix
Normal file
10
makefu/2configs/hw/cc2531.nix
Normal 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"
|
||||
'';
|
||||
}
|
|
@ -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 = {
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
users = {};
|
||||
# TODO: secure that shit
|
||||
aclExtraConf = ''
|
||||
pattern readwrite /#
|
||||
pattern readwrite #
|
||||
'';
|
||||
allowAnonymous = true;
|
||||
};
|
||||
|
|
|
@ -15,7 +15,6 @@ let
|
|||
|
||||
in {
|
||||
services.phpfpm = {
|
||||
# phpfpm does not have an enable option
|
||||
poolConfigs = {
|
||||
mpd = ''
|
||||
user = ${user}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
|
25
makefu/2configs/sickbeard/cheetah3.nix
Normal file
25
makefu/2configs/sickbeard/cheetah3.nix
Normal 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. ];
|
||||
};
|
||||
}
|
91
makefu/2configs/sickbeard/debug.patch
Normal file
91
makefu/2configs/sickbeard/debug.patch
Normal 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
|
|
@ -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; {
|
||||
|
|
|
@ -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";
|
||||
|
|
5
makefu/2configs/stats/external/aralast.nix
vendored
5
makefu/2configs/stats/external/aralast.nix
vendored
|
@ -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
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
users.users.makefu.packages = with pkgs;[
|
||||
# media
|
||||
gimp
|
||||
mirage
|
||||
inkscape
|
||||
libreoffice
|
||||
# skype
|
||||
|
|
|
@ -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" ];
|
||||
}
|
||||
|
|
|
@ -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
|
||||
'')
|
||||
];
|
||||
}
|
||||
|
|
32
makefu/5pkgs/cc-tool/default.nix
Normal file
32
makefu/5pkgs/cc-tool/default.nix
Normal 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;
|
||||
};
|
||||
}
|
19
makefu/5pkgs/custom/hydra-check/default.nix
Normal file
19
makefu/5pkgs/custom/hydra-check/default.nix
Normal 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
|
||||
}
|
30
makefu/5pkgs/custom/liveproxy/default.nix
Normal file
30
makefu/5pkgs/custom/liveproxy/default.nix
Normal 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. ];
|
||||
};
|
||||
}
|
|
@ -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 {})
|
||||
|
|
|
@ -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 ];
|
||||
};
|
||||
}
|
|
@ -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 ];
|
||||
};
|
||||
}
|
|
@ -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; {
|
||||
|
|
|
@ -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";
|
||||
};
|
||||
})
|
||||
];
|
||||
|
|
Loading…
Reference in a new issue