kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Relever température

Mon Feb 11, 2013 6:37 pm

Pour le moment et en attendant d'avoir un peu plus de temps pour mon projet qui nécessite un peu plus de temps j'ai décide de laisser mon pi en serveur de maison. Et j'aimerais en quelle-que sorte monitoré le pi avec un graphique de la température en fonction de l'heure et minute. Après quelle minute de réflexion j'ai eu l'idée de créer un script qui pour moi est le suivant :

Code: Select all

#!/bin/sh
sudo /opt/vc/bin/vcgencmd measure_temp >> /home/pi/temperature/temp.txt && date +%R >> /home/pi/temperature/temp.txt
le script inscrit le temperature dans mon fichier temp.txt et inscrit aussi hh:mm dans se meme fichier.

Ne reste plus qu'a configurer cron :

Code: Select all

crontab -e
et y ajouter :

Code: Select all

*/10 *   *   *   *    sudo /home/pi/temperature/temps.sh
Ici le script se lance tout les 10 minute.

Et la je suis bloqué car mon fichier .txt se présente comme sa :

Code: Select all

temp=43.3'C
18:38
temp=44.4'C
18:38
temp=43.9'C
18:40
Se qui me pose probleme c'est quand copiant sesi sur un tableur le fait qu'il y est le temp= et le 'C pose probleme, alors comment soit enlever dés le depart temp= et 'C ou apprendre a faire avec mais comment.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

MrNo209
Posts: 18
Joined: Thu Jan 17, 2013 8:36 pm

Re: Relever température

Mon Feb 11, 2013 7:52 pm

Tu peux utiliser awk pour modifier la ligne de température lors de l'écriture.

Je n'ai pas mon raspberry pi sous la main, mais ça devrait ressembler à ça :

Code: Select all

sudo /opt/vc/bin/vcgencmd measure_temp | awk -F "[=\']" '{print $2}' 2> /dev/null >> /home/pi/temperature/temp.txt && date +%R >> /home/pi/temperature/temp.txt
Daniel

kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Re: Relever température

Mon Feb 11, 2013 8:04 pm

Super merci, maintenant il y a bien que le nombre qui s'inscrit dans le fichier. Et t'aurais pas un solution pour que l'heure s'inscrive a coté de la température, car pour le moment la température est inscrite et ensuite à la ligne l'heure est inscrite.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

MrNo209
Posts: 18
Joined: Thu Jan 17, 2013 8:36 pm

Re: Relever température

Mon Feb 11, 2013 8:22 pm

Peut-être ceci :

Code: Select all

sudo /opt/vc/bin/vcgencmd measure_temp | awk -F "[=\']" '{print $2}' 2> /dev/null | tr '\n' ' ' >> /home/pi/temperature/temp.txt && date +%R >> /home/pi/temperature/temp.txt
Daniel

jelopo
Posts: 1605
Joined: Wed Oct 17, 2012 7:53 pm

Re: Relever température

Mon Feb 11, 2013 10:18 pm

Bonjour,
je te te propose une autre écriture pour ton script, bien que celle proposée par MRno209 soit juste :)

Code: Select all

#!/bin/bash
FIC=/home/pi/temperature/temp.txt
DATE=`date +%R`
TEMP=`cat /sys/class/thermal/thermal_zone0/temp`
echo  "${TEMP:0:2},${TEMP:3:1};$DATE" >> $FIC
A toi de modifier la ligne du echo en fonction du format de la température, du séparateur ou de l'heure que tu souhaites.

Et au passage, vire le sudo que tu as dans ta crontab, le script ne fait pas appel à des commandes reservées à root ;)

A+

MrNo209
Posts: 18
Joined: Thu Jan 17, 2013 8:36 pm

Re: Relever température

Tue Feb 12, 2013 1:04 am

Beaucoup plus élégant comme solution! :)

kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Re: Relever température

Tue Feb 12, 2013 8:52 am

Merci pour votre aide.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

Gaetan
Posts: 17
Joined: Fri Oct 26, 2012 10:19 am
Location: Lieusaint (77, France)

Re: Relever température

Tue Feb 12, 2013 10:15 am

@kiwil > je n'arrive pas à accéder à http://kiwilgk.blogspot.fr/, j'ai une page vide, est ce normal ?

kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Re: Relever température

Tue Feb 12, 2013 11:30 am

Bizzare je viens d'essayer sa marche très bien.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Re: Relever température

Thu Feb 14, 2013 7:07 pm

Merci a "jelopo" et "MrNo209" pour l'aide j'ai fait un petit tuto complet pour ceux qu'il souhaiterai faire la même chose.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Thu Feb 14, 2013 7:38 pm

Bonjour,

tu peux ajouter un tracé graphique avec l'historique en utilisant "rdtool" et Highcharts.


Regarde le post suivant:
http://www.raspberrypi.org/phpBB3/viewt ... 65#p208365


J'utilise un script python qui transfère les données à rdtool, à un serveur ftp et cré une page web avec les températures dans des tableaux.

Voici mon script python

Code: Select all

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import os
import sys
import re
import subprocess
import datetime

now = datetime.datetime.now()

# =============================
#
#  fonction pour lire la temperature du CPU
#
#  retourne la valeur en celsius

def ReadCpuTemperature():
  file= open("/sys/class/thermal/thermal_zone0/temp","r")
  string = file.readline()
  file.close()
  cputemp = float(string)/1000.0
  return cputemp

# ==============================
#
#  fonction pour lire capteur de temperature ds18b20
#
#  retourne la temperature en celsius
#
#  attention "loop" infini si le capteur n'est pas fonctionnel 

def ReadSensor( SensorId):
  while(1):
    fname = "/sys/bus/w1/devices/" + SensorId + "/w1_slave"
    tfile = open(fname)
    text = tfile.read()
    tfile.close()
    firstline  = text.split("\n")[0] 
    crc_check = text.split("crc=")[1]
    crc_check = crc_check.split(" ")[1]
    if crc_check.find("YES")>=0:
     break

  secondline = text.split("\n")[1]
  temperaturedata = secondline.split(" ")[9]
  temperature = float(temperaturedata[2:])
  temperature = temperature / 1000.0
  return temperature


# debut du programme principal
# initialiser ES pour le protocole 1wire et la sortie GPIO18=element chauffant


GPIO.setwarnings(False)
#pin 18 en output
GPIO.setmode(GPIO.BOARD)
GPIO.setup(18,GPIO.OUT)

#valeur cible du thermostat

target=4.0
histeresys=0.5
heater_on=True


# lecture  de l'heure
time_string =   time.strftime("%d%b%Y %H:%M:%S",time.localtime())


# ok lire les temperatures des capteurs
# pour les DS18b20, nous avons besoin de les lirent 2 fois (probleme au power up).

th_cpu       = ReadCpuTemperature()
for l in range(0, 2):
  th_main_box  = ReadSensor("28-00000457ecaa")
  th_cam_box   = ReadSensor("28-0000045d387d")
  th_outside   = ReadSensor("28-000004575419")
  th_pond1     = ReadSensor("28-000004575f0a")
  th_pond2     = ReadSensor("28-000004583355")

   
#ok maintenant devons-nous chauffer 

if th_pond1 < th_pond2:
  th_min=th_pond1
else:
  th_min=th_pond2

if th_min > (target+histeresys):
  heater_on = False

if th_min < (target-histeresys):
  heater_on = True

rd_heat = 0 

if heater_on:
   GPIO.output(18,GPIO.HIGH)
   rd_heat = 1
else:
   GPIO.output(18,GPIO.LOW)


# Juste pour verification, afficher les temperatures


t_str =  "{0} T('C) CPU:{1:.0f} Box:{2:.1f} Cam:{3:.1f} Out:{4:.1f} Pond1:{5:.1f} Pond2:{6:.1f}  SetP:{7} Heater:{8}"  .format(time_string,th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,heater_on)
print t_str


#maintenant envoyons les donnees  a rdtool pour faire un graphique chronologique 

# ok rdtool     

rd_str = "N:{0:.0f}:{1:.1f}:{2:.1f}:{3:.1f}:{4:.1f}:{5:.1f}:{6}:{7}" .format(th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,rd_heat)

subprocess.Popen(["/usr/bin/rrdtool","update","/usr/data/temperatures.rrd",rd_str])
subprocess.Popen(["/usr/data/rrd_export.sh"])


#ok  utilisons FTP pour ajouter les donnees sur mon disque dur reseau "cloud disk de WD"
#
#  P.S. /var/www/chart/data est un repertoire temporaire 
#
#  creation d'un fichier temps.txt  et transfere en mode "append" sur ftp
#  le fichier de destination sera code avec la date


nfile = "temp_" + now.strftime("%d_%m_%Y") + (".txt")
hdl_file = open("/var/www/chart/data/temp.txt","w")
time_str2 = now.strftime("%H:%M")
t_str = "{0}\t{1:.0f}\t{2:.1f}\t{3:.1f}\t{4:.1f}\t{5:.1f}\t{6:.1f}\t{7}\t{8}\n"  .format(time_str2,th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,heater_on)
hdl_file.write(t_str)
hdl_file.close()

subprocess.Popen(["/usr/local/bin/AppendFile.sh","temp.txt",nfile,"Rpi","My8assw0rd"])



# Et finalement creons un tableau en html pour afficher les donnee.
# Nous allons ecrire le fichier html et faire un "software link a la fin" 
# de cette facon et aura moins de chance de collision entre la lecture, sur browser, et l'ecriture
# Les fichiers seront codes avec l'information de la minutes donc temp0.html, temp5.html,... etc


file_name = "/var/www/chart/data/heater" + str(now.minute) + ".html"
html_file = open(file_name,"w")
html_file.write("<html><head><title>Pond Temperature</title>")
html_file.write("<meta http-equiv=\"refresh\" content=\"300;URL=\"><!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"></head><body>")
#html_file.write("<table border=\"0\"><tr><td colspan=\"9\"><center><h2>Temp&eacute;rature (&deg;C)</h2></center></td></tr>")
html_file.write("<table><tr valign=\"top\">")
# table pour la temperature Exterieur
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>Ext&eacute;rieur</center></td></tr><tr rowspan=\"2\" valign=\"center\"><td>")
t_str = "{0:.1f}&deg;C" .format(th_outside)
html_file.write(t_str)
html_file.write("<br> </td></tr></table><br></td><td></td>")

# table pour etang
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>&Eacute;tang</center></td></tr><tr><td>R&eacute;servoir du bas</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_pond1)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>R&eacute;servoir du haut</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_pond2)
html_file.write(t_str)
html_file.write("</td></tr></table></td><td></td>")

# table pour chauffage 
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>Chauffage</center></td></tr><tr><td>Valeur cible</td><td>")
t_str = "{0:.1f}&deg;C" .format(target)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>Relais</td><td>")
if heater_on:
 html_file.write("<FONT COLOR=\"FF0000\">ON</FONT>")
else:
 html_file.write("<FONT COLOR=\"000080\">OFF</FONT>")
html_file.write("</td></tr></table></td><td></td>")


#table pour electronique
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>&Eacute;lectronique</center></td></tr><tr><td>Bo&icirc;te</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_main_box)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>Camera</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_cam_box)
html_file.write(t_str)
html_file.write("</td></tr></table></td><td></td>")

#table pour cpu 
html_file.write("<td><table border=\"2\"><tr height=\"1*\"><td colspan=\"2\"><center>CPU</center></td></tr><tr height=\"2*\" rowspan=\"2\" valign=\"center\"><td>")
t_str = "{0:.1f}&deg;C" .format(th_cpu)
html_file.write(t_str)
html_file.write("<br> </td></tr></table><br></td><td><br>&nbsp;&nbsp;&nbsp;<a href=\"../index.html\" target=\"_top\">Chart</a></td></tr></table>")

html_file.write("</body></html>")
html_file.close()

subprocess.Popen(["/bin/ln","-fs",file_name,"/var/www/chart/data/heater.html"])
et le script pour transférer au disque dur "AppendFile.sh"

Code: Select all

#!/bin/bash

IN_LOCAL=$1
OUT_REMOTE=$2

USER=$3
PASSWD=$4

ftp -v -n 10.11.12.4 <<END_OF_SESSION
user $USER $PASSWD
lcd /var/www/chart/data
cd /Daniel/PiData
prompt off
append  $IN_LOCAL $OUT_REMOTE
bye
END_OF_SESSION
Daniel

kiwil
Posts: 82
Joined: Fri Dec 14, 2012 5:01 pm
Contact: Website

Re: Relever température

Fri Feb 15, 2013 2:48 pm

Merci, sa me parait trés intéressant mais beaucoup plus compliqué que mon petit script lol mais je vais quand même me renseigner plus en détaille.
Création de mon blog sur raspberry pi et high-tech: http://www.kiwil-dev.fr

pitchout
Posts: 1
Joined: Tue Nov 26, 2013 7:19 pm

Re: Relever température

Tue Nov 26, 2013 7:29 pm

@ danjperron ou autre,

Je cherche à installer sur ma raspberry un moyen de faire un releve des temperatures periodique. Un peu comme ton releve avec graphique. Je ne suis pas expert en linux et j'ai besoin d'un bon coup de main. Je ne vous demande pas de faire le travail à ma place, mais de bien me guide ou de me fourni un bon topic.

En esperant ne pas arriver dans l'oreille d'un sourd.

Bien à vous tous.

P.S. : Ma sonde est deja installée, je compte en placer plusieurs aussi ...

DG

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Wed Nov 27, 2013 3:10 am

Salut pitchout,

Wow cela fait déja plus d'un an que j'ai fait mon thermostat de température pour l'étang. Et le plus drôle c'est qu'il a planté hier. La température était autour de -12 celsius et la caméra , ou le wifi à planté. J'ai donc enveloppé la caméra et le la boîte électronique avec de l'isolation en mousse pour le reste de l'hivers.



j'utilise un script python StampTemp.py qui roule au 5 minutes dans crontab

Code: Select all

crontab -e
*/1 * *   *   *     /usr/local/bin/Snapshot.py
*/5 * *   *   *     /usr/bin/python /usr/local/bin/StampTemp.py
# */3 * *   *   *     /usr/local/bin/WiFi_Check.sh
0   0 *   *   *     /usr/bin/python /usr/local/bin/DailyMovie.py

Je vais te donner le script directement. Je sais qu'il fait beaucoup de choses mais essaie d'extraire ce que tu as besoin.

Voici les fonctions que StampTemp.py execute
  • 1- Lire les capteurs et la température du cpu
    2 - Détermine si la température d'un des bassins est plus bas que 2 celsius
    3 - Si oui il ferme contact au relais pour le chauffe eau dans le bassin du haut
    4 - Crée un fichier temporaire /temp/stamp.txt (Utiliser comme fichier de debug ex: tail -f /temp/stamp.txt)
    5 - Insère dans rdtool les nouvelles valeurs de température
    6 - Crée les données pour les graphiques (Les pages webs pour 3hr, 8hr, jour, semaine, etc..) execute rrd_export.sh
    7 - Crée un fichier temporaire pour pouvoir transféré dans un serveur ftp
    8 - Utilise ftp et envoi le fichier temporaire en mode "append",ajout, dans le serveur ftp avec un nom de référence contenant la date.
    9 - Crée un page web contenant un table avec les températures.
    10 - et finalement fait un link pour utilisé cette page web comme courante.
Voici le script StampTemp.py

Code: Select all

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import os
import sys
import re
import subprocess
import datetime

now = datetime.datetime.now()

def ReadCpuTemperature():
  file= open("/sys/class/thermal/thermal_zone0/temp","r")
  string = file.readline()
  file.close()
  cputemp = float(string)/1000.0
  return cputemp

def ReadSensor( SensorId):
  while(1):
    fname = "/sys/bus/w1/devices/" + SensorId + "/w1_slave"
    tfile = open(fname)
    text = tfile.read()
    tfile.close()
    firstline  = text.split("\n")[0] 
    crc_check = text.split("crc=")[1]
    crc_check = crc_check.split(" ")[1]
    if crc_check.find("YES")>=0:
     break

  secondline = text.split("\n")[1]
  temperaturedata = secondline.split(" ")[9]
  temperature = float(temperaturedata[2:])
  temperature = temperature / 1000.0
#    if temperature<0:
#print text
  return temperature

GPIO.setwarnings(False)
# set pin 16 et 18 output
GPIO.setmode(GPIO.BOARD)
#GPIO.setup(16,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
#GPIO.output(16,GPIO.LOW)
#GPIO.output(18,GPIO.LOW)
target=2.0
histeresys=0.3
heater_on=True
file_count=1


time_string =   time.strftime("%d%b%Y %H:%M:%S",time.localtime())

th_cpu       = ReadCpuTemperature()
for l in range(0, 2):
  th_main_box  = ReadSensor("28-00000457ecaa")
  th_cam_box   = ReadSensor("28-0000045d387d")
  th_outside   = ReadSensor("28-000004575419")
  th_pond1     = ReadSensor("28-000004575f0a")
  th_pond2     = ReadSensor("28-000004583355")

   
if th_pond1 < th_pond2:
  th_min=th_pond1
else:
  th_min=th_pond2


heater_on = GPIO.input(18)

if th_min > (target+histeresys):
  heater_on = False

if th_min < (target-histeresys):
  heater_on = True

rd_heat = 0 

if heater_on:
   GPIO.output(18,GPIO.HIGH)
   rd_heat = 1
else:
   GPIO.output(18,GPIO.LOW)

t_str =  "{0} T(\xb0C) CPU:{1:.0f} Box:{2:.1f} Cam:{3:.1f} Out:{4:.1f} Pond1:{5:.1f} Pond2:{6:.1f}  SetP:{7} Heater:{8}"  .format(time_string,th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,heater_on)
print t_str


fimg = open("/tmp/stamp.txt","w")
fimg.write(t_str)
fimg.close()

# ok rdtool     

rd_str = "N:{0:.0f}:{1:.1f}:{2:.1f}:{3:.1f}:{4:.1f}:{5:.1f}:{6}:{7}" .format(th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,rd_heat)

subprocess.Popen(["/usr/bin/rrdtool","update","/usr/data/temperatures.rrd",rd_str])
subprocess.Popen(["/usr/data/rrd_export.sh"])
#temp_file = "/usr/data/temp_" + now.strftime("%d_%m_%Y") + (".txt") 
nfile = "temp_" + now.strftime("%d_%m_%Y") + (".txt")

temp_file = "/var/www/chart/data/" + nfile


#/usr/local/bin/LoadFile.sh ${nfile} Pi1 temp-25C
#/usr/local/bin/LoadFile.sh ${nfile} Pi1 temp-25C

 

#if os.path.isfile(temp_file):
# hdl_file = open(temp_file,"a+")
#else:
# hdl_file = open(temp_file,"w")
# hdl_file.write("date\tCPU\tBox\tCam\tOut\tPond1\tPond2\tSetP\tHeater\n")

#time_str2 = now.strftime("%d/%m/%Y %H:%M")

hdl_file = open("/var/www/chart/data/temp.txt","w");

time_str2 = now.strftime("%H:%M")

t_str = "{0}\t{1:.0f}\t{2:.1f}\t{3:.1f}\t{4:.1f}\t{5:.1f}\t{6:.1f}\t{7}\t{8}\n"  .format(time_str2,th_cpu,th_main_box,th_cam_box,th_outside,th_pond1,th_pond2,target,heater_on)


hdl_file.write(t_str)
hdl_file.close()



#/usr/local/bin/Save/File.sh ${nfile} Pi1 tttt-875
#subprocess.Popen(["/usr/local/bin/AppendFile.sh","temp.txt",nfile,"Pi1","ttt-875"])
subprocess.Popen(["/usr/local/bin/AppendFileyafc.sh","temp.txt",nfile,"Pi1","ttt-875"])
# obsolete don't need anymore
#open("temp.txt","a+").write(t_str + "\n")


# let's use minutes to record value

file_name = "/var/www/chart/data/heater" + str(now.minute) + ".html"
html_file = open(file_name,"w")
html_file.write("<html><head><title>Pond Temperature</title>")
html_file.write("<meta http-equiv=\"refresh\" content=\"300;URL=\"><!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"></head><body>")
#html_file.write("<table border=\"0\"><tr><td colspan=\"9\"><center><h2>Temp&eacute;rature (&deg;C)</h2></center></td></tr>")
html_file.write("<table><tr valign=\"top\">")
# table pour la temperature Exterieur
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>Ext&eacute;rieur</center></td></tr><tr rowspan=\"2\" valign=\"center\"><td>")
t_str = "{0:.1f}&deg;C" .format(th_outside)
html_file.write(t_str)
html_file.write("<br> </td></tr></table><br></td><td></td>")

# table pour etang
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>&Eacute;tang</center></td></tr><tr><td>R&eacute;servoir du bas</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_pond1)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>R&eacute;servoir du haut</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_pond2)
html_file.write(t_str)
html_file.write("</td></tr></table></td><td></td>")

# table pour target 
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>Chauffage</center></td></tr><tr><td>Valeur cible</td><td>")
t_str = "{0:.1f}&deg;C" .format(target)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>Relais</td><td>")
if heater_on:
 html_file.write("<FONT COLOR=\"FF0000\">ON</FONT>")
else:
 html_file.write("<FONT COLOR=\"000080\">OFF</FONT>")
html_file.write("</td></tr></table></td><td></td>")


#table pour electronique
html_file.write("<td><table border=\"2\"><tr><td colspan=\"2\"><center>&Eacute;lectronique</center></td></tr><tr><td>Bo&icirc;te</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_main_box)
html_file.write(t_str)
html_file.write("</td></tr><tr><td>Camera</td><td>")
t_str = "{0:.1f}&deg;C" .format(th_cam_box)
html_file.write(t_str)
html_file.write("</td></tr></table></td><td></td>")

#table pour cpu 
html_file.write("<td><table border=\"2\"><tr height=\"1*\"><td colspan=\"2\"><center>CPU</center></td></tr><tr height=\"2*\" rowspan=\"2\" valign=\"center\"><td>")
t_str = "{0:.1f}&deg;C" .format(th_cpu)
html_file.write(t_str)
html_file.write("<br> </td></tr></table><br></td><td><br>&nbsp;&nbsp;&nbsp;<a href=\"../index.html\" target=\"_top\">Chart</a></td></tr></table>")

html_file.write("</body></html>")
html_file.close()
subprocess.Popen(["/bin/ln","-fs",file_name,"/var/www/chart/data/heater.html"])


#  os.symlink(file_name,"/var/www/heater.html") ca marche pas overwrite problem
et voici rrd_export.sh

Code: Select all

#!/usr/bin/env bash

rrdtool xport -s now-3h -e now --step 300 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature3h.xml

rrdtool xport -s now-24h -e now --step 900 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature24h.xml

rrdtool xport -s now-48h -e now --step 1800 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature48h.xml

rrdtool xport -s now-8d -e now --step 7200 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature1w.xml

rrdtool xport -s now-1month -e now --step 10800 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature1m.xml

rrdtool xport -s now-3month -e now --step 43200 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:a:"Outside" \
XPORT:b:"Main Box" \
XPORT:c:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature3m.xml

rrdtool xport -s now-1y -e now --step 86400 \
DEF:a=/usr/data/temperatures.rrd:th_main:AVERAGE \
DEF:b=/usr/data/temperatures.rrd:th_cam:AVERAGE \
DEF:c=/usr/data/temperatures.rrd:th_out:AVERAGE \
DEF:d=/usr/data/temperatures.rrd:th_pond1:AVERAGE \
DEF:e=/usr/data/temperatures.rrd:th_pond2:AVERAGE \
XPORT:c:"Outside" \
XPORT:a:"Main Box" \
XPORT:b:"Camera" \
XPORT:d:"Etang1" \
XPORT:e:"Etang2" > /var/www/chart/data/temperature1y.xml
et maintenant ceci est mon script pour créer le fichier de base pour rdtool. À faire une seule fois. Change le script pour ajuster au nombre de capteur.

createdata.sh

Code: Select all

#! /bin/bash
rrdtool create temperatures.rrd \
--start "02/02/2013" \
--step 300 \
 DS:th_cpu:GAUGE:1200:-40:50 \
 DS:th_main:GAUGE:1200:-40:50 \
 DS:th_cam:GAUGE:1200:-40:50 \
 DS:th_out:GAUGE:1200:-40:50 \
 DS:th_pond1:GAUGE:1200:-40:50 \
 DS:th_pond2:GAUGE:1200:-40:50 \
 DS:th_target:GAUGE:1200:-40:50 \
 DS:th_heater:GAUGE:1200:-40:50 \
 RRA:AVERAGE:0.5:1:2880 \
 RRA:AVERAGE:0.5:6:700 \
 RRA:AVERAGE:0.5:6:700 \
 RRA:AVERAGE:0.5:24:775 \
 RRA:AVERAGE:0.5:144:1500 \
 RRA:AVERAGE:0.5:288:2000 \
 RRA:MIN:0.5:1:600 \
 RRA:MIN:0.5:6:700 \
 RRA:MIN:0.5:24:775 \
 RRA:MIN:0.5:144:1500 \
 RRA:MIN:0.5:288:2000 \
 RRA:MAX:0.5:6:700 \
 RRA:MAX:0.5:24:775 \
 RRA:MAX:0.5:144:1500 \
 RRA:MAX:0.5:288:2000 \
Au cas ou ma carte SD devient corrompue, j'utilise ce code C pour rebâtir le fichier de base pour rdtool. Je monte mon serveur sur le Raspberry Pi et j'exécute le programme. Pratique d'avoir sauvegarder les données sur un serveur.

Fichier RebuildData.c

Code: Select all

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>

 int main(int argc, char * argv[])
{
 FILE * src, * dst;
  char fname[256];
  char line[1024];
 src= fopen(argv[1],"rt");
  unsigned long idate;
  unsigned long _date;
  unsigned long old=0;
  int th_cpu;
  float th_box,th_cam,th_out,th_p1,th_p2,target;
  int _hour,_min;
  int nreturn; 
  char _TF[256]; 
  time_t now,ttime;
  struct tm *d,dtime;

  time(&now);
  d = localtime(&now);


  int cr_day,cr_month,cr_year;

 int tday,tmonth,tyear;

 cr_day = d->tm_mday;
 cr_month = d->tm_mon+1;
 cr_year = d->tm_year + 1900;
   system("rm temperatures.rrd");
   system("./createdata.sh"); 
  
 for(tyear=2013;tyear<= cr_year;tyear++)
  for(tmonth=1;tmonth<13;tmonth++)
   for(tday=1;tday<31;tday++)
   {
 
   sprintf(fname,"temp_%02d_%02d_%04d.txt",tday,tmonth,2013);
   src= fopen(fname,"rt");

if(src == NULL)
 {
   continue;
 }
  
  printf("Scan %s\n",fname);fflush(stdout);
  dtime = *d;

  dtime.tm_sec=0;
  dtime.tm_min=0;
  dtime.tm_hour=0;
  dtime.tm_mday= tday;
  dtime.tm_mon= tmonth -1;
  dtime.tm_year = tyear - 1900; 
  
   

  ttime = mktime(&dtime);

  idate = (unsigned long) ttime;

 fgets(line,1023,src);
 while(!feof(src))
 {
  fgets(line,1023,src);
  
   nreturn = sscanf(line,"%d:%d\t%d\t%f\t%f\t%f\t%f\t%f\t%f\t%s",&_hour,&_min,&th_cpu,&th_box,&th_cam,&th_out,&th_p1,&th_p2,&target,_TF);


   if(nreturn == 10)
    {  
      _date = idate + ((unsigned long) _hour * (unsigned long)  3600) + ((unsigned long) _min *  60);       
      if(_date > old)  
      {sprintf(line,"/usr/bin/rrdtool update temperatures.rrd %lu:%d:%0.1f:%0.1f:%0.1f:%0.1f:%0.1f:%0.1f:%d\n",\
             _date,\
             th_cpu,th_box,th_cam,th_out,th_p1,th_p2,4.0,1);
  //   printf("============\n%s",line);fflush(stdout);
     system(line);
     old=_date;
     }
    }
   else
  break;
}
fclose(src);
}
system("./rrd_export.sh");
return 0;
}
Et pour ne pas à avoir de problème avec la carte SD, les page web pour les charts sont monté en tmpfs (ramdisk).

J'ai même /var/log sur tmpfs. De cette façon la carte n'est pas sollicité beaucoup et je n'ai pas de problème de corruption.
Le Raspberry Pi est à l'extérieur en wifi.

fichier /etc/fstab

Code: Select all

root@raspberrypi:/usr/local/bin# cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
tmpfs           /tmp		tmpfs   defaults,noatime,mode=1777 0    0
tmpfs		/var/log	tmpfs	defaults,noatime,mode=0755 0    0
#tmpfs           /var/lock	tmpfs   defaults,noatime,mode=0755 0    0
tmpfs           /var/www/chart/data tmpfs defaults,noatime,mode=0755,uid=www-data,gid=www-data 0 0
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
Les pages web pour l'historique de la température sont donc en mémoire vive. /var/www/chart/data

Et finalement j'utilise lighttpd pour web server. Peut être un peut dépassé mais il fontionne bien.



Je sais que c'est beaucoup de choses mais commence petit. Lire les capteurs en premier, Créer le fichier de base rdtool, etc..

P.S. Renseigne toi sur HighCharts et Rdtool.

Daniel
Last edited by danjperron on Wed Nov 27, 2013 12:45 pm, edited 2 times in total.

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Wed Nov 27, 2013 3:45 am

Voici mon fichier html qui affiche les données. J'utilise le même fichier pour tout. Le javascript modifie l'information pour afficher le bon lapse de temps.

P.S. Cette page web est une version modifié de Tafkas http://thule.mine.nu/html.

Code: Select all

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <title>historique de la temperature</title>

    <!-- Le styles -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap.min.css" rel="stylesheet">
    <style type="text/css">
      body {
        padding-top: 60px;
        padding-bottom: 40px;
      }
    </style>
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.2.2/css/bootstrap-responsive.min.css" rel="stylesheet">

    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="ico/favicon.ico">

  </head>

  <body>

    <script type="text/javascript">
         
       // return everything after the question mark
       function GetUrlParameter() {
         idx = window.location.href.indexOf("?");
         if( idx < 0 ) return "";
        return window.location.href.substring(idx+1);
        }
          urlParameter = GetUrlParameter();
     </script>

    <div class="navbar navbar-inverse navbar-fixed-top">
         <div class="navbar-inner">
           <div class="container-fluid">

             <a class="brand" href="//<mon IP>/index.html">La Temp&eacute;rature de l'&eacute;tang</a>
             <div class="nav-collapse collapse">
               <ul class="nav">
                 <li class="active"><a href="http://<mon IP>/index.html">Home</a></li>
               </ul>
             </div><!--/.nav-collapse -->
           </div>
         </div>
       </div>

       <div class="container-fluid">
         <div class="row-fluid">
           <div class="span2">
             <div class="well sidebar-nav">
               <ul class="nav nav-list">
                 <li class="nav-header">Temp&eacute;rature</li>
                  <li><a href="lastTemp.html?3h">Les derni&egrave;res 3h</a></li>
                  <li><a href="lastTemp.html?24h">Les derni&egrave;res 24h</a></li>
                  <li><a href="lastTemp.html?48h">Les derni&egrave;res 48h</a></li>
                  <li><a href="lastTemp.html?1w">La derni&egrave;re semaine</a></li>
                  <li><a href="lastTemp.html?1m">Le dernier mois</a></li>
                  <li><a href="lastTemp.html?3m">Les derniers 3 mois</a></li>
                  <li><a href="lastTemp.html?1y">La derni&egrave;re ann&eacute;e</a></li>
                  <!-- <li><a href="lastyearminmax.html">Last Year (Min and Max)</a></li> -->

               </ul>
             </div><!--/.well -->
           </div><!--/span-->
           <div class="span10">
             <div id="content">

               </div>
           </div><!--/span-->
         </div><!--/row-->

         <hr>

       </div><!--/.fluid-container-->
    <!-- Le javascript
    ================================================== -->

    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.min.js" charset="UTF-8"></script>
<!--
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/highcharts/2.3.1/highcharts.js" charset="UTF-8"></script>
-->
    <script type="text/javascript" src="js/highcharts.js" charset="UTF-8"></script>
    <script type="text/javascript" src="js/chart.min.js" charset="UTF-8"></script>
    <script type="text/javascript">
      
       //   multiple parameters  decoder
      function gup( name ){
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
	var regexS = "[\\?&]"+name+"=([^&#]*)";  
	var regex = new RegExp( regexS );  
	var results = regex.exec( window.location.href ); 
 	if( results == null )    return "";  
	else    return results[1];}
       

        // return everything after the question mark
       function GetUrlParameters() {
         idx = window.location.href.indexOf("?");
         if( idx < 0 ) return "";
        return window.location.href.substring(idx+1);
        }
           

      
      function GetChartXml() {
        switch(urlParameter)
        {
          case "3h":
          case "48h":
          case "1w":
          case "1m":
          case "3m":
          case "1y":
                     return "data/temperature" + urlParameter + ".xml";
         }
         return "data/temperature24h.xml";
      }
      
      
      function GetSerieName(sName)
      {
        
        switch(sName)
        {
          
          case "Outside": return "Extérieur";
          case "Main Box": return "Électronique";
          case "Camera":   return "Caméra";
          case "Etang1":   return "Étang du bas";
          case "Etang2":   return "Étang du haut";
          
          
          
          
        }
        
        
        return sName;
        
      }
      
      function GetChartTitle()
      {
       
        switch(urlParameter)
        {
          case "3h":
                return "La température des 3 dernières heures";
          case "48h":
                return "La température des 48 dernières heures";
          case "1w":
                return "La température de la dernière semaine";
          case "1m":
                return "La température du dernier mois";
          case "3m":
                return "La température des 3 derniers mois";
          case "1y":
                return "La température de la dernière année";
          }
                return "La température des 24 dernières heures";
      }
      
      
      
      
      
      $(document).ready(function() {

        $.ajax({
          type: "GET",
          url: GetChartXml(),
          dataType: "xml",
          success: function(xml) {
            var series = []

            //define series
            $(xml).find("entry").each(function() {
              var seriesOptions = {
                name: GetSerieName($(this).text()),
                data: []
              };
              options.series.push(seriesOptions);
            });

            //populate with data
            $(xml).find("row").each(function() {
              var t = parseInt($(this).find("t").text()) * 1000

              $(this).find("v").each(function(index) {
                var v = parseFloat($(this).text())
                v = v || null
                if (v != null) {
                  options.series[index].data.push([t, v])
                };
              });
            });

            options.title.text = GetChartTitle();
            $.each(series, function(index) {
              options.series.push(series[index]);
            });

            //add sunrise and sunset
            options.xAxis.plotBands = []
            for (var i = 1; i >= 0; i--) {
              var d = new Date();
              d.setHours(0,0,0,0);
              d.setDate(d.getDate()-i);
              var sunrise = d.getTime()+computeSunrise(dayOfYear(), true);
              var sunset = d.getTime()+computeSunrise(dayOfYear(), false);
              options.xAxis.plotBands.push({
                from: sunrise,
                to: sunset,
                color: '#FCFFC5'  
              });  
            };
            chart = new Highcharts.Chart(options);
          }
        });
      });
    </script>


</body>
</html>

Voici un exemple de la page web.
Image

Et des charts
Image


Daniel
Last edited by danjperron on Wed Nov 27, 2013 12:48 pm, edited 1 time in total.

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Wed Nov 27, 2013 12:37 pm

Salut pitchout,

j'espère que je ne t'ai pas trop saturé d'information.

J'ai regardé mon code python StampTemp.py et il y a beaucoup de code mort , les lignes avec # au début.
J'ai oublié de t'envoyer mon script de transfert si tu veux garder les données sur un serveur.
J'utilisait le ftp standard mais cette été j'ai fait un update pour la nouvelle version et le système gelait sur tout transfert avec ftp.
J'utilise donc le ftp yafc.


Voici le script ftp standard

Code: Select all

root@raspberrypi:/usr/local/bin# cat AppendFile.sh
#!/bin/bash

IN_LOCAL=$1
OUT_REMOTE=$2

USER=$3
PASSWD=$4

ftp -v -n 10.11.12.4 <<END_OF_SESSION
user $USER $PASSWD
lcd /var/www/chart/data
cd /Daniel/PiData
prompt off
append  $IN_LOCAL $OUT_REMOTE
bye
END_OF_SESSION

et la version ftpyafc

Code: Select all

root@raspberrypi:/usr/local/bin# cat AppendFileyafc.sh 
#!/bin/bash

IN_LOCAL=$1
OUT_REMOTE=$2

USER=$3
PASSWD=$4

yafc $USER:$PASSWD@10.11.12.4/Daniel/PiData <<END_OF_SESSION
lcd /var/www/chart/data
cd /Daniel/PiData
put $IN_LOCAL -a -o $OUT_REMOTE
quit
END_OF_SESSION
La syntaxe n'est pas la même mais au moins il ne gèle pas.

Le tout est transféré dans un disque réseau de WesternDigital My Cloud (3TB). Aussi si tu as remarqué j'ai une caméra qui fonctionne avec mjpg streamer et je capture une image à la minute pour faire un vidéo de la journée. Au mois de mars dernier, nous avons eu une bonne accumulation de neige et voici le time lapse en vidéo. Il est noir au début puisque mes vidéos commence à 12:00am. Tu remarqueras que je travaille a incruster la température sur le vidéo. Il est fonctionnel vers la fin.

Voici le lien pour le vidéo.
https://dl.dropboxusercontent.com/u/488 ... _03_19.mp4

Daniel

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Sat Dec 14, 2013 10:00 pm

Salut Pitchout,

J'espère que tu as réussi ton système.


Aujourd'hui il fait -24 Celsius et la Raspberry Pi a tenu le coup.

La page web HighCharts avec le déclin de la température.

https://dl.dropboxusercontent.com/u/488 ... .09.21.png

Voici l'image de l'étang avec le Raspberry Pi. C'est l'hivers tout est glace et neige.

Image


Et une vue que la caméra web me montre. Tout est gelé àla surface avec un dôme de glace au dessus de la chute.

Image

Daniel

danjperron
Posts: 3503
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Relever température

Tue Dec 17, 2013 12:26 pm

Nouveau record pour mon superviseur de l'étang.

Cette nuit la température était de -29 celsius et le système à tenu le coup.

Image

Daniel

Return to “Français”