:::: MENU ::::

Suivi de température sur le Raspberry Pi (sonde 1-wire DS18B20)

Depuis la sortie du Raspberry Pi, nombre de tutoriels concernant le branchement de sonde DS18B20 sur les ports GPIO via le bus 1-wire ont vu le jour. Néanmoins, la plupart se contentent seulement de vous montrer comment brancher la sonde de température et comment récupérer la valeur mesurée en ligne de commande. Afin de pousser un peu plus le concept j’ai décidé de réaliser une application facilement configurable qui vous permettra de rapidement installer un serveur web où vous pourrez, à l’aide de graphique, avoir un suivi de température d’une ou plusieurs sondes branchées sur un Raspberry Pi.

Projet PiTemp

Un aperçu de l’interface web du projet PiTemp

Montage électronique

Matériel nécessaire :

  • Une sonde de température DS18B20 1-wire (entre 1 à 6 € selon le modèle)
  • Une résistance de 4.7K Ω
  • Quelques câbles

Branchement de la sonde :

Pour notre montage, nous allons utiliser des sondes DS18B20 qui utilisent le bus 1-wire. La résolution de cette sonde est ajustable (de 9 à 12 bits) et la plage de mesure est de -55°C à 125°C. Le bus 1-wire est basé sur la notion de maître / esclaves. Le maître (ici le Raspberry Pi) interroge les différents esclaves à travers le bus ou leur envoi des ordres. Il est donc possible de brancher plusieurs sondes en parallèle sur notre bus (via trois conducteurs : masse, alimentation & données). De plus, ce type de sonde possède un mode parasite qui lui permet de ne pas relier la broche d’alimentation au Raspberry Pi (en la reliant directement à la masse ce qui permet d’économiser un fil).

Concernant les différentes possibilités de branchement de la sonde et le fonctionnement détaillé du bus 1-wire, je vous laisse faire vos propres recherches (ce n’est pas en soi l’intérêt de cet article). Vous trouverez ci-dessus un exemple de schéma de branchement :

Schéma branchement DS18B20

Schéma branchement sonde DS18B20

Pour résumer nous avons branché l’alimentation du capteur sur la pin 3.3V du Raspberry Pi, la masse du capteur sur la pin de masse et enfin la patte de donnée de la sonde à la pin GPIO 4. La résistance de 4.7K Ω est alors placée entre l’alimentation et le fil de données. Attention au sens de branchement de la sonde. Une fois le Raspberry Pi alimenté, si la sonde chauffe (par expérience cela peut être assez chaud) c’est qu’il y a un problème. Couper alors immédiatement l’alimentation du Raspberry afin d’éviter de griller définitivement le capteur.

DS18B20 schéma

Sonde DS18B20

Configuration du système

⚠ Attention : La procédure décrite ci-dessous risque d’être différente des anciens tutoriels que vous pouvez trouver sur internet. Ceci est dû au système de Device Tree (plus d’informations à cette adresse) maintenant utilisé par défaut par le noyau Linux de Raspbian afin de gérer l’allocation de certaines ressources ainsi que le chargement de modules.

Afin d’activer le module 1-wire il vous suffit d’ouvrir et modifier le fichier config.txt :

sudo nano /boot/config.txt

Et d’y rajouter à la fin la ligne suivante :

dtoverlay=w1-gpio,gpiopin=4

Pour que les changements soient appliqués, il est nécessaire de redémarrer le Rpi :

sudo reboot

Ce fichier est contenu sur la partition de boot du Raspberry Pi qui est formaté en FAT 32. Vous pouvez donc modifier directement le fichier depuis votre ordinateur sous Windows par exemple, après avoir écrite votre image de système sur la carte SD.

Nous allons maintenant vérifier le bon fonctionnement du capteur de température. Pour cela rendez vous dans ce dossier : /sys/bus/w1/devices  et affichez la liste des fichiers et dossiers disponibles :

cd /sys/bus/w1/devices
ls

Normalement, chaque sonde 1-wire connectée au Rpi est répertoriée au sein de ce dossier par le biais d’un identifiant unique. Pour consulter la valeur de température d’une sonde, il vous suffit alors de vous rendre dans ce répertoire et d’afficher le contenu du fichier w1_slave .

3b 01 55 00 7f ff 0c 10 db : crc=db YES
3b 01 55 00 7f ff 0c 10 db t=19687

Nous pouvons donc voir qu’à cet instant la température relevée par la sonde est de 19.687 °C.

Installation de l’outil de suivi

Node JS LogoL’outil de suivi est que j’ai développé utilise le langage Node JS (développement d’application en JavaScript côté serveur) couplé à une base de données RRD (Round-Robin Database) gérée par l’outil RRDTool. Ce dernier est notamment utilisé pour l’enregistrement de données cycliques ou chronologiques et la génération de graphique par de nombreux logiciels open source tel que Lighttpd (statistiques d’utilisation), Cacti ou Nagios.

RRDTool LogoConcernant le stockage des données via RRDTool, nous allons créer une DataSource de type GAUGE par sonde enregistrée. La valeur de chaque sonde sera lue toutes les 5 minutes. Nous allons alors générer trois archives RRA (Round Robin Archives) :

  • 1ère RRA : Toutes les valeurs de la journée actuelle (soit 288 valeurs, une toutes les 5 minutes)
  • 2ème RRA : La moyenne des valeurs sur une heure de la semaine (soit 168 valeurs, correspondant à la moyenne de 12 mesures)
  • 3ème RRA : La moyenne des valeurs sur une journée pour un an (soit 365 valeurs, correspondant à la moyenne de 288 mesures)

⚠ Attention : Le seul souci actuellement de ce système c’est qu’il n’est pas possible d’ajouter de DataSource (donc de sonde) à un fichier .rrd existant. Il vous faudra soit repartir sur un nouveau fichier, soit dupliquer les données manuellement avec un outil externe dans une nouvelle base de données qui aura été générée avec toutes les DataSources nécessaires.

Dans un premier temps il est nécessaire d’installer RRDTool (sans oublier de mettre à jour les paquets d’abord) :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install rrdtool librrd-dev git

Nous allons ensuite installer Node JS. Nous n’allons pas utiliser notre gestionnaire de paquets habituel, car la version présente est généralement obsolète (et risque de nous poser des problèmes).

Si vous êtes sous Raspbian Jessie il vous suffit de taper ces commandes :

wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb

Si vous êtes sous Raspbian Wheezy :

Pour un Raspberry Pi premières versions :

wget https://nodejs.org/dist/v4.2.2/node-v4.2.2-linux-armv6l.tar.gz
tar -xvf node-v4.2.2-linux-armv6l.tar.gz
cd node-v4.2.2-linux-armv6l
sudo cp -R * /usr/local/

Pour un Raspberry Pi 2 :

wget https://nodejs.org/dist/v4.2.2/node-v4.2.2-linux-armv7l.tar.gz
tar -xvf node-v4.2.2-linux-armv7l.tar.gz
cd node-v4.2.2-linux-armv7l
sudo cp -R * /usr/local/

Vous pouvez maintenant vérifier que Node Js est bien installé à l’aide de la commande node -v  et npm -v.

La récupération des dépendances via NPM ne fonctionne pas parfois en HTTPS. Vous pouvez basculer en HTTP si jamais vous rencontrez des problèmes avec la commande npm install  :

sudo npm config set registry http://registry.npmjs.org/
npm config set registry http://registry.npmjs.org/

Il faut ensuite installer les différents modules Node JS nécessaires. Pour cela il suffit de lancer la commande :

sudo npm install -g pm2

PM2 est un outil Node JS permettant l’exécution de script Node JS en tant que daemon. Node-gyp va nous permettre de compiler le module node_rrd faisant la liaison entre notre script Node JS et l’outil RRDTool.

On clone maintenant le projet PiTemp (et le projet node_rrd) :

git clone https://github.com/Orion98MC/node_rrd.git
git clone https://github.com/code4pi/PiTemp.git

Il faut maintenant installer les dépendances du projet :

cd PiTemp/
npm install

Si vous rencontrez une erreur de ce type :cc1plus: error: unrecognized command line option ‘-std=c++11’ (notamment sous Raspbian Wheezy, sous Jessie pas de problèmes en principe) faites ceci :

cd ../node_rrd/
git checkout 5b73f3e
cd ../PiTemp/
npm install

Nous allons modifier la configuration du projet. Pour cela il faut éditer le fichier config.js  :

var config = module.exports = {};

config.http = {};
// Port utilisé pour l'interface web (Attention un port inférieur à 1024 nécessite de lancer le serveur avec les droits root)
config.http.port = 8080;

config.https = {};
// Activer HTTPS
config.https.enable = false;
// Port HTTPS. Let's Encrypt nous force à utiliser le port 80 et 443.
// Mais une redirection peut être faite grace à un reverse proxy ou une redirection de port au niveau du routeur.
config.https.port = 8081;
// Domaine du certificat HTTPS
config.https.domain = 'example.com';
// Email pour l’enregistrement du certificat (requis par Let's Encrypt)
config.https.email = 'admin@example.com';
// Configuration de développement pour éviter un bloquage suite à un trop grand nombre de mauvaises requêtes
// Cf: https://git.coolaj86.com/coolaj86/greenlock-express.js
// Après vous êtes assurez de la bonne configuration du système, mettez cette valeur à true pour obtenir le vrai certificat
config.https.production = false;

config.auth = {};
// Activer basic authentification
config.auth.enable = false;
// Nom d'utilisateur pour basic auth
config.auth.username = 'admin';
// Sha256 du mot de passe (peut être obtenu via la commande echo -n password | sha256sum). Par défaut password
config.auth.password = '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8';

// Chemin ou sera enregistré le fichier RRD. Si le fichier n'existe pas, il sera créé
config.filename = 'PiTemp.rrd';

// Liste des sondes 1-wire
config.w1 = [{
  // ID de la sonde, sera utilisé pour identifié la datasource (j'utilise l'ID de la sonde dans mon cas)
  id: '28-0000054c2ec2',
  // Chemin complet permettant la récupération des données
  path: '/sys/bus/w1/devices/28-00042c32c1ff/w1_slave',
  // Nom de la sonde (qui sera affiché sur le graphique)
  name: 'Chambre',
  // Couleur de la ligne sur le graphique
  color: '#081D58'
}, 
  // On ajoute une deuxième sonde
  {
  id: '28-00042c32c1aa',
  path: '/sys/bus/w1/devices/28-00042c32c1aa/w1_slave',
  name: 'Salon',
  color: '#B1221C'
}];

module.exports = config;

Il ne nous reste plus qu’à lancer le serveur :

node server.js

Voilà maintenant vous pouvez accéder à l’interface web (http:\\ip_du_raspberry:port_choisi). Néanmoins il faudra alors attendre quelques minutes avant de voir des données s’afficher sur le graphique.

Une fois que vous vous êtes assuré que tout fonctionne bien, vous pouvez lancer le serveur en tant que daemon :

pm2 start server.js

Pour lancer pm2 du Raspberry Pi utilisez cette commande :

sudo su -c "env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u pi --hp /home/pi"

(Cette commande vous est normalement indiquée si vous saisissez pm2 startup ubuntu avec l’utilisateur pi.)

Enfin il faut indiquer à pm2 de sauvegarder la liste des processus lancés afin de les relancer au démarrage. Pour cela lancez la commande :

pm2 save

Perspective d’amélioration

Ce projet n’est qu’une première ébauche de ce que pourrait donner un projet plus abouti. J’ai différentes pistes d’améliorations que je souhaiterai mettre en place si le temps me le permet :

  • Possibilité d’avoir plusieurs sondes sur plusieurs Raspberry Pi reliés en réseau. On aurait alors une architecture client/serveur avec un Raspberry Pi central chargé d’enregistrer les données, qui hébergerait le serveur web et d’autres Raspberry Pi qui enverraient les données de leurs sondes au serveur.
  • Ajout de sonde à la volée. En effet comme je l’expliquais plus haut, il n’est pas possible actuellement de rajouter une datasource au sein d’un fichier RRD existant sans passer par un outil externe.
  • Système d’authentification afin de sécuriser l’accès aux données depuis le web. (Fait ! ;-))

Mise à jour du 24 janvier 2017: Ajout de la configuration permettant l’obtention d’un certificat HTTPS valide via Let’s Encrypt.

Mise à jour du 29 janvier 2017: Ajout d’une Basic Authentification.

A propos de l'auteur :

C’est l’histoire d’un développeur pleine pile un peu touche à tout, qui découvre l'infrastructure et le nuage. Son plat préféré, c’est le hachi-corp sauce K8S. Détestant faire deux fois la même chose, féru d’automatisation, il s’est dévoué à la cause de l’infrastructure comme code, de la containérisation et du déploiement continu. Blogueur sur un site de Framboise, il a eu le malheur d’acheter une imprimante 3D, et cherche encore à comprendre pourquoi il est un fan ardu de Formule 1.


38 Comments

  • Répondre yethidom |

    Bonjour,
    j’ai installé ligne par ligne votre configuration, et je trouve ce message qui apparaît régulièrement
    après avoir lancer le serveur
    J’ai un Raspberry Pi 2 1Go avec Jessie.

    pi@maminix ~/PiTemp $ node server.js
    PiTemp app listening at http://:::6060
    unknown DS name ’28-000006dd771e’
    unknown DS name ’28-000006dd771e’

    J’ai vérifié dans w1_slave l’adresse du capteur DS18B20 qui fonctionne bien avec une lecture simple.

    Le serveur fonctionne mais n’affiche que les axes de coordonnées
    Il n’affiche pas non plus les valeurs 0, 5°, 10° et les axes correspondants
    Je peux sélectionner par semaine, par mois
    Pouvez vous m’indiquer une erreur de ma part
    Merci

    • Répondre Benoit |

      Bonjour,

      J’ai l’impression qu’il y a un problème avec le fichier .rrd où sont normalement stockées les données.

      Essayez de supprimer ce fichier et relancez le serveur.

  • Répondre yethidom |

    Bonjour,
    J’ai mis le fichier .rrd à la poubelle, un nouveau fichier .rrd a été créé au moment du lancement du serveur, maintenant ça fonctionne bien. Très bon diagnostique !

    Maintenant j’aimerai placer ce graphique sur une page de mon site WEB.
    Je peux faire un lien avec la page http://PiTemp, mais y a t il une autre solution?

    Le fonctionnement de ce graphique est-il relié à Highcharts.com ou peut-il fonctionner en local (non connecté à Internet)?

    J’aimerai aussi pouvoir changer la présentation ( Remplacer PiTemp par XXX, modifier le temps de lecture de 5 secondes, traduire les textes en Français, etc). Puis-je directement modifier le fichier « dateInterval.js » Avez-vous une solution?

    Merci encore pour votre réponse
    Cordialement

  • Répondre yethidom |

    J’ai appliqué ceci pour lancer automatiquement l’application à la mise sous tension du Raspberry
    1 sudo su -c « env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u pi –hp /home/pi »

    comme vous l’avez indiqué
    Mais ça ne fonctionne pas, je suis obligé de faire la commande « node server.js »

    • Répondre Benoit |

      Concernant les traductions, les fichiers HTML sont statiques. Ils sont stockés dans le dossier nommé « public ». Libre à vous de le modifier à votre convenance.

      Pour inclure ce graphique dans votre site web, le plus simple reste l’iframe. Sinon il doit être possible d’intégrer un graphique Highcharts avec quelques notions de JS. Highcharts fonctionne de façon local.

      Pour le lancement de l’application au démarrage, il faut d’abord lancer le script à l’aide de l’outil pm2 (pm2 start server.js). Si le serveur est correctement lancé, il devrait être visible dans la liste des applications managées par pm2 (pm2 list). Maintenant, pour s’assurer que pm2 est lancé au démarrage du RPI, il faut utiliser la commande pm2 startup ubuntu qui vous indiquera une commande à exécuter (par exemple : sudo su -c « env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u pi –hp /home/pi », néanmoins la commande peut être différente en fonction de votre environnement).

  • Répondre yethidom |

    J’avais déjà fait l’intégration avec iframe et commencé à modifier les fichiers /PiTemp/ /public/index.html et /PiTemp/config.js en sauvegardant les originaux avant les modifications.
    Je préfère avoir votre confirmation pour modifier ces fichiers.

    Pour le lancement de l’application au démarrage ça a été plus compliqué, j’ai bien fait tout ce que vous avez indiqué (pm2 start server.js) puis (pm2 list) pour vérifier (c’est tout bon )
    Ensuite (pm2 startup Ubuntu) avec réponse de la commande à exécuter
    Puis la commande reçu (sudo su -c « env PATH………)
    Mais après une coupure d’alimentation du Rpi, pas de lancement de l’application.
    J’ai essayé plusieurs fois sans succès.
    J’ai fini par ajouter une commande dans /etc/crontab
    @reboot root sudo /root/make_boot_pm2.sh

    J’ai créé un fichier (/root/make_boot_pm2.sh) et dans ce fichier j’ai mis:

    #!/bin/sh

    # Lancement de l’application pm2 server.js à la mise sous tension
    cd /home/pi/PiTemp
    sudo pm2 start server.js

    ensuite j’ai validé les propriétés de ce nouveau fichier à 0755

    Je ne sais pas si c’est fait dans les règles de l’art, mais ça fonctionne sur 2 Raspberry Pi
    Le premier avec 2 sondes 18B20 et le deuxième avec une sonde.18B20

    Je suis maintenant enchanté de cette application qui me sert a surveiller et piloter le fonctionnement de ma pompe à chaleur située dans ma maison au dessus de Grenoble depuis le monde entier (quand je n’ai pas de problème de réseau !!!)

    Merci encore pour votre travail et vos très bons conseils
    Cordialement

    • Répondre Benoit |

      Content que cette application vous rend service !

      J’ai regardé rapidement la documentation de pm2 et je me suis rendu compte qu’il fallait taper la commande pm2 save après le lancement du script afin que ce dernier puisse se lancer au démarrage. J’ai mis à jour le tutoriel en conséquence. Néanmoins votre méthode fonctionne elle aussi.

      Cordialement

  • Répondre yethidom |

    Bonjour,
    Petite erreur dans le fichier config.js ( lignes 13 et 15), le n° de la sonde n’est pas le même.

    Ce qui me plairait bien dans l’affichage de la température du jour, c’est de pouvoir changer de jour en cliquant sur 2 boutons (jour précédent/suivant) ou (jour-/jour+) mais c’est peut-être compliqué?

    Vous pouvez peut-être indiquer que lorsqu’on rajoute une sonde à une configuration existante, il ne faut pas oublier d’effacer le fichier « PiTemp.rrd » pour qu’elle soit prise en compte.
    Et dans ce cas les anciens relevés sont perdus.
    Merci encore pour votre travail.
    Cordialement

  • Répondre olivier |

    bonjour, j’essaye de suivre votre tuto , mais j’ai un problème au moment de la commande « npm install » j’ai un message :
    npm WARN package.json PiTemp@0.0.1 No description
    npm WARN package.json PiTemp@0.0.1 No repository field.
    npm http GET http://registry.npmjs.org/express
    npm http GET http://registry.npmjs.org/moment
    npm http GET http://registry.npmjs.org/node_rrd
    npm http 304 http://registry.npmjs.org/express
    npm http 304 http://registry.npmjs.org/moment
    npm http 404 http://registry.npmjs.org/node_rrd
    npm ERR! TypeError: Object.keys called on non-object
    npm ERR! at Function.keys (native)
    npm ERR! at installTargetsError (/usr/local/lib/node_modules/npm/lib/cache.js:709:24)
    npm ERR! at /usr/local/lib/node_modules/npm/lib/cache.js:639:10
    npm ERR! at saved (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:142:7)
    npm ERR! at /usr/local/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:133:7
    npm ERR! at Object.oncomplete (fs.js:107:15)
    npm ERR! If you need help, you may report this *entire* log,
    npm ERR! including the npm and node versions, at:
    npm ERR!

    npm ERR! System Linux 4.1.18-v7+
    npm ERR! command « /usr/local/bin/node » « /usr/local/bin/npm » « install »
    npm ERR! cwd /root/PiTemp
    npm ERR! node -v v0.10.24
    npm ERR! npm -v 1.3.21
    npm ERR! type called_on_non_object
    npm ERR!
    npm ERR! Additional logging details can be found in:
    npm ERR! /root/PiTemp/npm-debug.log
    npm ERR! not ok code 0

    avez vous une idée ?

    • Répondre Benoit |

      Bonjour,

      A ce que je vois dans les logs, il semblerait que vous utilisiez une ancienne version de Node JS (0.10.24). Comme je l’explique dans le tutoriel, j’ai rencontré quelques soucis lors de la mise en place du projet avec une version plus ancienne de Node JS. Il faudrait donc mettre à jour Node JS (en version 4.x) pour voir si cela règle le problème.

  • Répondre Olivier |

    Bonjour merci de répondre. il est vrai que j’aurais pu le préciser, j’ai déjà essayé avec un version plus récente (la dernière) mais j’avais alors un problème avec : sudo npm install -g pm2. Le même genre d’erreur qui commence par WARN (surligner en orange). Avez vous une idée sur le problème ?
    Si besoin je recommencerais avec une version plus récente et vous montrerais le message d’erreur
    Merci

  • Répondre olivier |

    bonjour ,j’aurai dû le préciser , mais j’ai déja essayé avec une versione plus récentes , et à se moment là quan je fais la commande sudo npm install -g pm2
    j’ai : npm WARN optional dep failed, continuing fsevents@1.0.8
    /usr/local/bin/pm2 -> /usr/local/lib/node_modules/pm2/bin/pm2
    /usr/local/bin/pm2-dev -> /usr/local/lib/node_modules/pm2/bin/pm2-dev
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/npmconf requires mkdirp@’~0.3.3′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/mkdirp,
    npm WARN unmet dependency which is version 0.5.1
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/npmconf requires osenv@’0.0.3′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/osenv,
    npm WARN unmet dependency which is version 0.1.3
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/npmconf requires nopt@’2′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/nopt,
    npm WARN unmet dependency which is version 3.0.4
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/npmconf requires semver@’2′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/semver,
    npm WARN unmet dependency which is version 5.0.3
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/npmconf requires ini@’~1.1.0′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/ini,
    npm WARN unmet dependency which is version 1.3.4
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data requires semver@’2′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/semver,
    npm WARN unmet dependency which is version 5.0.3
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data requires github-url-from-git@’~1.1.1′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/github-url-from-git,
    npm WARN unmet dependency which is version 1.4.0
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data requires github-url-from-username-repo@’0.0.2′ but will load
    npm WARN unmet dependency /usr/local/lib/node_modules/npm/node_modules/github-url-from-username-repo,
    npm WARN unmet dependency which is version 1.0.2
    pm2@1.0.2 /usr/local/lib/node_modules/pm2
    ├── ikt@0.0.0
    ├── eventemitter2@0.4.14
    ├── async@1.5.2
    ├── pidusage@1.0.1
    ├── semver@5.1.0
    ├── commander@2.9.0 (graceful-readlink@1.0.1)
    ├── debug@2.2.0 (ms@0.7.1)
    ├── pm2-deploy@0.2.1 (async@1.4.2, tv4@1.0.18)
    ├── coffee-script@1.10.0
    ├── pm2-multimeter@0.1.2 (charm@0.1.2)
    ├── vizion@0.2.12 (async@0.9.0)
    ├── chalk@1.1.1 (escape-string-regexp@1.0.5, supports-color@2.0.0, strip-ansi@3.0.1, has-ansi@2.0.0, ansi-styles@2.2.0)
    ├── cli-table@0.3.1 (colors@1.0.3)
    ├── pm2-axon@2.0.9 (amp-message@0.1.2, escape-regexp@0.0.1, amp@0.3.1, configurable@0.0.1)
    ├── pm2-axon-rpc@0.3.6 (json-stringify-safe@5.0.1, commander@1.0.5)
    ├── mkdirp@0.5.1 (minimist@0.0.8)
    ├── shelljs@0.6.0
    ├── pmx@0.6.1 (json-stringify-safe@5.0.1)
    ├── nssocket@0.6.0 (lazy@1.0.11)
    ├── cron@1.1.0 (moment-timezone@0.3.1)
    ├── source-map-support@0.4.0 (source-map@0.1.32)
    ├── chokidar@1.4.3 (path-is-absolute@1.0.0, inherits@2.0.1, glob-parent@2.0.0, async-each@1.0.0, is-glob@2.0.1, is-binary-path@1.0.1, readdirp@2.0.0, anymatch@1.3.0)
    └── moment@2.11.2

    si jamais vous avez un peu de temps a me consacrer vous pouvez me contacter par mail historie que je n’envahisse pas cette page de commentaire .
    et bien sur si vous avez une idée sur mon problème .
    merci

  • Répondre Philippe |

    Bonjour,
    Merci ! voici ce que je cherchais depuis un moment, mais …
    j’ai mes données stoquées depuis un petit moment sur une base de données mysql (temperature, humidité, pression , etc)
    pour le DS18B20 j’ai deux sondes dans une table du format (uid, timestamp, température, id sonde)
    comment faire pour importer ces données dans un graphique ?
    j’aimerai garder cette base car cela me permet simplement de faire des requette pour autre chose, donc pas d’importation massive dans une base rrd (si c’est possible)

    merci d’avance
    cordialement

    Philippe

    • Répondre Benoit |

      Dans l’immédiat, il n’est pas possible d’importer les données depuis une base de données MySQL ou autre. Ce n’est pas compliquer à faire en mettant un peu les mains dans le cambouis mais cela nécessite des connaissances en développement JavaScript (et Node JS). Après il existe peut être des outils permettant la génération de graphiques depuis une table MySQL directement.

      • Répondre Philippe |

        Bonjour,

        merci pour votre réponse. Tout est là, je ne connais rien à javascript. j’ai bricolé un truc en php/mysql mais ce n’est pas aussi beau.

        bonne journée
        Philippe

  • Répondre BENABDELOUAHAB |

    Bonjour,

    Je possède d’un Raspberry pi 3 et d’un capteur de Température DHT11
    et je ne sais pas comment les brancher ensemble
    Aidez moi s’il vous plait

    Merci d’avance!

    • Répondre Benoit |

      Sur ce coup, Google est votre ami je dirais. Il est possible d’adapter ce projet pour lire d’autres types de sonde. Mais cela nécessite quelques connaissances en JavaScript (Node JS).

  • Répondre PERRIN René |

    Bonjour

    Nouveau dans le système linux j’ai opté pour ce sujet pour commencer, après plusieurs tentatives en arrivant à la fin j’obtient l’affichage suivant:

    Error: Cannot find module ‘rrd’
    at Function.Module._resolveFilename (module.js:337:15)
    at Function.Module._load (module.js:287:25)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object. (/root/PiTemp/server.js:5:11)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    Il va sans dire si une bonne âme voudrait bien me tuyauté sur la question je serais ravi.

    Merçi d’avance

    • Répondre Benoit |

      Bonjour,

      Cette erreur indique que le module RRD n’a pu être trouvé. Elle apparaît au lancement de la commande node server.js ?

      Avez-vous un dossier node_rrd au même niveau que le dossier PiTemp (vous devriez avoir ces 2 dossiers /root/node_rrd et /root/PiTemp) ? Que donne la commande npm install . à l’intérieur du dossier PiTemp ? Malheureusement le module node_rrd n’est pas présent sur le repo NPM ce qui complexifie un peu son installation.

  • Répondre PERRIN René |

    Bonjour Benoit

    Merçi d’avoir répondu, le fait que je répond aujourd’hui vient du fait que je me basais sur une réponse sur mon cite et oubliait le forum.Bon j’ai tout recommencé en prenant jessie comme référence voila ce que donne les réponses aux questions poséees :

    root@raspberrypi:~# node server.js

    module.js:340
    throw err;
    ^
    Error: Cannot find module ‘/root/server.js’
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

    root@raspberrypi:~/PiTemp# ls
    config.js dateInterval.js LICENSE package.json public README.md server.js

    root@raspberrypi:~# npm install .
    -su: npm : commande introuvable

    Impossible de charger :
    root@raspberrypi:~# sudo dpkg -i node_latest_armhf.deb
    dpkg: concernant node_latest_armhf.deb contenant node :
    nodejs-legacy entre en conflit avec node
    node (version 4.2.1-1) doit être installé.
    node fournit node et doit être installé.

    ensuite
    root@raspberrypi:~/PiTemp# npm install
    -su: npm : commande introuvable

    root@raspberrypi:~# sudo npm config set registry http://registry.npmjs.org/
    sudo: npm: command not found

    Voici tous les problèmes rencontrés et désolé d’être si long pour l’instant c’est la prise de tête

    Cordialement

    • Répondre Benoit |

      Bonjour,

      La raison de votre problème est que NPM (le gestionnaire de paquets de Node JS) ne c’est pas correctement installé (d’où l’erreur -su: npm : commande introuvable). Ce qui m’étonne c’est que j’ai testé l’installation de Node JS (et NPM) avec les commandes fournies dans le tutoriel et cela fonctionnement correctement (depuis une image Raspbian Jessie Lite) :

      wget http://node-arm.herokuapp.com/node_latest_armhf.deb
      sudo dpkg -i node_latest_armhf.deb

      Peut être qu’un sudo apt-get install npm pourra solutionné ce problème (mais je ne connais pas la version présente sur les repos Raspbian).

  • Répondre PERRIN René |

    Bonjour Benoit

    Après ton explication et mes problèmes j’ai tout viré et installé jessie lite et comme par hasard tout c’est très bien effectué. J’ai bien les 2 dossiers node_rrd et PiTemp dans root.
    voila le résultat de node server.js

    module.js:339
    throw err;
    ^

    Error: Cannot find module ‘/root/server.js’
    at Function.Module._resolveFilename (module.js:337:15)
    at Function.Module._load (module.js:287:25)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:134:18)
    at node.js:961:3

    A propos de jessie lite; jessie possède une interface graphique que l’on peut valider dans raspi-config alors que dans jessie lite il n’y a rien.

    Merçi d’avance pour la réponse

    • Répondre Benoit |

      Bonjour,

      Vous avez exécuté la commande node server.js en dehors du dossier PiTemp, c’est pour cela que vous avez cette erreur.

      Concernant la configuration de la distribution Jessie Lite, normalement elle est disponible avec la commande sudo raspi-config.

      Bonne soirée

  • Répondre laurent |

    Bonjour.
    Sur un raspberry PI3 :
    En executant la commande « node server.js » j’avais la même erreur que René :
    « Error: Cannot find module ‘rrd' »

    Dans package.json, j’ai remplacé la ligne :
    « node_rrd »: « file:../node_rrd »
    par
    « rrd »: « file:../node_rrd »

    et ensuite ca a marché
    (ie nom install, puis node server.js)

    Bonne soirée

    • Répondre Benoit |

      Ah il y a peut être eu quelques changement.

      Je regarde et je fais les corrections nécessaires.

      Merci de votre retour 😉 !

  • Répondre laurent |

    Bonjour,

    J’ai un problème avec une sonde extérieur et des températures négatives :

    1/ Il faut changer l’expression régulière dans updateNow() dans server.js pour capturer un nombre négatif :
    var temp = parseFloat(data.toString(‘ascii’).match(/t=(-?[0-9]+)/)[1]) / 1000;

    2/ Cependant, une fois que on capture un nombre négatif, celui ci ne s’affiche pas dans le graphisme … Et je ne comprend pas pourquoi

    Une idée ?
    Merci
    Laurent

    • Répondre Benoit |

      Bonjour,

      J’ai mis à jour le project sur GitHub pour régler le problème avec les températures négatives.
      Il était donc bien nécessaire dans un premier temps de changer la Regex.

      Néanmoins, le fichier RRD a été configuré pour gérer des températures de 0°C à 60°C (je ne pensais pas l’utiliser en extérieur :D). Il considérait donc une valeur négative comme invalide et donc ne l’enregistrait pas.
      J’ai donc changé la commande chargée de la création du fichier RRD pour qu’il prenne en compte des températures allant de -50°C à 100°C.

      Vous pouvez mettre à jour votre fichier à l’aide de la commande :
      rrdtool tune PiTemp.rrd --minimum {ID_DE_LA_SONDE}:-50
      rrdtool tune PiTemp.rrd --maximum {ID_DE_LA_SONDE}:100

      Ou alors vous récupérez les changements sur GitHub, supprimez votre fichier et relancez l’application pour générer un nouveau fichier.

      Benoit

  • Répondre laurent |

    Bonjour et merci pour votre réponse et l’ajustement du projet pour les températures négatives …

    Effectivement, ce n’était pas forcement évident de penser a des températures extérieurs négatives …
    Mais d’une part, la période s’y prête (:-) )et de plus en régulation de chauffage, on peut déterminer la puissance de chauffe en fonction des températures extérieures et des pertes du bâtiment (qui sont fonction de la température intérieure et extérieures).

    Merci

    Laurent

  • Répondre Alain |

    Bonjour,

    Merci beaucoup pour ce tutorial qui m’a bien aidé. J’ai fait tout fonctionner sur un Raspberry 3. Il y a juste une étape (je ne sais plus laquelle) où j’ai dû ajouter un « sudo » pour que cela fonctionne. Le problème, c’est que la température est largement incorrecte chez moi. Il indique 33.1° alors qu’il fait environs 24°. J’ai vérifié dans le fichier source (/sys/bus/w1/devices/w1_bus_master1/28-0000095f1d1e/w1_slave chez moi), c’est bien la température indiquée. Donc le soft fonctionne correctement… mais pourquoi n’ai-je pas la bonne température ? J’ai vérifié, j’ai bien une résistance de 4.7kOhms et un capteur DS18B20. Je ne vois pas d’erreur dans les branchements, et la sonde est à l’extérieur du boîtier (pour éviter le réchauffement dû au Raspberry). Après un certain temps, il se stabilise vers 31° au lieu des 24° attendus. Quelqu’un a-t-il déjà eu ce comportement ? Qu’est-ce qui pourrait en être la cause ? Y a-t-il une procédure de calibration à faire ?

    Merci pour toute aide ou tout conseil.

    • Répondre Benoit |

      Bonjour Alain,

      Personnellement je n’ai jamais rencontré ce problème avec ce type de sonde. J’ai déjà entendu parler d’écart de l’ordre de 1°C ou 2°C. Mais normalement la sonde est calibrée en usine.

      Je n’ai pas plus d’informations malheureusement.

      Bonne journée

  • Répondre johanna |

    Bonjour,

    Merci pour ce tuto qui fonctionne toujours (je n’ai rencontré aucun problème). A votre avis, est-il possible de récupérer la température non pas toutes les 5 minutes mais toutes les secondes ?

    Merci d’avance

  • Répondre Flavien |

    bonjour,
    Merci pour le tuto, chez moi le gpio4 est utiliser pour le détecteur de mouvement, je veux utiliser le gpio8 (CE1) sur un RPi
    (J’ai aussi un récepteur/émetteur lirc sur gpio17/18 et un récepteur/émetteur rf sur gpio 21/25

    Dans /boot/config.txt j’ai
    dtoverlay=lirc-rpi
    dtoverlay=w1-gpio,gpiopin=8

    Puis
    sudo dtoverlay w1-gpio gpiopin=8 pullup=0 # header pin 10

    C’est bien ca? Doc : https://fr.pinout.xyz/pinout/1_wire
    J’arrive pas a trouver ma sonde. Je doit faire des chose en plus?

  • Répondre Clement |

    Bonjour,

    Je n’ai pas encore essayé le tuto mais cela m’intéresse grandement et notamment la partie mise en réseau…

    En fait j’ai prévu pour ma part de disséminer divers capteurs avec des liaisons en 868MHz et de faire un genre de datalogger. Pour cela, je ne mettrai pas des raspberry mais plutôt des arduino.

    Si vous venez à développer la partie mise en réseau il est probable que je m’attaque à la mixité des réseaux. Il y aura aussi des arduino en ethernet reliés au système…

    Mais déjà, merci pour ce travail qui va sûrement m’être très rapidement utile !

Laissez un commentaire