Temperaturmessung RaspberryPi (one wire)

Da ich mich bereits längere Zeit mit dem Thema Wetter und der Beobachtung des Wetters beschäftigte, kam schnell die Idee auf, meine Wetterdaten auch anderen Wetter-Netzwerken zur Verfügung zu stellen.

Da ich noch ein paar DS1820 One Wire Temperatur Sensoren in der Schublade liegen hatte, fiel die Wahl schnell auf den RaspberryPI.
Mit ein paar Drähten und einem Widerstand kann der Sensor mit dem GPIO Port verbunden, und ausgelesen werden.

Es müssen lediglich 2 Kernelmodule galeden werden:

sudo modprobe w1-gpio pullup=1
sudo modprobe w1-therm

Script: install

#!/bin/bash

#Scriptname: install

MODFILE="/etc/modules"

if [ ! $USER = "root" ]
then
    echo "... please run as root!"
    exit 1
fi

if [ ! -f /usr/bin/bc ]
then
    apt-get -y install bc
fi

cp one-wire.gettemp /usr/local/bin/

MODULES=("# Edit by one-wire-temp deployment script" "w1-gpio" "w1-therm")
for((i=0;i<${#MODULES[@]};i++)); 
do
    MODULE=${MODULES[$i]};
    #echo "Module:$MODULE"
    if ! grep "$MODULE" "$MODFILE"
    then
        echo "$MODULE" >> $MODFILE
        echo "Write: $MODULE >> $MODFILE" 
    fi
done

echo "... bitte Neustart!"
Mittels install werden alle benötigten Pakete installiert, und /etc/modules entsprechend erweitert.

Script: one-wire.gettemp

#!/bin/bash

#Scriptname: one-wire.gettemp

LINE=$(grep t= /sys/bus/w1/devices/10-00080201ec9e/w1_slave)
TEMP=${LINE##*t=}
echo "scale=5; $TEMP/1000" | bc
Mit dem one-wire.gettemp Script wird das Temperatur aus dem angeschlossenen DS1820 Temperatursensor ausgelesen, und ausgegeben.
Die Seriennummer des Sensors muss auf jeden Fall angepasst werden.

Script: hamnet_wxdata

#!/usr/bin/python

#Scriptname: hamnet_wxdata

import urllib
import httplib2
import hashlib
import time
import sys

temp = sys.argv[1]

hash = hashlib.md5("************")
currDateTime = time.gmtime()
currDate =  str(currDateTime.tm_mday).zfill(2) 
        + "." + str(currDateTime.tm_mon).zfill(2) + "." 
        + str(currDateTime.tm_year).zfill(4)
currTime = str(currDateTime.tm_hour+2).zfill(2) 
        + ":" + str(currDateTime.tm_min).zfill(2)

username = "dk9mbs"
password = hash.hexdigest()
data = currDate + ";" 
	+ currTime + ";" 
	+ str(temp) + ";" 
	+ ";;;;;;;;;;;;;;;;;0;0;" 

url = "http://db0tv.ampr.org/wxnet/daten/reports/directdata.php?dataset=" 
	+ password + ";" 
	+ username + ";" 
	+ data

print url

http = httplib2.Http()
body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}
headers = {'Content-type': 'text/html'}
response, content = http.request(url, 'GET', headers=headers, body=urllib.urlencode(body))
print content

Mit dem Script hamnet_wxdata werden die Temperaturdaten an den Wetterserver im HAMNET übergeben.
Der Aufruf (z.B. mittels crontab) erfolgt wie folgt:
hamnet_wxdata $(one-wire.gettemp)
Zugangsdaten sind entsprechend anzupassen.

Script: aprs_wx

Die Übergabe der Wetterdaten an das APRS Netzwerk ist etwas komplizierter.
#!/usr/bin/python

#Scriptname: aprs_wx

import socket
import sys
import os

TCP_IP = 'cwop.aprs.net'
TCP_PORT = 10152
BUFFER_SIZE = 1024

call = sys.argv[1]
passwd = sys.argv[2]
celsius = sys.argv[3]
dest = "APZ100"

fahrenheit = round( float (  float(celsius) * 1.8 + 32 ))
fahrenheit = int( float(fahrenheit)  )
print "Fahrenheit:" + str(fahrenheit)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send ("user " + call + " pass " + passwd + "rn")
data = s.recv(BUFFER_SIZE)
print data

s.send (call + ">" + dest + ",TCPIP*:=5202.73N/01022.09E_.../...g...t0" 
           + str(fahrenheit).zfill(2) + "r...p...P...h..b.....xRSWrn")
data = s.recv(BUFFER_SIZE)
print data
Das Script aprs_wx überträgt die Wetterdaten an einen APRS-IS Server im HAMNET/Internet.
Der Aufruf erfolgt wie folgt:
aprs_wx [cwop Station ID] [APRS PASSCODE] $(one-wire.gettemp)