-
Notifications
You must be signed in to change notification settings - Fork 5
/
script_time_volets.lua
336 lines (278 loc) · 17.2 KB
/
script_time_volets.lua
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
-------------------------------------------------------------
-- Script d'action des scripts de gestion des volets en fonction de
------------------------------------------------------------
-- 1. Mode Mnauel
-- => Si activé alors Désactive ce script
-- 2. Mode Auto
-- Ouverture volets salon au lever du soleil / Fermeture au coucher
-- 3. Mode Auto Tardif
-- Ouverture volets salon le matin uniquement si présence détectée
-- 4. Mode absent
-- => Si activé alors :
-- pas d'ouverture des volets sdb
-- ouverture volet chambre les matins et weekend
-- 5. Mode canicule
-- => Si activé alors
-- Tous les jours, ouverture volets salon 1h30 plus tôt, Fermeture volets salon/chambre 2h plus tard
-- En semaine, ouverture volets chambre uniquement à 23h + fermeture volets salon de 14h à 17h
-- Si temp dehors < chambre, alors ouvre le volet chambre sinon on le ferme
-- Fermeture des volets du salon entre 14h et 17h la semaine
-- 6. Device 'Alarm Clock Weekdays'
-- => Semaine uniquement :
-- Si On, ouverture volets chambre 30min après heure reveil et ouverture volets sdb pendant 45min après heure reveil
-- Si OFF alors pas d'ouverture des volets chambre ni sdb le matin
-- 7. Si détection de présence
-- => On ouvre les volets sdb sinon on les ferme
-------------------------------------------------------------
package.path = package.path .. ';' .. '/home/pi/domoticz/scripts/lua/?.lua'
require("library")
commandArray = {}
----------------
-- Paramètres --
----------------
volets_sdb_on_weekdays = 45 -- Nbre de minutes volets restent ouverts le matin en semaine uniquement (variable alarmclock)
----------------
----- variables ------
datetime = os.date("*t") -- table is returned containing date & time information
time_inminutes = 60 * datetime.hour + datetime.min
_, _, alarm1, alarm2 = string.find(uservariables['Var_Alarmclock'], "(%d+):(%d+)") -- extrait heure / minute de la variable alarmclock
alarmclock_inminutes = 60 * tonumber(alarm1) + tonumber(alarm2)
min_time_ouverture = math.max(450, math.min(timeofday['SunriseInMinutes'], 540)) -- ouverture des volets à minimum 7h30 et à maximum 9h
min_time_fermeture = math.max(1050, timeofday['SunsetInMinutes'] + 30) -- fermeture des volets à minimum 17h30
temp_dehors = otherdevices_temperature['Temp dehors'] or 10
temp_chambre = otherdevices_temperature['Temp chambre'] or 18
humdite_dehors = otherdevices_humidity['Temp dehors'] or 60
Script_Presence_Maison = tonumber(uservariables['Script_Presence_Maison']) or 0
----------------------
-- On détermine si on est un jour ferie
is_jour_ferie = 0
date_jour = os.date("%x")
for jourferie_i in string.gmatch(uservariables['Var_Jours_Feries'], "%S+") do -- %S+ matche tout ce qui n'est pas un espace
_, _, jour_ferie_j, jour_ferie_m, jour_ferie_a = string.find(jourferie_i, "(%d+)/(%d+)/(%d+)")
date_jour_ferie = os.date("%x", os.time{day=jour_ferie_j, month=jour_ferie_m, year='20'..jour_ferie_a})
if (date_jour_ferie == date_jour) then -- Si on est dans la journée fériée
is_jour_ferie = 1
break -- on sort de la bouche si on sait qu'on est un jour fériée
end
end
-- Définition des paramètres à afficher sur le dashboard (doit être aligné avec les règles codées plus loin dans le code)
if (uservariables['Script_Mode_Volets'] == 'canicule' and uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
Variable_Info_VoletsSalonOn = min_time_ouverture - 90
Variable_Info_VoletsSalonOff = min_time_fermeture + 120
Variable_Info_VoletsChambreOff = min_time_fermeture + 121
Variable_Info_VoletsSdbOff = min_time_fermeture + 122
elseif (uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
if (uservariables['Script_Mode_VoletsTardifs'] == 'off') then
Variable_Info_VoletsSalonOn = min_time_ouverture
else
Variable_Info_VoletsSalonOn = -1
end
Variable_Info_VoletsSalonOff = min_time_fermeture + 1
Variable_Info_VoletsChambreOff = min_time_fermeture
Variable_Info_VoletsSdbOff = min_time_fermeture - 30
else
Variable_Info_VoletsSalonOff = -1
Variable_Info_VoletsChambreOff = -1
Variable_Info_VoletsSdbOff = -1
Variable_Info_VoletsSalonOn = -1
end
if (otherdevices['Alarm Clock Weekdays'] == 'On' and uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
Variable_Info_VoletsSdbOffWeekMorning = alarmclock_inminutes + volets_sdb_on_weekdays
else
Variable_Info_VoletsSdbOffWeekMorning = -1
end
if (otherdevices['Alarm Clock Weekdays'] == 'On' and uservariables['Script_Mode_Maison'] == 'auto' and alarmclock_inminutes >= timeofday['SunriseInMinutes'] - 30 and temp_dehors >= 0 and uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
Variable_Info_VoletsSdbOnWeekMorning = alarmclock_inminutes
else
Variable_Info_VoletsSdbOnWeekMorning = -1
end
if ((otherdevices['Alarm Clock Weekdays'] == 'On' or uservariables['Script_Mode_Maison'] == 'absent') and uservariables['Script_Mode_Volets'] ~= 'canicule' and temp_dehors >= 5 and uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
Variable_Info_VoletsChambreOnWeek = alarmclock_inminutes + 30
else
Variable_Info_VoletsChambreOnWeek = -1
end
if uservariables['Info_VoletsSalonOn'] ~= Variable_Info_VoletsSalonOn then
commandArray['Variable:Info_VoletsSalonOn'] = tostring(Variable_Info_VoletsSalonOn )
end
if uservariables['Info_VoletsSalonOff'] ~= Variable_Info_VoletsSalonOff then
commandArray['Variable:Info_VoletsSalonOff'] = tostring(Variable_Info_VoletsSalonOff)
end
if uservariables['Info_VoletsChambreOnWeek'] ~= Variable_Info_VoletsChambreOnWeek then
commandArray['Variable:Info_VoletsChambreOnWeek'] = tostring(Variable_Info_VoletsChambreOnWeek)
end
if uservariables['Info_VoletsChambreOff'] ~= Variable_Info_VoletsChambreOff then
commandArray['Variable:Info_VoletsChambreOff'] = tostring(Variable_Info_VoletsChambreOff)
end
if uservariables['Info_VoletsSdbOnWeekMorning'] ~= Variable_Info_VoletsSdbOnWeekMorning then
commandArray['Variable:Info_VoletsSdbOnWeekMorning'] = tostring(Variable_Info_VoletsSdbOnWeekMorning)
end
if uservariables['Info_VoletsSdbOffWeekMorning'] ~= Variable_Info_VoletsSdbOffWeekMorning then
commandArray['Variable:Info_VoletsSdbOffWeekMorning'] = tostring(Variable_Info_VoletsSdbOffWeekMorning)
end
if uservariables['Info_VoletsSdbOff'] ~= Variable_Info_VoletsSdbOff then
commandArray['Variable:Info_VoletsSdbOff'] = tostring(Variable_Info_VoletsSdbOff )
end
---------------------------------------------------------------------------------------------------------------
-- Gestion automatique des volets uniquement
-- si le mode maison n'est pas manuel
-- si le mode volet n'est pas manuel
if (uservariables['Script_Mode_Maison'] ~= 'manuel' and uservariables['Script_Mode_Volets'] ~= 'manuel') then
--------------------
-- Tous les jours --
-- Si le mode canicule n'est pas activé
if (uservariables['Script_Mode_Volets'] ~= 'canicule' ) then
-- Ouverture Volets salon
-- a. Si Mode_VoletsTardifs = Off ou Mode Absent, tous les jours le matin au lever du soleil
-- b. Si Mode_VoletsTardifs = On, le matin uniquement si présence détectée ou bien sinon à 13h
if ( (uservariables['Script_Mode_VoletsTardifs'] == 'off' or uservariables['Script_Mode_Maison'] == 'absent') and time_inminutes == min_time_ouverture
or uservariables['Script_Mode_VoletsTardifs'] == 'on' and timedifference(otherdevices_lastupdate['Volets Salon']) >= 21600 and otherdevices['Volets Salon'] == 'Closed' and (Script_Presence_Maison >= 1 and time_inminutes >= min_time_ouverture and datetime.hour < 12 or datetime.hour == 13) ) then
commandArray['Volets Salon'] = "On"
print('----- Ouverture automatique volets salon le matin -----')
end
-- Fermeture Volets salon le soir
if (time_inminutes == min_time_fermeture + 1) then
commandArray['Volets Salon'] = "Off"
print('----- Fermeture automatique volets salon le soir -----')
end
-- Fermeture Volets chambre le soir
if (time_inminutes == min_time_fermeture) then
commandArray['Volets Chambre'] = "Off RANDOM 10"
print('----- Fermeture automatique volets chambre le soir ----- regle : Off RANDOM 10')
end
-- Fermeture Volet sdb le soir 30min avant coucher du soleil s'ils sont encore ouverts
if (otherdevices['Volets sdb'] == 'Open' and time_inminutes == - 30 + min_time_fermeture) then
tts_function('Fermeture volets salle de bain dans les 10 minutes')
commandArray['Volets sdb'] = "Off RANDOM 10"
print('----- Fermeture automatique volets sdb tous les soirs ----- regle : Off RANDOM 10')
end
-- Si le mode canicule est activé
elseif (uservariables['Script_Mode_Volets'] == 'canicule') then
-- Ouverture Volets salon le matin
if (time_inminutes == min_time_ouverture - 90) then
commandArray['Volets Salon'] = "On"
print('----- Ouverture automatique volets salon le matin ----- regle : Mode Canicule On (-90min) ')
end
-- Fermeture Volets salon le soir
if (time_inminutes == min_time_fermeture + 120) then
commandArray['Volets Salon'] = "Off"
print('----- Fermeture automatique volets salon le soir ----- regle : Mode Canicule On (+120min) ')
end
-- Fermeture Volets chambre le soir
if (time_inminutes == min_time_fermeture + 121) then
commandArray['Volets Chambre'] = "Off RANDOM 10"
print('----- Fermeture automatique volets chambre le soir ----- regle : Mode Canicule On (+120min), Off RANDOM 10')
end
-- Fermeture Volet sdb le soir 120min après coucher du soleil s'ils sont encore ouverts
if (otherdevices['Volets sdb'] == 'Open' and time_inminutes == 122 + min_time_fermeture) then
tts_function('Fermeture volets salle de bain dans les 10 minutes')
commandArray['Volets sdb'] = "Off RANDOM 10"
print('----- Fermeture automatique volets sdb tous les soirs ----- regle : Mode Canicule On, Off RANDOM 10')
end
-- Ouverture Volet chambre pour cause de temperature
-- si temp extérieure + 1 <= temp chambre et si lumière eteinte
-- si temperature chambre >= 20 et humidité extérieure < 70
-- si pas de changement des volets dans la derniere heure
-- avant 23h, et 30 min après réveil si en semaine sinon après 14h
if (otherdevices['Volets Chambre'] == 'Closed' and otherdevices['Lampe Chambre RGBW'] == 'Off'
and temp_dehors + 1 <= temp_chambre
and datetime.hour < 23
and temp_chambre >= 20 and humdite_dehors < 70
and timedifference(otherdevices_lastupdate['Volets Chambre']) >= 3600
and ( otherdevices['Alarm Clock Weekdays'] == 'On' and time_inminutes >= alarmclock_inminutes + 45 and datetime.wday ~= 7 and datetime.wday ~= 1 and is_jour_ferie == 0
or (datetime.wday == 7 or datetime.wday == 1 or is_jour_ferie == 1 or otherdevices['Alarm Clock Weekdays'] == 'Off') and datetime.hour >= 14) ) then
commandArray['Volets Chambre'] = 'On'
print('----- Ouverture automatique volet chambre ----- regle : Mode canicule On et température favorable')
end
-- Fermeture Volet chambre pour cause de temperature
-- si temp extérieure >= temp chambre + 1 et si lumière eteinte
-- si pas de changement des volets dans la derniere heure
-- ou si temp chambre < 18 ou si humidité extérieure >= 90
if (otherdevices['Volets Chambre'] == 'Open' and otherdevices['Lampe Chambre RGBW'] == 'Off'
and (temp_dehors >= temp_chambre + 0.5
and timedifference(otherdevices_lastupdate['Volets Chambre']) >= 3600
or temp_chambre < 18
or humdite_dehors >= 90) ) then
commandArray['Volets Chambre'] = 'Off'
print('----- Fermeture automatique volet chambre ----- regle : Mode canicule On et température défavorable')
end
end
-- Ouverture Volet sdb si mode auto activé
-- lorsqu'il y a une presence (Script_Presence_Maison = 1)
-- uniquement si heure comprise entre 10h et 1h avant Sunset
-- uniquement si temperature exterieur > 5°C
if (uservariables['Script_Mode_Maison'] == 'auto' and otherdevices['Volets sdb'] == 'Closed' and Script_Presence_Maison >= 1
and timedifference(otherdevices_lastupdate['Volets sdb']) >= 3600
and datetime.hour >= 10 and time_inminutes < min_time_fermeture - 60
and temp_dehors >= 5 ) then
tts_function('Ouverture volets salle de bain')
commandArray['Volets sdb'] = 'On AFTER 5'
print('----- Ouverture automatique volets sdb la journée ----- regle : Présence détectée')
end
-- Fermeture Volet sdb si pas de présence (variable Script_Presence_Maison = 0)
if (otherdevices['Volets sdb'] == 'Open' and Script_Presence_Maison == 0
and datetime.hour >= 10) then
tts_function('Fermeture volets salle de bain')
commandArray['Volets sdb'] = 'Off AFTER 15'
print('----- Fermeture automatique volets sdb la journée ----- regle : Pas de présence détectée')
end
-------------
-- semaine --
if (datetime.wday ~= 7 and datetime.wday ~= 1 and is_jour_ferie == 0) then
-- Ouverture Volet chambre en semaine
-- Si alarmclock activée ou si mode absent activé
-- et si mode canicule désactivé
-- et si températeur extérieure > 5°
if ((otherdevices['Alarm Clock Weekdays'] == 'On' or uservariables['Script_Mode_Maison'] == 'absent')
and uservariables['Script_Mode_Volets'] ~= 'canicule' and time_inminutes == alarmclock_inminutes + 30
and temp_dehors >= 5 ) then
commandArray['Volets Chambre'] = "On"
print('----- Ouverture automatique volets chambre en semaine -----')
end
-- Mode canicule Salon - Fermeture / Ouverture Volets Salon l'après-midi
if (uservariables['Script_Mode_Volets'] == 'canicule' ) then
-- Fermeture Volets salon à 14h
if (time_inminutes == 14*60) then
commandArray['Volets Salon'] = 'Off RANDOM 10'
print('----- Fermeture automatique volets salon en semaine ----- regle : Mode Canicule On à 14h')
end
-- Ouverture Volets salon à 17h
if (time_inminutes == 17*60) then
commandArray['Volets Salon'] = 'On RANDOM 10'
print('----- Ouverture automatique volets salon en semaine ----- regle : Mode Canicule On à 17h')
end
end
-- Ouverture Volet sdb le matin en semaine
-- uniquement si mode Domoticz auto
-- uniquement si le reveil est au moins 30 min avant le lever du soleil
-- uniquement si temperature exterieure >= 0°
if (otherdevices['Alarm Clock Weekdays'] == 'On' and uservariables['Script_Mode_Maison'] == 'auto'
and alarmclock_inminutes >= timeofday['SunriseInMinutes'] - 30 and time_inminutes == alarmclock_inminutes ) then
if (temp_dehors >= 5) then
commandArray['Volets sdb'] = 'On'
print('----- Ouverture automatique volets sdb le matin en semaine ----- regle : On at alarmclock')
elseif (temp_dehors >= 0) then
commandArray[1] = {['Volets sdb'] = 'On'}
commandArray[2] = {['Volets sdb'] = 'On AFTER 8'} -- Ouverture à moitié (ne marche pas très bien. A cause d'interférences quand le volet s'ouvre ?)
print('----- Ouverture automatique volets sdb le matin en semaine ----- regle : On at alarmclock')
end
end
-- Fermeture Volet sdb le matin en semaine
if (otherdevices['Alarm Clock Weekdays'] == 'On' and otherdevices['Volets sdb'] == 'Open'
and time_inminutes == alarmclock_inminutes + volets_sdb_on_weekdays
and Script_Presence_Maison == 0) then
tts_function('Fermeture volet salle de bain')
commandArray['Volets sdb'] = 'Off AFTER 5'
print('----- Fermeture automatique volets sdb le matin en semaine ----- regle : Off '..volets_sdb_on_weekdays..' min after alarmclock')
end
end
-------------
-- weekend --
if (datetime.wday == 7 or datetime.wday == 1 or is_jour_ferie == 1) then
-- Uniquement si mode absent activé => Ouverture Volet chambre weekend à 10h
if (uservariables['Script_Mode_Maison'] == 'absent' and time_inminutes == 60*10) then
commandArray['Volets Chambre'] = "On"
print('----- Ouverture automatique volets chambre weekend ----- regle : à 10h si mode absent activé')
end
end
end
return commandArray