Projet en cours d'élaboration
Sur cette page sont décrites toutes les étapes pour domotiser son poêle à pellets, de la mise en place d'un thermostat à base de Raspberry PI et d'une sonde extérieure, au pilotage à distance du poêle, à la mise en place d'un calendrier afin d'économiser du carburant et de gagner en confort !
Le matériel de base :
pi
, et mot de passe raspberry
. Selon qu'on se trouve sous Linux, Windows ou autre, tu peux utiliser le client SSH qui te plait : pour moi ce sera la commande ssh
sous Linux ou le logiciel Putty pour Windows.sudo raspi-config
et sélectionne Expand Filesystem afin de bien utiliser tout l'espace disponible sur la carte SD. Profites-en pour personnaliser le hostname du RPI, Vulcain, à tout hasard , pour paramétrer la timezone, etc.Matériel nécessaire pour cette phase du projet :
Explications matérielles à faire
Le déroulé de cette étape consiste à paramétrer Raspbian afin de pouvoir lire notre sonde de température qu'on utilisera pour faire un thermostat filaire de la longueur que l'on souhaite, sans toucher au poêle d'origine :
sudo aptitude install vim
./boot/config.txt
avec sudo vim /boot/config.txt
et rajoute cette ligne : dtoverlay=w1-gpio,gpiopin=4
.sudo reboot
.ls /sys/bus/w1/devices/
. Tu dois obtenir ceci : 28-0000061521af w1_bus_master1
. 28-0000061521af
étant un identifiant unique, il sera forcément différent dans ton cas. Ensuite, en prenant mon exemple, tu peux afficher la température avec la commande cat /sys/bus/w1/devices/28-0000061521af/w1_slave
. Si tout va bien, tu dois obtenir quelque chose comme ça :80 01 4b 46 7f ff 10 10 c6 : crc=c6 YES 80 01 4b 46 7f ff 10 10 c6 t=24000
Sinon, reprends les étapes du dessus ou change ta sonde qui peut être défectueuse.
Ce logiciel développé en C, qu'on va appeler sobrement DS18B20Manager nécessite une bibliothèque MQTT client et un serveur MQTT.
<sxh [Bash]>
sudo aptitude install libssl-dev git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.c.git cd org.eclipse.paho.mqtt.c make sudo make install
</sxh>
sudo aptitude install mosquitto
. Tu peux installer ce serveur sur n'importe quel OS et n'importe quel RPI. Seule la configuration réseau changera par rapport à notre cas de figure.g++ -lpthread -lpaho-mqtt3c main.c -o DS18B20Manager
. à faire : mettre à disposition le code sourcetemperature_sensor/#
. Tu devrais recevoir la température à jour toutes les secondes.nohup /home/pi/DS18B20Manager/DS18B20Manager > /dev/null 2>&1 &
au fichier /etc/rc.local
avant exit 0
. Une autre solution, bien plus élégante consiste à écrire un script init.<sxh [Bash]>
sudo cp /home/pi/DS18B20Manager/DS18B20Managerd /etc/init.d/ sudo chmod 0755 /etc/init.d/DS18B20Managerd sudo update-rc.d DS18B20Managerd defaults
</sxh> à faire : fournir le script documenter DS18B20Manager
Nous allons avoir besoin d'un simple relais électromécanique pour faire le montage électronique.
Ajouter schéma
Pour la partie logicielle je me suis amusé à le faire en Bash, vue la fréquence à laquelle vont être effectuées les actions d'allumage et d'extinction, il n'y a pas besoin de passer par du C. De plus vues les opérations faites, pas la peine de se casser la tête à re-développer tout un client MQTT quand quelques lignes suffisent !
git clone git://git.drogon.net/wiringPi
.cd wiringPi
et ./build
.sudo aptitude install mosquitto-clients
.PelletStoveDriverd
dans /etc/init.d
et lance la commande sudo update-rc.d DS18B20Managerd defaults
.
Voilà ! Maintenant avec une simple commande on
ou off
envoyée sur le topic pellet_stove_driver/ground_floor/=
de notre broker MQTT nous pourrons démarrer notre sacré poêle à granulés.
modifier le script pour faire une commande de retour + retain message
Maintenant nous allons installer les scripts de gestion du thermostat, toujours de mon cru. Pour apprendre à faire tout ça je te conseille d'y jeter un œil, de le modifier, par exemple pour sélectionner la bonne sonde de température. Ne modifie pas l'installation du Fablab en cours STP, ou alors documente ceci dans ce wiki et vérifie que tout fonctionne bien , que l'on ne meurt ni de chaud, ni de froid .
bc
, qu'on installe comme suit : sudo aptitude install bc
. Elle sera utilisée dans l'un des scripts, en particulier, pour comparer des nombres à virgule flottante.ThermostatCored
dans /etc/init.d
.ThermostatController
va nous servir dans la prochaine étape, afin d'interface le calendrier à notre thermostat.Comme ce script n'est pas encore documenté, je vais le faire ici, afin de pouvoir le hacker dans de bonnes conditions ! Alors :
19.5
sur le topic /thermostat/ground_floor/target_temperature/=
. Si tout se passe bien, tu auras la confirmation de en t'abonnant au topic /thermostat/ground_floor/target_temperature
.normal
, eco
, always on
et always off
sur le topic /thermostat/ground_floor/mode/=
. De la même manière, pour vérifier que le nouveau mode a bien changé, abonne toi au topic /thermostat/ground_floor/mode
./thermostat/ground_floor/state
. Tu sauras si le chauffage est démarré si tu reçois le message running
, ou arrêté, si tu reçois le message stopped
.Grâce à cette sixième étape nous allons interfacer notre système de chauffage à un calendrier Google afin d'obtenir un système utilisable par tous les bénévoles du Fablab et ce, à distance : l'idéal aurait été d'utiliser un calendrier OwnCloud (méthode autonome et 100% libre ), mais n'ayant pas spécialement le temps de re-développer une solution je laisse à quelqu'un d'autre la charge de remplacer cette étape par une autre méthode, ou j'y reviendrais plus tard .
En attendant, voici ce que je te propose, cher lecteur : nous allons utiliser le script GCalCron python disponible à cette adresse : https://github.com/fabriceb/gcalcron/blob/master/README.md
.
sudo pip install –upgrade google-api-python-client
.git clone https://github.com/fabriceb/gcalcron.git $HOME/gcalcron
.sudo pip install python-dateutil
.at
: sudo aptitude install at
. Tout le script est basé sur cette commande, je te conseille d'aller voir à quoi elle sert !client_secrets.json
et placer dans le dossier du script.gcalcron
et lance le script qui s'y trouve comme suit : python gcalcron.py python gcalcron.py –noauth_local_webserver
.crontab -e
ajouter les lignes :PATH=/opt/bin:/bin:/usr/bin:/sbin:/usr/sbin */10 * * * * python /your/home/directory/gcalcron/gcalcron.py
Pour utiliser le calendrier il te suffit de créer un événement et d'ajouter la commande que tu veux lancer dans la description, en suivant ce formalisme :
-30 /home/pi/ThermostatController/ThermostatController -b
pour lancer le chauffage 30 min avant l’événement en question.end +5: /home/pi/ThermostatController/ThermostatController -e
pour stopper le chauffage 5 min après l’événement en question.Mais encore :
Dans cette n-ième étape du projet, nous allons configurer un tableau de bord, comme celui là : https://freeboard.io/board/rmr6-5. Pour cela nous allons avoir besoin d'un script qui vient récupérer les données des différentes applications que nous avons mis en place précédemment, du service https://dweet.io et du service https://freeboard.io. Quelques explications :
{ "state": "1", "mode": "Normal", "target_temperature": "25", "ground_floor_temperature": "23.9" }
Revenons en à nos moutons :
FreeBoardControllerd
dans /etc/init.d
et exécute la commande sudo update.rc FreeBoardControllerd defaults
.
Et voilà, tout est opé tous nos petits logiciels s'exécutent chacun de leur côté et communiquent entre eux, le petit dernier va juste espionner les sondes de température et le thermostat, pour retransmettre toutes les données utiles à https://dweet.io. L'objet (“thing”) en question est fablab_chantier_libre/thermostat/ground_floor
: le tableau de bord freeboard que nous avons préparé va exploiter ses données.
Cette solution rend le projet plus autonome : nous allons nous passer des deux services webs présentés précédemment.
<sxh bash; gutter: false>
git clone https://github.com/Freeboard/freeboard.git cd freeboard sudo aptitude install npm npm install grunt sudo npm install -g grunt-cli grunt
</sxh>
<sxh bash; gutter: false>
cd plugins/thirdparty/ wget https://raw.githubusercontent.com/alsm/freeboard-mqtt/master/paho.mqtt.plugin.js
</sxh>
<sxh bash; gutter: false>
cd ~/freeboard/lib/js/thirdparty/ wget http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.javascript.git/plain/src/mqttws31.js
</sxh>
paho.mqtt.plugin.js
de la manière suivante :<sxh javascript; gutter: true>
(function() { // ### Datasource Definition // // ------------------- freeboard.loadDatasourcePlugin({ "type_name" : "paho_mqtt", "display_name": "Paho MQTT", "description" : "Receive data from an MQTT server.", "external_scripts" : [ "/lib/js/thirdparty/mqttws31.js" ],
</sxh>
Modifie /lib/js/thirdparty/mqttws31.js
en fonction de la racine du site en question, on verra juste après comment procéder.
paho.mqtt.plugin.js
dans le freeboard en modifiant la page web index.html
, de la façon suivante :head.js("js/freeboard_plugins.min.js", "plugins/thirdparty/paho.mqtt.plugin.js", // *** Load more plugins here ***
<sxh bash; gutter: false>
sudo aptitude install nginx
</sxh>
Ensuite, nous allons paramétrer le serveur nginx en modifiant /etc/nginx/site-enabled/default
de cette façon :
server { root /var/www/freeboard; index index.html index.htm; server_name Vulcain; location / { try_files $uri $uri/ /index.html; } }
~/freeboard
dans /var/www
et à redémarrer le RPI :<sxh bash; gutter: false>
sudo cp -r ~/freeboard /var/www sudo reboot
</sxh>
<sxh bash; gutter: false>
wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key cd /etc/apt/sources.list.d/ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list sudo aptitude update sudo aptitude upgrade mosquitto
</sxh> Modifier le fichier de configuration de Mosquitto pour qu'il prenne en charge les websockets :
listener 1883 listener 9001 127.0.0.1 protocol websockets
Redémarrez le serveur ou le RPI : <sxh bash; glutter: false>
sudo service mosquitto stop sudo service mosquitto start
</sxh>
Ensuite récupère la configuration json via SAVE FREEBOARD.
Un fois cela fait, copie dashboard.json
à la racine du serveur web : tu pourras charger la configuration automatiquement, par exemple via l'URL http://192.168.1.2/index.html#source=dashboard.json.
Il y a quand même un gros défaut à cette solution : un seul client à la fois peut être connecté dans la mesure où le plugin Datasource MQTT dans l'état ne permet pas de générer des identifiants de clients mqtt différents. C'est donc un point à travailler pour qui s'y intéresserait.
Nous allons ici utiliser le projet ThingSpeak, projet OpenSource développé par l'équipe de MatLab. Suivre ce lien pour plus d'informations sur l’utilisation de ThingSpeak : https://github.com/iobridge/ThingSpeak. Tu peux aussi utiliser le service en ligne https://thingspeak.com, dans ce cas tu n'auras pas besoin d'installer tout ce qui est relatif au projet TeamSpeak.
<sxh bash; gutter:false>
git clone git@github.com:iobridge/thingspeak.git
</sxh>
<sxh bash; gutter: false>
sudo aptitude install ruby2.1 rubygems rails mysql-server mysql-client libmysqlclient-dev build-essential libxml2-dev libxslt-dev curl -sSL https://get.rvm.io | bash -s stable source /home/pi/.rvm/scripts/rvm rvm install 2.1 source /home/pi/.rvm/scripts/rvm
</sxh>
<sxh bash; gutter: false>
sudo gem install mysql cd ~/thingspeak cp config/database.yml.example config/database.yml mysql -u root -p
</sxh> <sxh sql; gutter: false>
CREATE USER 'thing'@'localhost' IDENTIFIED BY 'speak'; GRANT ALL PRIVILEGES ON * . * TO 'thing'@'localhost'; FLUSH PRIVILEGES; exit
</sxh> Modifie config/database.yml en fonction de l'utilisateur rajouté et de son mot de passe. Puis exécute ces commandes : <sxh bash; gutter: false>
bundle install sudo rake db:create rake db:schema:load
</sxh>
<sxh bash; gutter: false>
rails server
</sxh>
Maintenant que notre système de base est opérationnel, nous souhaiterions avoir un tableau de contrôle physique pour piloter notre chauffage simplement, ça n'est pas obligatoire, ma ça peut être sympa , par exemple pour les personnes qui ne sont pas adeptes de technologie :
Pour tout cela, nous utiliserons le matériel suivant :
De la même manière que pour toutes les étapes précédentes, j'ai découpé le projet en petites étapes, avec un petit programme à la clé à chaque fois, en C et/ou en Bash, en fonction de mon humeur (et des contraintes techniques, parce qu'il faut quand même que le système soit un minimum réactif !).
Pour faire simple, c'est un capteur qui réagit lorsqu'on fait tourner son axe ; on peut alors en déduire plusieurs informations : le sens de rotation, le nombre de crans passés (“detent” en anglais), la vitesse de rotation, le sens de rotation, etc. Ce type de capteur a tout un tas d'applications diverses ; ici nous allons simplement utiliser le retour haptique de notre capteur (tous n'en ont pas) qui nous permet de “sentir” chaque cran, ainsi que le fait de savoir si la rotation en cours est dans le sens de rotation des aiguilles d'une montre ou dans le sens inverse. De ce fait nous pourrons incrémenter ou décrémenter la température de réglage du thermostat.
Pour les curieux et ceux qui voudraient modifier le système, voici la documentation du capteur : http://www.mouser.com/ds/2/15/EC12E-587908.pdf.
Le capteur dispose de 3 sorties, A, B et C, nous n'aurons besoin de lire que les deux premières sur le RPI. Passons à l'action :
dessiner le montage
anticlockwise
ou clockwise
à chaque cran passé, en fonction du sens de rotation.mettre à disposition le code source
Maintenant nous allons utiliser deux mini écrans OLED 0.96“ de 128 x 64 pixels sur lesquels apparaîtront les températures intérieures et extérieures.
faire schéma
sudo raspi-config
et dans le menu Advanced Options
sélectionner I2C Enable/Disable automatic loading
et répondre yes
aux différentes questions.https://github.com/hallard/ArduiPi_OLED.git
. Installe d'abord ces bibliothèques : sudo aptitude install build-essential git-core libi2c-dev i2c-tools lm-sensors
. Télécharge le et compile le avec les commandes git clone https://github.com/hallard/ArduiPi_OLED.git
et sudo make
.make
et teste le bon fonctionnement de l'écran avec la commande sudo ./oled_demo –oled 3
.Il arrive que atd plante et remplisse la sdcard via syslog, il suffit d'utiliser la commande atq et d'effacer les pending jobs (atrm). Il faut aussi recommencer l'installation du script gcalcron, qui mériterait d'être redéveloppé.
— Jonathan Alibert 2015/12/02 14:48