———————————————————————————————————-
— 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    —————————————————————–
——————————————————————————————————————————