require "scripts/lua/functions"

commandArray = {}

--local switch = 'VoletCuisine'

-- ------------------------------------------------------------------------------
--recupere les minutes
-- ------------------------------------------------------------------------------
time     = os.time()
minutes  = tonumber(os.date('%M',time))
jour     = tonumber(os.date('%w',time))
heures   = tonumber(os.date('%H',time))
heurmin  = heures * 60 + minutes

function callExternal(command)
  local handle = io.popen(command)
  local result = handle:read("*a")
  handle:close()    
  --debug("Commande = "..command.." "..result)
  return result
end

-- ------------------------------------------------------------------------------
-- Test temperature radiateur chambres
-- ------------------------------------------------------------------------------
function gestionRadiateurInv( switchTemp, switchRadiateur, consigne)
  local intervalle = tonumber(uservariables['Intervalle_Chauffe'])

  --if (minutes % intervalle ~= 0) then
    --return
  --end

  local last = lastUpdateOfDevice(switchRadiateur)

  local local_delai = delai

  debug("--------------"..switchRadiateur.."-----------------------------------")
  debug(tostring(switchRadiateur).." local_delai="..tostring(local_delai).." last="..tostring(last)..' Chauffage='..otherdevices[switchRadiateur])
  debug("------------------------------------------------------------")

  local currentTemp = tonumber(otherdevices_svalues[switchTemp])

  local delta = 0.2

  local tempAbsence = tonumber(otherdevices_svalues['ConsigneAbsence'])

  local variation = variationTemp2(switchTemp, 10) -- variation des 10 dernières minutes

  local variationExt = uservariables['AugmentationTempExterieure']

  local augmentation = variation * 60 / 10 --time -- ° par heure

  local ecart = consigne - currentTemp

  local estimation = 0.0
  if (augmentation > 0 and ecart > 0) then
    estimation = 60 * ecart / augmentation
  end

  print("GR Retour augmentation="..tostring(augmentation).." ecart="..tostring(ecart)..'°C Estimation='..tostring(estimation).." minutes variationExt="..tostring(variationExt).."°C / heure")

--2016-02-27 20:08:59.864 LUA: local_delai=180 last=37
--2016-02-27 20:08:59.918 LUA: Retour variation=0.3 switch=RadiateurManon
--2016-02-27 20:08:59.918 LUA: CHECK Temperature Variation=0.3 switch=RadiateurManon currentTemp=18.3 tempAbsence=16 consigne=18.5

  print("GR Retour variation="..tostring(variation).." switch="..switchRadiateur..' lastUpdate='..tostring(last))
  debug('CHECK Temperature Variation='..tostring(variation)..' switch='..switchRadiateur..' currentTemp='..tostring(currentTemp).. ' tempAbsence='..tostring(tempAbsence)..' consigne='..tostring(consigne))
  -- if otherdevices['ChauffageGeneral'] == 'Off' then
  --   if (minutes%5 == 0) then
  --   	if (currentTemp >= consigne + delta) then
  --       switchOn(switchRadiateur)
  --   	end	
  --     debug("Radiateur ="..switchRadiateur.." Retour sans rien faire. ChauffageGeneral Eteint.")
  --   end
  --   return
  -- end
  if last < local_delai then
    debug("Radiateur ="..switchRadiateur.." Retour sans rien faire. local_delai non atteint.")
    return
  end
   -- Periode de vacances ou absence ==> hors gel
   if (otherdevices['Vacances'] == 'On' or otherdevices['AbsenceFamille'] == 'On') then
      if (currentTemp > 14) then
        switchIfNeeded(switchRadiateur,"On")
        --commandArray[switchRadiateur]='Off'
      else
        if variation <= 0 then
          --commandArray[switchRadiateur]='On'
          switchIfNeeded(switchRadiateur,"Off")
        end
      end
      print("GR "..tostring(switchRadiateur)..' Temperature chambre : Vacances -> ' ..otherdevices_svalues[switchTemp]..' switch='..switchRadiateur)
   else
     print("GR "..tostring(switchRadiateur)..' Temperature: Presence -> ' ..otherdevices_svalues[switchTemp]..' '..josdGetJourSemaine(jour))
     -- Température non atteinte
     if (currentTemp < consigne) then
        if variation <= 0.0 then
          switchIfNeeded(switchRadiateur,"Off")
          debug("Demande chauffe : "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
        else
          -- Dépassement prévu dans le local_delai on coupe
          if (estimation > 0 and estimation <= local_delai / 60 ) then
            switchIfNeeded(switchRadiateur,"On")
            debug("Arrêt chauffage : Température sera atteinte dans le local_delai "..tostring(estimation).." Minutes")
          else
             if estimation > 60 then
                switchIfNeeded(switchRadiateur,"Off")
                debug("Demande chauffe dela trop long : "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
	         else 
               debug("Aucune action. Chauffage en-cours."..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
             end
          end
        end
     -- Température dépassée
     else
       -- Température supérieure
       if (currentTemp >= consigne + delta or (estimation > 0 and estimation <= local_delai / 60 )) then
         if (consigne == consigneAbsence) then
          -- rien
          if (variation > 0) then
            switchIfNeeded(switchRadiateur,"On")
            debug("Demande arrêt. Température dépassée et augmente.")
          else
            debug("Aucune consigne. Température dépassée et diminue.")
          end
         else
           if (variation > 0) then
             if (variationExt <= 0) then
               switchIfNeeded(switchRadiateur,"On")
               debug("Demande arrêt. Température dépassée.")
             else
               switchIfNeeded(switchRadiateur,"On")
               debug("Aucune action. Augmentation due à température extérieure.")
             end
           else
             -- switchIfNeeded(switchRadiateur,"On")
           end 
         end
       else 
        -- Augmentation de la température non due à l'augmentation extérieure
        if (variation > 0) then
          -- Pas d'augmentation extérieure
          if (variationExt <= 0) then
            switchIfNeeded(switchRadiateur,"On")
            debug("Demande arrêt. Température atteinte et continue d'augmenter.")
          else
              switchIfNeeded(switchRadiateur,"On")
            debug("Aucune action. Augmentation due à température extérieure.")
          end
        else
          -- Températue en baisse pas nécessaire d'envoyer
            switchIfNeeded(switchRadiateur,"On")
          debug("Aucune action. Temperature atteinte et pas d'augmentation. "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
        end
      end
     end
   end
   debug("------------------------------------------------------------")
end
-- ------------------------------------------------------------------------------
-- Test temperature radiateur chambres
-- ------------------------------------------------------------------------------
function gestionRadiateur( switchTemp, switchRadiateur, consigne)
  local intervalle = tonumber(uservariables['Intervalle_Chauffe'])

--  if (minutes % intervalle ~= 0) or switchRadiateur == "RadiateurGrenier" then
--    return
--  end
  local  chauffe_eau   = tonumber(split(otherdevices['Chauffe_Eau'], ";")[1])
  local currentTemp = getTemperatureFromDevice(switchTemp)

  local last = lastUpdateOfDevice(switchRadiateur)
  local local_delai = delai
  if switchRadiateur == "RadiateurGrenier" then
    local_delai = 60
  end

  print("GR --------------"..switchRadiateur.."-----------------------------------")
  values2 = split(otherdevices['CONSOMMATION_GENERALE'], ";")
  print("GR Dans Radiateur CONSOMMATION_GENERALE tabs "..otherdevices['CONSOMMATION_GENERALE']) 
  print("GR "..tostring(switchRadiateur).." local_delai="..tostring(local_delai).." last="..tostring(last)..' Chauffage='..otherdevices[switchRadiateur] .. " currentTemp="..tostring(currentTemp) )

  if last < local_delai then
    print("GR Radiateur ="..switchRadiateur.." Retour sans rien faire. local_delai non atteint.")
    return
  end

  watt = tonumber(values2[1])
  if watt > 8000 then
    if otherdevices["RadiateurBureau"] == 'On' then
      print("GR "..tostring(switchRadiateur).." Dans Radiateur Haute consommation arrêt bureau") 
      switchOffRadiateur("RadiateurBureau")
    elseif otherdevices["RadiateurBureau"] == 'On' then
      print("GR "..tostring(switchRadiateur).." Dans Radiateur Haute consommation arrêt porte salon") 
      switchOffRadiateur("RadiateurPorteSalon")
    elseif otherdevices["RadiateurCuisine"] == 'On' then
      print("GR "..tostring(switchRadiateur).." Dans Radiateur Haute consommation arrêt cuisine") 
      switchOffRadiateur("RadiateurCuisine")
    elseif otherdevices["RadiateurCheminee"] == 'On' then
      print("GR "..tostring(switchRadiateur).." Dans Radiateur Haute consommation arrêt Cheminee") 
      switchOffRadiateur("RadiateurCheminee")
    elseif otherdevices["RadiateurMilieu"] == 'On' then
      print("GR "..tostring(switchRadiateur).." Dans Radiateur Haute consommation arrêt milieu") 
      switchOffRadiateur("RadiateurMilieu")
    end  
  end


  --print("GR ------------------------------------------------------------")
  --debug(getTemperatureFromDevice(switchTemp));
  --local currentTemp = tonumber(otherdevices_svalues[switchTemp])


  local time_variation = 30
  local delta = 0.2

  local tempAbsence = tonumber(otherdevices_svalues['ConsigneAbsence'])

  local variation = variationTemp2(switchTemp, time_variation) -- variation des 10 dernières minutes

  local variationExt = uservariables['AugmentationTempExterieure']

  local augmentation = variation * 60 / time_variation --time -- ° par heure

  local ecart = consigne - currentTemp

  local estimation = 0.0
  if (augmentation > 0 and ecart > 0) then
    estimation = 60 * ecart / augmentation
  end

  --if (switchRadiateur=="RadiateurCheminee" and augmentation > 1) then
  --  arretRadiateursSalon('ChauffageGeneral')
  --end


  print("GR "..tostring(switchRadiateur).." Retour augmentation="..tostring(augmentation).." ecart="..tostring(ecart)..'°C Estimation='..tostring(estimation).." minutes variationExt="..tostring(variationExt).."°C / heure")

--2016-02-27 20:08:59.864 LUA: local_delai=180 last=37
--2016-02-27 20:08:59.918 LUA: Retour variation=0.3 switch=RadiateurManon
--2016-02-27 20:08:59.918 LUA: CHECK Temperature Variation=0.3 switch=RadiateurManon currentTemp=18.3 tempAbsence=16 consigne=18.5

  print("GR "..tostring(switchRadiateur).." Retour variation="..tostring(variation).." switch="..switchRadiateur..' lastUpdate='..tostring(last))
  print("GR "..tostring(switchRadiateur).." Temperature Variation="..tostring(variation)..' switch='..switchRadiateur..' currentTemp='..tostring(currentTemp).. ' tempAbsence='..tostring(tempAbsence)..' consigne='..tostring(consigne))

  if otherdevices['ChauffageGeneral'] == 'Off' then
    if (minutes%5 == 0) then
      if (currentTemp >= consigne + delta) then
        switchOff(switchRadiateur)
      end	
      debug("ChauffageGeneral Eteint. Demande extinction.")
    else
      debug("Radiateur ="..switchRadiateur.." Retour sans rien faire. ChauffageGeneral Eteint.")
    end
    return
  end
  if (currentTemp >= consigne + 2 * delta) then
      print("GR Radiateur ="..switchRadiateur.." arret immediat température > consigne + 2 * delta.")
      switchIfNeeded(switchRadiateur,"Off")
      return
  end

   -- Periode de vacances ou absence ==> hors gel
   if (otherdevices['Vacances'] == 'On' or otherdevices['AbsenceFamille'] == 'On') then
      if (currentTemp > 14) then
        switchIfNeeded(switchRadiateur,"Off")
        --commandArray[switchRadiateur]='Off'
      else
        if variation <= 0 then
          --commandArray[switchRadiateur]='On'
          switchIfNeeded(switchRadiateur,"On")
        end
      end
      print("GR "..tostring(switchRadiateur)..' Temperature chambre : Vacances -> ' ..otherdevices_svalues[switchTemp]..' switch='..switchRadiateur)
   else
     print("GR "..tostring(switchRadiateur)..' Temperature: Presence -> ' ..otherdevices_svalues[switchTemp]..' '..josdGetJourSemaine(jour))
     -- Température non atteinte
     if (currentTemp < consigne - delta) then
        debug('Temperature non atteinte')
        if variation <= 0.0 then
          -- commandArray[switchRadiateur]='On'
          switchIfNeeded(switchRadiateur,"On")
          print("GR "..tostring(switchRadiateur).."Demande chauffe : "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
        else
          --switchIfNeeded(switchRadiateur, 'On')
          -- Dépassement prévu dans le local_delai on coupe
          if (estimation > 0 and estimation <= local_delai / 60 ) then
            --commandArray[switchRadiateur] = 'Off'
            switchIfNeeded(switchRadiateur,"Off")
            print("GR "..tostring(switchRadiateur).." Arrêt chauffage : Température sera atteinte dans le local_delai "..tostring(estimation).." Minutes")
          else
	           if estimation > 60 then
                switchIfNeeded(switchRadiateur,"On")
                debug("Demande chauffe dela trop long : "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
	           else 
               debug("Aucune action. Chauffage en-cours."..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
	           end
          end
        end
     -- Température dépassée
     else
       debug('Temperature supérieure')

       -- Température supérieure
       if (currentTemp >= consigne + delta or (estimation > 0 and estimation <= local_delai / 60 )) then
         if (consigne == consigneAbsence) then
          switchIfNeeded(switchRadiateur,"Off")
         else
           if (variation > 0) then
             if (variationExt <= 0) then
               switchIfNeeded(switchRadiateur,"Off")
               debug("Demande arrêt. Température dépassée.")
             else
               switchIfNeeded(switchRadiateur,"Off")
               debug("Aucune action. Augmentation due à température extérieure.")
             end
           else
             debug('Aucune variation')

              switchIfNeeded(switchRadiateur,"Off")
           end
         end
       else if (currentTemp <= consigne - delta) then
            -- Augmentation de la température non due à l'augmentation extérieure
            if (variation > 0) then
              -- Pas d'augmentation extérieure
              if (variationExt <= 0) then
                switchIfNeeded(switchRadiateur,"Off")
                debug("Demande arrêt. Température atteinte et continue d'augmenter.")
              else
                  switchIfNeeded(switchRadiateur,"Off")
                debug("Aucune action. Augmentation due à température extérieure.")
              end
            else
              -- Températue en baisse pas nécessaire d'envoyer
                switchIfNeeded(switchRadiateur,"Off")
              debug("Aucune action. Temperature atteinte et pas d'augmentation. "..tostring(currentTemp).." / "..tostring(consigne).." Variation="..tostring(variation))
            end
        end
      end
     end
   end
   debug("------------------------------------------------------------")
end

-- ------------------------------------------------------------------------------
-- Test temperature radiateur salon et cuisine
-- ------------------------------------------------------------------------------
function gestionRadiateurSalon( switchTemp, switchRadiateur, consigne)
  local currentTemp = tonumber(otherdevices_svalues[switchTemp])
  local tempAbsence = tonumber(otherdevices_svalues['ConsigneAbsence'])

  if otherdevices['ChauffageGeneral'] == 'Off' then
    if (minutes%30 == 0) then
       switchOffRadiateur(switchRadiateur)
    else
      debug("Radiateur ="..switchRadiateur.." Retour sans rien faire. ChauffageGeneral Eteint.")
    end
  end
   -- Periode de vacances ou absence ==> hors gel
   if (otherdevices['Vacances'] == 'On' or otherdevices['Presence'] == 'Off') then
      if (currentTemp > tempAbsence) then
        switchOffRadiateur(switchRadiateur)
      else
        switchOnRadiateur(switchRadiateur)
      end
      print("GR "..tostring(switchRadiateur)..' Temperature Salon: Vacances -> ' ..otherdevices_svalues[switchTemp]..' switch='..switchRadiateur)
   else

      -- Samedi Dimanche ou jour férié ou mercredi
      if (jour == 0 or jour == 6 or josdJourChome() or jour == 3) then
         print("GR "..tostring(switchRadiateur)..' Temperature: Presence -> ' ..otherdevices_svalues[switchTemp]..' '..josdGetJourSemaine(jour))
         if (currentTemp < tempAbsence
            or (currentTemp <= consigne and heures >= 08 and heures <= 24)) then
            switchOnRadiateur(switchRadiateur)
         else
            switchOffRadiateur(switchRadiateur)
         end
      else
         print("GR "..tostring(switchRadiateur)..' Temperature: Travail -> ' ..otherdevices_svalues[switchTemp]..' '..josdGetJourSemaine(jour))
         if (currentTemp < tempAbsence
            or (currentTemp <= (consigne - 1) and heures >= 17)
            or (currentTemp <= consigne and heures >= 19 and heures < 23)) then
            switchOnRadiateur(switchRadiateur)
         else
            switchOffRadiateur(switchRadiateur)
         end
      end
   end
end


-- ------------------------------------------------------
-- Arrêt tous les radiateurs
-- ------------------------------------------------------
if devicechanged['ChauffageGeneral'] then
  print("Chauffage General "..otherdevices['ChauffageGeneral'])	
  if otherdevices['ChauffageGeneral'] == 'Off' then
    -- for i = 1, 7 do
    for i,radiateur in ipairs(radiateurs) do  
      print("Chauffage General Arrêt radiateur="..radiateur)
      commandArray[radiateur]='Off'
    end
  end
end

local saison = uservariables["Saison"]

if otherdevices['ChauffageGeneral'] == 'On' then

  -- ----------------------------------------------------
  -- Chambre de Manon
  -- ------------------------------------------------------
  if devicechanged['ChambreManon'] or devicechanged['ConsigneConfortManon'] or devicechanged['ChauffageGeneral'] 
	  then --or tonumber(lastUpdateOfDevice('ChambreManon')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortManon'])
    gestionRadiateur('ChambreManon', 'RadiateurManon', consigne)
  end

  -- ------------------------------------------------------
  -- Chambre de Theo 
  -- ------------------------------------------------------
  if devicechanged['ChambreTheo'] or devicechanged['ConsigneConfortTheo'] or devicechanged['ChauffageGeneral'] 
	  then -- or tonumber(lastUpdateOfDevice('ChambreTheo')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortTheo'])
    gestionRadiateur('ChambreTheo', 'RadiateurTheo', consigne)
  end
  -- ------------------------------------------------------
  -- Chambre parents
  -- ------------------------------------------------------
  if devicechanged['Chambre'] or devicechanged['ConsigneConfortChambre'] or devicechanged['ChauffageGeneral']
	  then --or tonumber(lastUpdateOfDevice('Chambre')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortChambre'])
    gestionRadiateur('Chambre', 'RadiateurChambre', consigne)
  end
  -- ------------------------------------------------------
  -- Radiateur cuisine
  -- ------------------------------------------------------
  if devicechanged['TemperatureCuisine'] or devicechanged['ConsigneConfortSalon'] or devicechanged['ChauffageGeneral']
	  then -- or tonumber(lastUpdateOfDevice('TemperatureCuisine')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortSalon'])
    gestionRadiateur('TemperatureCuisine', 'RadiateurCuisine', consigne)
  end
  -- ------------------------------------------------------
  -- Radiateur Cheminee
  -- ------------------------------------------------------
  if devicechanged['Cheminee'] or devicechanged['ConsigneConfortSalon'] or devicechanged['ChauffageGeneral'] 
	 then -- or tonumber(lastUpdateOfDevice('Cheminee')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortSalon']) - 1 --0.2
    gestionRadiateur('Cheminee', 'RadiateurCheminee', consigne)    
  end
  -- ------------------------------------------------------
  -- Radiateur Salon
  -- ------------------------------------------------------
  if devicechanged['TemperatureSalon'] or devicechanged['ConsigneConfortSalon'] or devicechanged['ChauffageGeneral'] 
	 then -- or tonumber(lastUpdateOfDevice('TemperatureSalon')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortSalon'])
    gestionRadiateur('TemperatureSalon', 'RadiateurPorteSalon', consigne)
    gestionRadiateur('TemperatureSalon', 'RadiateurMilieu', consigne)
  end

  -- ------------------------------------------------------
  -- Radiateur Bureau
  -- ------------------------------------------------------
  if devicechanged['Bureau'] or devicechanged['ConsigneConfortBureau'] or devicechanged['ChauffageGeneral'] 
	then --  or tonumber(lastUpdateOfDevice('Bureau')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortBureau'])
    gestionRadiateur('Bureau', 'RadiateurBureau', consigne)
    --gestionRadiateur('TemperatureBarometre', 'RadiateurCheminee', consigne)
  end

  -- ------------------------------------------------------
  -- Radiateur Grenier
  -- ------------------------------------------------------
  if (devicechanged['TemperatureGrenier'] or devicechanged['ConsigneConfortGrenier'] or devicechanged['ChauffageGeneral'] or devicechanged['Force_Grenier']) 
	then --  or tonumber(lastUpdateOfDevice('TemperatureGrenier')) > 2 * delai then
    local consigne = tonumber(otherdevices_svalues['ConsigneConfortGrenier'])
    gestionRadiateur('TemperatureGrenier', 'RadiateurGrenierAcova', consigne)
    --gestionRadiateur('TemperatureBarometre', 'RadiateurCheminee', consigne)
  end
  
end

return commandArray
