This repository has no description
8.0 kB
256 lines
1{ lib, ... }:
2rec {
3 lights = {
4 bett = "l_bett";
5 essen = "l_essen";
6 arbeit = "l_arbeit";
7 nass = "l_nass";
8 };
9
10 switches = {
11 dimmer = {
12 bett = "i_bett";
13 essen = "i_essen";
14 nass = "i_nass";
15 };
16 };
17
18 sensors = {
19 movement = {
20 essen = "s_essen";
21 nass = "s_nass";
22 };
23 };
24
25 friendly_names =
26 lib.mapAttrs' (n: v: lib.nameValuePair "light.${v}" { friendly_name = "l.${n}"; }) lights //
27 lib.mapAttrs' (n: v: lib.nameValuePair "binary_sensor.${v}_update_available" { friendly_name = "s.${n}_up"; }) switches.dimmer //
28 lib.mapAttrs' (n: v: lib.nameValuePair "binary_sensor.${v}_update_available" { friendly_name = "i.${n}_up"; }) sensors.movement //
29 lib.mapAttrs' (n: v: lib.nameValuePair "binary_sensor.${v}_update_available" { friendly_name = "l.${n}_up"; }) lights //
30 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_linkquality" { friendly_name = "s.${n}_link"; }) switches.dimmer //
31 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_linkquality" { friendly_name = "i.${n}_link"; }) sensors.movement //
32 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_linkquality" { friendly_name = "l.${n}_link"; }) lights //
33 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_battery" { friendly_name = "s.${n}_bat"; }) switches.dimmer //
34 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_battery" { friendly_name = "i.${n}_bat"; }) sensors.movement //
35 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_action" { friendly_name = "s.${n}_act"; }) switches.dimmer //
36 lib.mapAttrs' (n: v: lib.nameValuePair "binary_sensor.${v}_occupancy" { friendly_name = "i.${n}_move"; }) sensors.movement //
37 lib.mapAttrs' (n: v: lib.nameValuePair "binary_sensor.${v}_occupancy" { friendly_name = "i.${n}_move"; }) sensors.movement //
38 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_temperature" { friendly_name = "i.${n}_heat"; }) sensors.movement //
39 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_temperature" { friendly_name = "i.${n}_heat"; }) sensors.movement //
40 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_illuminance" { friendly_name = "i.${n}_lux"; }) sensors.movement //
41 lib.mapAttrs' (n: v: lib.nameValuePair "sensor.${v}_illuminance" { friendly_name = "i.${n}_lux"; }) sensors.movement //
42 {};
43
44 detect_movement = name: sensor: light: delay:
45 let
46 id = name;
47 sensor_ = "binary_sensor.${sensor}_occupancy";
48 light_ = "light.${light}";
49 in {
50 input_boolean."${id}" = {
51 };
52 timer."${id}" = {
53 duration = delay;
54 };
55 automation = [
56 # {
57 # alias = "debug detect_movement";
58 # trigger = {
59 # platform = "state";
60 # entity_id = sensor_;
61 # };
62 # action = [
63 # {
64 # service = "system_log.write";
65 # data_template = {
66 # message = "XXXXXXXXXXXXXXXXXXXXXX {{ states('input_boolean.${sensor}_${light}_triggered') == 'on' }}";
67 # #message = "XXXXXXXXXXXXXXXXXXXXXX {{ state_attr('trigger.to_state.state', 'illuminance') }}";
68 # };
69 # }
70 # ];
71 # }
72 {
73 alias = "movement reset timer ${id}";
74 trigger = {
75 platform = "state";
76 entity_id = sensor_;
77 from = "off";
78 to = "on";
79 };
80 action = [
81 {
82 service = "timer.cancel";
83 data_template.entity_id = "timer.${id}";
84 }
85 ];
86 }
87 {
88 alias = "movement on ${id}";
89 trigger = {
90 platform = "state";
91 entity_id = "binary_sensor.${sensor}_occupancy";
92 from = "off";
93 to = "on";
94 };
95 condition = {
96 condition = "and";
97 conditions = [
98 {
99 condition = "template";
100 value_template = "{{ trigger.to_state.attributes.illuminance < 7500 }}";
101 }
102 {
103 condition = "template";
104 value_template = "{{ states('${light_}') == 'off' }}";
105 }
106 ];
107 };
108 action = [
109 {
110 service = "light.turn_on";
111 data_template = {
112 entity_id = light_;
113 brightness = "100";
114 };
115 }
116 { delay = "0:00:02"; }
117 {
118 service = "input_boolean.turn_on";
119 data_template.entity_id = "input_boolean.${id}";
120 }
121 ];
122 }
123 {
124 alias = "movement off ${id}";
125 trigger = {
126 platform = "state";
127 entity_id = sensor_;
128 from = "on";
129 to = "off";
130 };
131 condition = {
132 condition = "template";
133 value_template = "{{ states('input_boolean.${id}') == 'on' }}";
134 };
135 action = [
136 {
137 service = "timer.start";
138 entity_id = "timer.${id}";
139 }
140 ];
141 }
142 {
143 alias = "movement override ${id}";
144 trigger = {
145 platform = "state";
146 entity_id = light_;
147 };
148 action = [
149 {
150 service = "input_boolean.turn_off";
151 data_template.entity_id = "input_boolean.${id}";
152 }
153 {
154 service = "system_log.write";
155 data_template = {
156 message = "XXXXXXXXXXXXXXXXXXXXXX {{ trigger }}";
157 };
158 }
159 ];
160 }
161 {
162 alias = "movement expired ${id}";
163 trigger = {
164 platform = "event";
165 event_type = "timer.finished";
166 event_data.entity_id = "timer.${id}";
167 };
168 action = [
169 {
170 service = "light.turn_off";
171 data_template = {
172 entity_id = light_;
173 };
174 }
175 {
176 service = "input_boolean.turn_off";
177 data_template.entity_id = "input_boolean.${id}";
178 }
179 ];
180 }
181 ];
182 };
183
184 lightswitch = name: switch: light: {
185 automation = [
186 {
187 alias = "lightswitch ${name} turn on";
188 trigger = {
189 platform = "mqtt";
190 topic = "zigbee/${switch}";
191 };
192 condition = {
193 condition = "or";
194 conditions = [
195 {
196 condition = "template";
197 value_template = "{{ trigger.payload_json.action == 'on-press' }}";
198 }
199 {
200 condition = "template";
201 value_template = "{{ trigger.payload_json.action == 'up-press' }}";
202 }
203 {
204 condition = "and";
205 conditions = [
206 {
207 condition = "template";
208 value_template = "{{ trigger.payload_json.action == 'down-press' }}";
209 }
210 {
211 condition = "template";
212 value_template = "{{ trigger.payload_json.brightness > 30 }}";
213 }
214 ];
215 }
216 ];
217 };
218 action = [
219 {
220 service = "light.turn_on";
221 data_template = {
222 entity_id = "light.${light}";
223 brightness = "{{ trigger.payload_json.brightness }}";
224 };
225 }
226 ];
227 }
228 {
229 alias = "lightswitch ${name} turn off";
230 trigger = {
231 platform = "mqtt";
232 topic = "zigbee/${switch}";
233 };
234 condition = {
235 condition = "or";
236 conditions = [
237 {
238 condition = "template";
239 value_template = "{{ trigger.payload_json.action == 'off-press' }}";
240 }
241 {
242 condition = "template";
243 value_template = "{{ trigger.payload_json.brightness < 30 }}";
244 }
245 ];
246 };
247 action = {
248 service = "light.turn_off";
249 data_template = {
250 entity_id = "light.${light}";
251 };
252 };
253 }
254 ];
255 };
256}