Quitte à tripoter ma chaudière fioul, autant en profiter pour la domotiser un peu 🙂
Quand je dis domotiser, je parle bien évidemment de la régulation/programmation du chauffage.
Pour les chauffages électriques, c’est de la rigolade, puisque dans la plupart des cas, c’est natif (fil pilote, thermostat d’ambiance, que sais-je encore…)
Pour les chaudières Gaz, mon « confrère » bloggeur, Abavala (je peux t’appeler confrère Hervé ? :p ), a écrit un excellent billet à ce sujet que je vous invite à lire de suite :
http://www.abavala.com/2011/10/24/ma-chaudiere-a-lapproche-de-lhiver/
Quand au chaudière fioul, bah y’avait pas grand chose…
Alors tout d’abord, petit rappel de fonctionnement.
Ma chaudière est une « vieille » chaudière (comme Karen Cheryl) (spécial clin d’oeil à Fred qui se lamentait de ne plus avoir de lien vers sa chanteuse favorite) (pardon Karen).
Elle n’a donc aucun dispositif de thermostat d’ambiance.
(Vous me direz, je pourrais en changer et mettre un truc de la mort qui tue avec toutes les options, mais bon, c’est comme mes PCs ou ma femme, je suis assez basique la dessus, tant que ça marche, pourquoi en changer ?..)
C’est une chaudière qui produit de l’eau chaude (nommée ECS dans les milieux autorisés, pour Eau Chaude Sanitaire).
Donc elle est composée d’un brûleur (qui brûle le fioul ah ah ah) et chauffe l’eau du ballon incorporé pour me permettre de prendre ma douche dans des conditions acceptables en hiver (et en été aussi d’ailleurs…) et également l’eau qui est envoyé dans le circuit d’eau des radiateurs par un Circulateur.
Ce circulateur est une sorte de pompe qui ne fait que faire « circuler » (d’où son nom, comme quoi la nature est bien faite) l’eau dans le circuit.
Alors un circulateur, c’est ça :
En mode « été », on coupe le circulateur d’eau chaude qui donc n’envoi plus d’eau dans le circuit des radiateurs (magique hein ?).
Sous ce circulateur, nous avons un gros thermostat d’avant guerre qui permet de « régler » la température de l’eau chaude envoyée dans le circuit (en fait une simple vanne qui permet de doser le volume d’eau chaude envoyé).
Vanne qui ne me sert à rien puisque tout mes radiateurs (sauf 1 bien sûr (obligatoire!)), sont équipés de robinets thermostatiques, c’est pour quoi elle est ouverte à fond.
Je peux donc, individuellement, contrôler la température de chaque « pièce/radiateur » (si je met le robinet thermostatique a 21°, le robinet coupe l’arrivée d’eau chaude dans ce radiateur une fois cette température atteinte dans la pièce).
Bon je ne vous expliquerais pas le fonctionnement du robinet, on s’en moque un peu.
Alors déjà ça c’est bien, mais le matin, quand on quitte la maison, on se voit mal faire le tour de tout les radiateurs (j’en ai 13 !) pour baisser la température de 2°.
Donc bilan, on laisse tel quel et dans la journée, quand personne n’est la (à part le lapin), ben ça chauffe pareil que quand on est la…
D’où l’idée de gérer un peu tout cela par le serveur Domotique.
De quoi dispose t’on pour traiter de sujet ?
La majorité des pièces de mon domicile sont équipées de sondes de température, mon système domotique « connait » donc la température de chaque pièce.
On ouvre la chaudière et on regarde un peu les branchements électriques :
Alors oui, c’est très old-school… Nous avons le fil d’alimentation du circulateur qui arrive sur un bornier et donc qui est alimenté quand la chaudière est mode Hiver et coupé quand elle est en mode été.
Ne reste plus qu’a se greffer la dessus.
Pour cela, rien de plus simple, il nous faut un contacteur on/off 1000w Chacon (RF 433Mhz)
Un interrupteur va-et-vient (pour passer en mode normal si le système domotique venait à ne plus fonctionner), un voyant rouge 220v (pour faire zoli et voir quand le circulateur est alimenté) et une boiboite pour mettre tout ca dedans.
Soudure, domino et tadammmmm :
The Chaudiere-Controler made by GuiguiAbloc.
Essentiel pour la compréhension, un schéma électrique bien pourri (PS: Pour ceux qui aurait dormi en cours d’électricité P = Phase (ou aussi L comme « Live ») et N = Neutre):
(Quizz a mes amis du réseau : De quel équipement est tiré l’oreille qui sert de support à mon domino ? 😀 )
Maintenant que l’on peut contrôler l’arrêt/marche du circulateur, comment on programme cela ?
Alors vous allez voir c’est assez basique.
Tout d’abord, on se créé un template crontab qui sera chargé tout les jours de la semaine de 8h à 18h.
Comme mon serveur domotique « plotte » nos agendas, si nous sommes en RTT/Vacances/Pas envie d’aller bosser , il ne charge pas la crontab dans ce cas là.
Une fois cette crontab chargée, il exécute un script tout les quart d’heure qui vérifie les consignes qui lui sont données dans un fichier YAML. Si la température est au-dessus de ses consignes, il coupe le circulateur, sinon il le relance. Par contre, si une des températures de la maison venait a descendre en dessous du seuil minimum, il relance le circulateur.
La commande on/off du module Chacon est envoyée sur le bus xPL et transmise par mon boîtier RFXCOM.
J’ai donc écrit un script en python qui est lancé toutes les 15 minutes :
NB: C’est une version allégée de celui que j’utilise
Exemple fichier YAML de consigne :
SALON: 18.0
SDB : 20.0
MINITEMP : 17.0 |
SALON: 18.0
SDB : 20.0
MINITEMP : 17.0
Le script :
#! /usr/bin/python
# -*- coding: cp1252 -*-
import MySQLdb, sys
import yaml, socket
# YAML
fichieryaml = open('consigne.yaml')
consigne = yaml.load(fichieryaml)
fichieryaml.close()
# ALIMENTATION VARIABLE
consignesalon = consigne['SALON']
consignesdb = consigne['SDB']
minitemp = consigne['MINITEMP']
hostname = socket.gethostname()
# CONNECTEUR UDP XPL
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
# fonction Message XPL
def xplmsgcmnd(ordre):
msg = "xpl-cmnd\n{\nhop=1\nsource=guigui-chauffage." +hostname+"\ntarget=*\n}\nhomeeasy.basic\n{\naddress=0x1111bb\nunit=1\ncommand=" +ordre+ "\n}\n"
xpladdr = ("255.255.255.255",3865)
UDPSock.sendto(msg,xpladdr)
# Connexion MySQL
try:
db = MySQLdb.connect(host="localhost", user="sonde", passwd="sonde", db="sondes")
except :
print "connexion refusée"
sys.exit(1)
c = db.cursor()
c.execute("SELECT sensorValue from sensor where sensorType='TempSalon' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempsalon = float(row[0])
c.execute("SELECT sensorValue from sensor where sensorType='TempSdb' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempsdb = float(row[0])
c.execute("SELECT sensorValue from sensor where sensorType='TempAutre' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempautre = float(row[0])
c.close()
if tempsalon < minitemp or tempsdb < minitemp or tempautre < minitemp :
ordre = "on"
xplmsgcmnd(ordre)
sys.exit(0)
if tempsalon <= consignesalon or tempsdb <= consignesdb:
ordre = "on"
xplmsgcmnd(ordre)
if tempsdb > consignesdb and tempsalon > consignesalon:
ordre = "off"
xplmsgcmnd(ordre) |
#! /usr/bin/python
# -*- coding: cp1252 -*-
import MySQLdb, sys
import yaml, socket
# YAML
fichieryaml = open('consigne.yaml')
consigne = yaml.load(fichieryaml)
fichieryaml.close()
# ALIMENTATION VARIABLE
consignesalon = consigne['SALON']
consignesdb = consigne['SDB']
minitemp = consigne['MINITEMP']
hostname = socket.gethostname()
# CONNECTEUR UDP XPL
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
# fonction Message XPL
def xplmsgcmnd(ordre):
msg = "xpl-cmnd\n{\nhop=1\nsource=guigui-chauffage." +hostname+"\ntarget=*\n}\nhomeeasy.basic\n{\naddress=0x1111bb\nunit=1\ncommand=" +ordre+ "\n}\n"
xpladdr = ("255.255.255.255",3865)
UDPSock.sendto(msg,xpladdr)
# Connexion MySQL
try:
db = MySQLdb.connect(host="localhost", user="sonde", passwd="sonde", db="sondes")
except :
print "connexion refusée"
sys.exit(1)
c = db.cursor()
c.execute("SELECT sensorValue from sensor where sensorType='TempSalon' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempsalon = float(row[0])
c.execute("SELECT sensorValue from sensor where sensorType='TempSdb' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempsdb = float(row[0])
c.execute("SELECT sensorValue from sensor where sensorType='TempAutre' ORDER BY idx DESC limit 1")
rows = c.fetchall()
for row in rows:
tempautre = float(row[0])
c.close()
if tempsalon < minitemp or tempsdb < minitemp or tempautre < minitemp :
ordre = "on"
xplmsgcmnd(ordre)
sys.exit(0)
if tempsalon <= consignesalon or tempsdb <= consignesdb:
ordre = "on"
xplmsgcmnd(ordre)
if tempsdb > consignesdb and tempsalon > consignesalon:
ordre = "off"
xplmsgcmnd(ordre)
Et voila, un thermostat d’ambiance beaucoup plus fin que ceux que l’on trouve dans le commerce (car il prend en compte plusieurs températures et non pas seulement la température de la pièce de référence) et comble du luxe, comme je connais également la température extérieure, je peux peaufiner ma demande (inertie des radiateurs, baisse plus ou moins rapide de la chaleur de la pièce etc…)
C’est très DIY je l’avoue, mais c’est très amusant à faire (et en plus ça permet de faire des économies 😀 )
Amusez vous bien 🙂