Projet Raspberry Pi
Réaliser un server Python pour consulter les courbes de température


25 octobre 2019 • 36 • 4.9

Nous avons vu dans le tutoriel sur la sonde DS18B20 comment mesurer la température à l'aide d'un Raspberry. Le projet que je vous présente aujourd'hui explique comment on peut, à partir de ces données, créer une courbe de température consultable à l'aide d'un navigateur, simplement en utilisant Python et la librairie flask.

Réaliser des courbes de température avec DS18B20

Voici un aperçu de ce que l'on va faire :

Capture d'écran objectif projet Capture d'écran objectif projet

Prérequis

Pour ce projet, il faut le même matériel que dans le tutoriel sur la mesure de température, rien de plus. Ce qui donne dans le détail :

Une fois tout le matériel réunis, on peut passer au branchement.

Branchement de la sonde

Ici encore, rien de nouveau, on garde le même branchement que dans le tuto, soit :

Shéma de branchement d'une DS18B20 sur Raspberry Pi 3

Maintenant que la sonde est branchée, on essaie de mesurer la température via le terminal pour tester la liaison. (Voir le III. du tuto sur la sonde)

Installation de Flask et premiers pas

Important ! Tout au long du projet, il faudra exécuter le fichier app.py avec la commande suivante :

sudo python3 app.py
Si l'on n'indique pas la version de Python 3, le script ne s'exécutera pas.

Pour commencer, il va falloir installer la librairie flask qui va nous permettre de faire de notre Raspberry Pi un serveur Web. Entrez simplement la commande suivante dans le terminal :

sudo apt-get install python3-flask

Maintenant que la librairie est installée, voyons les notions de base de Flask. Voici le code le plus simple utilisant la librairie que l'on peut écrire :

En exécutant ce code, on devrait voir s'écrire dans le terminal ceci :

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: xxx-xxx-xxx

Cela signifie que le serveur est démarré, et qu’on peut y accéder en entrant l'IP du Raspberry Pi, suivi de :5000, qui est le numéro du port. Si on accède à cette page, on verra s'afficher Hello World.
Pour tester, entrer ceci dans le champ URL d'un navigateur : xxx.xxx.x.xxx:5000, où xxx.xxx.x.xxx est l'adresse IP du Raspberry Pi.
Si vous ne connaissez pas l'adresse IP de votre Raspberry Pi, entrez dans une console ceci :

hostname -I

(et n'oubliez pas de redémarrer le serveur)


Capture d'écran premier script Flask

Plutôt que de renvoyer un simple texte, Flask peut retourner une page HTML. Pour se faire, il suffit de changer le return 'Hello world' de la fonction appelée en celui-ci : return render_template('index.html').
La page index.html sera donc affichée sur le navigateur lorsque la fonction est appelée.
Pour transférer des variables entre le script Python et la page HTML, on ajoute simplement l'élément à transférer comme ceci : return render_template('index.html', valeur="2").
Pour récupérer la donnée transférée, il suffira d'écrire {{ valeur }} entre des balises HTML.

Prenons un exemple :
Créez les fichiers et répertoires comme ceci sur votre Raspberry Pi :

├──ProjetGraphTemp
    └── app.py
├── templates └── index.html
├── static (optionnel) └── style.css
Aide

Pour tout créer d'un coup, entrez ces commandes dans le terminal :

cd ~
mkdir ProjetGraphTemp
cd ProjetGraphTemp
touch app.py
mkdir templates
touch templates/index.html
mkdir static
touch static/style.css

Insérez le code suivant dans le fichier app.py :

Et celui-ci dans le fichier index.html :

Enfin, changez le style d'écriture ou tout autre élément graphique dans le fichier css si vous le souhaitez. Pour faire le lien entre les documents HTML & CSS avec Flask, ajouter cette ligne dans la balise <head> du code HTML :

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}" />

En exécutant le code Python et en se rendant à l'adresse IPRaspberry:5000, on obtient ceci :

Capture d'écran script avec redirection HTML Flask

On a donc les bases pour commencer par afficher la température sur une page Web.

Afficher la température

Avec ce que l'on vient de voir et ce que l'on a déjà vu dans tutoriel sur la sonde DS18B20, il n'est pas compliqué d'afficher la température sur une page HTML, il suffit de modifier un tout petit peu le code précédent.

Information

Comment récupérer le numéro de la sonde ?

Il suffit d'entrer les commandes suivantes dans le terminal :

sudo modprobe w1-gpio
sudo modprobe w1-therm
ls /sys/bus/w1/devices/

Une ligne de ce type devrait s'afficher :

28-0317229e0bff  w1_bus_master1

La partie verte correspond au numéro de la sonde.
Si rien ne s'affiche, lire cette section du tutoriel sur la DS18B20.

En exécutant le code Python et en se rendant à l'adresse IPRaspberry:5000/getTemp, on obtient ceci :

Capture d'écran script avec affichage température HTML Flask

Pour améliorer un peu l'esthétique, je vous propose ce CSS, qu'il faut ajouter dans le fichier static/style.css :

En executant le code avec ce CSS, on obtient ceci :

Capture d'écran script avec redirection HTML Flask et CSS

Enregistrer les températures

Pour construire un graphique de température, on va avoir besoin de données, il va falloir enregistrer les températures à intervalle de temps régulier. On va pour se faire créer une fonction supplémentaire à notre code, que l'on va nommer enregistrement(temperature). Cette fonction va être appelée lorsque l'on fait un getTemp. Elle va enregistrer la température donnée en paramètre dans un fichier texte ayant pour nom la date du jour. Le fichier contiendra sur chaque ligne l'heure et la température associée.
Les fichiers contenant les données de température seront de cette forme :

00:00 18.625
00:15 18.437
00:30 18.312
00:45 18.125
01:00 18.0
01:15 17.812
01:30 17.5
01:45 17.375
02:00 17.312
Information J'ai déjà pensé à utiliser une base de donnée pour enregistrer les températures, mais le temps de chargement du graphique était beaucoup plus long que lorsque l'on vient lire le contenu des fichiers.

Voici la fonction enregistrement(temp), que j'explique juste après.

Cette fonction prend la température en paramètre. Tout d'abord, elle ouvre le fichier dans lequel la température va être enregistrée. Si le fichier n'existe pas déjà, on ouvre en mode w (write) : On crée le fichier et on écrit la première température dedans. Sinon, si le fichier existe déjà, (donc des températures ont déjà été enregistrées ce jour), en ouvre le fichier en mode a (add). Une fois le fichier ouvert ou créé, on écrit l'heure suivie de la température sur une nouvelle ligne

Pourquoi ouvrir en add plutot qu'en write ?
Si on ouvre le fichier en write, tout le contenu qui existait déjà serait écrasé. Il faut donc d'abord vérifier l'existence du fichier pour savoir si l'on utilise le mode add ou write.
De plus, on ne peut pas être en mode add si le fichier n'existe pas déjà.

Personnellement, j'enregistre la température toutes les 15 minutes. Modifions un peu la fonction getTemp en lui ajoutant un argument ordonnant ou non l'enregistrement de la température.

Pourquoi ne pas enregistrer la température à chaque getTemp ?
Car plus tard, on va calculer la moyenne de température de la journée et on va la comparer. Il faut donc avoir le même nombre de températures chaque jour, donc il faut qu'elle soit enregistrée seulement toutes les 15 minutes : Lorsque l'on va consulter la courbe, la température sera affichée mais pas enregistrée.

Voici donc le nouveau code après modifications :

Il faut maintenant demander au Raspberry Pi de charger la page IPRasp:5000/getTemp?sauvegarde=True à intervalle régulier, je choisis 15 minutes mais vous pouvez choisir une autre fréquence évidemment. Pour se faire, on va modifier le fichier crontab.
Entrez donc la commande suivante dans le terminal :

sudo crontab -e
Information

Le fichier devrait ressembler à ceci :

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.L71rF1/crontab installed on Tue May 29 20:57:03 2018)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Une fois le fichier ouvert en édition, ajoutez les lignes suivantes à la fin puis enregistrez et quittez. (la première ligne permet d'executer le programme dès le démarage du Raspberry Pi)

@reboot cd /home/pi/ProjetGraphTemp; sudo python3 app.py
*/15 * * * * curl localhost:5000/getTemp?sauvegarde=True

Grace à ces lignes, le Raspberry Pi exécutera le script app.py à chaque démarrage et enregistrera la température toutes les 15 minutes.

Mise en place de la courbe et des statistiques

Maintenant que la température est enregistrée à intervalle de temps régulier dans un fichier, il suffit de récupérer ses données et de les insérer dans un graphique. Pour cette dernière partie, nous allons utiliser un outil développé par Google : Google Charts.
Google Charts permet de réaliser assez facilement un tas de graphique de tous types : Circulaires, histogrammes, cartes, courbes... Pour notre projet, nous allons utiliser le module de courbes : Line Chart
Pour commencer, on va créer une fonction fichierVersListe(cheminFich) qui va transformer les lignes contenues dans le fichier de température en deux listes qui vont nous servir plus tard pour la courbe et les statistiques.

Fonction fichierVersListe(cheminFich)

Exemple d'éxecution de la fonction :

00:00 18.625
00:15 18.437
00:30 18.312
00:45 18.125
01:00 18.0

fichierVersListe(cetExemple)

[
                [['00', '00', '18.625'], ['00', '15', '18.437'], ['00', '30', '18.312'], ['00', '45', '18.125'], ['01', '00', '18.']],
[18.625, 18.437, 18.312, 18.125, 18.0]
            ]

fichierVersListe(cetExemple)[0]
Cette liste est la liste des points que l'on va dessiner sur le graphe.

[['00', '00', '18.625'], ['00', '15', '18.437'], ['00', '30', '18.312'], ['00', '45', '18.125'], ['01', '00', '18.']]

fichierVersListe(cetExemple)[1]
Cette liste permet de trouver très facilement la température max, min et moyenne.

[18.625, 18.437, 18.312, 18.125, 18.0]

On va maintenant se servir de tout ça en créant la fonction graphTemp(date) qui renverra sur la page HTML qui s'occupera de dessiner le graphe. La fonction est la fin du code final, tout est commenté et expliqué :


Enfin, voici le code HTML qui permet de transformer toutes les données transférées en un beau graphique, grâce à Google charts. Ce code est à enregistrer dans le fichier templates/graphTemp.html.

Enregistrez les images de flèche permettant la navigation entre les dates en entrant les deux lignes de commande suivantes dans le terminal :

wget -P ~/ProjetGraphTemp/static https://raspberry-lab.fr/Projets/Courbe-temperature-accessible-avec-un-server-Web-Python/Images/nextDay.png
wget -P ~/ProjetGraphTemp/static https://raspberry-lab.fr/Projets/Courbe-temperature-accessible-avec-un-server-Web-Python/Images/prevDay.png

En laissant tourner le programme, la journée, on obtient des courbes comme ceci (avec un Raspberry à l'extérieur) :

Capture d'écran objectif projet Capture d'écran objectif projet

PS : J'ai ajouté une statistique "année précédente" dans mon programme car j'enregistre les températures avec mon Raspberry Pi depuis plusieurs années déjà ! :)


Voilà, ce projet est maintenant terminé, n'hésitez pas à laisser un commentaire pour dire si tout a bien marché, ou si vous avez quelques soucis. C'est le premier projet que j'explique entièrement, j'ai hâte de lire vos retours ! Ce projet peut évidemment être amélioré, avec des statistiques plus poussées, etc. La seule limite sera votre imagination !

A lire

Branchement caméra - présentation

Obtenir la température avec une sonde DS18B20


Branchement caméra - présentation

Choisir et utiliser une caméra sur un Raspberry Pi






Ce tutoriel vous a plu ?

starstarstarstarstar

4.9/5 | 31 votes




Commentaires

35 commentaires publiés.

PiouPiou, le 23/06/2022 à 11h29
Bonjour,
Merci beaucoup votre tutoriel est top tout a fonctionné sans encombre !
J'aimerais pouvoir faire pareil avec plusieurs sondes et qu'elles apparaissent toutes sur le même graph mais cela me parait assez complexe vu mes compétences en dev x)
Fredgui78, le 02/04/2022 à 20h18
Bonjour,
Tout d'abord bravo pour ce très beau projet ! ;o)
Je rencontre un petit soucis > les Google Graphes ne s'affichent pas alors que j'arrive à exécuter parfaitement le petit programme en Python et les données "text" s'affichent correctement dans la page HTML dans le navigateur du Pc.
aurais-je un soucis au niveau de l'exécution des scripts
Lorsque j'ouvre la feuille htlm en local sur la PC windows - les graphs s'affichent
Lorsque je lance la feuille Html hébergée sur la rapsberry après avoir exécuté le programme python les graphes ne s'affichent pas
Dans quelle direction dois je investiguer pour résoudre ce problème.
Merci pour votre éclairage ;o)
Fred
Rod, le 11/01/2022 à 03h22
Bonjour, votre laboratoire est vraiment tres interresant.
je suis entrain de le faire pas a pas.
je suis un peu bloquer dans la section ou faire afficher la temperature dans le navigateur mais un peu plus gros.
avec le fichier .css.
le programme ne semble pas ce referer a ce fichier.css.
donc il n affiche pas tellement gros
pouvez vous me donner une piste?
merci
KimHao, le 05/06/2021 à 03h50
Bonjour, suis super heureux d'avoir trouvé un projet qui correspond beaucoup à mes besoins, je cherchais un moyen de contrôler des températures. Dans tous les cas, merci beaucoup pour la réalisation de ce tuto !
Bon du coup, je me suis lancé mais lorsque que je vais 192.xx.xx.xx:5000/graphTemp, j'ai le 404 no found. Du coup après plusieurs verifications, j'ai constaté que je ne génère pas le template graphTemp.html. Voici ce que j'obtiens comme message d'erreur lorsque je fais :
sudo python3 code-Python-Final-Graphique.py
File "code-Python-Final-Graphique.py", line 108
return render_template(
^
SyntaxeError: 'return' outside function

J'ai beau vérifié, je ne vois pas . Ou peut-être que cela vient d'autre chose mais là ca me dépasse totalement.

Alors au secours , je suis sur la fin de réussir mon projet sur Framboise
Merci d'avance
Raspberry Lab, le 06/06/2021 à 19h02
Bonjour @KimHao,
L'erreur SyntaxeError: 'return' outside function survient lorsque qu'un return se trouve en dehors d'une fonction. Concrètement, c'est très probablement un problème d'indentation. Si votre return n'est pas indenté, le compilateur considèrera que cette ligne n'est pas dans la fonction (et donc n'a pas de sens).
Revérifiez donc l'indentation de votre programme python, et ça devrait fonctionner !

Bonne continuation, Raspberry Lab.
KimHao, le 08/06/2021 à 16h57
Bonjour, un grand merci pour votre retour rapide. Après vérification de mes tabulations, tout fonctionne bien.

J'aimerai optimiser l'application, lorsqu'on click sur "nextDays" alors qu'on est sur le graph d'aujoud'hui, ca nous affiche une erreur. Normal,
j'aimerai plutôt supprimer le bouton "nextDays" ou "prevDays" lorsqu'on ne possède les fichiers des jours concernés.
Je voudrais trouver la solution par moi-même, même si suis un débutant sur python, mais j'ai besoin que l'on m'oriente svp.

Autre point, j'ai voulu ajouter un rafraichissement automatique avec ce code :
(6e ligne) <meta http-equiv="refresh" content="5">
J'ai eu droit a l'erreur : index of range, du coup j'ai arrêté l'appli avec un CRTL+c puis je l'ai relancé.
Et là, nouveau message erreur, le fichier 28-xxxx de la sonde a été supprimé.
J'ai ensuite supprimé ma ligne refresh et fais shutdown ainsi que couper l'alimentation du raspberry.
Après redémmarage et relancer l'appli tout refonctionne normalement. Est ce que mon temps de rafraichement est trop court 5s ?
Précision je suis sur un raspberry pi zero w

Dans tous les cas, je me suis embarqué dans une aventure passionnante et j'adore. Du coup, je vais commander un second rapsberry pour un autre projet.

Encore merci pour votre contribution !!
99
Lat dior, le 28/03/2021 à 20h54
Un grand merci . Tout fonctionne pour moi . Je voudrais juste quelques pistes pour réaliser une autre courbe , si possible sur le même graphique mais d'une autre couleur, puisqu'il s'agit d'une 2éme sonde.

Raspberry Lab, le 28/03/2021 à 22h10
Bonsoir @Lat dior,
Pour avoir plusieurs courbes sur le même graphique, je vous laisse avec la documentation de la librairie utilisée (Google Charts) : https://developers.google.com/chart/interactive/docs/gallery/linechart.
Au niveau du Raspberry Pi, il suffira d'enregistrer les températures des deux sondes. La partie qui peut être plus délicate sera l'adaptation du code JS (dans templates/graphTemp.html). Ceci dit, les ajouts à faire devraient être plus ou moins similaires à ce qui a déjà été fait dans le tutoriel.

En espérant vous avoir aidé,
N'hésitez pas à poster votre avancement / questions ici !

Bonne continuation,
Raspberry Lab.
vercors99, le 06/01/2021 à 11h52
Bravo et merci pour ce tutoriel, très clair, même pour un non-informaticien !!.
L'acquisition fonctionne parfaitement et me permets de surveiller la température en mon absence.
J'envisage d'ajouter une seconde sonde pour avoir aussi la température extérieure
Cordialement
DKT, le 08/10/2020 à 12h28
Bonjour,

Serait-il possible de faire un petit exemple avec

import os
import time

def measure_temp():
temp = os.popen("vcgencmd measure_temp").readline()
return (temp.replace("temp=",""))

while True:
print(measure_temp())
time.sleep(1)

Pour avoir la température du CPU en direct sans page html
tao1024, le 01/06/2020 à 22h32
Bonjour à tous,

J'ai remplacé les deux urls en 404 (css et js) par :
https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.css
https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.js

Les données se remplissent, mais aucune courbe ni valeurs sur la page.
Raspberry Lab, le 02/06/2020 à 23h47
Bonsoir @tao1024,
concernant les liens morts, c'est gentil d'avoir partagé les nouvelles ressources, mais en réalité, elles sont inutiles pour ce projet 🙁 Comme je viens d'éditer le commentaire de @Clem, elles dataient d'une ancienne implémentation du projet.
Concernant votre soucis de courbe (qui n'est donc pas lié aux liens js et css), je viens de refaire le tuto sur un nouveau Raspberry Pi, et je parviens à le finir.

Pouvez-vous préciser votre soucis ?
Le html du graphique est-il bien dans templates/graphTemp.html ?
Vous rendez-vous bien à l'adresse IP:5000/graphTemp ?

Je vais améliorer la fin du tuto dans les prochains jours, afin de le rendre plus clair.

D'ici là, j'attends vos réponses pour pouvoir vous aider ! 🙂
tao1024, le 03/06/2020 à 18h28
Bonjour @RaspBerryLab,

Effectivement j'avais fait une erreur sur le nom du fichiers html:
Il était libellé templates/index.html au lieu de templates/graphTemp.html

Merci beaucoup.
Et bravo pour ce projet très pratique.
Raspberry Lab, le 03/06/2020 à 21h46
Parfait ! J'ai fait la même erreur hier en refaisant le tuto, je vais le modifier 🙂

Content que le projet vous ait plu, et bonne continuation sur Raspberry Pi !
Clem, le 16/05/2020 à 13h39
Bonjour,

merci pour ce tuto très utile. Tous fonctionne bien de mon cote, sauf deux fichiers qui n'existe plus, il s'agit du js et du css. Quelqu'un pourrait il me communiquer le contenu de ces fichiers?
Raspberry Lab, le 18/05/2020 à 10h50
Bonjour @Clem,
Content que le tuto vous ai plu ! Concernant les fichiers js et css, en effet, leurs url ne sont plus accessibles.
Cependant, ce sont des appels résiduels d'une ancienne implémentation du projet, et ils sont inutiles dans la version présentée ! Je viens donc de supprimer leurs appels.

Bonne continuation :)
Raspberry Lab.
Clem, le 15/06/2020 à 17h45
Bonjour,
désolé pour le délai de réponse, mais en effet les sans les liens j'ai quand meme l'interface de fonctionnelle.
abn55, le 21/04/2020 à 21h40
Bonjour,
Débutant en programmation Python, je suis entrain de réaliser une application qui doit me permettre, à terme, d'afficher sur une page HTML des relevés de températures provenant d'une dizaine de sonde.
En phase de test, j'ai déjà réalisé le tuto "lire la température à l'aide d'une sonde".
Tout fonctionne très bien et je parviens à afficher les températures de 2 sondes dans un fichier texte.
Dans ce tuto, j'arrive à la fin de la première étape avec l'affichage de la page HTML "Bienvenue sur espace RaspberryFrancais"
En revanche, dès que je passe à l'étape suivante "afficher la température", l'affichage de la page HTML me renvoie le message suivant :
Not Found
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
A la fin de l'exécution du code, sur app.py, j'ai le message suivant :
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 207-644-360
127.0.0.1 - - [21/Apr/2020 21:15:29] "GET / HTTP/1.1" 404 -

Merci de bien vouloir m'apporter un peu d'aide.
Raspberry Lab, le 02/06/2020 à 23h23
Bonsoir @abn55,
Vous avez sûrement déjà dû trouver la solution mais je pense que le problème venait du fait qu'à partir de cette section, il faut ajouter /getTemp à l'URL pour obtenir la ressource !
Pat5331, le 13/02/2020 à 00h17
Bonjour, j'ai réalisé le tuto, le fichier se rempli avec l'heure et la température, mais rien ne s'affiche sur la page web concernant la courbe et la température moyenne.
J'ai bien la grille du graph les deux flèches en bas, mais pas de tracé de courbe.
Quel est mon problème je ne vois pas
Pat5331, le 13/02/2020 à 00h25
Bonjour, je me suis trompé de tuto lors de ma demande précédente desolé...
Sur celui-ci , j'ai bien suivi me semble t il le tuto, mais si le fichier se rempli bien toutes les 15 minutes avec l'heure et la température, sur la page web rien ne s'affiche comme valeur, et pas de tracé de courbe. juste la grille les flèches et température moyenne sans valeur.
Quel est mon problème .
Cordialement
Damien, le 10/01/2020 à 20h38
Hello,

Super tuto

juste un soucis au moment ou j'intègre le code ou on intègre l'ID de la sonde et que je lance le truc, j'ai chaque fois le message :Not Found

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

quelqu'un peux m'aider?

salutations
cedric, le 01/08/2019 à 18h21
Super merci sa tourne et encore deux questions :
dans quel ligne je peux modifier la prise de température car pour le moment il pend toute les minutes..
Et dernières questions je pense que cela est possible d'afficher deux courbes de températures sur le même graph pour du genre température extérieur et intérieur est ce c'est possible d'avoir un peu d'aide ?
Cedrix, le 17/08/2019 à 09h27
Bonjour je reviens car j’ai un autre soucis au bout de quelques jours de fonctionnement j’ai un nouveau message d’erreur sur la page de visualisation du graph, il me dit qu’il ne trouve pas le fichier text avec la date du jour. Pour alimenter le graph...
Savez vous pourquoi ?
cédric, le 28/07/2019 à 13h06
j'ai un autre soucis quand j'execute le code :
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return 'Hello world'

app.run(debug=True, host='0.0.0.0', port=5000)

j'ai cette réponse :
* Running on http://0.0.0.0:5000/

Traceback (most recent call last):
File "/home/pi/Documents/temperature/test 1.py", line 9, in
app.run(debug=True, host='0.0.0.0', port=5000)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File "/usr/lib/python2.7/dist-packages/werkzeug/serving.py", line 706, in run_simple
test_socket.bind((hostname, port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 98] Address already in use

pouvez vous m'aider à résoudre ce problème ?

Je suis un débutant tout frais dans le domaine je n'ai aucune connaissance de base sur ce domaine n'hesitez pas à me le dire si je fais n'importe quoi.....
Raspberry Lab, le 28/07/2019 à 22h31
Bonjour cédric,
cette erreur apparaît lorsque vous tentez de lancer plusieurs serveurs sur le même port. Concrètement, vous avez dû lancer le script plusieurs fois sans éteindre le serveur.
Redémarrer le Raspberry devrait résoudre le problème.
Sinon, ce lien explique comment résoudre le problème sans redémarrer.

Tenez-moi au courant !
cedric, le 29/07/2019 à 08h28
Bonjour est merci pour la reactivité, j'avais remarqué cela hier soir en me disant justement que j'avais surment mal arrêté le script et comme je ne savais pas comment l'arrêté correctement un bon redémarrage fairait bien l'affaire, depuis mon dernier poste j'ai réussi à avancé un peu, j'ai réussi à faire affiché la température sur la page HTML, j'ai cependant un petit soucis au chapitre 4 ou exactement je dois mettre cette ligne de code "" pour améliorer l'esthétique ?
Ensuite au chapitre 5 j'ai un autre problème avec cette ligne de code :
#Ajouter les imports suivants en debut de fichier
from datetime import datetime, timedelta
import os

# Entree : temperature; Fonction : enregistrer la temperature dans un fichier, au bon endroit
def enregistrement(temperature):
d = datetime.now()
# On recupere de datetime.now l'annee & le jour et on le stocke
annee = str(d)[:4]
jour = str(d)[:10]
repertoire = '/home/pi/ProjetGraphTemp/temperatures/' + annee + '/'
# On vérifie que le repertoire existe. S'il n'existe pas : on le cree
if not os.path.isdir(repertoire):
os.makedirs(repertoire)
fich_Temp = repertoire + jour + '.txt'
# On ouvre le fichier ayant pour nom la date_du_jour.txt en fonction de s'il existe ou pas : en add ou en write
if os.path.exists(fich_Temp):
# Le fichier existe, on l'ouvre en mode ajout
f = open(fich_Temp, "a")
else:
# Le fichier n'existe pas, on le cree et on l'ouvre
f = open(fich_Temp, "w")
# Enfin, on ajoute une ligne dans le fichier au format : HH:MM Temp _ Exemple : 10:15 27.02
time = d.strftime("%H:%M")
print(str(time) + " " + str(temperature), file=f)
f.close()
A la fin du script j'ai constamment une érreur de syntaxe à la fin sur "file=f" est ce que je dois modifier quelque chose à cette endroit ?
Idem au chapitre suivant j'ai copier le script complet en y ajoutant l'adresse IP du raspi et en indiquant la réf de la sonde et j'ai le même érreur de syntaxe.


Raspberry Lab, le 30/07/2019 à 09h53
Bonjour,
pour le problème de syntaxe avec file=f, il me semble que j'avais déjà rencontré cette erreur et que la solution était de lancer le script avec sudo python3 app.py au lieu de sudo python app.py.

Bonne continuation !
TyraxaryT, le 03/06/2019 à 15h06
Bonjour, est il possible de faire la même démarche mais en passant par une base de données ? C'est à dire récupéré les valeurs de la température de la base de données pour y afficher une courbe. Tout en suivant votre programme en python. MErci
Raspberry Lab, le 04/06/2019 à 19h26
Bonjour @TyraxaryT,
Il est en effet tout à fait envisageable de passer par une base de donnée pour stocker les températures tout en gardant une bonne partie du programme ci-dessus.
Il faudrait pour se faire tout d'abord modifier la fonction enregistrer(), pour sauvegarder les valeurs dans une base plutôt que dans un fichier txt. Cette première étape est assez abordable, en cherchant des infos sur l'utilisation de BDN avec Python.
Ensuite, il faudra envoyer les bonnes valeurs, sous la bonne forme à la page graphTemp.html pour que l'API Google Chart dessine le graphique correctement.

Je vais bientôt avoir du temps libre ce qui me permettra d'écrire l'alternative par base de données, directement dans le tutoriel.

En attendant n'hésitez pas à me poser des questions, si vous rencontrez un problème ou autre.

Cordialement,
RaspberryLab.
D@D0U, le 11/05/2019 à 17h34
Bonjour,
je viens de réaliser le tuto pas à pas et tout fonctionne.
Merci
pierro49, le 15/01/2019 à 12h39
Bonjour,
Lorsque j'essaie de compiler j'ai une erreur sur la ligne "print(str(time) + " " + str(temperature), file=f)"
SyntaxError
Avez-vous une idée?

Merci
Raspberry Lab, le 15/01/2019 à 15h54
Bonjour pierro49,
Exécutez-vous bien le script à l'aide de la commande sudo python3 app.py ?
Car il me semble que si l'on ne spécifie pas la version 3 de Python, le script ne s’exécute pas.

Si cela ne résous pas le problème, informez m'en pour qu'on trouve une solution.

Cordialement,
RaspberryLab.
pierro49, le 16/01/2019 à 16h09
Bonjour,

Tout d'abord merci pour votre réactivité sur mon précédent message.
Lorsque j'ouvre la page monip/getTemp j'obtiens ceci:

Traceback (most recent call last)
File "/usr/lib/python3/dist-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/lib/python3/dist-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/lib/python3/dist-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3/dist-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/lib/python3/dist-packages/flask/app.py", line 1982, in wsgi_app
Open an interactive python shell in this frame...

Cordialement
Raspberry Lab, le 17/01/2019 à 12h38
Bonjour,
Je viens de refaire le tuto sur un Raspberry remis à zéro et je n'ai pas obtenu d'erreur, à part à l’exécution du premier script où la fonction getTemp() était appelée avec un paramètre alors qu'il n'y en avait pas dans sa définition (J'ai par conséquent corrigé le script et tout marche). Le problème est que votre erreur n'a pas l'air d'être liée à cela.

Dans le III. Installation de Flask et premiers pas tout marche bien ?
C'est à partir de IV que ça ne fonctionne plus ?
Essayez de modifier la définition def getTemp() par def getTemp(sauvegardeStatus), même si l'erreur semble venir d'ailleurs.

Cordialement,
RaspberryLab.


Commenter
Votre adresse mail ne sera pas visible sur le site.

Les commentaires sous soumis à vérification avant publication.