Aller au contenu

Messages recommandés

Posté(e)

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é.

Posté(e)

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 ?

Posté(e)

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...

  • 6 mois après...
Posté(e)

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)
×
×
  • Créer...