k shack/glados: now a docker deployment
This commit is contained in:
parent
7239ec83c5
commit
6e44c39fe0
@ -1,23 +0,0 @@
|
|||||||
# needs:
|
|
||||||
# binary_sensor.lounge_ampel_status
|
|
||||||
# light.lounge_ampel_licht_rot
|
|
||||||
|
|
||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config.automation =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
alias = "Ampel Rotes Licht";
|
|
||||||
initial_state = true;
|
|
||||||
trigger = {
|
|
||||||
platform = "state";
|
|
||||||
entity_id = "binary_sensor.lounge_ampel_status";
|
|
||||||
};
|
|
||||||
action = { service = "light.turn_on";
|
|
||||||
data.entity_id = "light.lounge_ampel_licht_rot";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
Willkommen werter Keyholder {{ states("sensor.keyholder") }} in deinem Lieblingshackerspace.
|
|
||||||
|
|
||||||
Es ist {{states("sensor.fablab_feinstaub_temperature") | round(1) | replace('.',' Komma ')}} Grad {% if states("sensor.fablab_feinstaub_temperature")|float > 25 %}heiss{%elif states("sensor.fablab_feinstaub_temperature")|float > 15%}warm{%else%}kalt{%endif%} bei {% if states(" sensor.rz_feinstaub_humidity") | int <45 %}trockenen{% elif states(" sensor.rz_feinstaub_humidity") | int <65 %}angenehmen{%else%}feuchten{%endif%} {{states(" sensor.rz_feinstaub_humidity") | int }} Prozent Luftfeuchtigkeit.
|
|
||||||
|
|
||||||
{% if (states("sensor.fullstand_mate_1")|int == 0) and
|
|
||||||
states("sensor.fullstand_mate_2")|int == 0 %}ES IST MAHTECALYPSE, BEIDE MAHTESCHÄCHTE SIND LEER! {%if states("sensor.fullstand_mate_cola")| int == 0%} UND SOGAR DIE COLA IST ALLE. Ihr seid sowas von am Arsch!{%else%}Zum Glück gibt es noch Cola, Phew!{%endif%}
|
|
||||||
{% elif (states("sensor.fullstand_mate_1")|int + states("sensor.fullstand_mate_2")|int) < 5 %}
|
|
||||||
Der Mahtestand im Automaten ist mit {{states("sensor.fullstand_mate_1")|int + states("sensor.fullstand_mate_2")|int }} verbleibenden Flaschen kritisch!
|
|
||||||
{% else %}
|
|
||||||
Im Automaten sind noch {{states("sensor.fullstand_mate_1")|int + states("sensor.fullstand_mate_2")|int }} Flaschen Mahte und {{states("sensor.fullstand_mate_cola")}} Flaschen Cola.
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
Die Wettervorhersage: {{states("sensor.dark_sky_hourly_summary")}} Aktuell {{states("sensor.dark_sky_summary")}} bei {{states("sensor.dark_sky_temperature") | round(1) | replace('.',' Komma ')}} Grad.
|
|
||||||
Der Stromverbrauch liegt bei {{ (( states("sensor.l1_power")|int + states("sensor.l2_power")|int + states("sensor.l3_power")|int ) / 1000 )| round(1) | replace('.',' Komma ')}} Kilowatt.
|
|
||||||
|
|
||||||
Im Fablab ist die Feinstaubbelastung {% if states("sensor.fablab_particulate_matter_2_5um_concentration") | float > 50 %}hoch!{%elif states("sensor.fablab_particulate_matter_2_5um_concentration") | float > 25 %}mäßig.{% else %}gering.{%endif%}
|
|
||||||
|
|
||||||
{% if is_state("binary_sensor.door_rzl",'on') and is_state("binary_sensor.door_entropia",'on') %}
|
|
||||||
Das Raumzeitlabor und Entropia haben geöffnet.
|
|
||||||
{% elif is_state("binary_sensor.door_rzl",'off') and is_state("binary_sensor.door_entropia",'off') %}
|
|
||||||
Das Raumzeitlabor und Entropia haben geschlossen.
|
|
||||||
{% elif is_state("binary_sensor.door_rzl",'on') and is_state("binary_sensor.door_entropia",'off') %}
|
|
||||||
Das Raumzeitlabor hat geöffnet und Entropia hat geschlossen.
|
|
||||||
{% elif is_state("binary_sensor.door_rzl",'off') and is_state("binary_sensor.door_entropia",'on') %}
|
|
||||||
Das Raumzeitlabor hat geschlossen und Entropia hat geöffnet.
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
Die Glados Hackerspace Automation wünscht dir und allen Anwesenden einen produktiven und angenehmen Aufenthalt!
|
|
@ -1,24 +0,0 @@
|
|||||||
# needs:
|
|
||||||
# light.fablab_led
|
|
||||||
{
|
|
||||||
services.home-assistant.config.automation =
|
|
||||||
[
|
|
||||||
{ alias = "State on HA start-up";
|
|
||||||
trigger = {
|
|
||||||
platform = "homeassistant";
|
|
||||||
event = "start";
|
|
||||||
};
|
|
||||||
# trigger good/bad air
|
|
||||||
action = [
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = "light.fablab_led";
|
|
||||||
effect = "Rainbow";
|
|
||||||
color_name = "purple";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
# Needs:
|
|
||||||
# sun.sunset
|
|
||||||
# switch.lounge_diskoschalter_relay
|
|
||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
disko_schalter = "switch.lounge_diskoschalter_relay";
|
|
||||||
player = "media_player.lounge";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config.automation =
|
|
||||||
[
|
|
||||||
{ alias = "Party um 21 Uhr";
|
|
||||||
trigger = {
|
|
||||||
platform = "sun";
|
|
||||||
event = "sunset";
|
|
||||||
};
|
|
||||||
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 = "media_player.turn_on";
|
|
||||||
data.entity_id = player;
|
|
||||||
} # TODO: also start playlist if nothing is running?
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,100 +0,0 @@
|
|||||||
# needs:
|
|
||||||
# binary_sensor.portal_lock
|
|
||||||
# sensor.keyholder
|
|
||||||
# media_player.lounge
|
|
||||||
|
|
||||||
# additional state required on:
|
|
||||||
# mpd.shack:
|
|
||||||
# playlist "ansage"
|
|
||||||
# playlist "lassulus"
|
|
||||||
# lounge.kiosk.shack:
|
|
||||||
# playlist "ansage"
|
|
||||||
|
|
||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config.automation =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
alias = "Bedanken bei Übernahme von Key";
|
|
||||||
initial_state = true;
|
|
||||||
trigger = {
|
|
||||||
platform = "state";
|
|
||||||
entity_id = "sensor.keyholder";
|
|
||||||
};
|
|
||||||
condition = {
|
|
||||||
condition = "template";
|
|
||||||
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 = {
|
|
||||||
platform = "state";
|
|
||||||
from = "unavailable";
|
|
||||||
entity_id = "media_player.kiosk";
|
|
||||||
};
|
|
||||||
action = glados.say.kiosk (builtins.readFile ./announcement.j2);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
alias = "Start Music on portal lock on";
|
|
||||||
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.5; }
|
|
||||||
{
|
|
||||||
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";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,12 +1,33 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
let
|
let
|
||||||
unstable = import (pkgs.fetchFromGitHub {
|
kodi-host = "192.168.8.11";
|
||||||
owner = "nixos";
|
confdir = "/var/lib/homeassistant-docker";
|
||||||
repo = "nixpkgs";
|
|
||||||
rev = (lib.importJSON ../../../nixpkgs-unstable.json).rev;
|
|
||||||
sha256 = (lib.importJSON ../../../nixpkgs-unstable.json).sha256;
|
|
||||||
}) {};
|
|
||||||
in {
|
in {
|
||||||
|
imports = [
|
||||||
|
];
|
||||||
|
|
||||||
|
# networking.firewall.allowedTCPPorts = [ 8123 ];
|
||||||
|
virtualisation.oci-containers.containers.hass = {
|
||||||
|
image = "homeassistant/home-assistant:latest";
|
||||||
|
environment = {
|
||||||
|
TZ = "Europe/Berlin";
|
||||||
|
# TODO create unique users
|
||||||
|
PUID = toString config.users.users.news_container.uid;
|
||||||
|
PGID = toString config.users.groups.news_container.gid;
|
||||||
|
UMASK = "007";
|
||||||
|
};
|
||||||
|
extraOptions = ["--net=host" ];
|
||||||
|
volumes = [
|
||||||
|
"${confdir}:/config"
|
||||||
|
#"${confdir}/docker-run:/etc/services.d/home-assistant/run:"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
#"f ${confdir}/docker-run 0770 kiosk kiosk - -"
|
||||||
|
# TODO:
|
||||||
|
"d ${confdir} 0770 news_container news_container - -"
|
||||||
|
];
|
||||||
|
|
||||||
services.nginx.virtualHosts."hass.shack" = {
|
services.nginx.virtualHosts."hass.shack" = {
|
||||||
serverAliases = [ "glados.shack" ];
|
serverAliases = [ "glados.shack" ];
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
@ -23,127 +44,4 @@ 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
|
|
||||||
./automation/ampel.nix
|
|
||||||
|
|
||||||
];
|
|
||||||
services.home-assistant =
|
|
||||||
{
|
|
||||||
enable = true;
|
|
||||||
package = unstable.home-assistant.overrideAttrs (old: {
|
|
||||||
doInstallCheck = false;
|
|
||||||
});
|
|
||||||
config = {
|
|
||||||
homeassistant = {
|
|
||||||
name = "Glados";
|
|
||||||
time_zone = "Europe/Berlin";
|
|
||||||
latitude = "48.8265";
|
|
||||||
longitude = "9.0676";
|
|
||||||
elevation = 303;
|
|
||||||
auth_providers = [
|
|
||||||
{ type = "homeassistant";}
|
|
||||||
{ type = "trusted_networks";
|
|
||||||
trusted_networks = [
|
|
||||||
"127.0.0.1/32"
|
|
||||||
"10.42.0.0/16"
|
|
||||||
"::1/128"
|
|
||||||
"fd00::/8"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
# https://www.home-assistant.io/components/influxdb/
|
|
||||||
influxdb = {
|
|
||||||
database = "glados";
|
|
||||||
host = "influx.shack";
|
|
||||||
component_config_glob = {
|
|
||||||
"sensor.*particulate_matter_2_5um_concentration".override_measurement = "2_5um particles";
|
|
||||||
"sensor.*particulate_matter_10_0um_concentration".override_measurement ="10um particles";
|
|
||||||
};
|
|
||||||
tags = {
|
|
||||||
instance = "wolf";
|
|
||||||
source = "glados";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
esphome = {};
|
|
||||||
api = {};
|
|
||||||
mqtt = {
|
|
||||||
broker = "localhost";
|
|
||||||
port = 1883;
|
|
||||||
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";
|
|
||||||
qos = 1;
|
|
||||||
retain = true;
|
|
||||||
};
|
|
||||||
will_message = {
|
|
||||||
topic = "glados/hass/status/LWT";
|
|
||||||
payload = "Offline";
|
|
||||||
qos = 1;
|
|
||||||
retain = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
light = [];
|
|
||||||
media_player = [
|
|
||||||
{ platform = "mpd";
|
|
||||||
name = "lounge";
|
|
||||||
host = "lounge.mpd.shack";
|
|
||||||
}
|
|
||||||
{ platform = "mpd";
|
|
||||||
name = "kiosk";
|
|
||||||
#host = "lounge.kiosk.shack";
|
|
||||||
host = "kiosk.shack";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
camera = [];
|
|
||||||
frontend = { };
|
|
||||||
config = { };
|
|
||||||
sun = {};
|
|
||||||
http = {
|
|
||||||
base_url = "http://hass.shack";
|
|
||||||
use_x_forwarded_for = true;
|
|
||||||
trusted_proxies = [ "127.0.0.1" "::1" ];
|
|
||||||
};
|
|
||||||
#conversation = {};
|
|
||||||
|
|
||||||
history = {};
|
|
||||||
logbook = {};
|
|
||||||
#recorder = {};
|
|
||||||
|
|
||||||
logger.default = "info";
|
|
||||||
|
|
||||||
tts = [
|
|
||||||
{ platform = "google_translate";
|
|
||||||
service_name = "say";
|
|
||||||
language = "de";
|
|
||||||
cache = true;
|
|
||||||
time_memory = 57600;
|
|
||||||
base_url = "http://hass.shack";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
device_tracker = [];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, fetchPypi
|
|
||||||
, requests
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "gtts-token";
|
|
||||||
version = "1.1.3";
|
|
||||||
|
|
||||||
src = fetchPypi {
|
|
||||||
pname = "gTTS-token";
|
|
||||||
inherit version;
|
|
||||||
sha256 = "9d6819a85b813f235397ef931ad4b680f03d843c9b2a9e74dd95175a4bc012c5";
|
|
||||||
};
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
requests
|
|
||||||
];
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Calculates a token to run the Google Translate text to speech";
|
|
||||||
homepage = https://github.com/boudewijn26/gTTS-token;
|
|
||||||
license = licenses.mit;
|
|
||||||
# maintainers = [ maintainers. ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, fetchpatch
|
|
||||||
, fetchPypi
|
|
||||||
, aiohttp
|
|
||||||
, async-timeout
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "pyhaversion";
|
|
||||||
version = "2.2.1";
|
|
||||||
|
|
||||||
src = fetchPypi {
|
|
||||||
inherit pname version;
|
|
||||||
sha256 = "72b65aa25d7b2dbb839a4d0218df2005c2335e93526035904d365bb668030b9f";
|
|
||||||
};
|
|
||||||
patches = [
|
|
||||||
(fetchpatch { url = "https://github.com/makefu/pyhaversion/commit/f3bdc38970272cd345c2cfbde3037ea492ca27c4.patch";
|
|
||||||
sha256 =
|
|
||||||
"1rhq4z7mdgnwhwpf5fmarnbc1ba3qysk1wqjdr0hvbzi8vmvbfcc";})
|
|
||||||
];
|
|
||||||
doCheck = false;
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
aiohttp
|
|
||||||
async-timeout
|
|
||||||
];
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "";
|
|
||||||
homepage = https://github.com/ludeeus/pyhaversion;
|
|
||||||
# maintainers = [ maintainers. ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,66 +0,0 @@
|
|||||||
let
|
|
||||||
prefix = "glados";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
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 = 4.5; }
|
|
||||||
{ service = "tts.say";
|
|
||||||
entity_id = "media_player.${entity}";
|
|
||||||
data_template = {
|
|
||||||
inherit message;
|
|
||||||
language = "de";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
in
|
|
||||||
{
|
|
||||||
lounge = message: tts {
|
|
||||||
inherit message;
|
|
||||||
entity = "lounge";
|
|
||||||
};
|
|
||||||
herrenklo = message: tts {
|
|
||||||
inherit message;
|
|
||||||
entity = "herrenklo";
|
|
||||||
};
|
|
||||||
kiosk = message: tts {
|
|
||||||
inherit message;
|
|
||||||
entity = "kiosk";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
tasmota =
|
|
||||||
{
|
|
||||||
plug = {host, name ? host, topic ? host}:
|
|
||||||
{
|
|
||||||
platform = "mqtt";
|
|
||||||
inherit name;
|
|
||||||
state_topic = "sonoff/stat/${topic}/POWER1";
|
|
||||||
command_topic = "sonoff/cmnd/${topic}/POWER1";
|
|
||||||
availability_topic = "sonoff/tele/${topic}/LWT";
|
|
||||||
payload_on= "ON";
|
|
||||||
payload_off= "OFF";
|
|
||||||
payload_available= "Online";
|
|
||||||
payload_not_available= "Offline";
|
|
||||||
retain = false;
|
|
||||||
qos = 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
#
|
|
||||||
|
|
||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
tempsensor = "sensor.dark_sky_temperature";
|
|
||||||
all_covers = [
|
|
||||||
"cover.crafting_rollo"
|
|
||||||
"cover.elab_rollo"
|
|
||||||
"cover.or2_rollo"
|
|
||||||
"cover.retroraum_rollo"
|
|
||||||
];
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config =
|
|
||||||
{
|
|
||||||
automation =
|
|
||||||
[
|
|
||||||
{ alias = "Rollos fahren Runter";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "numeric_state";
|
|
||||||
entity_id = tempsensor;
|
|
||||||
above = 25;
|
|
||||||
for = "00:30:00";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
condition =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
condition = "state";
|
|
||||||
entity_id = "sun.sun";
|
|
||||||
state = "above_horizon";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "cover.close_cover";
|
|
||||||
entity_id = all_covers;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{ alias = "Rollos fahren Hoch";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "sun";
|
|
||||||
event = "sunset";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
condition = [ ];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "cover.open_cover";
|
|
||||||
entity_id = all_covers;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
feinstaub_sensor = "sensor.fablab_particulate_matter_2_5um_concentration";
|
|
||||||
ledring = "light.fablab_led_ring";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config =
|
|
||||||
{
|
|
||||||
automation =
|
|
||||||
[
|
|
||||||
{ alias = "Gute Luft Fablab";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "numeric_state";
|
|
||||||
entity_id = feinstaub_sensor;
|
|
||||||
below = 3;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = ledring;
|
|
||||||
effect = "Twinkle";
|
|
||||||
color_name = "green";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{ alias = "mäßige Luft Fablab";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "numeric_state";
|
|
||||||
above = 3;
|
|
||||||
below = 10;
|
|
||||||
entity_id = feinstaub_sensor;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = ledring;
|
|
||||||
effect = "Twinkle";
|
|
||||||
color_name = "yellow";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{ alias = "schlechte Luft Fablab";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "numeric_state";
|
|
||||||
above = 10;
|
|
||||||
entity_id = feinstaub_sensor;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = ledring;
|
|
||||||
effect = "Fireworks";
|
|
||||||
color_name = "red";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{ alias = "Luft Sensor nicht verfügbar";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "state";
|
|
||||||
to = "unavailable";
|
|
||||||
entity_id = feinstaub_sensor;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = ledring;
|
|
||||||
effect = "Rainbow";
|
|
||||||
color_name = "blue";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{ alias = "Fablab Licht Reboot";
|
|
||||||
trigger = [
|
|
||||||
{
|
|
||||||
platform = "state";
|
|
||||||
from = "unavailable";
|
|
||||||
entity_id = ledring;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{ service = "light.turn_on";
|
|
||||||
data = {
|
|
||||||
entity_id = ledring;
|
|
||||||
effect = "Rainbow";
|
|
||||||
color_name = "orange";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
services.home-assistant.config =
|
|
||||||
{
|
|
||||||
binary_sensor = [
|
|
||||||
{ platform = "mqtt";
|
|
||||||
name = "Portal Lock";
|
|
||||||
device_class = "door";
|
|
||||||
state_topic = "portal/gateway/status";
|
|
||||||
availability_topic = "portal/gateway/lwt";
|
|
||||||
payload_on = "open";
|
|
||||||
payload_off = "closed";
|
|
||||||
payload_available = "online";
|
|
||||||
payload_not_available = "offline";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
sensor = [
|
|
||||||
{ platform = "mqtt";
|
|
||||||
name = "Keyholder";
|
|
||||||
state_topic = "portal/gateway/keyholder";
|
|
||||||
availability_topic = "portal/gateway/lwt";
|
|
||||||
payload_available = "online";
|
|
||||||
payload_not_available = "offline";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
# uses:
|
|
||||||
# switch.crafting_giesskanne_relay
|
|
||||||
let
|
|
||||||
glados = import ../lib;
|
|
||||||
seconds = 20;
|
|
||||||
wasser = "switch.crafting_giesskanne_relay";
|
|
||||||
brotbox = {
|
|
||||||
minutes = 10;
|
|
||||||
pump = "switch.crafting_brotbox_pumpe";
|
|
||||||
sensor = "sensor.statistics_for_sensor_crafting_brotbox_soil_moisture";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config =
|
|
||||||
{
|
|
||||||
sensor = map ( entity_id: {
|
|
||||||
platform = "statistics";
|
|
||||||
name = "Statistics for ${entity_id}";
|
|
||||||
inherit entity_id;
|
|
||||||
max_age.minutes = "60";
|
|
||||||
sampling_size = 1000;
|
|
||||||
}) ["sensor.crafting_brotbox_soil_moisture"];
|
|
||||||
|
|
||||||
|
|
||||||
automation =
|
|
||||||
[
|
|
||||||
### Brotbox #####
|
|
||||||
#{ alias = "Brotbox: water for ${toString brotbox.minutes} minutes every hour";
|
|
||||||
# trigger =
|
|
||||||
# { # Trigger once every hour at :42
|
|
||||||
# platform = "time_pattern";
|
|
||||||
# minutes = 42;
|
|
||||||
# };
|
|
||||||
# condition = {
|
|
||||||
# condition = "numeric_state";
|
|
||||||
# entity_id = brotbox.sensor;
|
|
||||||
# value_template = "{{ state_attr('${brotbox.sensor}', 'median') }}";
|
|
||||||
# below = 75;
|
|
||||||
# };
|
|
||||||
# action =
|
|
||||||
# [
|
|
||||||
# {
|
|
||||||
# service = "homeassistant.turn_on";
|
|
||||||
# entity_id = brotbox.pump;
|
|
||||||
# }
|
|
||||||
# { delay.minutes = brotbox.minutes; }
|
|
||||||
# {
|
|
||||||
# service = "homeassistant.turn_off";
|
|
||||||
# entity_id = brotbox.pump ;
|
|
||||||
# }
|
|
||||||
# ];
|
|
||||||
#}
|
|
||||||
{ alias = "Brotbox: Always turn off water after ${toString (brotbox.minutes * 2)} minutes";
|
|
||||||
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";
|
|
||||||
entity_id = wasser;
|
|
||||||
to = "on";
|
|
||||||
for.seconds = seconds*2;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
action =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
service = "homeassistant.turn_off";
|
|
||||||
entity_id = [ wasser ];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
{lib,...}:
|
|
||||||
{
|
|
||||||
services.home-assistant.config.sensor =
|
|
||||||
[
|
|
||||||
{ platform = "darksky";
|
|
||||||
api_key = lib.removeSuffix "\n"
|
|
||||||
(builtins.readFile <secrets/hass/darksky.apikey>);
|
|
||||||
language = "de";
|
|
||||||
monitored_conditions = [
|
|
||||||
"summary" "icon"
|
|
||||||
"nearest_storm_distance" "precip_probability"
|
|
||||||
"precip_intensity"
|
|
||||||
"temperature" # "temperature_high" "temperature_low"
|
|
||||||
"apparent_temperature"
|
|
||||||
"hourly_summary" # next 24 hours text
|
|
||||||
"humidity"
|
|
||||||
"pressure"
|
|
||||||
"uv_index"
|
|
||||||
];
|
|
||||||
units = "si" ;
|
|
||||||
scan_interval = "00:15:00";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
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
|
|
||||||
{
|
|
||||||
services.home-assistant.config.sensor =
|
|
||||||
[
|
|
||||||
(fuellstand "Wasser" 1)
|
|
||||||
(fuellstand "Mate Cola" 2)
|
|
||||||
(fuellstand "Apfelschorle" 3)
|
|
||||||
(fuellstand "Zitronensprudel" 4)
|
|
||||||
(fuellstand "Mate 1" 26)
|
|
||||||
(fuellstand "Mate 2" 27)
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
let
|
|
||||||
power_x = name: phase:
|
|
||||||
{ platform = "mqtt";
|
|
||||||
name = "${phase} ${name}";
|
|
||||||
state_topic = "/power/total/${phase}/${name}";
|
|
||||||
availability_topic = "/power/lwt";
|
|
||||||
payload_available = "Online";
|
|
||||||
payload_not_available = "Offline";
|
|
||||||
};
|
|
||||||
power_consumed =
|
|
||||||
{ platform = "mqtt";
|
|
||||||
name = "Power Consumed";
|
|
||||||
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_curr = power_x "Current";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.home-assistant.config.sensor =
|
|
||||||
(map power_volt [ "L1" "L2" "L3" ])
|
|
||||||
++ (map (x: ((power_watt x) // { device_class = "power"; })) [ "L1" "L2" "L3" ])
|
|
||||||
++ (map power_curr [ "L1" "L2" "L3" ])
|
|
||||||
++ [ power_consumed ];
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
services.home-assistant.config.air_quality =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
platform = "opensensemap";
|
|
||||||
station_id = "56a0de932cb6e1e41040a68b";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
{
|
|
||||||
services.home-assistant.config.binary_sensor =
|
|
||||||
[
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
controllers = {
|
|
||||||
host = "unifi.shack";
|
|
||||||
site = "shackspace";
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
# 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
|
|
||||||
{
|
|
||||||
services.home-assistant.config.switch =
|
|
||||||
[
|
|
||||||
# These commands we see with a shutdown:
|
|
||||||
# power/143/state on
|
|
||||||
# power/142/state on
|
|
||||||
# power/141/state on
|
|
||||||
# power/142/state off
|
|
||||||
# power/141/state off
|
|
||||||
# power/10/state off
|
|
||||||
# power/main/state off
|
|
||||||
|
|
||||||
(power "10" "Hauptschalter")
|
|
||||||
(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")
|
|
||||||
];
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user