———————————————————————————————————-
— Script : script_time_volets.lua
— Programme lancé chaque minute
—
— Objectif : Script qui permet d’automatiser la gestion des volets roulants
— en fonction de l’heure du levé et du couché du soleil
— et en fonction de ma présence.
—
— Programme du lundi au vendredi au travail
— ou programme le reste ou vacances
—
— Auteur : Raphael
— Date : 23/03/2017
— Révision 2.01: 16/06/2017: Ajout volets etage
— Révision 2.02: 17/06/2017: Correction de bug
— Révision 2.10: Ajout de variables Heure Volet
— Révision 2.20: 26/01/2020: Open Blind séparé pour chaque Chambre
— Version : 2.20
———————————————————————————————————-
— Ce qui marche
— commandArray[‘UpdateDevice’] =38 ..’|0|’.. »Off » — OK ca marche (0=nvalue ou current state (« On ») , « Off »= svalues) pour dummy
— commandArray[‘UpdateDevice’] =38 ..’|1|’.. »On » — OK ca marche (1=nvalue ou current state (« Off »), « On » = svalues) pour dummy
— commandArray[38] = {[‘Lumiere test’]= « On »} — OK ca marche
— commandArray[38] = {[‘Lumiere test’]= ‘On’} — OK ca marche
— commandArray[38] = { [‘UpdateDevice’] = 38 ..’|0|’.. »Off » } — OK ca marche
— otherdevices_svalues[‘Lumiere test’]== »0″ then — Contrôle juste svalues
— if otherdevices_scenesgroups[‘Volets Salle a manger (ON = Fermer)’]== »Off » then — Pour les groups ou scenes
— if otherdevices_scenesgroups[‘Volets Salle a manger (ON = Fermer)’]== »Mixed » then — Pour les groups ou scenes
— if otherdevices[‘Lumiere test’]== »On » then
— print (« Lumiere allume »..otherdevices[‘Lumiere test’])
— end
— print (« <font color=’#fb8a21′>Mon texte en orange</font> »)
— print (« <font color=’#D524F4′>Couleur Mauve</font> »)
— commandArray[‘Variable:MyVar’]= uservariables[« MyVar »] +25 — Pour les variables
———————————————————————————————————-
— Script functions
———————————————————————————————————-
local function Mn_To_Hour(Heure_en_mn) — Conversion Mn en Heure HH:mn
local mn=math.floor(Heure_en_mn%60) — math.floor(x) pour retirer les décimals
local hh=math.floor((Heure_en_mn-mn)/60) — math.floor(x) pour retirer les décimals
if mn<10 then mn= »0″..mn end
if hh<10 then hh= »0″..hh end
return (hh.. »: »..mn)
end
local function Hour_To_Mn(Heure_str) — Conversion Heure en Mn
_, _, hh, mn = string.find(Heure_str, « (%d+):(%d+) »)
return hh*60+mn
end
———————————————————————————————————-
— Script parameters
———————————————————————————————————-
Debug = « YES » — Turn debugging on (« YES ») or off (« NO »)
— Les variables de seuil
local Seuil_Heure_Open_Mini_Present_RDC=Hour_To_Mn(uservariables[‘Seuil_Heure_Open_Mini_Pres_RDC’]) — « 06:50″=410 Present RDC « 05:50=350
local Seuil_Heure_Closed_Maxi_Present_RDC=Hour_To_Mn(uservariables[‘Seuil_Heure_Closed_Maxi_Pres_RDC’]) — « 21:00 » Present RDC
local Seuil_Heure_Open_Mini_Present_SDB = Hour_To_Mn(uservariables[‘Seuil_Heure_Open_Mini_Pres_SDB’]) — « 06:40 » Present SDB
local Seuil_Heure_Open_Etage= Hour_To_Mn(uservariables[‘Seuil_Heure_Open_Etage’]) — « 10:00 » Etage hors SDB
local Seuil_Heure_Closed_Etage=Hour_To_Mn(uservariables[‘Seuil_Heure_Closed_Etage’]) — « 19:50 » Etage hors SDB
local Seuil_Heure_Open_Anae=Hour_To_Mn(uservariables[‘Seuil_Open_Blind_Anae’]) — « 10:00 » Volet Anae
local Seuil_Heure_Open_Milo=Hour_To_Mn(uservariables[‘Seuil_Open_Blind_Milo’]) — « 09:00 » Volet Milo
local Seuil_Heure_Open_RafNad=Hour_To_Mn(uservariables[‘Seuil_Open_Blind_RafNad’]) — « 09:00 » Volet RAF & NAD
local Seuil_Heure_Open_Mini_Absent=Hour_To_Mn(uservariables[‘Seuil_Heure_Open_Mini_Abs’]) — « 07:45″=465 Absent ou week end RDC & SDB
local Seuil_Heure_Closed_Maxi_Absent=Hour_To_Mn(uservariables[‘Seuil_Heure_Closed_Maxi_Abs’]) — « 20:45″=1245 Absent ou week end RDC & SDB
local Offset_couche_soleil =5
local Heure_LEVER_soleil = timeofday[‘SunriseInMinutes’]
local Heure_COUCHER_soleil = timeofday[‘SunsetInMinutes’]
local Jour_de_semaine=tonumber(os.date(‘%w’)) — [0-6 = Sunday-Saturday]
local Var_hours=tonumber(os.date(‘%H’))
local Var_minutes=tonumber(os.date(‘%M’))
local NowInMinutes = Var_hours * 60 + Var_minutes –recuperer l’heure actuelle en minutes
local Ouvrir_Volets_RDC, Ouvrir_Volet_SDB
local Ouvrir_Volet_Anae, Ouvrir_Volet_Milo, Ouvrir_Volet_RafNad — Volets des chambre
———————————————————————————————————-
— CommandArray
———————————————————————————————————-
commandArray = {}
— if Debug== »YES » then — Affichage des valeurs en mode Debug
— print(« Heure en minutes: « ..NowInMinutes.. » / Sunrise: « ..Heure_LEVER_soleil.. » / Sunset: « ..Heure_COUCHER_soleil)
— print(« Heure: « ..os.date(« %H:%M »).. » / Sunrise: « ..string.format(‘%02d:%02d’, math.floor(Heure_LEVER_soleil / 60), Heure_LEVER_soleil % 60)..
— » / Sunset: « ..string.format(‘%02d:%02d’, math.floor(Heure_COUCHER_soleil / 60), Heure_COUCHER_soleil % 60))
— end
— if Debug == « YES » then print (« <font color=’#24F4EB’>Jour de la semaine: « ..Jour_de_semaine.. » </font> ») end
if (NowInMinutes ==5)then — Pour affichage
local Time_Ouverture= »00:00″
local Time_Fermeture= »00:00″
if(otherdevices[‘Etat_Presence’]== »PRESENT » or otherdevices[‘Etat_Presence’]== »PRES ETAGE OPEN HS »)and Jour_de_semaine>=1 and Jour_de_semaine<=5 then — RDC Présent Lundi-Vendredi
— Heure d’ouverture
if Heure_LEVER_soleil>Seuil_Heure_Open_Mini_Present_RDC then
Time_Ouverture=Mn_To_Hour(Heure_LEVER_soleil)
else Time_Ouverture=Mn_To_Hour(Seuil_Heure_Open_Mini_Present_RDC)
end
— Heure de Fermeture
if Heure_COUCHER_soleil+Offset_couche_soleil<Seuil_Heure_Closed_Maxi_Present_RDC then
Time_Fermeture=Mn_To_Hour(Heure_COUCHER_soleil+Offset_couche_soleil)
else Time_Fermeture=Mn_To_Hour(Seuil_Heure_Closed_Maxi_Present_RDC)
end
elseif otherdevices[‘Etat_Presence’]~= »Pilotage OFF » then — Mode VACANCES
— Heure d’ouverture
if Heure_LEVER_soleil>Seuil_Heure_Open_Mini_Absent then
Time_Ouverture=Mn_To_Hour(Heure_LEVER_soleil)
else Time_Ouverture=Mn_To_Hour(Seuil_Heure_Open_Mini_Absent)
end
— Heure de Fermeture
if Heure_COUCHER_soleil+Offset_couche_soleil<Seuil_Heure_Closed_Maxi_Absent then
Time_Fermeture=Mn_To_Hour(Heure_COUCHER_soleil+Offset_couche_soleil)
else Time_Fermeture=Mn_To_Hour(Seuil_Heure_Closed_Maxi_Absent)
end
end
commandArray[‘Variable:Info_Ouverture_mini_volet’]=Time_Ouverture
commandArray[‘Variable:Info_Fermeture_maxi_volet’]=Time_Fermeture
commandArray[1] = { [‘UpdateDevice’] = 18 .. ‘|0|’ .. Time_Ouverture} — Pour afficher Heure ouverture volet
commandArray[2] = { [‘UpdateDevice’] = 19 .. ‘|0|’ .. Time_Fermeture} — Pour afficher Heure fermeture volet
end
————————————————————————————————————————–
—————————————————- PRESENT/ABSENT RDC + SDB ——————————————–
————————————————————————————————————————–
if (otherdevices[‘Etat_Presence’]== »PRESENT » or otherdevices[‘Etat_Presence’]== »PRES ETAGE OPEN HS ») and Jour_de_semaine>=1 and Jour_de_semaine<=5 then — Présent du Lundi-vendredi
if (NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Mini_Present_SDB)
or (NowInMinutes==Seuil_Heure_Open_Mini_Present_SDB and Heure_LEVER_soleil<=Seuil_Heure_Open_Mini_Present_SDB) then — Test Ouverture SDB
Ouvrir_Volet_SDB=true
end
if (NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Mini_Present_RDC)
or (NowInMinutes==Seuil_Heure_Open_Mini_Present_RDC and Heure_LEVER_soleil<=Seuil_Heure_Open_Mini_Present_RDC) then — Test Ouverture RDC
Ouvrir_Volets_RDC=true
elseif (NowInMinutes==Heure_COUCHER_soleil+Offset_couche_soleil and Heure_COUCHER_soleil+Offset_couche_soleil<=Seuil_Heure_Closed_Maxi_Present_RDC)
or (NowInMinutes==Seuil_Heure_Closed_Maxi_Present_RDC and Heure_COUCHER_soleil+Offset_couche_soleil>=Seuil_Heure_Closed_Maxi_Present_RDC) then — Test Fermeture
Ouvrir_Volets_RDC=false
Ouvrir_Volet_SDB=false
end
elseif otherdevices[‘Etat_Presence’]== »VACANCES » or Jour_de_semaine==0 or Jour_de_semaine==6 then — ABSENT ou Samedi Dimanche
if (NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Mini_Absent)
or (NowInMinutes==Seuil_Heure_Open_Mini_Absent and Heure_LEVER_soleil<=Seuil_Heure_Open_Mini_Absent)then — Test Ouverture
Ouvrir_Volets_RDC=true
Ouvrir_Volet_SDB=true
elseif (NowInMinutes==Heure_COUCHER_soleil+Offset_couche_soleil and Heure_COUCHER_soleil+Offset_couche_soleil<=Seuil_Heure_Closed_Maxi_Absent) — Fermeture 10mn après couché du soleil
or (NowInMinutes==Seuil_Heure_Closed_Maxi_Absent and Heure_COUCHER_soleil+Offset_couche_soleil>=Seuil_Heure_Closed_Maxi_Absent)then
Ouvrir_Volets_RDC=false
Ouvrir_Volet_SDB=false
end
end
————————————————————————————————————————–
—————————————————- PRESENT/ABSENT ETAGE ————————————————
————————————————————————————————————————–
if otherdevices[‘Etat_Presence’]~= »Pilotage OFF » and — Fermeture des volets chambre
((NowInMinutes==Heure_COUCHER_soleil+Offset_couche_soleil and Heure_COUCHER_soleil+Offset_couche_soleil<=Seuil_Heure_Closed_Etage)
or (NowInMinutes==Seuil_Heure_Closed_Etage and Heure_COUCHER_soleil+Offset_couche_soleil>=Seuil_Heure_Closed_Etage)) then
Ouvrir_Volet_Milo=false
Ouvrir_Volet_Anae=false
Ouvrir_Volet_RafNad=false
else — Test pour l’ouverture des volets chambre
— OPEN Blind ANAE —
if(((otherdevices[‘Etat_Presence’]== »PRESENT » and Jour_de_semaine>=1 and Jour_de_semaine<=5)or otherdevices[‘Etat_Presence’]== »VACANCES ») and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Etage)
or (NowInMinutes==Seuil_Heure_Open_Etage and Heure_LEVER_soleil<=Seuil_Heure_Open_Etage)))
or
((otherdevices[‘Etat_Presence’]== »PRESENT » and (Jour_de_semaine==6 or Jour_de_semaine==0))and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Anae)
or (NowInMinutes==Seuil_Heure_Open_Anae and Heure_LEVER_soleil<=Seuil_Heure_Open_Anae)))then
Ouvrir_Volet_Anae=true
end
— OPEN Blind MILO —
if(((otherdevices[‘Etat_Presence’]== »PRESENT » and Jour_de_semaine>=1 and Jour_de_semaine<=5 and Jour_de_semaine~=3 )or otherdevices[‘Etat_Presence’]== »VACANCES ») and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Etage)
or (NowInMinutes==Seuil_Heure_Open_Etage and Heure_LEVER_soleil<=Seuil_Heure_Open_Etage)))
or
((otherdevices[‘Etat_Presence’]== »PRESENT » and (Jour_de_semaine==3 or Jour_de_semaine==6 or Jour_de_semaine==0))and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Milo)
or (NowInMinutes==Seuil_Heure_Open_Milo and Heure_LEVER_soleil<=Seuil_Heure_Open_Milo)))then
Ouvrir_Volet_Milo=true
end
— OPEN Blind RAF & NAD —
if (((otherdevices[‘Etat_Presence’]== »PRESENT » and Jour_de_semaine>=1 and Jour_de_semaine<=5 and Jour_de_semaine~=3 )or otherdevices[‘Etat_Presence’]== »VACANCES ») and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_Etage)
or (NowInMinutes==Seuil_Heure_Open_Etage and Heure_LEVER_soleil<=Seuil_Heure_Open_Etage)))
or
((otherdevices[‘Etat_Presence’]== »PRESENT » and (Jour_de_semaine==3 or Jour_de_semaine==6 or Jour_de_semaine==0))and
((NowInMinutes==Heure_LEVER_soleil and Heure_LEVER_soleil>=Seuil_Heure_Open_RafNad)
or (NowInMinutes==Seuil_Heure_Open_RafNad and Heure_LEVER_soleil<=Seuil_Heure_Open_RafNad)))then
Ouvrir_Volet_RafNad=true
end
end
–**************************************************************************************************************************************************************–
–**************************************************************************************************************************************************************–
——————————————————————————————————————————————————————
—————————————————— Commande des volets avec RFX Com ————————————————————————–
——————————————————————————————————————————————————————
————————————————————– RDC ———————————————————————————————–
if Ouvrir_Volets_RDC==true then — Ouverture des volets RDC
commandArray[‘Volet Cuisine’] = « Off »
commandArray[‘Volet Salle Cote rue’]= »Off AFTER 30″ — 30s
commandArray[‘Volet Salle Cote cours’]= »Off AFTER 60″ — 60s=1mn
if Debug== »YES » then print (« <font color=’#D524F4′>Ouverture des volets RDC</font> ») end
commandArray[‘Group:Volets RDC’] = « Off AFTER 90 » — Confirmation ouverture RDC
elseif Ouvrir_Volets_RDC==false then — Fermeture des volets RDC
if otherdevices[‘Etat_Presence’]== »VACANCES » then commandArray[‘Volet Cuisine’]= »On » end — Fermeture des volets cuisine si mode vacances activé
if otherdevices[‘Etat_Presence’]== »VACANCES » and Debug== »YES » then print(« <font color=’#D524F4′>Fermeture du volet cuisine</font> ») end
commandArray[‘Volet Salle Cote rue’]= »On AFTER 60″
commandArray[‘Volet Salle Cote cours’]= »On AFTER 600″ — 600s=10mn
if otherdevices[‘Etat_Presence’]== »VACANCES » then
commandArray[‘Group:Volets RDC’] = « On AFTER 660 » — Confirmation ouverture volets RDC
if Debug== »YES » then print(« <font color=’#D524F4′>Fermeture des volets RDC</font> ») end
else
commandArray[‘Group:Volets Salle a manger (ON = Fermer)’] = « On AFTER 660 » — Confirmation ouverture volets Salle
if Debug== »YES » then print(« <font color=’#D524F4′>Fermeture des volets salles</font> ») end
end
end
————————————————————– SDB ——————————————————-
if Ouvrir_Volet_SDB==true then — Ouverture
commandArray[‘Volet SDB’]= »Off »
if Debug== »YES » then print(« <font color=’#D524F4′>Ouverture du volet SDB</font> ») end
elseif Ouvrir_Volet_SDB==false then — Fermeture
commandArray[‘Volet SDB’]= »On AFTER 600″
if Debug== »YES » then print(« <font color=’#D524F4′>Fermeture du volet SDB</font> ») end
end
————————————————————- ETAGE ——————————————————
if Ouvrir_Volet_Anae==true then commandArray[‘Volet Anae’] = « Off » end — Ouverture du volet Anae
if Ouvrir_Volet_Anae==true and Debug== »YES » then print(« <font color=’#D524F4′>Ouverture volet ANAE à « ..Seuil_Heure_Open_Anae.. »</font> ») end
if Ouvrir_Volet_Milo==true then commandArray[‘Volet Milo’] = « Off » end — Ouverture du volet Milo
if Ouvrir_Volet_Milo==true and Debug== »YES » then print(« <font color=’#D524F4′>Ouverture volet MILO à « ..Seuil_Heure_Open_Milo.. »</font> ») end
if Ouvrir_Volet_RafNad==true then commandArray[‘Volet Chambre’] = « Off » end — Ouverture du volet Raf & Nad
if Ouvrir_Volet_RafNad==true and Debug== »YES » then print(« <font color=’#D524F4′>Ouverture volet RAF & NAD à « ..Seuil_Heure_Open_RafNad.. »</font> ») end
if Ouvrir_Volet_RafNad==true and Ouvrir_Volet_Milo==true and Ouvrir_Volet_Anae==true then — Ouverture globale des volets
commandArray[‘Group:Volets Etage’] = « Off AFTER 120 » — 2mn = 120
if Debug== »YES » then print(« <font color=’#D524F4′>Confirmation ouverture des volets chambre</font> ») end
elseif Ouvrir_Volet_RafNad==false and Ouvrir_Volet_Milo==false and Ouvrir_Volet_Anae==false then — Fermeture des volets etage
commandArray[‘Volet Milo’] = « Stopped »
commandArray[‘Volet Anae’] = « Stopped AFTER 60 »
commandArray[‘Volet Chambre’] = « Stopped AFTER 120 »
commandArray[‘Group:Volets Etage’] = « On AFTER 660 »
if Debug== »YES » then print(« <font color=’#24F4EB’>Fermeture des volets etage</font> ») end
end
————————————————————————————————————————–
————————————————————————————————————————–
return commandArray
————————————————– Fin —————————————————————–
——————————————————————————————————————————