stockholm/makefu/2configs/bureautomation/combination/10h_timers.nix

384 lines
11 KiB
Nix
Raw Normal View History

{lib, ... }:
let
persons = [ "frank" "daniel" "thorsten" "carsten" "thierry" "ecki"
# "felix" # custom actions
];
random_zu_lange = name: ''{{ [
"Du musst jetzt endlich nach Hause gehen ${name}!",
"10 Stunden sind rum, bald schenkst du den Franzosen deine Lebenszeit",
"Nur eine Minute über 10 Stunden kann zu einer Stunde Arbeit für Thorsten werden, ${name}.",
"In 10 Minuten kommt dich der Security Mann holen, ${name}",
"Zu lange, ${name}!" ] | random }}'' ;
random_announce = name: ''{{ [
"Guten Tag ${name}!",
"${name} is in da House",
"Ahoi ${name}",
"Moinsen ${name}",
"Moin Moin ${name}",
"Palim, Palim ${name}",
"Vorwärts Genosse ${name}",
"Gemeinsame Grüße, Genosse ${name}",
"Sozialistische Grüße, Genosse ${name}",
"Konzentrierte Grüße, Genosse ${name}",
"Ach, der ${name} ist auch wieder da...",
"Nicht ${name} schon wieder",
"Tri tra tralala, der ${name} ist wieder da.",
"Na sieh mal einer an, ${name} hat es auch her geschafft",
"Wer ist im Büro eingetroffen? ${name} ist es!",
"Willkommen in deinem Lieblingsbüro, ${name}.",
"Klopf, Klopf, wer ist da? ${name} ist da!",
"Messer, Gabel, Schere, Licht sind für kleinen ${name} nicht.",
"Ich kenne ein Geheimnis, ${name} ist abgekommen",
"Wir sind ${name}. Sie werden assimiliert werden",
"Achtung, es erfolgt eine Durchsage. ${name} ist eingetroffen",
"Die Scanner haben eine dem System bekannte Lebensform mit dem Namen ${name} detektiert",
"Das Büro sieht dich, ${name}",
"Im Kalender von ${name} sind heute acht Meetings eingeplant, von denen zwei bereits verpasst wurden",
"Das Postfach von ${name} beinhaltet einhundertachtundzwanzig ungelesene E-Mails.",
"Nachricht von Serge: ${name}, bitte melden Sie sich Umgehend bei mir im Büro!",
"Luftqualität hat sich durch das Eintreffen von ${name} um zweihunder Punkte verschlechtert, bitte alle Fenster öffnen.",
"${name} arbeitet gern für seinen Konzern",
"${name} ist nur froh im Großraumbüro",
"Für ${name} ist die schönste Zeit ... die Arbeit",
"Ein Fleißbienchen für ${name} zum rechtzeitigen Erscheinen im Büro",
"${name} ist heute wohl doch nicht im Office Home",
"${name} ist bereit für einen Tag voller Meetings",
"Trotz schwerer Männergrippe ist ${name} heute im Büro erschienen.",
"${name} kenne keine Parteien mehr, ${name} kenne nur noch Arbeitsplätze",
"${name}, Frage nicht, was dein Arbeitsplatz für dich tun kann. Frage, was du für deinen Arbeitsplatz tun kannst",
"${name} läuft bis in den Jemen - für sein Unternehmen. ${name} schwimmt bis nach Birma - für meine Firma",
"Der Cyberian ${name} ist gekommen um die Bahnwelt vor Cyber-Angriffen zu schützen",
"Alles paletto im Ghetto, ${name}?",
"Hach, ${name}, wenn du hier rein kommst fühlt es sich gleich wieder an wie Montag.",
"Oh nein, nicht schon wieder ${name}",
"Wer wohnt in der Ananas ganz tief im Meer? ${name} Schwammkopf!",
"Arbeit ist Freizeit! Wachstum ist Fortschritt! Sicherheit ist Freiheit!",
"Willkommen ${name}"] | random }}'' ;
patterns = [
[1000 500 250] # TODO: maybe even play a short audio announcement?
[150 150 150]
[255 255]
[500 500 100]
[100 1000 100]
# [125 250 500]
];
tmr_10h = name: {
"${name}_10h" = {
name = "${name} 10h Timer";
duration = "10:00:00";
};
};
multi_flash = { entity, delays ? [ 500 ], alias ? "${entity}_multi_flash_${toString (lib.length delays)}" }:
{
inherit alias;
sequence = lib.flatten (builtins.map (delay: [
{ service = "homeassistant.turn_on";
data.entity_id = entity;
}
{ delay.milliseconds = delay; }
{ service = "homeassistant.turn_off";
data.entity_id = entity;
}
{ delay.milliseconds = delay; }
]
) delays);
};
buzz_user = name: delays: { "buzz_${name}" = (multi_flash {
entity = "light.redbutton_buzzer";
inherit delays;
alias = "Red Button Buzz ${name}";
});
};
zu_lange_user = name:
{ "announce_${name}" = {
alias = "Random Zu Lange ${name}";
sequence = [
{ service = "media_player.play_media";
data = {
entity_id = "media_player.mpd";
media_content_type = "playlist";
media_content_id = "ansage";
};
}
{ delay.seconds = 5; }
{ service = "tts.google_say";
entity_id = "media_player.mpd";
data_template = {
message = random_zu_lange name;
language = "de";
};
}
];
};
};
announce_user = name:
{ "announce_${name}" = {
alias = "Random Announce ${name}";
sequence = [
{ delay.seconds = 10; }
{ service = "media_player.play_media";
data = {
entity_id = "media_player.mpd";
media_content_type = "playlist";
media_content_id = "ansage";
};
}
{ delay.seconds = 5; }
{ service = "tts.google_say";
entity_id = "media_player.mpd";
data_template = {
message = random_announce name;
language = "de";
};
}
];
};
};
automation_10h = name: [
{ alias = "start ${name} 10h";
trigger = {
platform = "state";
# TODO: ecki
entity_id = [ "device_tracker.${name}_phone"];
from = "not_home";
to = "home";
};
condition = {
condition = "and";
conditions = [
{
condition = "state";
entity_id = "timer.${name}_10h";
state = "idle";
}
{
condition = "time";
after = "06:00:00";
before = "12:00:00";
}
];
};
action = [
{ service = "timer.start";
entity_id = [ "timer.${name}_10h" ] ;
}
{ service = "homeassistant.turn_on";
entity_id = [
# "script.buzz_${name}"
"script.blitz_10s"
"script.announce_${name}"
];
}
];
}
{
alias = "Zu lange ${name}!";
trigger =
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.${name}_10h";
};
action =
[
{ service = "homeassistant.turn_on";
entity_id = [
"script.blitz_10s"
"script.zu_lange_${name}"
];
}
];
}
];
in
{
timer =lib.fold lib.recursiveUpdate {}
([
(tmr_10h "felix")
{ felix_8_30h = {
name = "Felix 8_30h Timer";
duration = "08:30:00";
};
felix_7h = {
name = "Felix 7h Timer";
duration = "07:00:00";
};
}
] ++ (map tmr_10h persons));
automation = lib.flatten (map automation_10h persons) ++
[
{ alias = "start Felix 10h";
trigger = {
platform = "state";
entity_id = [ "device_tracker.felix_phone" "device_tracker.felix_laptop" ];
from = "not_home";
to = "home";
};
condition = {
condition = "and";
conditions = [
{
condition = "state";
entity_id = "timer.felix_10h";
state = "idle";
}
{
condition = "time";
after = "06:00:00";
before = "12:00:00";
}
];
};
action = [
{ service = "timer.start";
entity_id = [ "timer.felix_10h" "timer.felix_8_30h" "timer.felix_7h" ] ;
}
{ service = "homeassistant.turn_on";
entity_id = [
# "script.buzz_felix"
"script.blitz_10s"
];
}
{
service = "tts.google_say";
entity_id = "media_player.mpd";
data_template = {
message = "Willkommen, Felix!";
language = "de";
};
}
{ service = "light.turn_on";
data = {
effect = "2";
entity_id = [ "light.status_felix" ];
};
}
];
}
{ alias = "Disable Felix timer at button press";
trigger = {
platform = "state";
entity_id = "binary_sensor.redbutton";
to = "on";
};
condition = {
condition = "and";
conditions = [
{
condition = "state";
entity_id = "timer.felix_10h";
state = "active";
}
{
condition = "time";
after = "12:00:00";
before = "22:00:00";
}
];
};
action =
[
{
service = "timer.cancel";
entity_id = [ "timer.felix_10h" "timer.felix_8_30h" "timer.felix_7h" ];
}
{
service = "homeassistant.turn_on";
entity_id = [ "script.buzz_red_led_fast" ];
}
{
service = "homeassistant.turn_off";
entity_id = [ "light.status_felix" ];
}
];
}
{
alias = "Genug gearbeitet Felix";
trigger =
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.felix_7h";
};
action =
[
{ service = "light.turn_on";
data = {
rgb_color= [0 255 0];
# effect = "0";
entity_id = [ "light.status_felix" ];
};
}
];
}
{
alias = "nun aber nach hause";
trigger =
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.felix_8_30h";
};
action =
[
{ service = "light.turn_on";
data = {
rgb_color= [255 255 0];
# effect = "0";
entity_id = [ "light.status_felix" ];
};
}
];
}
{
alias = "Zu lange Felix!";
trigger =
{
platform = "event";
event_type = "timer.finished";
event_data.entity_id = "timer.felix_10h";
};
action =
[
{
service = "notify.telegrambot";
data = {
title = "Zu lange Felix!";
message = "Du bist schon 10 Stunden auf Arbeit, geh jetzt gefälligst nach Hause!";
};
}
{
service = "homeassistant.turn_on";
entity_id = [
# "script.buzz_felix"
"script.blitz_10s"
];
}
{ service = "light.turn_on";
data = {
rgb_color= [255 0 0];
effect = "0";
entity_id = [ "light.status_felix" ];
};
}
];
}
]
;
script = lib.fold lib.recursiveUpdate {} (
(map (ab: buzz_user ab.fst ab.snd) (lib.zipLists persons patterns)) ++
(map (p: announce_user p) persons) ++
(map (p: zu_lange_user p) persons) ++
[ (announce_user "felix" ) (buzz_user "felix" [125 250 500] ) ]
);
}