kiwi Posté(e) le 10 juillet 2014 Signaler Posté(e) le 10 juillet 2014 Bonjour, Encore un code de ma part : la gestion de volets extérieur automatiques. Mon idée est de faire de sorte que mes volets soient commandés de façon semi auto en journée, lors des chaleurs dà»es a l'été pour éviter de faire rentrer trop de chaleur dans la maison (et ainsi ne pas utiliser de clim). L'installation est plus ou moins prévue pour ma maison, car j'ai une double orientation, donc 2 sondes extérieures, et 2 groupes de volets. Il me reste a finir : la gestion des volets non basé sur des modules roller shutter (voir ma bidouille pour commander des stores SSL de Velux la : http://blog.oav.net/dotclear/index.php?post/2014/03/07/How-to-interface-a-Velux-Solar-powered-roller-shutter-and-ZWave-Domotic-box... la gestion de l'hivers avec ouverture en cas de soleil la gestion des orages toute l'année pour fermer tous les volets (y compris les velux) pour éviter ... d'avoir des dégâts (ou les limiter) Il y a plusieurs variables a configurer : tempsensors: les sondes de température à l'extérieur et à l'ombre. Ici 34 & 123 a_shutters: les roller shutter associés au sondes de température extérieures (ici les volets 96 & 218 sont associés à la sonde 34, et le volet 97 à la sonde 123) shutter_sensors: les détecteurs d'ouvertures qui correspondent aux fenêtres des volets pour tester si la fenêtre/porte est ouverte shutter_close: comme j'ai 3 type de fenêtre, les positions "été" sont souvent pas les même templimit: la temperature extérieure à partir de laquelle les volets vont être fermés minhour et minminutes : heure a laquelle on force la levée des volets le matin. C'est l'option WAF qui permet de dormir le week-end et éviter que les volets s'ouvrent automatique par beau temps, lors.... du lever de soleil. Dans mon code cette valeur est 10h30. debug: si vous voulez du debug ou pas. En option la variable shutter_open est la valeur à laquelle vous voulez que la position "ouvert" soit configuré (içi 99.0 = défaut du HC). A noter que le programme recherche une variable mise par l'excellent scheduler de robmac : -- Nuit et Jour luaDaySchedule:add("Sunset","NightTime", "1" , "setGlobal", {"All"} , true , - 11) luaDaySchedule:add("Sunrise","NightTime", "0" , "setGlobal", {"All"} , true , 11 ) Voici le code, je ne l'ai pas encore mis sur mon GIT public --[[ %% properties 3 WeatherConditionConverted %% globals --]] -- Version 1.0.3 - (C) Xavier Beaudouin under the MPL 1.1 LICENSE -- set here sensors local tempsensors = { 34, 123 }; -- Create array with same index than temp sensors (used to cache max temps per day) local max_temp = { [34] = -99.0, [123]= -99.0, }; -- Roller Shutter associated (ONLY ROLLER SHUTTER !) to the sensors local a_shutters = { [34] = { 96, 218 }, [123] = { 97 }, }; -- Door sensors associated to Roller Shutter local shutter_sensors = { [96] = 77 , [97] = 75 , [218]= 83 , }; -- set limit when shutter has to go down local templimit = 25.0; local shutter_open = 99.0; -- Adjust with the right numbers needed to get right calibration. local shutter_close = { [96] = 44.0, [97] = 40.0, [218]= 20.0, }; -- Hour and minute in the morning when shutter are not to be upped if -- current time is below this hour and minutes local minhour = 10; local minminutes = 30; -- debug or not debug = true; -- Don't change anthing there -- Variable delay stuff depending of meteo and night -- sleepdelta is number of 10 minutes respawn of this script local sleepdelta = 1; -- Avoid multiple launch of this script if (fibaro:countScenes()>1) then fibaro:debug('Second instance closed') fibaro:abort(); end -- functions function mydebug(string) if (debug) then fibaro:debug(string); end end function checktime() local todayIs = os.date("*t"); local destdate = os.time{year=todayIs.year,month=todayIs.month, day=todayIs.day, hour=minhour, min=minminutes}; local currenttime = os.time(); mydebug("Time is : "..todayIs.hour..":"..todayIs.min); mydebug("Comparing to "..minhour..":"..minminutes); mydebug("Current time is : "..currenttime); mydebug("Dest time is : "..destdate); if (currenttime < destdate) then mydebug("Time is < -> ok"); return true; else mydebug("Current time is > "); return false; end return false; end function check_shutter(shutters, what) local value; mydebug("-- check_shutter()"); for s,z in ipairs(shutters) do if (what == "up") then value = shutter_open; elseif (what == "down") then value = shutter_close[z]; end local cur_shutter = tonumber(fibaro:getValue(z, "value")); local shutter_name = fibaro:getName(z); mydebug("--- Shutter "..shutter_name.."("..z..") is currently : "..cur_shutter.." comparing to command : "..value); if (what == "up") then if (cur_shutter >= value) then mydebug("---- Shutter is ok, skip"); else if (checktime()) then mydebug("---- Current time is < to ".. minhour..":"..minminutes.." : don't up the shutter"); else mydebug("---- Shutter is to be upped"); fibaro:call(z, "setValue", value); end end elseif (what == "down") then if (cur_shutter <= value) then mydebug("---- Shutter is ok, skip"); else mydebug("---- Shutter has to be downed"); -- Check if door is open. If not, then close the shutter local door_is_open = tonumber(fibaro:getValue(shutter_sensors[z], "value")); if (door_is_open == 1) then mydebug("----- Door / Window is open : don't close "..z); else mydebug("----- Yes we close "..z); fibaro:call(z, "setValue", value); end end end -- Sleep for 10 seconds mydebug(" 10 sec sleep"); fibaro:sleep(10*1000); end return 0; end function do_shutter_work() -- Do the real Shutter work sleepdelta=1; fibaro:debug("- Now figure if we need to get down shutter"); for i,v in ipairs(tempsensors) do local cur_temp = tonumber(fibaro:getValue(v, "value")); local temp_name = fibaro:getName(v); fibaro:debug("- Sensor "..temp_name.."("..v..") has temperature "..cur_temp.."°C"); -- Update the cache if needed. if (cur_temp > max_temp[v]) then fibaro:debug("- Update cache for "..v); max_temp[v] = cur_temp; if (cur_temp > templimit) then fibaro:debug("-- Temp is out limit"); check_shutter(a_shutters[v], "down"); end else if (cur_temp < templimit) then fibaro:debug("-- Temp is under limit"); check_shutter(a_shutters[v], "up"); end end end end -- main code while true do -- Check it this is night if ( fibaro:getGlobalValue("NightTime") == "0") then local meteo = fibaro:getValue(3, "WeatherConditionConverted"); -- Meteo can be : clear, fog, cloudy fibaro:debug("Weather is ".. meteo); if (meteo == "clear") then do_shutter_work(); else if (meteo == "cloudy") -- Even if meteo is cloudy it can be hot then do_shutter_work(); else -- Sleep for 20 Minutes sleepdelta=2; end end else fibaro:debug("This is night, nothing to do..."); -- Reset the temperature to default values for i,v in ipairs(tempsensors) do max_temp[v] = -99.0; end -- Sleep for one hour sleepdelta=6; end if (sleepdelta == 0) then sleepdelta = 1; -- 10 Minutes end fibaro:debug("Sleep for "..(sleepdelta*10).." minutes..."); fibaro:sleep(sleepdelta*600*1000); end Historique : Version 1.0.0 : version initiale Version 1.0.1 : - Ajout d'un système de cache pour éviter que les volets ne fassent monter et descendre lors de baisse faible de température. Le volet ne descendra QUE si la temperature ne fait que monter. Version 1.0.2: - Ajout d'une tempo de 10 secondes entre 2 commandes ZWave (important quand on a beaucoup de modules) Version 1.0.3: - Ajout de la fonction WAF qui permet de ne pas ouvrir le volet quand il fait beau ou nuageux en même temps que le soleil. Teste si le volet est fermé, dans cas "ne fait" rien jusqu'à l'heure indiquée. Merci de me donner tout patches, correctif, ou idée de code a intégrer.
Messages recommandés