Bonjour à tous,
Une fois n’est pas coutume, je suis pas là pour demande de l’aide mais pour présenter un projet que je viens de terminer en Z-Wave avec jeedom. Un petit boitier électronique, piloté en Z-Wave via Jeedom pour renseigner la température réelle de la maison à mon poêle, et avec un bouton que j’appuie à chaque fois que je met un sac pour avoir un suivi (simple incrémentation de valeur d’un virtuel à chaque appui) sur l’année. Bonne lecture (c’est un peu long mais je détaille tout )
Mon problème initial : Mon poêle à granulés de la marque CMG qui est complètement dépourvu de contact sec, d’entrée thermostat ou de quoi que ce soit qui pourrais en faire un pilotage externe et qui de plus possède une sonde de température de 1m50 (pas très « réel » comme température). Je ne peut pas le piloter à distance (en anticipation quand je rentre de déplacement surtout) et je n’ai pas de température fiable. Je me suis tourné dans un premier temps vers le constructeur qui n’en avait vraiment que faire de ma demande et qui me proposait juste une option sonde déportée à 200€, mais il fallait aussi changer la carte mère car elle n’est pas compatible, bref, autant en racheter un neuf.
Ma solution : Remplacer la sonde existante de mon poêle (NTC K10) par un meilleur système de température ambiante de la maison. L’idéal étant ma sonde netatmo intérieure. Et tant qu’a faire pourquoi pas en Z-Wave ?
Matériel utilisé :
- Z-Uno (https://z-uno.z-wave.me), en gros c’est une base arduino avec une couche z-wave et on code ce que l’on veut dedans. Je vous avoue que c’était pas simple et le premier que j’ai reçu était pas reconnu par W10.
- MCP4131 (http://cdn.sparkfun.com/datasheets/Components/General%20IC/22060b.pdf), un potentiomètre digital qui sera commandé par le z-uno, j’ai pris un 10kOhms car j’ai pas trouvé de 5kOhms qui est la plage que je voulais.
Schéma
le MCP4131 est un potentiomètre de 10kOhms, pour en faire un de 5kOhms je place donc R2 qui fait 10kOhms en parallèle de la sortie, ce qui me donne un 0/100% en 0/5kOhms.
J’ai choisi d’avoir une plage variable de 16 à 25°C donc 5kOhms suivant ce tableau : http://www.verdone.fr/uploads/files/products/valeurs-des-sondes-passives-en-ohms_ts6300d-valeurs-ohmiques.pdf, la R3 de 10kOhms en série me permet de passer en 0/100% = 10/15kOhms soit 16°C/25°C
Je pique l’alim 5V de la carte dans le poêle, j’ai ça qui est à dispo à défaut du reste ^^
Programme Z-Uno
#include <SPI.h>
#define LedPin 9
#define CSPin 8
#define ButtonPin 18
byte ledValue = 0;
int TemperatureValue = 0;
byte lastButtonState = 0;
byte PotAddress = 0x00;
ZUNO_SETUP_CHANNELS(
ZUNO_SWITCH_MULTILEVEL(getterTemperature, setterTemperature),
ZUNO_SWITCH_MULTILEVEL(getterButton, NULL),
ZUNO_SWITCH_BINARY(getterLed, setterLed)
);
void setup() {
pinMode(LedPin, OUTPUT);
pinMode(CSPin, OUTPUT);
digitalWrite(CSPin, HIGH);
pinMode(ButtonPin, INPUT_PULLUP);
SPI.begin();
}
void loop() {
byte currenButtonState = digitalRead(ButtonPin);
if (currenButtonState != lastButtonState) {
lastButtonState = currenButtonState;
zunoSendReport(2);
delay(5000);
}
}
int digitalPotWrite(int value) {
SPISettings spi_settings = SPISettings(8000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(&spi_settings);
digitalWrite(CSPin, LOW);
SPI.transfer(PotAddress);
SPI.transfer(value);
digitalWrite(CSPin, HIGH);
SPI.endTransaction();
}
void setterLed(byte value) {
digitalWrite(LedPin, (value > 0) ? HIGH : LOW);
ledValue = value;
}
byte getterLed(){
return ledValue;
}
void setterTemperature(int value) {
TemperatureValue = value;
digitalPotWrite(value);
}
byte getterTemperature() {
return TemperatureValue;
}
byte getterButton() {
if (lastButtonState == 0) {
return 0;
} else {
return 0xff;
}
}
Intégration Jeedom
Côté intégration c’est comme un capteur Z-Wave classique, on passe en mode inclusion, 3 appui sur le BP du Z-Uno et paf il arrive, par contre c’est à vous de faire les commandes, voici les miennes associées au programme :
Et le scénario de pilotage de tout ça :
La led me sert à faire un retour de prise en compte du BP pour le décomptage d’un sac sur mon virtuel.
La led reste allumée 5s pour la prise en compte du BP et s’allume 2s toutes les 5min pour la réception de la température à jour du Netatmo.
La partie un peu plus complexe et pas évidente, la fonction de conversion température <> pilotage MCP4131
Pour convertir la température en index de pilotage du MCP4131, j’ai une fonction polynomiale d’ordre 3 dans mon scénario, les valeurs ne tombant pas du ciel, j’ai un fichier excel pour ça : http://ftp.boss-bravo.fr/divers/MCP4131%20Resistance%20Calcul.xlsx
Il suffit de faire incrémenter plusieurs valeurs du MCP4131 en manuel dans le software Z-Uno et de regarder la consigne affichée sur le poêle. Ca nous donne une courbe et excel me ressort une fonction qui se rapproche assez de mes valeurs que je rentre dans jeedom (celle affichée en haut du graphique Temperature / MCP4131), le relevé en Ohms est falcultatif.
Du coup je reçois ma valeur de température de netatmo que j’envoie toutes les 5 minutes en passant à la moulinette dans cette fonction qui me ressort une valeur entre 0 et 128 (129 pas pour le MCP4131, d’autres proposent 257 pas si besoin et nativement en 5kOhms, mais j’en avais pas sous la main) que j’envoie au Z-Uno qui envoie en SPI au MCP4131.
La suite
J’intègrerais la gestion ON/OFF du poêle un peu plus tard dans un autre scénario mais le concept est simple, le poêle est toujours allumé, consigne à 19.5°C, si je met température ambiant à 25°C il va se couper car il fait trop chaud, quand je veut l’allumer, je repasse la température à sa vraie valeur.
J’espère que j’ai été assez clair, j’ai voulu partager ce ptit truc avec vous car les poêles c’est pas si simple quand on en a un comme le mien tout fermé par le constructeur, si ça peut en aider certains d’entre vous, have fun !
Pavé César et bonne fin de weekend à vous cher Jeedomistes .