Aller au contenu
Steven

Gestion Chauffage Avec Sondes Oregon, Netatmo, Json, Etc...

Recommended Posts

Il y a une function 'switch' dans mon code, non ? Si oui, envoie moi juste ce morceau de code.

Partager ce message


Lien à poster
Partager sur d’autres sites


Heating.switch = function(choice)
		--fibaro:call(33, choice)
    --fibaro:call(340, "pressButton", "1");
	end

  
	-- Mise en chauffe
	Heating.warmUp = function()
		-- allumage du système
		Heating.switch("turnOn")
		fibaro:log("Warming Up...")
		Heating.started = true
    	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRunning.value", "oui")
    	fibaro:call(selfId, "setProperty", "currentIcon", 1057)
	end

c'est de cette partie que tu parles?

Partager ce message


Lien à poster
Partager sur d’autres sites

voila ce que j'ai fait, ça àl'air de fonctionner, peux-tu me dire si c'est correct?

-- module(s) a allumer/éteindre --- ou autre
  	-- choice= turnOn | turnOff
  	Heating.switch = function(choice)
		--fibaro:call(33, choice)
    fibaro:call(340, "pressButton", choice);
	end
-- Mise en chauffe
	Heating.warmUp = function()
		-- allumage du système
		Heating.switch("1")
		fibaro:log("Warming Up...")
		Heating.started = true
    	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRunning.value", "oui")
    	fibaro:call(selfId, "setProperty", "currentIcon", 1083)
	end
-- Eteint le système de chauffage
	Heating.stop = function()
		Heating.switch("4")
		fibaro:log("Sleeping")
		Heating.started = false
        fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblRunning.value", "no")
        fibaro:call(selfId, "setProperty", "currentIcon", 1085)
	end

Partager ce message


Lien à poster
Partager sur d’autres sites

A vu de nez c'est parfait, tu as remplacer le turnOn par 1, le turnOff par 4 et dans switch mis pressButton choice. C'est parfait.

Bravo.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @Steven, ça à  l'air de fonctionner parfaitement et j'ai pu récupérer les températures de mes sonde Netatmo. :60:

 

juste une autre question qui me chiffonne, il y à  4 état symbolisés par des icônes, la flamme orange pour "confort", la flamme noir pour "Stop", mais les deux autre? la flamme blanche et le ZZZ?

 

quoi que c'est monsieur? 

Partager ce message


Lien à poster
Partager sur d’autres sites

De mémoire :

Orange ... en chauffe

Noir ... rien du tout

Vert/Blanc ... en chauffe douce

Zzzz ... en attente d'un réveil soudain.

J'ai un poêle a pellet. Avec une température de confort de 21° et une hystéresis de 0.7°.

Donc je chauffe àfond (Orange) jusqu'à21° si je suis en dessous de 20.3° puis je ralenti entre 21 et 21.7° (Vert) et je stoppe (Noir),en delà. En redescendant en température quand je suis entre 20.3 et 21.7, j'affiche le Zzzz cela me permettait de savoir que je suis en perte de température et non pas en montée.

Voilà;)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven, j'ai besoin de ton aide, ton module fonctionne parfaitement mais j'ai tout de même un soucis que je n'arrive pas à  gérer.

 

Je veux pouvoir utiliser les radiateurs indépendamment par les 4 ordres fil pilote, au début.

 

Je stoppais et killé la scène comme ceci:

fibaro:setSceneEnabled(99, false) 
fibaro:killScenes(99)

mais je trouvais pas trop génial ce procédé et je préfère passer par une variable, "MANUEL" que j'ai rajouté à  "chauffage".

donc j'ai réussi à  changer l'affichage de ton module mais pas l'action, il repasse en AUTO.

-- Gestion de l'affichage
local temp = Heating.getActualTemp()
if (fibaro:getGlobal("Chauffage") == "VACANCES") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / VAC" )  
elseif (fibaro:getGlobal("Chauffage") == "OFF") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / OFF" )
elseif (fibaro:getGlobal("Chauffage") == "MANUEL") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / MANUEL" )	

je voudrais que quand la variable "MANUEL" remplace "OFF", "ON" ou "VACANCES", le module affiche "MANUEL" et n'ai plus d'action tant que la variable n'est pas changé.

Tu peux m'aider? 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir,

J'ai réaliser la mise à  jour vers la 4.018 et depuis j'ai un problème avec un bout de votre code lua de votre module virtuel :

140     response = HC2:GET("/api/panels/heating?id="..strefa)
141     local jsontable =json.decode(response)
 
Lors que je debug, voici ce que j'obtiens :
[ERROR] 20:27:03: line 141: attempt to index global 'json' (a nil value)

[ERROR] 20:27:07: line 141: attempt to index global 'json' (a nil value)

[ERROR] 20:27:09: line 141: attempt to index global 'json' (a nil value)

[DEBUG] 20:27:11: Current temp : 20.4

[ERROR] 20:27:11: line 141: attempt to index global 'json' (a nil value)

[DEBUG] 20:27:14: Stop it

[DEBUG] 20:27:14: Current temp : 20.4

[DEBUG] 20:27:14: Min temp : 7.3

[DEBUG] 20:27:14: Max temp : 8.7

[DEBUG] 20:27:14: Started : stopped

[DEBUG] 20:27:14: VACANCES

 

[

 

Voilà  trois heures que je cherche et rien..... Vous avez une idée ?

Merci de votre aide

Bonne soirée

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour Steven,

Merci pour ce module et d'ailleurs toutes tes contributions au forum (je suis fan !).

Fonctionne super !

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven, j'ai besoin de ton aide, ton module fonctionne parfaitement mais j'ai tout de même un soucis que je n'arrive pas à  gérer.

 

Je veux pouvoir utiliser les radiateurs indépendamment par les 4 ordres fil pilote, au début.

 

Je stoppais et killé la scène comme ceci:

fibaro:setSceneEnabled(99, false) 
fibaro:killScenes(99)

mais je trouvais pas trop génial ce procédé et je préfère passer par une variable, "MANUEL" que j'ai rajouté à  "chauffage".

donc j'ai réussi à  changer l'affichage de ton module mais pas l'action, il repasse en AUTO.

-- Gestion de l'affichage
local temp = Heating.getActualTemp()
if (fibaro:getGlobal("Chauffage") == "VACANCES") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / VAC" )  
elseif (fibaro:getGlobal("Chauffage") == "OFF") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / OFF" )
elseif (fibaro:getGlobal("Chauffage") == "MANUEL") then 
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblTemps.value", temp .. "°C / MANUEL" )	

je voudrais que quand la variable "MANUEL" remplace "OFF", "ON" ou "VACANCES", le module affiche "MANUEL" et n'ai plus d'action tant que la variable n'est pas changé.

Tu peux m'aider? 

@Steven , je fais un petit UP car je n'arrive pas à  avancer.

je n’arrête pas de parcourir ton code sans arrivé à  stopper l'action.

si j'ai bien compris, si la variable "chauffage" n'est pas sur "OFF" ou "VACANCES" donc le module est en AUTO, la variable "ON" sert juste à  changer l'état de la variable "chauffage" mais n'a aucune action dans le code?

Partager ce message


Lien à poster
Partager sur d’autres sites

@Fredric

Tu as eu raison de faire un "UP" je t'avais oublié .. honte sur moi.

 

Ce que tu aimerais c'est qu'en mode "MANUEL" le module virtuel ne fasse plus rien ? C'est bien cela ?

 

 

Dans mon code, cherche

Heating.run = function()

et juste la ligne en dessous ajoute ceci :

      if (fibaro:getGlobal("Chauffage") == "MANUEL") then return end

Cela va stopper le module virtuel en mode MANUEL.

 

Tiens moi au courant stp.

 

 

P.S: Oui "ON" est juste pour avoir autre chose que "OFF" et "Vacances" ... le code ne vérifie que OFF et Vacances et considère tout le reste comme le mode AUTO.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour à  tous,

 

J'ai adapté ce code pour gérer mon chauffage, c'est le top, merci Steven.

Par contre, j'ai un soucis pour utiliser le panneau de chauffage, visiblement à  cause du bug de json dans la version 4.018 (même message d'erreur que yoda6907)...

Comment peut on faire dans ce cas là  ?

Pour info, je suis obligée de rester dans cette version pour utiliser le plugin virtual sensor qui gère ma sonde de température ! 

 

Merci d'avance de votre aide

Partager ce message


Lien à poster
Partager sur d’autres sites

Il faudrait coder les heures directement dans le module virtuel en attendant mais sans ma HC2 je n'y arriverais pas. Il faut attendre quelques jours.

Envoyé de mon HTC One_M8 dual sim en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

post-1692-0-42525400-1415743088_thumb.png

Bonjour à  tous,
 
J'ai adapté ce code pour gérer mon chauffage, c'est le top, merci Steven.
Par contre, j'ai un soucis pour utiliser le panneau de chauffage, visiblement à  cause du bug de json dans la version 4.018 (même message d'erreur que yoda6907)...
Comment peut on faire dans ce cas là  ?
Pour info, je suis obligée de rester dans cette version pour utiliser le plugin virtual sensor qui gère ma sonde de température ! 
 
Merci d'avance de votre aide

Bonsoir,
Pour ma part, j'ai fait un downgrade vers la version 3.590. 
J'ai retouché le module pour y intégrer une gestion par le fil pilote (gestion des ordres confort, eco, arret, ..). J'ai laisse tombé le panneau de chauffage pour utiliser des variables :
 
L'idée est de définir dans les variables (une pour chaque jour) les plages horaires pendant lequel le chauffage doit être en mode confort. Si pas dans la plage, on passe en mode Eco
 
-- Bout de code qui détermine si l'on est dans une plage 'Confort'


local i = 1
 
-- Recupere les plages horaire 'Confort' du jour
local day = string.lower(os.date("%A"))
local ch ="?"
fibaro:debug("Jour : " ..day)
ch =fibaro:getGlobal(day)
local lg = string.len(ch)
fibaro:debug("Chaine :" .. ch .. "-" .. lg)
  
local hour = (os.date("%H"))
local min = (os.date("%M"))
local now = 100000 + hour * 60 + min
fibaro:debug("jour : " ..day)

local ipos1 = 0
while (ipos1 <= lg) do
  local sep1=string.find (ch,"-",ipos1)
  local sep2=string.find (ch,"/",sep1)
 
  hdeb=string.sub(ch,ipos1,sep1-1)
  hdebH=(string.sub(hdeb,0,2))
  hdebM=(string.sub(hdeb,4,5))
  heuredebut =100000 + hdebH * 60 + hdebM
   
  hfin=string.sub(ch,sep1+1,sep2-1)
  hfinH=(string.sub(hfin,0,2))
  hfinM=(string.sub(hfin,4,5))
  heurefin =100000 + hfinH * 60 + hfinM
  fibaro:debug(heuredebut .. "-" ..heurefin)
 
  ipos1 = sep2 + 1
  if (now >= heuredebut) and (now <= heurefin) then
    gAutoConfort = 1
    fibaro:debug("Plage N° : " ..i)
    break
  end
  i=i+1
end

 
Voila rapidement. Je tacherais de prendre du temps pour diffuser le module complet

Modifié par yoda6907
Bonjour, merci d'editer le message et d'utiliser les balises pour code : <>

Partager ce message


Lien à poster
Partager sur d’autres sites

merci @Steven  ;)

 

je viens de faire la modification, mais comme je suis au boulot et que les icônes de certain vd ne remonte pas, je ne vois pas si cela fonctionne, s'en en a tout l'air en tous cas.

je te teins au courant 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour les fou de la v 4.018 :)

 

Voici une solution temporaire (workaround) autre que celle de yoda6907 (qui a l'avantage d'utiliser des variables globales et d'être plus lisible).

 

J'ai donc remplacer la méthode Heating.getTempPanel par celle-ci (quasiment identique)

Heating.getTempPanel = function()
	if (fibaro:getGlobal("Chauffage") == "VACANCES") then
		return Heating.holidays
	end
	
	--local strefa = Heating.stefa
	local day = string.lower(os.date("%A"))
	local hour = os.date("%H")
	local min = os.date("%M")
	local now = 0
	local temp = 0
	local lasttemp = 0
	local mode = ""
	local lastmode = ""
	
	--HC2 = Net.FHttp("127.0.0.1",80)
	--HC2:setBasicAuthentication(Heating.admin, Heating.password)
	--response = HC2:GET("/api/panels/heating?id="..strefa)
	--local jsontable =json.decode(response)
	
	local week = {"monday","tuesday","wednesday","thursday","friday", "saturday", "sunday"}	

	local datas = {}
    	datas["monday"] = {}
    	datas["monday"]["morning"] = {hour=7; minute=0; temperature=21}
    	datas["monday"]["day"] = {hour=9; minute=0; temperature=19}
    	datas["monday"]["evening"] = {hour=16; minute=0; temperature=21}
    	datas["monday"]["night"] = {hour=23; minute=0; temperature=19}
    	datas["tuesday"] = datas["monday"]
    	datas["thursday"] = datas["monday"]
    	datas["friday"] = datas["monday"]
    	datas["wednesday"] = {}
    	datas["wednesday"]["morning"] = {hour=7; minute=0; temperature=21}
    	datas["wednesday"]["day"] = {hour=9; minute=0; temperature=21}
    	datas["wednesday"]["evening"] = {hour=16; minute=0; temperature=21}
    	datas["wednesday"]["night"] = {hour=23; minute=0; temperature=19}
    	datas["saturday"] = datas["wednesday"]
    	datas["sunday"] = datas["wednesday"]
    
        for k,v in pairs(week) do
		if (v == day) then now = k * 100000 + hour * 60 + min end
	end
	for k,v in pairs(week) do
		for l,w in pairs({"morning","day","evening","night"}) do
			if (now > k*100000+datas[v][w].hour*60+datas[v][w].minute) then
				temp = datas[v][w].temperature
				mode = v .. " .. " ..w
			end
			lasttemp = datas[v][w].temperature
			lastmode = v .. " .. " ..w
		end
	end
	if (temp == 0) then 
		temp = lasttemp
		mode = lastmode
	end
	local oldMode = fibaro:getValue(fibaro:getSelfId(), "ui.lblMode.value")
	fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblMode.value", mode )      
	if (oldMode ~= mode) then
		fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblCorr.value", 0)
	end
	return tonumber(temp)+Heating.getCorrection()       
end

Vous constaterez que j'ai simplement déclarer en "dur" les jours et heures de chauffe en reprenant le même format que retourne normalement le panneau de chauffage de la fibaro.

 

Voici une petit explication rapide :

- Chaque jour est composé de 4 périodes : matin, jour, soirée, nuit

- Chaque période commence à  une certaine heure et est liée à  une certaine température.

 

Dans mon cas j'ai déclaré les données pour le lundi et ensuite j'ai juste indiqué que mardi, jeudi et vendredi sont identique

datas["monday"] = {}
datas["monday"]["morning"] = {hour=7; minute=0; temperature=21}
datas["monday"]["day"] = {hour=9; minute=0; temperature=19}
datas["monday"]["evening"] = {hour=16; minute=0; temperature=21}
datas["monday"]["night"] = {hour=23; minute=0; temperature=19}

-- Idem que lundi
datas["tuesday"] = datas["monday"]
datas["thursday"] = datas["monday"]
datas["friday"] = datas["monday"]

Pour moi le mercredi est comme le week-end, un jour non-travaillé

datas["wednesday"] = {}
datas["wednesday"]["morning"] = {hour=7; minute=0; temperature=21}
datas["wednesday"]["day"] = {hour=9; minute=0; temperature=21}
datas["wednesday"]["evening"] = {hour=16; minute=0; temperature=21}
datas["wednesday"]["night"] = {hour=23; minute=0; temperature=19}
-- idem que le mercredi
datas["saturday"] = datas["wednesday"]
datas["sunday"] = datas["wednesday"]

Voilà , avec un peu d'attention, c'est assez simple à  comprendre et adapté.

 

J'espère avoir répondu a vos attente.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Fredric

Tu as eu raison de faire un "UP" je t'avais oublié .. honte sur moi.

 

Ce que tu aimerais c'est qu'en mode "MANUEL" le module virtuel ne fasse plus rien ? C'est bien cela ?

 

 

Dans mon code, cherche

Heating.run = function()

et juste la ligne en dessous ajoute ceci :

      if (fibaro:getGlobal("Chauffage") == "MANUEL") then return end

Cela va stopper le module virtuel en mode MANUEL.

 

Tiens moi au courant stp.

 

 

P.S: Oui "ON" est juste pour avoir autre chose que "OFF" et "Vacances" ... le code ne vérifie que OFF et Vacances et considère tout le reste comme le mode AUTO.

Merci @Steven, cela marche parfaitement  ;)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour @Steven, 

 

peux-tu me dire si la modification suivant est possible et fonctionnel dans ton module.

 

pour que le chauffage fonctionne différemment selon si il y à  personne ou si on est là , j'ai créé une deuxième zone de chauffage et je souhaite l'activer via une variable que j'utilise déjà  dans plusieurs scripts. 

l'idée: "si aujourd’hui est égale à  1 alors choisir l'ID 5 si non choisir l'ID 3"

-- Méthode à  appeler toutes les X secondes (30) par 
-- un scénario afin de rafraichir ce programme
if (not Heating) then

	Heating = {}

	Heating.hysteresis = 0.7 --- +/- de chauffage
	Heating.holidays = 17 -- température souhaitée du mode vacances

	if tonumber(fibaro:getGlobalValue("Aujourdhui")) == tonumber("1") then
	Heating.stefa = 5 -- id du panneau de chauffage Present
	elseif Heating.stefa = 3 -- id du panneau de chauffage normal
	end
	
        Heating.admin = "login"
  	Heating.password = "password"

tu ne vois pas de complication pour le bon fonctionnement de ton module?

Partager ce message


Lien à poster
Partager sur d’autres sites

Aucune contre-indication de mon côté, l'idée me semble même bonne. Juste que ton code n'est pas bon .. .voici la version corrigée

if (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 1) then
   Heating.stefa = 5 -- id du panneau de chauffage Present
else
   Heating.stefa = 3
end

Partager ce message


Lien à poster
Partager sur d’autres sites

ok, super  :60:

 

 

j'ai un bug, j'avais déjà  créé deux zones, une pour la sale de bain et une pour la zone 1 (salon, salle à  manger ...), pas de soucis, les températures sont bien respectés.

si je crée une troisième ou même plus, les horaires ne sont pas respectés, par exemple, il est 18h45, il va chercher la température de 00h00.

 

tu as créé plusieurs zones ???

 

 

 

 

ça vient du panneau de chauffage, j'en ai créé un autre sans supprimer ce dernier et ça marche!! va comprendre......

Modifié par Fredric

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonne nouvelle. Pour l'instant j'ai pas remis les zones. Il faudrait que je le fasse. Je les avait enlever lorsque le json ne fonctionnait plus.

Envoyé de mon portable grâce àmes petits doigts.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour.....

Petite question concernant toujours le même pb de conversion des données récupérer sur la ZIBASE:

J'ai appliqué la ligne suivante sur un Slider (comme le devise virtuel de STEVEN)

 

local temp = tonumber(fibaro:getValue(37, "ui.Slider1.value"))/10

 

et malgré cela , mes données affichées sont toujours sans la virgule !!!

je pêche  :-( 

besoin d'aides 

merci

Partager ce message


Lien à poster
Partager sur d’autres sites

×