Gazous Posté(e) le 18 février 2015 Signaler Posté(e) le 18 février 2015 Bonjour à tous, Ce message pour partager avec vous un script qui me permet de gérer simplement la programmation de mon chauffage électrique équipé de fil pilote par zones. Ne possédant actuellement qu'un FGS-221 et pas encore de module Qubino Fil Pilote, je me suis contenté de gérer la programmation pour mes propres besoins de mes 2 zones de chauffage (Séjour et Chambres) en mode ECO ou CONFORT avec gestion de dérogation sur présence en semaine. Pourquoi ce script ? 1) Parce que je ne suis pas fan des scenes en blocs qui génèrent un code pas terrible et nécessite de créer autant de scènes que de zones et de modes. En plus c'est pas super fiable car avant ce script j'ai fait des essais et parfois la bascule ne se faisait pas et comme il n'y avait pas de vérification permanente, il fallait attendre la prochaine plage horaire pour que ça passe... 2) Parce que j'aime bien maitriser/comprendre ce que je fais et faire des choses générique et évolutives 3) Parce que j'aime que tout soit centralisé au niveau d'un seul script pour une fonction bien précise en l'occurence la gestion de mon chauffage Que fait le script ? 1) Toutes les minutes, il va s'exécuter et parcourir toutes les zones définies et toutes les plages horaires définies pour le mode ECO 2) Si il voit qu'une zone doit basculer d'un mode à l'autre, il le fera systématiquement, même si quelqu'un s'amuse à modifier l'état du module à la main En ce qui me concerne ce script est temporaire car j'envisage quand j'aurais les moyens de changer mes radiateurs et d'acheter des Qunbino Fil Pilote pour chaque radiateur mais en attendant il me rend bien service donc peut-être qu'il pourra servir à d'autres. Comment l'utiliser ? Il suffit de se rendre à la fin du script, ligne 107 pour la paramètrage de vos zones comme l'exemple ci-dessous : -- Initialisation des zones -- La syntaxe est simple, il suffit d'ajouter une zone avec -- - l'id du FGS -- - le nom de la zone -- - les X timeSlots ECO de la semaine -- - les X timeSlots ECO du weekend -- Le troisième paramètre optionnel tu timeSlot correspond à une autorisation de dérogation -- Il faudra pour l'autoriser le définir à true et positienner une variable globale nommée "presence" à 1 ou 0 -- Dans mon cas ci-dessous, seul le séjour a une possibilité de dérogation en cas de présence dans l'appartement en journée, dans ce cas, le chauffage restera en CONFORT zones.add(176, "Sejour", {newTimeSlot("23:35", "06:00"), newTimeSlot("08:00", "16:30", true)}, -- semaine {newTimeSlot("23:35", "08:00"), newTimeSlot("12:00", "13:00")}) -- weekend zones.add(178, "Chambres", {newTimeSlot("23:50", "06:15"), newTimeSlot("08:15", "18:30")}, -- semaine {newTimeSlot("23:50", "07:00"), newTimeSlot("9:00", "18:00")}) -- weekend -- Recurence de verification zones.checkEvery = 60 checkZones() Voici le script complet : Chauffage v0.1.lua Il tourne bien depuis quelque temps dans mon cas d'usage. Je n'ai pas encore utiliser la dérogation de présence in situ car je viens de l'implémenter et pas encore eu besoin mais les tests ont fonctionné.
franckg16 Posté(e) le 18 février 2015 Signaler Posté(e) le 18 février 2015 Salut, Très bon script. J'ai moi-même un script pour gérer mes radiateurs électriques en fil pilote ou contact sec. La programmation est bien moins "élégante" que ce que tu as fait mais il permet de faire sensiblement les mêmes choses. Il permet aussi de gérer les modes "absent" (ECO 24/24) ou "présent en semaine" (même horaire que le weed-end) et d'avoir des températures de confort différentes pour chaque zone (modifiables via un module virtuel). Ce serait intéressant de rajouter ces paramètres dans ton script. Autre idée que j'aimerais implémenter : utiliser les programmations horaires du panneau de chauffage de façon àpouvoir modifier les heures (hors mode "absent"ou "présent en semaine") depuis l'interface, sans avoir àtoucher au code (un peu plus WAF). Qu'en penses-tu ?
Gazous Posté(e) le 18 février 2015 Auteur Signaler Posté(e) le 18 février 2015 Et oui tu as tout àfait raison mais pour l'instant, j'ai fait pour mes besoins actuels et comme je n'ai pas de vacances prévues avant un moment, j'ai le temps pour le mode absence Donc je vais le coder en plus c'est pas compliqué avec gestion d'une date de retour vacances. Par contre comment tu gères les températures de confort différentes ? Tu as un module Qubino peut-être ? Pour les programmations horaires via le panneau de chauffage, très bonne idée, je vais regarder mais je ne me suis pas encore penché làdessus ni sur les modules virtuels. Je débute un peu...
Gazous Posté(e) le 4 septembre 2015 Auteur Signaler Posté(e) le 4 septembre 2015 Bonjour, je reviens aujourd'hui sur ce post car ayant fait l'acquisition il y a quelques temps d'un IPX800V3, j'ai naturellement utilisé celui-ci pour le pilotage de mes radiateurs et également de mon chauffe-eau. Voici ci-dessous le script amélioré et adapté à l'IPX800. Il faut si vous avez activer l'authentification sur votre IPX, saisir vos crédentials et définir vos zones de chauffage. Je gère également une variable Globale "vacances" avec comme valeurs 0 ou 1 pour couper le chauffage et l'eau-chaude en cas d'absence prolongée. Espérant que cela puisse servir à d'autres. En ce qui me concerne, c'est du temporaire pour la partie chauffage puisque j'attends une autre solution Fil Pilote centralisée ou radiateur connecté puisque j'envisage prochainement de remplacer mes radiateurs. --[[ %% autostart %% properties %% globals --]] local sourceTrigger = fibaro:getSourceTrigger() local zones = {} local chauffeEau = {} local IPXIP = "192.168.1.11" local IPXAuthorizationKey = "" local IPXJsonState = nil --- Usefull Functions --- function debug(text, color) color = color or "white" fibaro:debug("<font color='"..color.."'>"..text.."</font>") end function arrayContains(array, val) for k,v in pairs(array) do if (v == val) then return true end end return false end function isWeekDay() return fibaro:getGlobalValue("JourChome") == "NON" end function isTimeBetween(startTime, endTime) -- Je stocke l'heure courante dans le format attendu pour comparaison now = tostring(os.date("%H:%M")) -- Je vérifie que l'heure courante est dans la plage horaire if (startTime < endTime and (now >= startTime and now <= endTime)) then return true elseif (startTime > endTime) then if (now >= startTime or now <= endTime) then return true end end return false end function checkTimeSlots(timeSlots, zoneName) for k,ts in ipairs(timeSlots) do if isTimeBetween(ts.startTime, ts.endTime) then return true elseif (ts.canDerogate and tonumber(fibaro:getGlobalValue("presence")) ~= 0) then fibaro:debug("Zone "..zoneName.." en CHAUFFE sur dérogation de présence") return true end end return false end function newTimeSlot(startTime, endTime, canDerogate) ts = {} ts.startTime = startTime ts.endTime = endTime ts.canDerogate = canDerogate or false return ts end function checkZonesAsync() if (IPXJsonState == nil) then debug("Erreur de récupération de l'état IPX", "red") else -- J'itère sur toutes les zones for k,z in ipairs(zones) do checkZoneState(z) end end debug("Vérification terminée !", "blue") -- Gestion de l'autostart et du timer toutes les 1 min if (sourceTrigger["type"] == "autostart") then setTimeout(checkZones, zones.checkEvery*1000) end end function refreshIPXState() IPXJsonState = nil local http = net.HTTPClient() http:request("http://"..IPXIP.."/api/xdevices.json?cmd=20", { options = { method = 'GET', headers = {["Authorization"] = 'BASIC '..IPXAuthorizationKey}, }, success = function(response) IPXJsonState = json.decode(response.data) checkZonesAsync() end, error = function(err) debug("Error: " ..err, "red") fibaro:sleep(1000) refreshIPXState() end }) end function switchIPXRelay(relayId, newState) local http = net.HTTPClient() http:request("http://"..IPXIP.."/preset.htm?set"..relayId.."="..newState, { options = { method = 'GET', headers = {["Authorization"] = 'BASIC '..IPXAuthorizationKey}, }, error = function(err) debug("Error: " ..err, "red") end }) end function checkZoneState(z) -- Selection du bon TimeSlot (Semaine ou WE) if isWeekDay() then timeSlots = z.weekSlots else timeSlots = z.weekendSlots end -- Gestion du mode inversé (exemple chauffe eau) local eco = 1 confort = 0 if (z.inverseState) then eco = 0 confort = 1 end -- Mode ECO if (vacances == 0 and checkTimeSlots(timeSlots, z.name)) then if (tonumber(IPXJsonState["OUT"..z.IPXRelayId]) == eco) then debug("Passage de la zone "..z.name.." en Mode CHAUFFE", "orange") switchIPXRelay(z.IPXRelayId, confort) end -- Mode CONFORT elseif (tonumber(IPXJsonState["OUT"..z.IPXRelayId]) == confort) then debug("Passage de la zone "..z.name.." en Mode ECO", "green") switchIPXRelay(z.IPXRelayId, eco) end end zones.add = function(IPXRelayId, name, weekSlots, weekendSlots, inverseState) z = {} z.IPXRelayId = IPXRelayId z.name = name z.weekSlots = weekSlots z.weekendSlots = weekendSlots z.inverseState = inverseState or false table.insert(zones, z) end ----------------------------------------------------------------------------- function checkZones() debug("Vérification Chauffe-eau et Chauffage...") vacances = tonumber(fibaro:getGlobalValue("vacances")) if vacances == 1 then debug("Mode vacances : toutes les zones sont en ECO", "red") end -- Je rafraichi l'état des relais de l'IPX qui terminera le traitement lors de la réponse refreshIPXState() end -- Initialisation des zones -- La syntaxe est simple, il suffit d'ajouter une zone avec -- - l'id du relais de l'IPX -- - le nom de la zone -- - les X timeSlots ECO de la semaine -- - les X timeSlots ECO du weekend -- - si les status du relais sont en mode inversé NO <> NF -- Le troisième paramètre optionnel tu timeSlot correspond à une autorisation de dérogation -- Il faudra pour l'autoriser le définir à true et positienner une variable globale nommée "presence" à 1 ou 0 -- Dans mon cas ci-dessous, seul le séjour a une possibilité de dérogation en cas de présence dans l'appartement en journée, dans ce cas, le chauffage restera en CONFORT zones.add(1, "Chauffe-Eau", {newTimeSlot("03:45", "06:55")}, -- newTimeSlot("14:10", "16:50")}, -- semaine {newTimeSlot("03:45", "06:55")}-- newTimeSlot("14:10", "16:50")} ,true) -- weekend et jour chomes zones.add(2, "Sejour", {newTimeSlot("06:00", "08:30"), newTimeSlot("16:30", "23:35", true)}, -- semaine {newTimeSlot("08:00", "12:00"), newTimeSlot("13:00", "23:35")}) -- weekend et jour chomes zones.add(3, "Chambres 1 et 3", {newTimeSlot("06:15", "07:45"), newTimeSlot("21:45", "23:50")}, -- semaine {newTimeSlot("07:00", "08:45"), newTimeSlot("22:45", "23:50")}) -- weekend et jour chomes zones.add(4, "Chambre Adam", {newTimeSlot("06:15", "08:15"), newTimeSlot("18:30", "21:00")}, -- semaine {newTimeSlot("06:45", "08:45"), newTimeSlot("18:30", "21:00")}) -- weekend et jour chomes zones.add(5, "SDB", {newTimeSlot("06:15", "08:15"), newTimeSlot("18:30", "21:00")}, -- semaine {newTimeSlot("06:45", "08:45"), newTimeSlot("18:30", "21:00")}) -- weekend et jour chomes -- Recurence de verification zones.checkEvery = 60 pcall(checkZones)
Messages recommandés