[Bygglogg]-ish Raspberry Pi som temperaturmätare

Trädvy Permalänk
Medlem
Registrerad
Sep 2006

[Bygglogg]-ish Raspberry Pi som temperaturmätare

Tjena

Jag satt i samma tankar som många andra, vad ska jag göra med min Pi?
Eftersom jag var på jakt efter något som kan logga temperaturen i mitt serverrum och presentera det för mig på ett snyggt sätt så började jag helt enkelt forska i det.

Hårdvaran jag använde:
Raspberry Pi med ett 8GB minneskort (4GB går lika bra).
Strömadapter (gammal HTC-laddare).
USB-minne (4GB) för att installera Debain.
1st DS18B20+.
1st Metallfilmsmotstånd 0.25W 4,7Kohm .
1st GPIO 26 Pin Connector (för att inte löda direkt på min Pi).

Ladda ner:
NOOBS_v1_3_4.zip från http://www.raspberrypi.org/downloads/
och
SDFormatterv4.zip från https://www.sdcard.org/downloads/formatter_4/

Beställde två resistorer, en i reserv :).

Löda fast det på GPIO-connectorn enl följande bild

Nu ger vi oss på mjukvaran, vi börjar med att installera operativsystemet.
Formatera minneskortet med SDFormatter och kopiera sedan över innehåller från NOOBS_v1_3_4.zip rakt in på minneskortet.
Släng minneskortet i din Pi och starta den.
När den har startat visas en lista över operativsystem som kan installeras, välj Raspbian.
När det är klart startas automatiskt raspi-config där man kan ställa in språk, tid osv.

Innan vi går vidare ska vi testa så att hårdvaran fungerar.
Så stäng ner din Pi och koppla in temperaturmätaren och starta den igen.
Kör sedan

sudo modprobe w1-gpio sudo modprobe w1-therm cat /sys/bus/w1/devices/28-*/w1_slave

Om hårdvaran fungerar som den ska ska vi få ett mätvärde. Här ser vi att den visar 27,6 grader celcius.

Då är det dags att bygga lite script för att få detta snyggt.
Installera libwww-perl

sudo apt-get install libwww-perl

Installera paramiko (detta är till för att skicka graferna med sftp till t.ex en webserver).

sudo apt-get install python-paramiko

Installera rrdtool

sudo apt-get install rrdtool

Skapa en mapp som heter temperature

sudo mkdir temperature

Gå in i mappen

cd temperature

Skapa skriptet som ska skapa databasen

sudo nano create_db.sh

Klistra in följande text och spara med CTRL + X följt av Y och ENTER.

#!/bin/bash rrdtool create hometemp.rrd --start N --step 300 \ DS:temp:GAUGE:600:U:U \ DS:outtemp:GAUGE:600:U:U \ RRA:AVERAGE:0.5:1:12 \ RRA:AVERAGE:0.5:1:288 \ RRA:AVERAGE:0.5:12:168 \ RRA:AVERAGE:0.5:12:720 \ RRA:AVERAGE:0.5:288:365

Kör skriptet så att databasen skapas

sudo sh create_db.sh

Nu skapar vi skriptet som ska generera graferna.

sudo nano create_graphs.sh

Klistra in följande text och spara med CTRL + X följt av Y och ENTER.

#!/bin/bash DIR="/home/pi/temperature/" #set to C if using Celsius TEMP_SCALE="C" #define the desired colors for the graphs INTEMP_COLOR="#CC0000" OUTTEMP_COLOR="#0000FF" #hourly rrdtool graph $DIR/temp_hourly.png --start -4h \ DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \ AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \ DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \ LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]" #daily rrdtool graph $DIR/temp_daily.png --start -1d \ DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \ AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \ DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \ LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]" #weekly rrdtool graph $DIR/temp_weekly.png --start -1w \ DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \ DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \ AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \ LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]" #monthly rrdtool graph $DIR/temp_monthly.png --start -1m \ DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \ DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \ AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \ LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]" #yearly rrdtool graph $DIR/temp_yearly.png --start -1y \ DEF:temp=$DIR/hometemp.rrd:temp:AVERAGE \ DEF:outtemp=$DIR/hometemp.rrd:outtemp:AVERAGE \ AREA:temp$INTEMP_COLOR:"Inside Temperature [deg $TEMP_SCALE]" \ LINE1:outtemp$OUTTEMP_COLOR:"Outside Temperature [deg $TEMP_SCALE]"

Nu skapar vi skriptet som ska hämta temperaturen. Denna hämtar även yttertemperaturen från något som heter metar.
Leta upp din stad här http://weather.rap.ucar.edu/surface/stations.txt och ersätt KMSN.TXT i skriptet nedan med motsvarande för din stad.

sudo nano get_temp.pl

#!/usr/bin/perl use LWP::UserAgent; my $dir = '/home/pi/temperature/'; my $metar_url = 'http://weather.noaa.gov/pub/data/observations/metar/stations/...'; my $is_celsius = 0; #set to 1 if using Celsius my $ua = new LWP::UserAgent; $ua->timeout(120); my $request = new HTTP::Request('GET', $metar_url); my $response = $ua->request($request); my $metar= $response->content(); $metar =~ /([\s|M])(\d{2})\//g; $outtemp = ($1 eq 'M') ? $2 * -1 : $2; #'M' in a METAR report signifies below 0 temps $outtemp = ($is_celsius) ? $outtemp + 0 : ($outtemp * 9/5) + 32; $modules = `cat /proc/modules`; if ($modules =~ /w1_therm/ && $modules =~ /w1_gpio/) { #modules installed } else { $gpio = `sudo modprobe w1-gpio`; $therm = `sudo modprobe w1-therm`; } $output = ""; $attempts = 0; while ($output !~ /YES/g && $attempts < 5) { $output = `sudo cat /sys/bus/w1/devices/28-*/w1_slave 2>&1`; if($output =~ /No such file or directory/) { print "Could not find DS18B20\n"; last; } elsif($output !~ /NO/g) { $output =~ /t=(\d+)/i; $temp = ($is_celsius) ? ($1 / 1000) : ($1 / 1000) * 9/5 + 32; $rrd = `/usr/bin/rrdtool update $dir/hometemp.rrd N:$temp:$outtemp`; } $attempts++; } #print "Inside temp: $temp\n"; #print "Outside temp: $outtemp\n";

Nu skapar vi skriptet som skickar graferna till FTP-servern, tänk på att modifiera skriptet nedan med dina uppgifter för FTP-servern.

sudo nano ftp_graphs.py

#!/usr/bin/python import paramiko from commands import getstatusoutput DIR = '/home/pi/temperature/' #generate graphs getstatusoutput(DIR + '/create_graph.sh') ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('your_sftp_server', port=your_sftp_port, username='your_username', password='your_password') sftp = ssh.open_sftp(); sftp.put(DIR + '/temp_hourly.png', 'rpi_temp/temp_hourly.png') sftp.put(DIR + '/temp_daily.png', 'rpi_temp/temp_daily.png') sftp.put(DIR + '/temp_weekly.png', 'rpi_temp/temp_weekly.png') sftp.put(DIR + '/temp_monthly.png', 'rpi_temp/temp_monthly.png') sftp.put(DIR + '/temp_yearly.png', 'rpi_temp/temp_yearly.png') sftp.close()

Nu skapar vi websidan där graferna presenteras. Denna kan även skapas lokalt på din pi om du vill. Då måste du installera en webbserver på den vilket jag inte kommer att gå igenom här.

sudo nano index.php

<? $lastmod = date("F d, Y g:i A", filemtime("temp_daily.png")); ?> <html> <head> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="refresh" content="3600" > <title>RPi Temperature</title> <style> BODY { font-family: arial; font-size: 10pt; background-repeat: no-repeat; background-position: center center; } H2, H3 { margin-bottom: 0; } </style> </head> <body> <div style="width: 800px; margin-left: 100px;" > <h2>RPi Temperature Inside & Outside</h2> <i>Last Modified: <?=$lastmod?></i> <h3>Daily</h3> <img src="temp_daily.png" /> <h3>Weekly</h3> <img src="temp_weekly.png" /> <h3>Monthly</h3> <img src="temp_monthly.png" /> <h3>Yearly</h3> <img src="temp_yearly.png" /> </div> </body> </html>

Nu måste vi se till att skripten körs automatiskt.

sudo crontab -e

Klistra in och spara med CTRL + X följt av Y och ENTER.

*/1 * * * * sudo /home/pi/temperature/get_temp.pl */5 * * * * sudo /home/pi/temperature/ftp_graphs.py */1 * * * * sudo /home/pi/temperature/create_graphs.sh

Se så snyggt det blev

Större delen av det jag har skrivit kommer från http://blog.turningdigital.com/2012/09/raspberry-pi-ds18b20-t...

Nu återstår lite finjusteringar samt att jag skulle vilja presentera temperaturen på webbsidan i siffror så jag kan se den aktuella temperaturen just nu.
Det går att göra detta med flera temperaturmätare om man vill. För att mäta i olika rum t.ex
Jag tror det var allt. Men har jag missat något så säg till :).

EDIT:
Jag lyckades att lösa problemet med att jag ville skriva ut temperaturen.

Det jag gjorde var att i
create_graphs.sh lägga till

rrdtool lastupdate $DIR/hometemp.rrd > $DIR/tmp.txt

i ftp_graphs.py lägga till

sftp.put(DIR + '/tmp.txt', 'rpi_temp/tmp.txt')

Precis under

sftp.put(DIR + '/temp_yearly.png', 'rpi_temp/temp_yearly.png')

Sedan på webbsidan index.php lägga till

<h3>Temp: <?php $section = file_get_contents('./tmp.txt', NULL, NULL, 27, 4); print($section); ?> ℃ </h>

Dator: https://www.inet.se/kundvagn/bild/9823049/
Server: 2x HP ProLiant Microserver Gen8, 16GB/st, ESXi 6.0
NAS: Synology DS413 4st 3TB | QNAP TS-879 Pro 8st 2TB

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2006

Kul att se att vi är flera som vill precis samma!

Jag har inte blivit helt klar än men jag har valt en lite annan lösning.
Mysql för lagring av mätvärden.
Crontab kör python skript som lagrar nya mätvärden var 20e minut.
Php anropar databasen och genererar grafer. Nu meckar jag med att få till grafen.

Kul att du lägger upp din lösning. Det grår att körs krypterad ftp i python utan p paramikko. Ska se om jag kan läggs upp ett exempel.

Mvh z

Edit:
Här en variant av den inbyggda som gör att du kan ansluta med krypterad ftp (TSL) utan att köra extra moduler.

import ftplib,os,sys,time,socket,ssl from ftplib import FTP_TLS class tyFTP(FTP_TLS): def __init__(self, host='', user='',port='', passwd='', acct='', keyfile=None, certfile=None, timeout=10): FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, timeout) def connect(self, host='',hostname='', port=0, timeout=-999): '''Connect to host. Arguments are: - host: hostname to connect to (string, default previous host) - port: port to connect to (integer, default previous port) ''' if host != '': self.host = host if port > 0: self.port = port if timeout != -999: self.timeout = timeout try: self.sock = socket.create_connection((self.host, self.port), self.timeout) self.af = self.sock.family #add this line!!! self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile,ssl_version=ssl.PROTOCOL_TLSv1) #add end self.file = self.sock.makefile('rb') self.welcome = self.getresp() except Exception as e: print e return self.welcome class FTP(): def __init__(self,host='',hostname='', user='',port=22, passwd='',pasive=True, encrypted=True): # Verivy reiced arguments if host != '' and hostname != '': sys.exit('ERROR: Arguments host and hostname are mutually exclusive.\n') # Get IP of hostname if hostname was given try: if not hostname=='': # If unset, i.e. False pass host = socket.gethostbyname(hostname) except: sys.exit('ERROR: The host name could not be resolved: %s\n' %hostname) # Assign recieved arguments self.encrypted=encrypted self.user=user self.passwd=passwd self.host=host self.hostname=hostname self.port=port # Create ftpobj self.sftp=tyFTP(FTP_TLS) # Set passive for this connection type self.sftp.set_pasv(pasive) def updateHostByName(self, hostname=False): # Update hostname if a new hostname is parsed if not hostname: pass else: self.hostname=hostname # Resolve hostname to IPv4 adress try: self.host = socket.gethostbyname(self.hostname) return True except: return False def sendFile(self,local,remote): try: # Check if the local file exists if not os.path.isfile(local): raise # Establish connection self.sftp.connect(host=self.host,port=self.port,timeout=10) if self.encrypted: #self.sftp.auth() # Setup secure controll connection self.sftp.prot_p() #Setup secure data connection # Log in on server self.sftp.login(self.user,self.passwd) # Change folder on server self.sftp.cwd(remote) self.sftp.sendcmd("TYPE I") #Open file and send fileHandle=open(local) self.sftp.storbinary('STOR %s' %local,fileHandle) fileHandle.close() self.sftp.close() return True except: if 'fileHandle' in vars(): if not fileHandle.closed: fileHandle.close() raise return False def sendFiles(self,local,remote): try: # Check if the local files exists before establishing connection for currentFile in local: if not os.path.isfile(currentFile): print 'file %s not found' %currentFile raise # Establish connection self.sftp.connect(host=self.host,port=self.port,timeout=10) if self.encrypted: self.sftp.prot_p() #Setup secure data connection # Log in on server self.sftp.login(self.user,self.passwd) # Change folder on server self.sftp.cwd(remote) self.sftp.sendcmd("TYPE I") # Send files status=[] for currentFile in local: try: #Open file and send fileHandle=open(currentFile) self.sftp.storbinary('STOR %s' %currentFile,fileHandle) fileHandle.close() status.append(True) except: print 'Problem sending' print sys.exc_info() if 'fileHandle' in vars(): if not fileHandle.closed: fileHandle.close() # Close connection self.sftp.close() return status except: return False #---------------------------------------------------------------------------- if __name__ == '__main__': ftpServerDNS="www.mydomain.se" host='192.168.10.1' sftp=FTP(host=host,port=1234,passwd='passwd',user='username') print 'Send file:' status=sftp.sendFile('ftps.py','www/test') print status print 'Send files:' status=sftp.sendFiles(['test.1','test.2'],'www/test') print status

Dold text

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Jag använder också min Pi för temperaturmätning. Jag har en billig och kass mätare kopplad till usb i stället. TEMPer USB från något kinesiskt bolag.

Mitt vardagsrum.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2006
Skrivet av Emaku:

Jag använder också min Pi för temperaturmätning. Jag har en billig och kass mätare kopplad till usb i stället. TEMPer USB från något kinesiskt bolag.

http://i.imgur.com/5JY8fIm.png

Mitt vardagsrum.

Vad använder du för att visualisera datat? Hur sparar du datat?

Med vänlig hälsning,
z

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Trädvy Permalänk
Medlem
Registrerad
Sep 2006

Man tackar.
Jag vill även få ut MIN och MAX-temp för dagen/veckan. Jag gissar på att man kan göra det med RRDtool också.

Dator: https://www.inet.se/kundvagn/bild/9823049/
Server: 2x HP ProLiant Microserver Gen8, 16GB/st, ESXi 6.0
NAS: Synology DS413 4st 3TB | QNAP TS-879 Pro 8st 2TB

Trädvy Permalänk
Medlem
Registrerad
Maj 2002
Skrivet av Emaku:

Jag använder också min Pi för temperaturmätning. Jag har en billig och kass mätare kopplad till usb i stället. TEMPer USB från något kinesiskt bolag.

http://i.imgur.com/5JY8fIm.png

Mitt vardagsrum.

Hade oxo velat vet mer hur du presenterar datan ifrån usb loggern, lust att dela med dig?

mvh /d

meep meep

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Jag använder rrdtool för både sparande och visualiserade av data. Tempen läser jag med ett program jag hitta på github https://github.com/edorfaus/TEMPered

Jag kör följande kommando i en screen för att updatera databasen.

while true; do update temp.rrd $(date +"%s"):$(/home/user/repo/TEMPered/build/utils/tempered |cut -d " " -f 4); sleep 60; done

Jag kanske borde lägga det i en cron men orka liksom.

För att generera grafen kör jag

rrdtool graph rtemp_year.png -w 365 -h 100 \ --title="Yearly Temperature 1 day/px" \ --slope-mode --alt-autoscale -L 2 \ --start end-1y --end "January 1"+1y \ --legend-position=south \ --border 0 \ DEF:year_data_avg=temp.rrd:temp:AVERAGE \ DEF:year_data_min=temp.rrd:temp:AVERAGE:reduce=MIN \ DEF:year_data_max=temp.rrd:temp:AVERAGE:reduce=MAX \ CDEF:year_avg=year_data_avg,2.58,- \ CDEF:year_min=year_data_min,2.58,- \ CDEF:year_max=year_data_max,2.58,- \ AREA:year_max#CCCCCC \ AREA:year_min#FFFFFF \ LINE1:year_max#888888 \ LINE1:year_min#888888 \ LINE1.5:year_avg#FF0000 \ VDEF:label_max=year_max,MAXIMUM \ VDEF:label_avg=year_avg,AVERAGE \ VDEF:label_min=year_min,MINIMUM \ GPRINT:label_max:"MAX %.1lf°C" \ GPRINT:label_min:"MIN %.1lf°C" \ GPRINT:label_avg:"AVG %.1lf°C" \

Sensorn är kass och visar 2.58 grader för mycket jämfört med min andra termometer. Jag litar mer på den så jag drar ifrån 2.58 när jag visar datan.

De genererade graferna läggs i rooten på en webserver. På min stationära dator har jag en desktop widget som läser och visar graferna därifrån.

Trädvy Permalänk
Medlem
Plats
stockholm
Registrerad
Mar 2014

Jag använder min till att logga temperaturer från Tellstick och presentera fina diagram

Här har vi resultatet, alla sensorer är inte mina. Låter en kollega vara med i projektet också
http://tellstick.no-ip.biz/public/

Trädvy Permalänk
Medlem
Registrerad
Jul 2013
Skrivet av joaeng:

Jag använder min till att logga temperaturer från Tellstick och presentera fina diagram

http://forumbilder.se/DDMPH/2014-08-08-17-48-18.jpg?width=150

Här har vi resultatet, alla sensorer är inte mina. Låter en kollega vara med i projektet också
http://tellstick.no-ip.biz/public/

Fräsigt! Hur?

Trädvy Permalänk
Medlem
Plats
stockholm
Registrerad
Mar 2014
Skrivet av sickhouse:

Fräsigt! Hur?

Ja lite kul att se temperaturen under året

Jag har inte utvecklat sidan själv, bara installerat den på min raspberry pi

Mer information finns här http://www.telldus.com/forum/viewtopic.php?f=11&t=3364&sid=8258a1f22de0a35ab258f74c430f8739

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

Tack för en bra och utförlig guide. Då jag är helt ny på detta var den till stor hjälp för mig.

Jag har följt guiden och allt fungerar bra men jag skulle vilja logga temperaturer från två olika DS18B20 sensorer.

Är det någon som kan visa hur jag ska modifiera skripten så att jag istället för att logga metar-datan loggar data från en andra tempsensor.

Trädvy Permalänk
Medlem
Registrerad
Jan 2013
Skrivet av mattiaso:

Tack för en bra och utförlig guide. Då jag är helt ny på detta var den till stor hjälp för mig.

Jag har följt guiden och allt fungerar bra men jag skulle vilja logga temperaturer från två olika DS18B20 sensorer.

Är det någon som kan visa hur jag ska modifiera skripten så att jag istället för att logga metar-datan loggar data från en andra tempsensor.

Jag fick guiden att funka (orkade inte bråka med en webbserver), så jag titta på alternativ.
Testade nettemp
https://github.com/sosprz/nettemp

Nettemp var väldigt lätt att installera och allt körs på rasberry pi
I nettemp ska det inte vara nog problem att köra flera sensorer

Trädvy Permalänk
Medlem
Plats
Järfälla
Registrerad
Jan 2004

Mäter också temperaturen i min lägenhet med min raspberry pi. Jag väljer att spara datat i en MySQL databas (dock hostad på min server). När den är nere eller liknande sparas datat i en textfil för att laddas upp på servern när den är igång igen. Jag använder phplot för att plotta grafer (finns säkert bättre verktyg). Det mesta är ihopskrivet i hast, men jag delar med er om ni är intresserade. Så här blir grafen (går att ändra mkt med phplot, men detta duger just nu). Just nu sitter inte temperaturproben så fiffigt till, får ändra på det när man har tid. Går ju att koppla in fler på samma port. Har ni någon uppfattning om hur känsligt det är med störningar, och hur långa kablarna kan tänkas kunna vara max?

De senaste 24 timmarna

och lite längre

Jag har valt att skriva allting med PHP.
temp.php - På raspberry PI

<?php function update($db) { $file = '/home/pi/temp/temperatures.txt'; $dbfile = '/home/pi/temp/tempback.txt'; $content = file_get_contents($file); $content = explode("\n", $content); if (count($content) > 1) { unset($content[count($content)-1]); $sql = "INSERT INTO pi (time, temperature) VALUES "; foreach ($content as $r) { $date = substr($r, 0, 19); $temp = substr($r, 20,5); $sql .= "('$date', '$temp'), "; } $sql = substr($sql,0,-2); $sql .= ";"; $stmt = $db->prepare($sql); if ($stmt->execute()) { file_put_contents($dbfile, file_get_contents($file), FILE_APPEND); file_put_contents($file, ''); } } } try { $db = new PDO('mysql:host=192.168.1.150;dbname=temperatures', 'user', 'pw'); $db->exec("SET CHARACTER SET utf8"); $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1); } catch (PDOException $e) { $db = null; } if (!file_exists('/sys/bus/w1/devices/28-00000527b552/w1_slave')) { die(); } $data = file_get_contents('/sys/bus/w1/devices/28-00000527b552/w1_slave'); $data = explode('=', $data); $temp = $data[2]; if ($db != null) { update($db); $stmt = $db->prepare('INSERT INTO pi (temperature) VALUES (:temp)'); if (!$stmt->execute(array('temp' => $temp))) { file_put_contents('/home/pi/temp/temperatures.txt', date("Y-m-d H:i:s").','.$temp, FILE_APPEND); } die(); } file_put_contents('/home/pi/temp/temperatures.txt', date("Y-m-d H:i:s").','.$temp, FILE_APPEND);

temp.php - För att plotta grager

<?php require_once 'phplot/phplot.php'; try { $db = new PDO('mysql:host=localhost;dbname=temperatures', 'user', 'pw'); $db->exec("SET CHARACTER SET utf8"); $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); die(); } $hours = isset($_GET['hours']) ? $_GET['hours'] : 2; $limit = $hours * 12; $stmt = $db->prepare('(SELECT id, time, temperature FROM pi ORDER BY id DESC LIMIT '.$limit.') ORDER BY ID asc'); $stmt->execute(); if ($stmt->rowCount() > 0) { $result = $stmt->fetchAll(); } $data = array(); foreach ($result as $row) { $data[] = array('%A', strftime(strtotime($row['time'])), $row['temperature']/1000); } $plot = new PHPlot(800, 400); $plot->SetImageBorderType('plain'); $plot->SetPlotType('lines'); $plot->SetDataType('data-data'); $plot->SetDataValues($data); $plot->SetLineWidths(2); $plot->SetDataColors(array('red')); $plot->SetLineStyles('solid'); $plot->SetXDataLabelPos('none'); $plot->SetXLabelType('time', '%H:%I'); $plot->SetXTickIncrement(60*$hours*60/8); $plot->setFont('y_label', 3); $plot->SetTitle('Temperatures last '.$hours.' hours'); $plot->SetPlotAreaWorld(NULL, NULL, NULL, NULL); $plot->SetDrawXGrid(True); $plot->SetDrawYGrid(True); $plot->DrawGraph();

Jag mäter temperaturen var 5e minut med hjälp av cron
[çode]*/5 * * * * /usr/bin/php /home/pi/temp/temp.php[/code]

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2006
Skrivet av trexake:

Mäter också temperaturen i min lägenhet med min raspberry pi.
[MYCKET TEXT]

Riktigt kul att se just detta. Jag har lagrat i MSQL-databasen ett bra tag men jag har inte haft tid att fixa till graferna. Nu kanske jag bara kan klippa och klistra lite för att få till temperaturloggen.

Tack för posten!

/Z

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Trädvy Permalänk
Medlem
Plats
Järfälla
Registrerad
Jan 2004
Skrivet av zonar:

Riktigt kul att se just detta. Jag har lagrat i MSQL-databasen ett bra tag men jag har inte haft tid att fixa till graferna. Nu kanske jag bara kan klippa och klistra lite för att få till temperaturloggen.

Tack för posten!

/Z

Har ett till exempel där jag plottar lite fler temperaturer! De läses från en fil dock. Lägger upp det lite senare

Trädvy Permalänk
Medlem
Registrerad
Sep 2006

Amen det är ju hur tjusigt som helst grabbar!

Dock har jag stött på lite problem som någon av er kanske kan hjälpa mig med?
Försöker presentera ute-tempen på min php-sida men jag får fan inte till det.

I min get_temp.pl la jag längst ner till följande för att skriva det till en .txt-fil som jag läser informationen från sedan.

open (TIMES, ">tmp_outside.txt");
print TIMES "$outtemp\n";
close (TIMES);

Kör jag .pl-skriptet manuellt med ./get_temp.pl så fungerar det och den skriver det till textfilen.
Men det fungerar inte med mitt cron-job av någon anledning.
Resterande del av skriptet fungerar.
Jag har testat lägga jobbet i den aktuella användaren såväl som su men ingen skillnad.

Någon som har tips eller ideér så är det välkommet :).

EDIT: Jag löste det. Var tvungen att skriva hela sökvägen till textfilen (dvs /home/pi/temperature/tmp_outside.txt) istället så att cronjobbet faktiskt letar där :).

Dator: https://www.inet.se/kundvagn/bild/9823049/
Server: 2x HP ProLiant Microserver Gen8, 16GB/st, ESXi 6.0
NAS: Synology DS413 4st 3TB | QNAP TS-879 Pro 8st 2TB

Trädvy Permalänk
Medlem
Plats
Valö
Registrerad
Maj 2006

Jag undrar om någon känner till ngt kort så man kan driva ett flertal ds18b20 får bara 7st som mest, men då är det ostabilt så 5st är det för tillfället, har laborerat med en Vridpot ganska mycket men uta större framgång.
Har 2A spänningsmatning med en extra Konding för slät & fin matning så det borde räcka.
Jag skulle vilja använda ca 17 mätpunkter.
Om det finns ett kort som orkar driva så många samtidigt så är jag väldigt intresserad eller om man (inte jag, är jättedålig på programmering) kan skriva ngt script som läser dem i olika block efter deras adress.
Tips Idéer? har sett fler som har samma problem.
Kör på Cat 6, mätare i "serie", max 5m kabel.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2006
Skrivet av Fredarp:

Jag undrar om någon känner till ngt kort så man kan driva ett flertal ds18b20 får bara 7st som mest, men då är det ostabilt så 5st är det för tillfället, har laborerat med en Vridpot ganska mycket men uta större framgång.
Har 2A spänningsmatning med en extra Konding för slät & fin matning så det borde räcka.
Jag skulle vilja använda ca 17 mätpunkter.
Om det finns ett kort som orkar driva så många samtidigt så är jag väldigt intresserad eller om man (inte jag, är jättedålig på programmering) kan skriva ngt script som läser dem i olika block efter deras adress.
Tips Idéer? har sett fler som har samma problem.
Kör på Cat 6, mätare i "serie", max 5m kabel.

Hej!
Blev lite nyfiken så jag kollade lite. Kör själv sådana sensorer men bara ett par stycker på varje Pi. Dock hittade jag detta:

Citat:

Notes and further reading

For large numbers of sensors and long cable runs use the DS2480B 1-wire driver chip. More info here. Thanks to Chris Shucksmith for sharing.

"If you intend to have a large 1-wire network, it is important that you design the network correctly, otherwise you will have problems with timing/reflection issues and loss of data. For very small networks, it is possible to connect each sensor in a star or radial arrangement. This means that each sensor is connected via its own cable back to a central point and then connected to the 1-wire to serial adapter. However, it is strongly recommend that you connect each sensor to a single continuous cable which loops from sensor to sensor in turn (daisy chain). This will reduce potential mis-reads due to reflections in the cable. Each sensor should have a maximum of 50mm (2") of cable connected off the main highway. Even using this method, connecting more than 10-15 sensors will still cause problems due to loading of the data bus. To minimise this effect, always place a 100-120 ohm resistor in the data leg of each sensor before connecting to the network."

quoted from: http://www.jon00.me.uk/onewireintro.shtml

Lots of info about 1-wire bus problems here: http://www.shucksmith.co.uk/blog/ds2480bds18b20drivers-1

Vilket ger en förslag på vidare läsning som kanske kan hjälpa till och lösa ditt problem
Texten hittades HÄR.

Mvh Z

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Trädvy Permalänk
Medlem
Plats
Valö
Registrerad
Maj 2006

Perfekt då har jag lite mer ledtrådar.

Med vänlig hälsning Fredarp