Aller au contenu
OJC

Heating Manager

Recommended Posts

Le principe est que tout le chauffage est géré par une seule Scène, dans laquelle il suffit d'identifier tous les id des modules virtuels permettant de commander chaque chauffage, ainsi que l'id de la sonde (ou module virtuel sonde)

Partager ce message


Lien à poster
Partager sur d’autres sites

bon après avoir bien suivie tes conseils la chose fonctionne, je te tiens au courant des évolutions.Il me reste a voir pour les paramètres de chauffe, comment  peut- on régler différemment les paramètres de chauffe pour chaque radiateur? et pour la température extérieur peut on indique l'id de la sonde (zwave)?

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour régler les paramètres de calcul de la durée de chauffe pour chaque radiateur, il faut déclarer les coefficient P et T avec la fonction HeatingManager:addHeater, paramètres localP et localT :

    HeatingManager:addHeater(idHeater, [idSonde], [localP], [localT])

      + idHeater = ID du module permettant de commander le radiateur
      + idSonde  = ID de la sonde de température à laquelle est asservie le radiateur ou {ID du module virtuel, ID de l''étiquette contenant la température}
                   Paramètre optionnel à défaut duquel c''est la sonde de température principale de la pièce qui est utilisée.
      + localP   = Paramètre optionnel à défaut duquel la variable default.kP est utilisée
      + localT   = Paramètre optionnel à défaut duquel la variable default.kT est utilisée

L'algorithme utilisé est expliqué ici et aussi là.

 

Pour la température extérieure :

--HeatingManager:setOutdoorSonde(ID Device ou {ID VirtualDevice, ID Label})

Ce n'est qu'à défaut que le programme utilise la température extérieure fournie par le plugin météo.

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

bon tous est en place je vois demain le résultat , merci pour les infos;)

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

dans la scène :

heatingCycle = 10
logLevel = 1

 

A quoi correspond le logLevel?

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est pour afficher des logs plus ou moins détaillés = à 1, il te mets tout, à 2 il se contente d'indiquer quand il démarre un radiateur.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@iman alors ça donne quoi avec tes planchers chauffants ? Pour ma part, avec un mélange de radiant et d'inertiel, j'ai la température intérieure qui colle à la température de consigne... Vachement bien pensé l'algorithme de chauffage de l'eedomus !!

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

dans l'ensemble je suis pas mal,il faut que j'affine les réglages pour la salle grande pièces 42 m2 avec plancher donc grande inertie;), peut on supprimer les panneaux de chauffages ou du moins pour une pièce et l'inscrire les horaires dans la scène car il met impossible de mettre une consigne a partir de 20h et en suite une autre à 3h celle-ci ne bascule pas, un bug dans les panneaux ou alors je ne l'utilise pas correctement:mellow:

Partager ce message


Lien à poster
Partager sur d’autres sites

@iman Les panneaux de chauffage permettent de définir quatre températures de consigne différentes pour une journée. Je n'ai aucun souci pour ma part. Essaie en mettant un changement à 2 h ou 4 h au lieu de 3 h pour voir ce que ça donne ?

 

Le principe à la base du développement de Heating Manager est précisément d'utiliser les panneaux de chauffage, donc tout le VD est conçu autour de ça. Aller chercher la consigne ailleurs n'est pas en soi impossible, mais il faudrait modifier la structure du programme en profondeur...

 

EDIT = Quoique à la réflexion, c'est peut-être pas si compliqué à gérer en mettant le paramètre panel de HeatingManager:addZone() dans le VD à {ID du VD, ID de l'étiquette contenant la température de consigne} et en réagissant derrière avec type() dans la fonction getSetpoint()... :15: A charge pour toi ensuite de dev un VD faisant office de panneau de chauffage. Je vais regarder ça de plus près ce soir...

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Gros job, trop envie de tester ;-)

 

Je suis un peu comme @iman, ce qui peut-etre bloquant avec les panneaux de chauffage c'est lorsque toute la maison n'a pas le meme rythme de vie, par exemple mon WAF bosse dans la sante, je te laisse imaginer le travail de nuit, de jour, horaires decales et week-end, je suis donc vite ilmité avec les panneaux de chauffage. Ce qui serait enorme, c'est de pouvoir changer de panneau de chauffage en fonction des besoins.

 

Je m'explique : pour la même piece je peux peut-etre avoir besoin de 2 panneaux.

 Genre la salle de bains:

 - le WAF bosse de nuit, je suis présent : je peux baisser la temperature la niut et la remonter le matin pour X temps.

 - mais la meme journée, impossible de redescendre la temperature à la même heure, quand le WAF va se lever, la temperature va etre basse, et je vais me faire appeler Arthur ;-)

Et c'est la que j'aurais (ou d'autres) besoin de plusieurs panneaux pour la meme piece en fonction de conditions ;-).

 

Et suis de l'avis de @Nico

Pouvoir modifier la temperature de consigne depuis le VD est un plus ;-). Ca permet de le faire depuis n'importe où, scène, appli..

Et vu ton niveau de code : api.get..api.put et hop. Ce ne sont évidemment que des suggestions ;-) . Encore félicitations pour le boulot. Et merci d'avoir partagé surtout. Encore une petite demande, possible d'avoir le code du VD dans le 1er post pour éviter d'avoir à importer le vfib ;-).Au boulot je ne peux pas et la lecture du code j'adoore ;-)

 

Modifié par pepite
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite C'est à dire que le panneau de chauffage utilisé se mette à jour en temps réel en fonction de la réalisation de telle ou telle condition ? C'EST POSSIBLE :D

 

Supposons qu'il y ait un panneau de chauffage pour les jours où Madame bosse de nuit, et un autre pour celui où elle bosse de jour. Supposons, naturellement, que cette information est enregistrée quelque part, par exemple dans la variable globale horairesMadame :

HeatingPanel:addZone("SalledeBains", lib:iif(fibaro:getGlobalValue("horairesMadame") == "nuit", 4, 5)

S'il faut tenir compte en plus du week-end ou pas :

local horaire = fibaro:getGlobalValue("horairesMadame")
local day = ({"Dim","Lun","Mar","Mer","Jeu","Ven","Sam" })[os.date("*t", os.time())["wday"]]
local panel = 0

if day = "Sam" or day = "Dim" then
  panel = 4
elseif horaire = "nuit" then
  panel = 5
elseif horaire = "jour" then
  panel = 6
else
  panel = 7
end if

HeatingPanel:addZone("SalledeBains", panel)

Et comme ça Madame peut modifier son panneau de chauffage sans avoir à mettre la pagaille les mains dans le code ;)

 

Et @iman, si tu as besoin de définir plus de quatre températures de consigne sur une journée, tu fais deux panneaux de chauffage en divisant la journée en deux et tu déclare comme ça :

HeatingManager("Sejour", lib:iif(tonumber(os.date("%H")) > 12, 4, 5)

Ainsi, après midi, tu passes sur le deuxième panneau, ce qui te permet de définit huit températures de consignes pour une journée.

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites

Exactement, alors suis désolé d'avoir posé la question si c'etait déjà dans le code du VD n'ayant pas importé MeaCulpa.

 

Ca devient tres tres bon ;-)

 

manque plus que la temperature de consigne ;-) en fonction de la piece

 

Alors comment trouves tu l'algorithme de chauffage d'eedomus ?

La temperature arrive à l'heure souhaitée ?

 

Sinon pour la gestion des jours, il y a plus simple avec os.date :  :D


 

    local semaine = {
    Monday   = true,
    Tuesday  = true,
    Wednesday= true,
    Thursday = true,
    Friday   = true,
    Saturday = false,
    Sunday   = false }

    if (semaine[os.date("%A")]) then...

PS : faut vraiment que je lise le code du vfib

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 6 minutes, pepite a dit :

PS : faut vraiment que je lise le code du vfib

 

Oui, surtout qu'au final, c'est dans le VD qu'il y a le plus gros du programme :). J'aurais dû le mettre en spoiler aussi...

 

La température de consigne est bien définie pour chaque pièce (appelée zone dans le programme).

 

Et pour l'algo de l'eedomus, il marche vraiment bien. En revanche, si tu mets une consigne à 22 °C à 7 h dans le panneau de chauffage de la salle de bains, le chauffage démarrera à 7 h jusqu'à atteindre 22 °C. Il ne fera pas 22 °C à 7 h. Je suis  en train de regarder comment anticiper la température de consigne pour arriver à ce résultat.

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai mis le code du Main Loop du VD dans un spoiler dans le premier post ;)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 11 minutes, OJC a dit :

La température de consigne est bien définie pour chaque pièce (appelée zone dans le programme).

oui oui, j'avais bien compris, je parlais de modifier la temperature de consigne, je me suis mal exprimé ;-)

 

il y a 7 minutes, OJC a dit :

code du Main Loop du VD dans un spoiler

merci j'y vas de ce pas.

 

il y a 11 minutes, OJC a dit :

anticiper la température de consigne pour arriver à ce résultat.

Pour cela, je pense que l'algorithme se complique, puisqu'il faut determiner en fonction de la temperature exterieure et interieure le temps de chauffe d'1 degres, puis soustraire à l'heure affichée dans le panneau le temps de chauffe requis pour le delta de temperature, et enfin modifier l'jheure du panneau pour lancer le depart ou alors le passer en manuel jsuqu'a lheure de depart du panneau ;-)

Jeedom a ce genre d'alorithme, l'heure du plugin est l'heure à laquelle on souaite la température spécifiée et non l'heure du départ de la chauffe.

 

en fait, c'est tout de même simple d'avancer l'heure du départ dans le panneau ;-) quand tu le sais.

 

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites
Citation

Et suis de l'avis de @Nico

Pouvoir modifier la temperature de consigne depuis le VD est un plus ;-). Ca permet de le faire depuis n'importe où, scène, appli..

Et vu ton niveau de code : api.get..api.put et hop. Ce ne sont évidemment que des suggestions ;-) . Encore félicitations pour le boulot. Et merci d'avoir partagé surtout. Encore une petite demande, possible d'avoir le code du VD dans le 1er post pour éviter d'avoir à importer le vfib ;-).Au boulot je ne peux pas et la lecture du code j'adoore ;-)

 

Tu veux dire modifier le panneau de chauffage lui-même, de manière pérenne ? Ou juste l'overrider comme en utilisant le mode manuel inclus  nativement ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Citation

Pour cela, je pense que l'alogorothme se complique, puisqu'il faut determiner en fonction de la temperature exterieure et interieure le temps de chauffe. Jeedom fonctionne comme cela.

 

L'algo utilisé est déjà fonction de la température extérieure et de la température intérieure. C'est pas le plus difficile. C'est l'implémentation du truc, facile dans les grandes lignes : à chaque exécution du Main Loop, il faut analyser la prochaine tranche de température de consigne, calculer le temps nécessaire pour l'atteindre et, le cas échéant, lancer le chauffage. Ce qui implique de développer la communication entre le module virtuel et la scène, inexistante en réalité pour le moment.

Facile sur le papier, et en pratique aussi tant qu'il n'y a qu'un panneau de chauffage à gérer... Mais s'il faut tenir compte du fait que potentiellement dans 30 minutes le panneau de chauffage va changer... ça devient plus acrobatique :mellow:

Modifié par OJC

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 6 minutes, OJC a dit :

de manière pérenne ?

oui, si par exemple je veux passer ma SDB de 21 à 22 ;-)

Pour ce qui est de l'override en manuel, je crois que tu l'avais deja prévu non ? je ne me souviens plus, comme pour les vacances ?

 

il y a 4 minutes, OJC a dit :

le module virtuel et la scène, inexistante en réalité pour le moment

Regarde du cote de fibaro:args() ca permet de lancer une scene avec les paramètres que l'on souhaite. Mais j'espere qe ca ne te ferait pas changer le coeur du code.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais si c'est pour la changer de manière pérenne, pourquoi ne pas aller dans le panneau de chauffage ? Vu les possibilités IHM des modules virtuels, ça va être une usine à gaz le truc :

> Un label affichant le nom de la zone

> deux boutons min. pour faire défiler les zones

> Un label affichant le jour de la semaine à modifier

> deux boutons min. pour faire défiler les jours

> un label affichant l'heure de début de la consigne

> quatre boutons pour modifier heures et minutes

> un label affichant l'heure de fin de la consigne

> quatre boutons pour modifier heures et minutes

> un label affichant la nouvelle consigne

> deux boutons min. pour fixer la valeur de la consigne

> deux boutons, l'un pour annuler les modifications et un pour les valier

:mellow:

 

Oui, fibaro:args() a l'air bien pour ça.

Mais le gros problème, c'est d'anticiper un éventuel changement du panneau de chauffage...

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 7 minutes, OJC a dit :

pourquoi ne pas aller dans le panneau de chauffage ?

Parfois tu veux changer ta temperature de consigne automatiquement en fonction de conditions, et c'est simple d'aller appuyer depuis l'IHM sur un bouton de VD ou en LUA ;-) ou passer en manuel ou en vacances. ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ben suffit de faire un api.put :) Parce que gérer un VD avec X boutons en Lua... c'est plus de l'usine à gaz !

Partager ce message


Lien à poster
Partager sur d’autres sites

Juste pour info, j'avais crashé (oui oui c'est bien le terme), un bout de code pour simuler un panneau de chauffage en pure LUA. Je te met ci dessous le code pour te simplifier la tache.

 

local Heating = {confort = 21, normal=20}
local datas = {}
datas["monday"] = {}
datas["monday"]["morning"] = {hour=6; minute=30; temperature=Heating.confort}
datas["monday"]["day"] = {hour=8; minute=0; temperature=Heating.normal}
datas["monday"]["evening"] = {hour=16; minute=0; temperature=Heating.confort}
datas["monday"]["night"] = {hour=23; minute=0; temperature=Heating.normal}
datas["tuesday"] = datas["monday"]
datas["thursday"] = datas["monday"]
datas["friday"] = {}
datas["friday"]["morning"] = {hour=6; minute=30; temperature=Heating.confort}
datas["friday"]["day"] = {hour=8; minute=0; temperature=Heating.normal}
datas["friday"]["evening"] = {hour=15; minute=0; temperature=Heating.confort}
datas["friday"]["night"] = {hour=23; minute=0; temperature=Heating.normal}
datas["wednesday"] = {}
datas["wednesday"]["morning"] = {hour=7; minute=0; temperature=Heating.confort}
datas["wednesday"]["day"] = {hour=9; minute=0; temperature=Heating.normal}
datas["wednesday"]["evening"] = {hour=12; minute=0; temperature=Heating.confort}
datas["wednesday"]["night"] = {hour=23; minute=0; temperature=Heating.normal}
datas["saturday"] = {}
datas["saturday"]["morning"] = {hour=8; minute=0; temperature=Heating.confort}
datas["saturday"]["day"] = {hour=9; minute=0; temperature=Heating.confort}
datas["saturday"]["evening"] = {hour=16; minute=0; temperature=Heating.confort}
datas["saturday"]["night"] = {hour=23; minute=0; temperature=Heating.normal}
datas["sunday"] = datas["saturday"]
    
function getFakeHeatingPanelTemperature()
  local day = string.lower(os.date("%A"))
  local hour = tonumber(os.date("%H"))
  local min = tonumber(os.date("%M"))
  local now = 0
	local temp = 0
	local week = {"monday","tuesday","wednesday","thursday","friday", "saturday", "sunday"}	  
    for k,v in pairs(week) do
		if (v == day) then now = k * 100000 + tonumber(hour) * 60 + tonumber(min) end
	end
	for k,v in pairs(week) do
		for l,w in pairs({"morning","day","evening","night"}) do
 			if (now > k*100000+tonumber(datas[v][w].hour)*60+tonumber(datas[v][w].minute)) then
   			   temp = datas[v][w].temperature
 			end
 			lasttemp = datas[v][w].temperature
 		end
	end
	if (temp == 0) then 
		temp = lasttemp
	end
  return temp
end

function getSetPoint(ID)
  if (ID == 999) then 
    return getFakeHeatingPanelTemperature()
  else
      local panel = api.get("/panels/heating?id=" .. ID)
      return panel.properties.currentTemperature
  end
end

print(getSetPoint(999))

 

  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ce bout de code :)

 

Mais je vois toujours pas concrètement l'intérêt d'un VD qui permettrait de faire la même chose que le panneau de chauffage (que ce soit en direct GUI ou via un code Lua) mais avec une interface merdique... Donc, en l'état, je le mets pas dans le cahier des charges :P

Partager ce message


Lien à poster
Partager sur d’autres sites

×