summaryrefslogtreecommitdiffstats
path: root/makefu/2configs/home/ham/automation/fenster_auf.nix
blob: b3682fe0c447c309af6bd2a8fcf63aec679c845c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
{ lib, ... }:
#uses:
# notify.signal
# binary_sensor.badezimmer_fenster_contact
# binary_sensor.dusche_fenster_contact
let
  hlib = import ../lib;
  say = hlib.say.office;
  draussen = "sensor.wohnzimmer_temp_temperature";
  draussen_diff = "sensor.unterschied_draussen_drinnen";
  draussen_heiss = 23;
  min = 20;
  fenster_offen = name: entity:
    { alias = "${name} seit ${toString min} Minuten offen";
      trigger = [
          {
            platform = "state";
            entity_id = entity;
            to = "on";
            for.minutes = min;
          }
      ];
      condition = [
      ];
      action =
      [
        {
          service = "notify.signal_home";
          data_template = {
            message = "${name} seit ${toString min} Minuten offen und draussen ist es gerade {{states.sensor.dark_sky_temperature.state}}°C bei {{states.sensor.dark_sky_humidity.state}}% Luftfeuchte";
          };
        }
        {
          service = "input_boolean.turn_on";
          target.entity_id = "input_boolean.${lib.toLower name}_lang_offen";
        }
      ];
    };
  fenster_geschlossen_lang = name: entity:
    { alias = "${name} wieder geschlossen";
      trigger = [
          {
            platform = "state";
            entity_id = entity;
            to = "off";
            for.seconds = 10;
          }
        ];
      condition = [
        { condition = "state";
          entity_id = "input_boolean.${lib.toLower name}_lang_offen";
          state = "on";
        }
      ];
      action =
      [
        {
          service = "notify.signal_home";
          data = {
            message= "${name} ist wieder geschlossen, Danke!";
          };
        }
        {
          service = "input_boolean.turn_off";
          target.entity_id = "input_boolean.${lib.toLower name}_lang_offen";
        }
      ];
    };
in {
  services.home-assistant.config = {
    template = [
      { sensor = {
        name = "Unterschied Draussen Drinnen";
        unit_of_measurement = "°C";
        state = ''
          {% set inside = states("${draussen}") | float | round(2) -%}
          {% set outside = states("sensor.dark_sky_temperature") | float | round(2) -%}
          {{ ((outside - inside) | round(1) )}}'';
        };
      }
    ];
    sensor = [
      { platform = "season"; type = "meteorological";}
    ];

    input_boolean = {
      badezimmerfenster_lang_offen.name = "Badezimmer lange offen";
      duschfenster_lang_offen.name = "Duschfenster lange offen";
      ist_sommer = {
        name = "Es ist Sommer";
        initial = true; # TODO
      };
    };

    automation = [
      (fenster_geschlossen_lang "Badezimmerfenster" "binary_sensor.badezimmer_fenster_contact")
      (fenster_geschlossen_lang "Duschfenster" "binary_sensor.dusche_fenster_contact")

      (fenster_offen "Badezimmerfenster" "binary_sensor.badezimmer_fenster_contact")
      (fenster_offen "Duschfenster" "binary_sensor.dusche_fenster_contact")

      { alias = "Draussen ist wieder kaelter";
        trigger = [
            {
              platform = "numeric_state";
              entity_id = draussen_diff;
              below = 0;
              for.minutes = 20;
            }
        ];
        condition = [
          { condition = "numeric_state";
            entity_id = draussen;
            above = draussen_heiss;
          }
        ];
        action = (say "Draussen ist es endlich kühler, jetzt kann man die Fenster auf machen");
      }
      { alias = "Draussen ist zu warm";
        trigger = [
            {
              platform = "numeric_state";
              entity_id = draussen_diff;
              above = 0;
              for.minutes = 20;
            }
        ];
        condition = [
          { condition = "numeric_state";
            entity_id = draussen;
            above = draussen_heiss;
          }
        ];
        action = (say "Draussen wird es jetzt zu warm, besser das fenster schliessen");
      }
    ];
  };
}