1
0
Fork 0

Improve hass-config

This commit is contained in:
Malte Brandy 2022-01-03 01:15:04 +01:00
parent 2a93a2e788
commit 652a79f0a0
2 changed files with 127 additions and 127 deletions

View file

@ -1,7 +1,7 @@
{ pkgs, lib, ... }: { pkgs, lib, ... }:
let let
haLib = import ./lib.nix lib; haLib = import ./lib.nix lib;
inherit (haLib) modules util cards conditions triggers; inherit (haLib) modules util cards conditions triggers jinja actions tap_actions;
modes = modes =
let let
empty = { empty = {
@ -16,7 +16,7 @@ let
icon = util.mkIcon "account"; icon = util.mkIcon "account";
title = "Aktiv"; title = "Aktiv";
}; };
force-active = { force_active = {
icon = util.mkIcon "lightbulb-on"; icon = util.mkIcon "lightbulb-on";
title = "Alles An"; title = "Alles An";
}; };
@ -31,6 +31,21 @@ let
name = "flat"; name = "flat";
options = { inherit active vacation; }; options = { inherit active vacation; };
}; };
wohnzimmer = {
title = "Wohnzimmer";
name = "wohnzimmer";
options = { inherit empty heat active force_active; };
};
kueche = {
title = "Küche";
name = "kueche";
options = { inherit empty active; };
};
schlafzimmer = {
title = "Schlafzimmer";
name = "schlafzimmer";
options = { inherit empty heat active force_active; };
};
}; };
inherit (import ../../../nix/sources.nix) nixos-unstable; inherit (import ../../../nix/sources.nix) nixos-unstable;
homeAssistantDir = "/disk/persist/home-assistant"; homeAssistantDir = "/disk/persist/home-assistant";
@ -42,6 +57,9 @@ in
]; ];
imports = [ imports = [
(modules.mkModeSwitcher modes.wohnzimmer { })
(modules.mkModeSwitcher modes.kueche { })
(modules.mkModeSwitcher modes.schlafzimmer { })
(modules.mkModeSwitcher modes.flat { }) (modules.mkModeSwitcher modes.flat { })
"${nixos-unstable}/nixos/modules/services/misc/home-assistant.nix" "${nixos-unstable}/nixos/modules/services/misc/home-assistant.nix"
./hexa-cards.nix ./hexa-cards.nix
@ -151,10 +169,10 @@ in
{ {
alias = "Thermostatsteuerung Küche"; alias = "Thermostatsteuerung Küche";
trigger = with triggers; [ trigger = with triggers; [
{ platform = "state"; entity_id = "input_number.target_temperature_kueche"; } (stateTrigger "input_number.target_temperature_kueche")
{ platform = "state"; entity_id = "sensor.kueche_temperature"; } (stateTrigger "sensor.kueche_temperature")
{ platform = "state"; entity_id = "binary_sensor.kuechenfenster"; } (stateTrigger "binary_sensor.kuechenfenster")
{ platform = "state"; entity_id = "climate.kueche"; } (stateTrigger "climate.kueche")
(modeSwitchTrigger modes.flat) (modeSwitchTrigger modes.flat)
]; ];
action = [{ action = [{
@ -179,9 +197,9 @@ in
{ {
alias = "Thermostatsteuerung Wohnzimmer"; alias = "Thermostatsteuerung Wohnzimmer";
trigger = with triggers; [ trigger = with triggers; [
{ platform = "state"; entity_id = "input_number.target_temperature_wohnzimmer"; } (stateTrigger "input_number.target_temperature_wohnzimmer")
{ platform = "state"; entity_id = "binary_sensor.wohnzimmerfenster"; } (stateTrigger "binary_sensor.wohnzimmerfenster")
{ platform = "state"; entity_id = "climate.wohnzimmer"; } (stateTrigger "climate.wohnzimmer")
(modeSwitchTrigger modes.flat) (modeSwitchTrigger modes.flat)
]; ];
action = [{ action = [{
@ -202,92 +220,93 @@ in
} }
{ {
alias = "Küchentemperatur"; alias = "Küchentemperatur";
trigger = [{ platform = "state"; entity_id = "input_select.scene_kueche"; }]; trigger = [ (triggers.modeSwitchTrigger modes.kueche) ];
action = [{ action = [{
service = "input_number.set_value"; service = "input_number.set_value";
target.entity_id = "input_number.target_temperature_kueche"; target.entity_id = "input_number.target_temperature_kueche";
data.value = '' data.value = jinja.if' (jinja.isState (util.modeSelectEntity modes.kueche) "empty") "18" "20";
{% if is_state('input_select.scene_kueche', 'empty') %}
18
{% else %}
21
{% endif %}
'';
}]; }];
} }
{ {
alias = "Wohnzimmertemperatur"; alias = "Wohnzimmertemperatur";
trigger = [{ platform = "state"; entity_id = "input_select.scene_wohnzimmer"; }]; trigger = [ (triggers.modeSwitchTrigger modes.wohnzimmer) ];
action = [{ action = [{
service = "input_number.set_value"; service = "input_number.set_value";
target.entity_id = "input_number.target_temperature_wohnzimmer"; target.entity_id = "input_number.target_temperature_wohnzimmer";
data.value = '' data.value = jinja.if' (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "empty") "18" "24";
{% if is_state('input_select.scene_wohnzimmer', 'empty') %}
18
{% else %}
24
{% endif %}
'';
}]; }];
} }
{ {
alias = "Schlafzimmertemperatur"; alias = "Schlafzimmertemperatur";
trigger = [{ platform = "state"; entity_id = "input_select.scene_schlafzimmer"; }]; trigger = [ (triggers.modeSwitchTrigger modes.schlafzimmer) ];
action = [{ action = [{
service = "input_number.set_value"; service = "input_number.set_value";
target.entity_id = "input_number.target_temperature_schlafzimmer"; target.entity_id = "input_number.target_temperature_schlafzimmer";
data.value = '' data.value = jinja.if' (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "empty") "18" "20";
{% if is_state('input_select.scene_schlafzimmer', 'empty') %}
18
{% else %}
21
{% endif %}
'';
}]; }];
} }
{ {
alias = "Wohnzimmerlichter"; alias = "Wohnzimmerlichter";
trigger = [{ platform = "state"; entity_id = "input_select.scene_wohnzimmer"; } { platform = "state"; entity_id = "sun.sun"; }]; trigger = with triggers; [
(modeSwitchTrigger modes.wohnzimmer)
(stateTrigger "sun.sun")
];
action = [{ action = [{
service = '' service = jinja.if'
{% if is_state('input_select.scene_wohnzimmer', 'force-active') or (is_state('input_select.scene_wohnzimmer', 'active') and state_attr('sun.sun', 'elevation') < 6) %} (jinja.or
homeassistant.turn_on (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "force_active")
{% else %} (jinja.and
homeassistant.turn_off (jinja.isState (util.modeSelectEntity modes.wohnzimmer) "active")
{% endif %}''; "state_attr('sun.sun', 'elevation') < 6"))
"homeassistant.turn_on"
"homeassistant.turn_off";
target.entity_id = "group.wohnzimmer_lights"; target.entity_id = "group.wohnzimmer_lights";
}]; }];
} }
{ {
alias = "Schlafzimmerlichter"; alias = "Schlafzimmerlichter";
trigger = [{ platform = "state"; entity_id = "input_select.scene_schlafzimmer"; } { platform = "state"; entity_id = "sun.sun"; }]; trigger = with triggers; [
(modeSwitchTrigger modes.schlafzimmer)
(stateTrigger "sun.sun")
];
action = [{ action = [{
service = '' service = jinja.if'
{% if is_state('input_select.scene_schlafzimmer', 'force-active') or (is_state('input_select.scene_schlafzimmer', 'active') and state_attr('sun.sun', 'elevation') < 6) %} (jinja.or
homeassistant.turn_on (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "force_active")
{% else %} (jinja.and
homeassistant.turn_off (jinja.isState (util.modeSelectEntity modes.schlafzimmer) "active")
{% endif %}''; "state_attr('sun.sun', 'elevation') < 6"))
"homeassistant.turn_on"
"homeassistant.turn_off";
target.entity_id = "group.schlafzimmer_lights"; target.entity_id = "group.schlafzimmer_lights";
}]; }];
} }
{ {
alias = "Schlafzimmer vorheizen"; alias = "Schlafzimmer vorheizen";
trigger = [{ platform = "time"; at = "19:00:00"; } { platform = "time"; at = "04:00:00"; }]; trigger = [{ platform = "time"; at = "19:00:00"; } { platform = "time"; at = "04:00:00"; }];
condition = [{ condition = "state"; entity_id = "input_select.scene_schlafzimmer"; state = "empty"; } (conditions.modeIs modes.flat "active")]; condition = [
action = [{ service = "input_select.select_option"; data.option = "heat"; entity_id = "input_select.scene_schlafzimmer"; }]; (conditions.modeIs modes.schlafzimmer "empty")
(conditions.modeIs modes.flat "active")
];
action = [ (actions.setMode modes.schlafzimmer "heat") ];
} }
{ {
alias = "Schlafzimmer nachts kühl"; alias = "Schlafzimmer nachts kühl";
trigger = [{ platform = "time"; at = "01:00:00"; }]; trigger = [{ platform = "time"; at = "01:00:00"; }];
condition = [{ condition = "state"; entity_id = "input_select.scene_schlafzimmer"; state = "heat"; } (conditions.modeIs modes.flat "active")]; condition = [
action = [{ service = "input_select.select_option"; data.option = "empty"; entity_id = "input_select.scene_schlafzimmer"; }]; (conditions.modeIs modes.schlafzimmer "heat")
(conditions.modeIs modes.flat "active")
];
action = [ (actions.setMode modes.schlafzimmer "empty") ];
} }
{ {
alias = "Morgens Licht an"; alias = "Morgens Licht an";
trigger = [{ platform = "time"; at = "08:00:00"; }]; trigger = [{ platform = "time"; at = "08:00:00"; }];
condition = [{ condition = "state"; entity_id = "input_select.scene_schlafzimmer"; state = "heat"; } (conditions.modeIs modes.flat "active")]; condition = [
action = [{ service = "input_select.select_option"; data.option = "active"; entity_id = "input_select.scene_schlafzimmer"; }]; (conditions.modeIs modes.schlafzimmer "heat")
(conditions.modeIs modes.flat "active")
];
action = [ (actions.setMode modes.schlafzimmer "active") ];
} }
# Warnung für offene Fenster oder Türen # Warnung für offene Fenster oder Türen
# Warnungen für niedrige Akkustände # Warnungen für niedrige Akkustände
@ -312,18 +331,6 @@ in
{ sensor = [{ state = "{% if is_state('climate.wohnzimmer', 'heat') %}1{% else %}0{% endif %}"; name = "Wohnzimmerheizung"; }]; } { sensor = [{ state = "{% if is_state('climate.wohnzimmer', 'heat') %}1{% else %}0{% endif %}"; name = "Wohnzimmerheizung"; }]; }
{ sensor = [{ state = "{% if is_state('climate.kueche', 'heat') %}1{% else %}0{% endif %}"; name = "Küchenheizung"; }]; } { sensor = [{ state = "{% if is_state('climate.kueche', 'heat') %}1{% else %}0{% endif %}"; name = "Küchenheizung"; }]; }
{ sensor = [{ state = "{{ state_attr('climate.wohnzimmer', 'current_temperature') }}"; name = "Temperatur Wohnzimmer"; }]; } { sensor = [{ state = "{{ state_attr('climate.wohnzimmer', 'current_temperature') }}"; name = "Temperatur Wohnzimmer"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_schlafzimmer', 'empty') %}1{% else %}0{% endif %}"; name = "schlafzimmer_empty"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_schlafzimmer', 'heat') %}1{% else %}0{% endif %}"; name = "schlafzimmer_heat"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_schlafzimmer', 'active') %}1{% else %}0{% endif %}"; name = "schlafzimmer_active"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_schlafzimmer', 'force-active') %}1{% else %}0{% endif %}"; name = "schlafzimmer_force_active"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_wohnzimmer', 'empty') %}1{% else %}0{% endif %}"; name = "wohnzimmer_empty"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_wohnzimmer', 'heat') %}1{% else %}0{% endif %}"; name = "wohnzimmer_heat"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_wohnzimmer', 'active') %}1{% else %}0{% endif %}"; name = "wohnzimmer_active"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_wohnzimmer', 'force-active') %}1{% else %}0{% endif %}"; name = "wohnzimmer_force_active"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_kueche', 'empty') %}1{% else %}0{% endif %}"; name = "kueche_empty"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_kueche', 'heat') %}1{% else %}0{% endif %}"; name = "kueche_heat"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_kueche', 'active') %}1{% else %}0{% endif %}"; name = "kueche_active"; }]; }
{ binary_sensor = [{ state = "{% if is_state('input_select.scene_kueche', 'force-active') %}1{% else %}0{% endif %}"; name = "kueche_force_active"; }]; }
]; ];
input_number = { input_number = {
target_temperature_schlafzimmer = { target_temperature_schlafzimmer = {
@ -348,20 +355,6 @@ in
step = "0.25"; step = "0.25";
}; };
}; };
input_select = {
scene_schlafzimmer = {
name = "Szene Schlafzimmer";
options = [ "empty" "heat" "active" "force-active" ];
};
scene_wohnzimmer = {
name = "Szene Wohnzimmer";
options = [ "empty" "heat" "active" "force-active" ];
};
scene_kueche = {
name = "Szene Kueche";
options = [ "empty" "heat" "active" "force-active" ];
};
};
system_health = { }; system_health = { };
zha = { zha = {
device_config = { device_config = {
@ -410,11 +403,21 @@ in
state_filter = [ "on" ]; state_filter = [ "on" ];
} }
]; ];
badges = [ badges =
{ type = "state-label"; entity = "input_select.scene_wohnzimmer"; name = "Wohnzimmer"; tap_action = { action = "call-service"; service = "input_select.select_next"; service_data.entity_id = "input_select.scene_wohnzimmer"; }; } let
{ type = "state-label"; entity = "input_select.scene_kueche"; name = "Küche"; tap_action = { action = "call-service"; service = "input_select.select_next"; service_data.entity_id = "input_select.scene_kueche"; }; } badge = mode:
{ type = "state-label"; entity = "input_select.scene_schlafzimmer"; name = "Schlafzimmer"; tap_action = { action = "call-service"; service = "input_select.select_next"; service_data.entity_id = "input_select.scene_schlafzimmer"; }; } {
]; type = "state-label";
entity = util.modeSelectEntity mode;
name = mode.title;
tap_action = tap_actions.cycleMode mode;
};
in
[
(badge modes.wohnzimmer)
(badge modes.kueche)
(badge modes.schlafzimmer)
];
envstack = envstack =
{ {
type = "vertical-stack"; type = "vertical-stack";
@ -440,18 +443,7 @@ in
{ {
type = "vertical-stack"; type = "vertical-stack";
cards = [ cards = [
{ (cards.modeSwitcher modes.wohnzimmer)
type = "glance";
title = "Wohnzimmer";
columns = 4;
show_state = false;
entities = [
{ entity = "binary_sensor.wohnzimmer_empty"; name = "Leer"; icon = "mdi:account-off"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_wohnzimmer"; option = "empty"; }; }; }
{ entity = "binary_sensor.wohnzimmer_heat"; name = "Heizen"; icon = "mdi:radiator"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_wohnzimmer"; option = "heat"; }; }; }
{ entity = "binary_sensor.wohnzimmer_active"; name = "Aktiv"; icon = "mdi:account"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_wohnzimmer"; option = "active"; }; }; }
{ entity = "binary_sensor.wohnzimmer_force_active"; name = "Alles An"; icon = "mdi:lightbulb-on"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_wohnzimmer"; option = "force-active"; }; }; }
];
}
{ {
type = "custom:mini-graph-card"; type = "custom:mini-graph-card";
entities = [ entities = [
@ -478,25 +470,14 @@ in
} }
{ {
type = "logbook"; type = "logbook";
entities = [ "input_select.scene_wohnzimmer" "binary_sensor.wohnzimmerfenster" "switch.lichterkette_fernseher" "switch.lichterkette_schrank" "switch.blaue_lichterkette" ]; entities = [ (util.modeSelectEntity modes.wohnzimmer) "binary_sensor.wohnzimmerfenster" "switch.lichterkette_fernseher" "switch.lichterkette_schrank" "switch.blaue_lichterkette" ];
} }
]; ];
}; };
kuechenstack = { kuechenstack = {
type = "vertical-stack"; type = "vertical-stack";
cards = [ cards = [
{ (cards.modeSwitcher modes.kueche)
type = "glance";
title = "Küche";
columns = 4;
show_state = false;
entities = [
{ entity = "binary_sensor.kueche_empty"; name = "Leer"; icon = "mdi:account-off"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_kueche"; option = "empty"; }; }; }
{ entity = "binary_sensor.kueche_heat"; name = "Heizen"; icon = "mdi:radiator"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_kueche"; option = "heat"; }; }; }
{ entity = "binary_sensor.kueche_active"; name = "Aktiv"; icon = "mdi:account"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_kueche"; option = "active"; }; }; }
{ entity = "binary_sensor.kueche_force_active"; name = "Alles An"; icon = "mdi:lightbulb-on"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_kueche"; option = "force-active"; }; }; }
];
}
{ {
type = "custom:mini-graph-card"; type = "custom:mini-graph-card";
entities = [ entities = [
@ -548,7 +529,7 @@ in
} }
{ {
type = "logbook"; type = "logbook";
entities = [ "input_select.scene_kueche" "climate.kueche" "binary_sensor.kuechenfenster" ]; entities = [ (util.modeSelectEntity modes.kueche) "climate.kueche" "binary_sensor.kuechenfenster" ];
} }
]; ];
}; };
@ -556,18 +537,7 @@ in
{ {
type = "vertical-stack"; type = "vertical-stack";
cards = [ cards = [
{ (cards.modeSwitcher modes.schlafzimmer)
type = "glance";
title = "Schlafzimmer";
columns = 4;
show_state = false;
entities = [
{ entity = "binary_sensor.schlafzimmer_empty"; name = "Leer"; icon = "mdi:account-off"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_schlafzimmer"; option = "empty"; }; }; }
{ entity = "binary_sensor.schlafzimmer_heat"; name = "Heizen"; icon = "mdi:radiator"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_schlafzimmer"; option = "heat"; }; }; }
{ entity = "binary_sensor.schlafzimmer_active"; name = "Aktiv"; icon = "mdi:account"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_schlafzimmer"; option = "active"; }; }; }
{ entity = "binary_sensor.schlafzimmer_force_active"; name = "Alles An"; icon = "mdi:lightbulb-on"; tap_action = { action = "call-service"; service = "input_select.select_option"; service_data = { entity_id = "input_select.scene_schlafzimmer"; option = "force-active"; }; }; }
];
}
{ {
type = "custom:mini-graph-card"; type = "custom:mini-graph-card";
entities = [ entities = [
@ -620,7 +590,7 @@ in
} }
{ {
type = "logbook"; type = "logbook";
entities = [ "input_select.scene_schlafzimmer" "switch.weihnachtsstern_schlafzimmer" "switch.luftentfeuchter" "climate.schlafzimmer" "binary_sensor.schlafzimmerfenster" ]; entities = [ (util.modeSelectEntity modes.schlafzimmer) "switch.weihnachtsstern_schlafzimmer" "switch.luftentfeuchter" "climate.schlafzimmer" "binary_sensor.schlafzimmerfenster" ];
} }
]; ];
}; };
@ -723,6 +693,14 @@ in
{ {
views = [ views = [
{ icon = "mdi:city"; inherit badges; cards = [ envstack ]; } { icon = "mdi:city"; inherit badges; cards = [ envstack ]; }
{
icon = "mdi:switch"; inherit alertbadges; cards = [
(cards.modeSwitcher modes.wohnzimmer)
(cards.modeSwitcher modes.kueche)
(cards.modeSwitcher modes.schlafzimmer)
(cards.modeSwitcher modes.flat)
];
}
{ icon = "mdi:floor-plan"; inherit alertbadges; cards = [ wohnzimmerstack kuechenstack schlafzimmerstack badstack ]; } { icon = "mdi:floor-plan"; inherit alertbadges; cards = [ wohnzimmerstack kuechenstack schlafzimmerstack badstack ]; }
{ icon = "mdi:sofa"; inherit badges; cards = [ wohnzimmerstack ]; } { icon = "mdi:sofa"; inherit badges; cards = [ wohnzimmerstack ]; }
{ icon = "mdi:countertop"; inherit badges; cards = [ kuechenstack ]; } { icon = "mdi:countertop"; inherit badges; cards = [ kuechenstack ]; }

View file

@ -6,11 +6,30 @@ let
in in
rec { rec {
jinja = import ./jinja.nix lib; jinja = import ./jinja.nix lib;
tap_actions = { tap_actions =
let
fromServiceAction = action:
{
action = "call-service";
inherit (action) service;
service_data = action.data or { } // {
inherit (action) entity_id;
};
};
in
{
setMode = mode: option: fromServiceAction (actions.setMode mode option);
cycleMode = mode: fromServiceAction (actions.cycleMode mode);
};
actions = {
cycleMode = mode: {
service = "input_select.select_next";
entity_id = util.modeSelectEntity mode;
};
setMode = mode: option: { setMode = mode: option: {
action = "call-service";
service = "input_select.select_option"; service = "input_select.select_option";
service_data = { entity_id = util.modeSelectEntity mode; inherit option; }; data = { inherit option; };
entity_id = util.modeSelectEntity mode;
}; };
}; };
util = rec { util = rec {
@ -37,7 +56,10 @@ rec {
options = builtins.attrNames mode.options; options = builtins.attrNames mode.options;
in in
mkHAConfig { mkHAConfig {
input_select.${util.modeSelectName mode} = { inherit options; } // attrs; input_select.${util.modeSelectName mode} = {
inherit options;
name = mode.title;
} // attrs;
template = builtins.map (templates.binarySensorForMode mode) options; template = builtins.map (templates.binarySensorForMode mode) options;
}; };
}; };