Merge remote-tracking branch 'gum/master'

This commit is contained in:
lassulus 2020-12-30 09:13:07 +01:00
commit e0bb61d3d3
24 changed files with 625 additions and 513 deletions

View File

@ -1,12 +1,16 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
imports = [ imports = [
./net.nix
<stockholm/krebs> <stockholm/krebs>
<stockholm/krebs/2configs> <stockholm/krebs/2configs>
<stockholm/krebs/2configs/secret-passwords.nix> <stockholm/krebs/2configs/secret-passwords.nix>
<stockholm/krebs/2configs/hw/x220.nix> <stockholm/krebs/2configs/hw/x220.nix>
# see documentation in included getty-for-esp.nix:
# brain hosts/puyak/root
<stockholm/krebs/2configs/hw/getty-for-esp.nix>
## initrd unlocking ## initrd unlocking
# (brain hosts/puyak/luks-ssd;echo) | ssh root@$(brain krebs-secrets/puyak/initrd/hostname) 'cat > /crypt-ramfs/passphrase' # (brain hosts/puyak/luks-ssd;echo) | ssh root@$(brain krebs-secrets/puyak/initrd/hostname) 'cat > /crypt-ramfs/passphrase'
@ -118,7 +122,6 @@
krebs.build.host = config.krebs.hosts.puyak; krebs.build.host = config.krebs.hosts.puyak;
sound.enable = false; sound.enable = false;
boot = { boot = {
loader.systemd-boot.enable = true; loader.systemd-boot.enable = true;
loader.efi.canTouchEfiVariables = true; loader.efi.canTouchEfiVariables = true;
@ -163,10 +166,6 @@
services.logind.lidSwitchExternalPower = "ignore"; services.logind.lidSwitchExternalPower = "ignore";
services.udev.extraRules = ''
SUBSYSTEM=="net", ATTR{address}=="8c:70:5a:b2:84:58", NAME="wl0"
SUBSYSTEM=="net", ATTR{address}=="3c:97:0e:07:b9:14", NAME="et0"
'';
environment.systemPackages = [ pkgs.zsh ]; environment.systemPackages = [ pkgs.zsh ];
@ -179,5 +178,4 @@
isNormalUser = true; isNormalUser = true;
shell = "/run/current-system/sw/bin/zsh"; shell = "/run/current-system/sw/bin/zsh";
}; };
networking.firewall.allowedTCPPorts = [ 5901 ];
} }

View File

@ -0,0 +1,23 @@
let
ext-if = "enp0s25";
shack-ip = "10.42.22.184";
shack-gw = "10.42.20.1";
in {
services.udev.extraRules = ''
SUBSYSTEM=="net", ATTR{address}=="8c:70:5a:b2:84:58", NAME="wl0"
SUBSYSTEM=="net", ATTR{address}=="3c:97:0e:07:b9:14", NAME="et0"
'';
networking = {
firewall.enable = false;
firewall.allowedTCPPorts = [ 8088 8086 8083 5901 ];
interfaces."${ext-if}".ipv4.addresses = [
{
address = shack-ip;
prefixLength = 20;
}
];
defaultGateway = shack-gw;
nameservers = [ "10.42.0.100" "10.42.0.200" ];
};
}

View File

@ -0,0 +1,17 @@
{
# 1. Program an esp8266 devboard (esp8266+usb-ttl) with # https://github.com/jeelabs/esp-link
# tested vesion: esp-link v3.2.47-g9c6530d
# Pin Preset: esp-bridge
# tx-enable: false
# uart-pins: normal
# 2. connect directly with usb-cable to device, check that vendorID and ProductID match
# 3. nc <esp-link-ip> 23
# Info: for puyak the root pw is `brain hosts/puyak/root`
services.udev.extraRules = ''
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ilo", MODE="0660"
'';
systemd.services."serial-getty@ilo".enable = true;
systemd.services."serial-getty@ilo".wantedBy = [ "multi-user.target" ];
systemd.services."serial-getty@ilo".serviceConfig.Restart = "always";
}

View File

@ -1,5 +1,6 @@
{ pkgs,lib, ... }: { pkgs,lib, ... }:
{ {
boot.kernel.sysctl."net.ipv4.ip_forward" = true;
services.gitlab-runner = { services.gitlab-runner = {
enable = true; enable = true;
services= { services= {
@ -17,6 +18,7 @@
"/nix/var/nix/daemon-socket:/nix/var/nix/daemon-socket:ro" "/nix/var/nix/daemon-socket:/nix/var/nix/daemon-socket:ro"
]; ];
dockerDisableCache = true; dockerDisableCache = true;
# TODO: use the channel from <stockholm/krebs/nixpkgs.json>
preBuildScript = pkgs.writeScript "setup-container" '' preBuildScript = pkgs.writeScript "setup-container" ''
mkdir -p -m 0755 /nix/var/log/nix/drvs mkdir -p -m 0755 /nix/var/log/nix/drvs
mkdir -p -m 0755 /nix/var/nix/gcroots mkdir -p -m 0755 /nix/var/nix/gcroots
@ -28,9 +30,9 @@
mkdir -p -m 0755 /nix/var/nix/profiles/per-user/root mkdir -p -m 0755 /nix/var/nix/profiles/per-user/root
mkdir -p -m 0700 "$HOME/.nix-defexpr" mkdir -p -m 0700 "$HOME/.nix-defexpr"
. ${pkgs.nix}/etc/profile.d/nix.sh . ${pkgs.nix}/etc/profile.d/nix.sh
${pkgs.nix}/bin/nix-env -i ${concatStringsSep " " (with pkgs; [ nix cacert git openssh ])} ${pkgs.nix}/bin/nix-channel --add https://nixos.org/channels/nixos-20.09 nixpkgs
${pkgs.nix}/bin/nix-channel --add https://nixos.org/channels/nixpkgs-unstable
${pkgs.nix}/bin/nix-channel --update nixpkgs ${pkgs.nix}/bin/nix-channel --update nixpkgs
${pkgs.nix}/bin/nix-env -i ${concatStringsSep " " (with pkgs; [ nix cacert git openssh ])}
''; '';
environmentVariables = { environmentVariables = {
ENV = "/etc/profile"; ENV = "/etc/profile";

View File

@ -1,21 +1,24 @@
# needs: # needs:
# light.fablab_led # light.fablab_led
[ {
{ alias = "State on HA start-up"; services.home-assistant.config.automation =
trigger = { [
platform = "homeassistant"; { alias = "State on HA start-up";
event = "start"; trigger = {
}; platform = "homeassistant";
# trigger good/bad air event = "start";
action = [ };
{ service = "light.turn_on"; # trigger good/bad air
data = { action = [
entity_id = "light.fablab_led"; { service = "light.turn_on";
effect = "Rainbow"; data = {
color_name = "purple"; entity_id = "light.fablab_led";
}; effect = "Rainbow";
} color_name = "purple";
]; };
} }
] ];
}
];
}

View File

@ -6,24 +6,27 @@ let
disko_schalter = "switch.lounge_diskoschalter_relay"; disko_schalter = "switch.lounge_diskoschalter_relay";
player = "media_player.lounge"; player = "media_player.lounge";
in in
[ {
{ alias = "Party um 21 Uhr"; services.home-assistant.config.automation =
trigger = { [
platform = "sun"; { alias = "Party um 21 Uhr";
event = "sunset"; trigger = {
}; platform = "sun";
action = event = "sunset";
( glados.say.kiosk "Die Sonne geht unter. Und jetzt geht die Party im shack erst richtig los. Partybeleuchtung, aktiviert!" ) };
++ action =
[ ( glados.say.kiosk "Die Sonne geht unter. Und jetzt geht die Party im shack erst richtig los. Partybeleuchtung, aktiviert!" )
{ ++
service = "homeassistant.turn_on"; [
entity_id = disko_schalter; {
} service = "homeassistant.turn_on";
{ entity_id = disko_schalter;
service = "media_player.turn_on"; }
data.entity_id = player; {
} # TODO: also start playlist if nothing is running? service = "media_player.turn_on";
]; data.entity_id = player;
} } # TODO: also start playlist if nothing is running?
] ];
}
];
}

View File

@ -13,85 +13,88 @@
let let
glados = import ../lib; glados = import ../lib;
in in
[ {
{ services.home-assistant.config.automation =
alias = "Bedanken bei Übernahme von Key"; [
initial_state = true; {
trigger = { alias = "Bedanken bei Übernahme von Key";
platform = "state"; initial_state = true;
entity_id = "sensor.keyholder"; trigger = {
}; platform = "state";
condition = { entity_id = "sensor.keyholder";
condition = "template"; };
value_template = "{{ (trigger.from_state.state != 'No Keyholder') and (trigger.from_state.state != 'No Keyholder') }}"; condition = {
}; condition = "template";
action = glados.say.kiosk "Danke {{ trigger.to_state.state }} für das Übernehmen des Keys von {{ trigger.from_state.state }}"; value_template = "{{ (trigger.from_state.state != 'No Keyholder') and (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 }}";
alias = "Keyholder Begrüßen wenn MPD hoch fährt"; }
initial_state = true; {
trigger = { alias = "Keyholder Begrüßen wenn MPD hoch fährt";
platform = "state"; initial_state = true;
from = "unavailable"; trigger = {
entity_id = "media_player.kiosk"; platform = "state";
}; from = "unavailable";
action = glados.say.kiosk (builtins.readFile ./announcement.j2); entity_id = "media_player.kiosk";
} };
{ action = glados.say.kiosk (builtins.readFile ./announcement.j2);
alias = "Start Music on portal lock on"; }
trigger = { {
platform = "state"; alias = "Start Music on portal lock on";
entity_id = "binary_sensor.portal_lock"; trigger = {
to = "on"; platform = "state";
for.seconds = 30; entity_id = "binary_sensor.portal_lock";
}; to = "on";
condition = { for.seconds = 30;
condition = "and"; };
conditions = condition = {
[ condition = "and";
{ # only start if a keyholder opened the door and if the lounge mpd is currently not playing anything conditions =
condition = "template"; [
value_template = "{{ state('sensor.keyholder') != 'No Keyholder' }}"; { # 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"; condition = "state";
}
];
};
action = [
{
service = "media_player.volume_set";
data = {
entity_id = "media_player.lounge"; entity_id = "media_player.lounge";
volume_level = 1.0; state = "idle";
}; }
} ];
{ };
service = "media_player.play_media"; action = [
data = { {
entity_id = "media_player.lounge"; service = "media_player.volume_set";
media_content_type = "playlist"; data = {
media_content_id = "ansage"; entity_id = "media_player.lounge";
}; volume_level = 1.0;
} };
{ delay.seconds = 8.5; } }
{ {
service = "media_player.volume_set"; service = "media_player.play_media";
data = { data = {
entity_id = "media_player.lounge"; entity_id = "media_player.lounge";
volume_level = 0.6; media_content_type = "playlist";
}; media_content_id = "ansage";
} };
{ }
service = "media_player.play_media"; { delay.seconds = 8.5; }
data = { {
entity_id = "media_player.lounge"; service = "media_player.volume_set";
media_content_type = "playlist"; data = {
media_content_id = "lassulus"; 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";
};
}
];
}
];
}

View File

@ -1,9 +1,5 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let let
shackopen = import ./multi/shackopen.nix;
wasser = import ./multi/wasser.nix;
badair = import ./multi/schlechte_luft.nix;
rollos = import ./multi/rollos.nix;
in { in {
services.nginx.virtualHosts."hass.shack" = { services.nginx.virtualHosts."hass.shack" = {
serverAliases = [ "glados.shack" ]; serverAliases = [ "glados.shack" ];
@ -21,14 +17,28 @@ in {
''; '';
}; };
}; };
imports = [
./multi/shackopen.nix
./multi/wasser.nix
./multi/schlechte_luft.nix
./multi/rollos.nix
./switch/power.nix
./sensors/power.nix
./sensors/mate.nix
./sensors/darksky.nix
./sensors/spaceapi.nix
./sensors/sensemap.nix
./automation/shack-startup.nix
./automation/party-time.nix
./automation/hass-restart.nix
];
services.home-assistant = services.home-assistant =
{ {
enable = true; enable = true;
package = pkgs.home-assistant.override {
extraPackages = ps: with ps; [
python-forecastio jsonrpc-async jsonrpc-websocket mpd2 pkgs.picotts
];
};
autoExtraComponents = true; autoExtraComponents = true;
config = { config = {
homeassistant = { homeassistant = {
@ -85,9 +95,6 @@ in {
retain = true; retain = true;
}; };
}; };
switch =
(import ./switch/power.nix)
;
light = []; light = [];
media_player = [ media_player = [
{ platform = "mpd"; { platform = "mpd";
@ -100,34 +107,23 @@ in {
} }
]; ];
sensor =
(import ./sensors/power.nix)
++ (import ./sensors/mate.nix)
++ (import ./sensors/darksky.nix { inherit lib;})
++ shackopen.sensor
++ wasser.sensor
;
air_quality = (import ./sensors/sensemap.nix );
binary_sensor =
shackopen.binary_sensor
++ (import ./sensors/spaceapi.nix)
;
camera = []; camera = [];
frontend = { }; frontend = { };
config = { }; config = { };
sun = {};
http = { http = {
base_url = "http://hass.shack"; base_url = "http://hass.shack";
use_x_forwarded_for = true; use_x_forwarded_for = true;
trusted_proxies = "127.0.0.1"; trusted_proxies = "127.0.0.1";
}; };
#conversation = {}; #conversation = {};
# history = {};
#logbook = {}; history = {};
logger.default = "info"; logbook = {};
#recorder = {}; #recorder = {};
logger.default = "info";
tts = [ tts = [
{ platform = "google_translate"; { platform = "google_translate";
service_name = "say"; service_name = "say";
@ -136,15 +132,6 @@ in {
time_memory = 57600; time_memory = 57600;
} }
]; ];
sun = {};
automation = wasser.automation
++ badair.automation
++ rollos.automation
++ (import ./automation/shack-startup.nix)
++ (import ./automation/party-time.nix)
++ (import ./automation/hass-restart.nix);
device_tracker = []; device_tracker = [];
}; };
}; };

View File

@ -11,46 +11,49 @@ let
]; ];
in in
{ {
automation = services.home-assistant.config =
[ {
{ alias = "Rollos fahren Runter"; automation =
trigger = [ [
{ { alias = "Rollos fahren Runter";
platform = "numeric_state"; trigger = [
entity_id = tempsensor;
above = 25;
for = "00:30:00";
}
];
condition =
[
{ {
condition = "state"; platform = "numeric_state";
entity_id = "sun.sun"; entity_id = tempsensor;
state = "above_horizon"; above = 25;
} for = "00:30:00";
];
action =
[
{ service = "cover.close_cover";
entity_id = all_covers;
} }
]; ];
} condition =
{ alias = "Rollos fahren Hoch"; [
trigger = [ {
{ condition = "state";
platform = "sun"; entity_id = "sun.sun";
event = "sunset"; state = "above_horizon";
} }
]; ];
condition = [ ]; action =
action = [
[ { service = "cover.close_cover";
{ service = "cover.open_cover"; entity_id = all_covers;
entity_id = all_covers; }
];
}
{ alias = "Rollos fahren Hoch";
trigger = [
{
platform = "sun";
event = "sunset";
} }
]; ];
} condition = [ ];
]; action =
[
{ service = "cover.open_cover";
entity_id = all_covers;
}
];
}
];
};
} }

View File

@ -4,103 +4,106 @@ let
ledring = "light.fablab_led_ring"; ledring = "light.fablab_led_ring";
in in
{ {
automation = services.home-assistant.config =
[ {
{ alias = "Gute Luft Fablab"; automation =
trigger = [ [
{ { alias = "Gute Luft Fablab";
platform = "numeric_state"; trigger = [
entity_id = feinstaub_sensor; {
below = 3; platform = "numeric_state";
} entity_id = feinstaub_sensor;
]; below = 3;
action =
[
{ service = "light.turn_on";
data = {
entity_id = ledring;
effect = "Twinkle";
color_name = "green";
};
} }
]; ];
} action =
{ alias = "mäßige Luft Fablab"; [
trigger = [ { service = "light.turn_on";
{ data = {
platform = "numeric_state"; entity_id = ledring;
above = 3; effect = "Twinkle";
below = 10; color_name = "green";
entity_id = feinstaub_sensor; };
} }
]; ];
action = }
[ { alias = "mäßige Luft Fablab";
{ service = "light.turn_on"; trigger = [
data = { {
entity_id = ledring; platform = "numeric_state";
effect = "Twinkle"; above = 3;
color_name = "yellow"; below = 10;
}; entity_id = feinstaub_sensor;
} }
]; ];
} action =
{ alias = "schlechte Luft Fablab"; [
trigger = [ { service = "light.turn_on";
{ data = {
platform = "numeric_state"; entity_id = ledring;
above = 10; effect = "Twinkle";
entity_id = feinstaub_sensor; color_name = "yellow";
} };
]; }
action = ];
[ }
{ service = "light.turn_on"; { alias = "schlechte Luft Fablab";
data = { trigger = [
entity_id = ledring; {
effect = "Fireworks"; platform = "numeric_state";
color_name = "red"; above = 10;
}; entity_id = feinstaub_sensor;
} }
]; ];
} action =
{ alias = "Luft Sensor nicht verfügbar"; [
trigger = [ { service = "light.turn_on";
{ data = {
platform = "state"; entity_id = ledring;
to = "unavailable"; effect = "Fireworks";
entity_id = feinstaub_sensor; color_name = "red";
} };
]; }
action = ];
[ }
{ service = "light.turn_on"; { alias = "Luft Sensor nicht verfügbar";
data = { trigger = [
entity_id = ledring; {
effect = "Rainbow"; platform = "state";
color_name = "blue"; to = "unavailable";
}; entity_id = feinstaub_sensor;
} }
]; ];
} action =
{ alias = "Fablab Licht Reboot"; [
trigger = [ { service = "light.turn_on";
{ data = {
platform = "state"; entity_id = ledring;
from = "unavailable"; effect = "Rainbow";
entity_id = ledring; color_name = "blue";
} };
]; }
action = ];
[ }
{ service = "light.turn_on"; { alias = "Fablab Licht Reboot";
data = { trigger = [
entity_id = ledring; {
effect = "Rainbow"; platform = "state";
color_name = "orange"; from = "unavailable";
}; entity_id = ledring;
} }
]; ];
} action =
]; [
{ service = "light.turn_on";
data = {
entity_id = ledring;
effect = "Rainbow";
color_name = "orange";
};
}
];
}
];
};
} }

View File

@ -1,23 +1,26 @@
{ {
binary_sensor = [ services.home-assistant.config =
{ platform = "mqtt"; {
name = "Portal Lock"; binary_sensor = [
device_class = "door"; { platform = "mqtt";
state_topic = "portal/gateway/status"; name = "Portal Lock";
availability_topic = "portal/gateway/lwt"; device_class = "door";
payload_on = "open"; state_topic = "portal/gateway/status";
payload_off = "closed"; availability_topic = "portal/gateway/lwt";
payload_available = "online"; payload_on = "open";
payload_not_available = "offline"; payload_off = "closed";
} payload_available = "online";
]; payload_not_available = "offline";
sensor = [ }
{ platform = "mqtt"; ];
name = "Keyholder"; sensor = [
state_topic = "portal/gateway/keyholder"; { platform = "mqtt";
availability_topic = "portal/gateway/lwt"; name = "Keyholder";
payload_available = "online"; state_topic = "portal/gateway/keyholder";
payload_not_available = "offline"; availability_topic = "portal/gateway/lwt";
} payload_available = "online";
]; payload_not_available = "offline";
}
];
};
} }

View File

@ -11,100 +11,103 @@ let
}; };
in in
{ {
sensor = map ( entity_id: { services.home-assistant.config =
platform = "statistics"; {
name = "Statistics for ${entity_id}"; sensor = map ( entity_id: {
inherit entity_id; platform = "statistics";
max_age.minutes = "60"; name = "Statistics for ${entity_id}";
sampling_size = 1000; inherit entity_id;
}) ["sensor.crafting_brotbox_soil_moisture"]; max_age.minutes = "60";
sampling_size = 1000;
}) ["sensor.crafting_brotbox_soil_moisture"];
automation = automation =
[ [
### Brotbox ##### ### Brotbox #####
#{ alias = "Brotbox: water for ${toString brotbox.minutes} minutes every hour"; #{ alias = "Brotbox: water for ${toString brotbox.minutes} minutes every hour";
# trigger = # trigger =
# { # Trigger once every hour at :42 # { # Trigger once every hour at :42
# platform = "time_pattern"; # platform = "time_pattern";
# minutes = 42; # minutes = 42;
# }; # };
# condition = { # condition = {
# condition = "numeric_state"; # condition = "numeric_state";
# entity_id = brotbox.sensor; # entity_id = brotbox.sensor;
# value_template = "{{ state_attr('${brotbox.sensor}', 'median') }}"; # value_template = "{{ state_attr('${brotbox.sensor}', 'median') }}";
# below = 75; # below = 75;
# }; # };
# action = # action =
# [ # [
# { # {
# service = "homeassistant.turn_on"; # service = "homeassistant.turn_on";
# entity_id = brotbox.pump; # entity_id = brotbox.pump;
# } # }
# { delay.minutes = brotbox.minutes; } # { delay.minutes = brotbox.minutes; }
# { # {
# service = "homeassistant.turn_off"; # service = "homeassistant.turn_off";
# entity_id = brotbox.pump ; # entity_id = brotbox.pump ;
# } # }
# ]; # ];
#} #}
{ alias = "Brotbox: Always turn off water after ${toString (brotbox.minutes * 2)} minutes"; { alias = "Brotbox: Always turn off water after ${toString (brotbox.minutes * 2)} minutes";
trigger = trigger =
{
platform = "state";
entity_id = brotbox.pump;
to = "on";
for.minutes = brotbox.minutes*2;
};
action =
{
service = "homeassistant.turn_off";
entity_id = brotbox.pump;
};
}
##### Kaffeemaschine
{ alias = "Water the plant for ${toString seconds} seconds";
trigger = [
{ # trigger at 20:00 no matter what
# TODO: retry or run only if switch.wasser is available
platform = "time";
at = "20:00:00";
}
];
action =
[
{
service = "homeassistant.turn_on";
entity_id = [
wasser
];
}
{ delay.seconds = seconds; }
{
service = "homeassistant.turn_off";
entity_id = [
wasser
];
}
];
}
{ alias = "Always turn off water after ${toString (seconds * 2)}seconds";
trigger = [
{ {
platform = "state"; platform = "state";
entity_id = wasser; entity_id = brotbox.pump;
to = "on"; to = "on";
for.seconds = seconds*2; for.minutes = brotbox.minutes*2;
} };
]; action =
action =
[
{ {
service = "homeassistant.turn_off"; service = "homeassistant.turn_off";
entity_id = [ wasser ]; entity_id = brotbox.pump;
} };
]; }
}
]; ##### Kaffeemaschine
{ alias = "Water the plant for ${toString seconds} seconds";
trigger = [
{ # trigger at 20:00 no matter what
# TODO: retry or run only if switch.wasser is available
platform = "time";
at = "20:00:00";
}
];
action =
[
{
service = "homeassistant.turn_on";
entity_id = [
wasser
];
}
{ delay.seconds = seconds; }
{
service = "homeassistant.turn_off";
entity_id = [
wasser
];
}
];
}
{ alias = "Always turn off water after ${toString (seconds * 2)}seconds";
trigger = [
{
platform = "state";
entity_id = wasser;
to = "on";
for.seconds = seconds*2;
}
];
action =
[
{
service = "homeassistant.turn_off";
entity_id = [ wasser ];
}
];
}
];
};
} }

View File

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

View File

@ -6,11 +6,15 @@ let
name = "Füllstand ${name}"; name = "Füllstand ${name}";
value_template = "{{ value_json.fuellstand }}"; value_template = "{{ value_json.fuellstand }}";
}; };
in [ in
(fuellstand "Wasser" 1) {
(fuellstand "Mate Cola" 2) services.home-assistant.config.sensor =
(fuellstand "Apfelschorle" 3) [
(fuellstand "Zitronensprudel" 4) (fuellstand "Wasser" 1)
(fuellstand "Mate 1" 26) (fuellstand "Mate Cola" 2)
(fuellstand "Mate 2" 27) (fuellstand "Apfelschorle" 3)
] (fuellstand "Zitronensprudel" 4)
(fuellstand "Mate 1" 26)
(fuellstand "Mate 2" 27)
];
}

View File

@ -20,7 +20,10 @@ let
power_watt = (power_x "Power") ; power_watt = (power_x "Power") ;
power_curr = power_x "Current"; power_curr = power_x "Current";
in in
{
services.home-assistant.config.sensor =
(map power_volt [ "L1" "L2" "L3" ]) (map power_volt [ "L1" "L2" "L3" ])
++ (map (x: ((power_watt x) // { device_class = "power"; })) [ "L1" "L2" "L3" ]) ++ (map (x: ((power_watt x) // { device_class = "power"; })) [ "L1" "L2" "L3" ])
++ (map power_curr [ "L1" "L2" "L3" ]) ++ (map power_curr [ "L1" "L2" "L3" ])
++ [ power_consumed ] ++ [ power_consumed ];
}

View File

@ -1,6 +1,9 @@
[ {
{ services.home-assistant.config.air_quality =
platform = "opensensemap"; [
station_id = "56a0de932cb6e1e41040a68b"; {
} platform = "opensensemap";
] station_id = "56a0de932cb6e1e41040a68b";
}
];
}

View File

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

View File

@ -15,18 +15,30 @@ let
power = nodelight "power"; power = nodelight "power";
light = ident: name: { icon = "mdi:lightbulb";} // nodelight "light" ident name; light = ident: name: { icon = "mdi:lightbulb";} // nodelight "light" ident name;
in in
[ {
(power 1 "Hauptschalter") services.home-assistant.config.switch =
(power 2 "Dusche") [
(power 3 "Warmwasser") # These commands we see with a shutdown:
(power 4 "Optionsräume") # power/143/state on
(power 5 "Küche") # power/142/state on
(light 1 "Decke Lounge 1") # power/141/state on
(light 2 "Decke Lounge 2") # power/142/state off
(light 3 "Decke Lounge 3") # power/141/state off
(light 4 "Decke Lounge 4") # power/10/state off
(light 5 "Decke Lounge 5") # power/main/state off
(light 6 "Decke Lounge 6")
(light 7 "Decke Lounge 7") (power "10" "Hauptschalter")
(light 8 "Decke Lounge 8") (power 1 "Dusche") # ???
] (power 2 "Warmwasser") # ???
(power 3 "Optionsräume") # ???
(power 4 "Küche") # ???
(light 1 "Decke Lounge 1")
(light 2 "Decke Lounge 2")
(light 3 "Decke Lounge 3")
(light 4 "Decke Lounge 4")
(light 5 "Decke Lounge 5")
(light 6 "Decke Lounge 6")
(light 7 "Decke Lounge 7")
(light 8 "Decke Lounge 8")
];
}

View File

@ -67,7 +67,7 @@ in {
}; };
sensor = "total"; sensor = "total";
types = [ "Voltage" "Current" "Power" ]; types = [ "Voltage" "Current" "Power" ];
phases = [ 1 2 3 ]; phases = [ "1" "2" "3" ];
in in
[ (genTopic "Power consumed" "/power/${sensor}/consumed" { inherit sensor; }) ] ++ [ (genTopic "Power consumed" "/power/${sensor}/consumed" { inherit sensor; }) ] ++
(lib.flatten (map (type: (map (phase: (genTopic "Power" "/power/${sensor}/L${toString phase}/${type}" { inherit sensor phase type; }) ) phases)) types)); (lib.flatten (map (type: (map (phase: (genTopic "Power" "/power/${sensor}/L${toString phase}/${type}" { inherit sensor phase type; }) ) phases)) types));

View File

@ -3,11 +3,11 @@
with import <stockholm/lib>; with import <stockholm/lib>;
let let
pkg = pkgs.stdenv.mkDerivation { pkg = pkgs.stdenv.mkDerivation {
name = "worlddomination-2018-04-21"; name = "worlddomination-2020-12-01";
src = pkgs.fetchgit { src = pkgs.fetchgit {
url = "https://github.com/shackspace/worlddomination/"; url = "https://git.shackspace.de/rz/worlddomination.git";
rev = "1b32403b9"; rev = "c7aedcde7cd1fcb870b5356a6125e1a384b0776c";
sha256 = "10x7aiil13k3x9wqy95mi1ys999d6fxg5sys3jwv7a1p930gkl1i"; sha256 = "0y6haz5apwa33lz64l7b2x78wrrckbw39j4wzyd1hfk46478xi2y";
}; };
buildInputs = [ buildInputs = [
(pkgs.python3.withPackages (pythonPackages: with pythonPackages; [ (pkgs.python3.withPackages (pythonPackages: with pythonPackages; [
@ -17,6 +17,7 @@ let
grequests grequests
paramiko paramiko
python python
setuptools
])) ]))
]; ];
installPhase = '' installPhase = ''

View File

@ -0,0 +1,33 @@
let
toggle = light: btn:
{
alias = "Toggle Light ${light} via ${btn}";
trigger = {
platform = "state";
entity_id = "sensor.${btn}_click";
to = "single";
};
action = {
service = "light.toggle";
entity = light;
};
};
turn_off_all = btn:
{
alias = "Turn of all lights via ${btn} double click";
trigger = {
platform = "state";
entity_id = "sensor.${btn}_click";
to = "double";
};
action = {
service = "light.turn_off";
entity = "light.alle_lichter";
};
};
in {
services.home-assistant.config.automation = [
(toggle "light.wohnzimmer_lichter" "btn3")
(turn_off_all "btn3")
];
}

View File

@ -26,6 +26,7 @@ in {
./calendar/nextcloud.nix ./calendar/nextcloud.nix
./automation/firetv_restart.nix ./automation/firetv_restart.nix
./automation/light_buttons.nix
./light/groups.nix ./light/groups.nix
]; ];

View File

@ -13,7 +13,7 @@ let
"light.wohnzimmer_stehlampe_osram_light" "light.wohnzimmer_stehlampe_osram_light"
]; ];
schlafzimmer_licht = [ schlafzimmer_licht = [
"schlafzimmer_komode_osram_light" "light.schlafzimmer_komode_osram_light"
]; ];
in { in {
services.home-assistant.config.light = [ services.home-assistant.config.light = [

View File

@ -52,6 +52,7 @@
xo = "mimeopen"; xo = "mimeopen";
nmap = "nmap -oN $HOME/loot/scan-`date +\%s`.nmap -oX $HOME/loot/scan-`date +%s`.xml"; nmap = "nmap -oN $HOME/loot/scan-`date +\%s`.nmap -oX $HOME/loot/scan-`date +%s`.xml";
}; };
# navi package does not come with the navi.plugin.zsh anymore so we use .src
initExtra = '' initExtra = ''
bindkey -e bindkey -e
# shift-tab # shift-tab
@ -69,7 +70,7 @@
zstyle ':completion::complete:secrets::' prefix "$HOME/.secrets-pass/" zstyle ':completion::complete:secrets::' prefix "$HOME/.secrets-pass/"
# navi # navi
source ${pkgs.navi}/share/navi/shell/navi.plugin.zsh . ${pkgs.navi.src}/shell/navi.plugin.zsh
# ctrl-x ctrl-e # ctrl-x ctrl-e
autoload -U compinit && compinit autoload -U compinit && compinit
autoload -U edit-command-line autoload -U edit-command-line