Kommentare 7

Der twitternde Tiefkühlschrank

Ein Gastbeitrag von Torsten Dillenburg

torstendillenburgAls Papa eines kleinen Jungen muss man ja viel mitmachen. Ständig klaut der Sohn einem das iPad, um The Big Bang Theory zu schauen, oder er verstellt am iMac die Auflösung. Und letztens hat dann mein geliebter Filius die Küche für sich endeckt. War ja auch klar. 1. kommt da das lecker Essen her und 2. gibt es dort viele Knöpfe zu drücken. Zum Glück hat der Induktionsherd eine Kindersicherung! Aber den Tiefkühlschrank hat’s erwischt…

Ein vernünftiger Dreijähriger muss natürlich auf den leuchtend grünen Knopf drücken:

tiefkuehltruhe

Und außerdem die Tür öffnen (diese Kraft, erstaunlich). Leider funktioniert der Temperaturalarm nur dann, wenn der Tiefkühlschrank auch eingeschaltet ist. Zugegeben, das musste ja alles mal abgetaut werden, aber doch nicht so!

Nachdem die letzten Fischstäbchen ihr Seepferdchen gemacht hatten, der Rest an brauchbaren Nahrungsmitteln verputzt und die Küche wieder trocken gelegt war stand für mich fest: Das geht so nicht weiter!

Was man zur Risikominimierung braucht

Optional:

Vorbereiten des Raspberry Pi

Wenn man alle Teile beisammen hat, geht es mit etwas Einfachem los: Das Raspberry Pi benötigt ein Betriebssystem.

Neben der offiziellen Distribution gibt es auch einige andere interessante Pakete. Ich habe mich für die Occidentalis Distrubition von adafruit entschieden. Nach dem Download müssen die Daten nur noch auf die SD-Karte für das Pi geschrieben werden.

Einspielen der Distribution

Auf dem Mac ist die Installation recht unkompliziert. Noch einfacher geht es allerdings mit dem Raspberry-PI-SD-Installer für OS X. Zunächst die ZIP-Datei von Github runterladen und dann entpacken:

raspi_sd_installer

Dann legen wir im Ordner noch die Image Datei der Distribution ab.

Wenn alle Downloads abgeschlossen sind geht es ins Terminal.

Erst einmal wechseln wir mit cd in unseren Ordner. Dann starten wir mit sudo ./install Occidentalis_v02.img das kleine Programm. Nach der Eingabe des Passworts werden wir von einer kleinen Übersicht über alle unsere Laufwerke begrüßt. Nun müssen wir nur unsere SD Karte auswählen.

rasp_sd_install

Dann schauen wir doch erst noch mal nach der Nummer! Und geben sie ein, wenn wir sicher sind. Anschließend gibt’s zur Belohung einen Kaffee, den wir trinken, während die SD-Karte für den Start vorbereitet wird.

Der erste Start des Raspberry Pi

Nun aber ab an den Monitor, Pi anschließen und los geht’s.

raspi

Wenn die ersten Einstellungen gemacht sind, kann es weiter gehen.

raspi_config

Nach dem Starten werden wir ganz freundlich von der Raspi-Config begrüßt. Dort können wir nun das Keyboard-Layout und die Zeit einstellen.

Aufbau der Schaltung

schaltung

Der DS18B20 (Datenblatt) ist relativ leicht an das Raspberry Pi an zu schließen. Ausgelesen wird der Sensor über den 1-Wire-Bus. Aber nicht vom Namen täuschen lassen! Wir brauchen hier drei Pins. Wenn der Sensor mit der flachen Seite zu uns auf dem Tisch liegt, sind die Beinchen von links nach rechts mit 1) Masse, 2) Signal und 3) Plus belegt. Für die ersten Tests kann man die Schaltung super auf einem Breadboard zusammenstecken. Für den Kühlschrank ist aber doch eine längere Leitung nötig. Ich habe dazu den Sensor mit einem Flachbandkabel verlötet und anschließend an Ort und Stelle deponiert.

Auslesen des Temperatur

Nachdem wir den kleinen, unschuldigen DS18B20 unter Strom gesetzt haben, müssen wir ihn nur noch davon überzeugen, mit uns zu reden. Zum Glück kann das Raspberry ja schon 1-Wire, das macht unsere Leben doch entschieden leichter.

Wir melden uns per SSH auf der Konsole an und laden die Kernel-Module. Das geht mit:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Mit #1 laden wir das Modul für die IO-Verbindung, mit #2 das Modul zum Auslesen der Temperatur. Nun müssen wir uns im Filesystem nach dem IO-Stream des Sensors umsehen. Unter /sys/bus/w1/devices lassen wir uns nun mit ls alle 1-Wire Devices, jedes mit seiner ID, anzeigen.

Dann ab in den Ordner. Dort finden wir nun die Daten, die wir brauchen. Genauer gesagt den IO-Stream, der über das 1-Wire-Interface vom DS18B20 kommt. Mit more w1_slave können wir uns die Daten anzeigen lassen. Und siehe da, in der zweiten Zeile steht die Temperatur:

auslesen2

Verarbeiten der Daten

Nun haben wir die Temperatur schon mal im Pi, aber sich jedes Mal durch das Terminal wühlen ist schon nervig. Das geht auch einfacher. Mit Python.

Wir starten in der Shell mit python die Python-Konsole und geben Folgendes ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Oeffne den IO-Stream des DS18b20
tfile = open("/sys/bus/w1/devices/28-0000039a01b9/  w1_slave") 
# Den ganzen Text auslesen
text = tfile.read() 
# IO-Stream schliessen
tfile.close() 
# 2. Zeile lesen 
zeileZwei = text.split("\n")[1] 
# bei den Leerzeichen in Woerter teilen und das 10. Wort (angefangen bei Null) lesen 
temperaturdata = zeileZwei.split(" ")[9] 
# das "t=" verwerfen,  um eine Zahl zu erhalten
temperatur = float(temperaturdata[2:]) 
# durch Tausend teilen, um das Komma zu setzen 
temperatur = temperatur / 1000 
print temperatur

Dann Enter und ab dafür. Und siehe da, eine Temperatur:

python_temp

Natürlich kann man das ganze auch in einen kleine Datei speichern und diese dann direkt Python zum Ausführen Vorsetzen:

python_temp_py

Ab in die Wolke

So, nun haben wir ja die Temperatur schön ausgelesen. Aber immer nachschauen ist irgendwie blöd. Und es könnte ja auch schön bunt sein oder? Da gibt es eine Lösung:

cosm_logo
Cosm ist aus dem Cloud-Dienst Pachube hervorgegangen und bietet Privatleuten einen Platz für die eigenen Sensordaten. Das Schöne am Dienst ist, dass es viele Anleitungen für die Einbindung der entsprechenden Geräte gibt.

Für Python bietet sich das Package eeml von Peter Vizi an. Mit diesem Package kann man mit wenigen Zeilen Code seine Daten an cosm senden.

Um das Package auf unserem Raspberry Pi zu installieren melden wir uns wieder auf der Konsole an. Dort laden wir mit

wget -O geekman-python-eeml.tar.gz https://github.com/geekman/python-eeml/tarball/master

die aktuelle Version herunter. Sobald der Download abgeschlossen ist, wird das Archiv mit

tar zxvf geekman-python-eeml.tar.gz

entpackt. Dann wechseln wir mit

cd geekman-python-eeml*

in das entstandene Verzeichnis und fügen dort mittels

sudo python setup.py install

das Package unserer Python-Installation hinzu.

eeml_install

Als nächsten müssen wir uns nur noch unter www.cosm.com uns ein neues Konto anlegen. Und dort die notwendigen Daten eintragen:

cosm_anmeldung

Sobald das geschafft ist, geht es daran einen Feed für unsere Daten einzurichten. Dazu nehmen wir die Quelle “Arduino”.

feed1

Nun noch einen Namen auswählen und evtl. ein paar Tags setzen.

feed2

feed3

Nach dem letzten Schritt gelangen wir zu einer Übersichtsseite. Dort wird neben der Feed-ID auch ein kleines Besipielprogramm angezeigt. In diesem ist bereits ein API-Key gesetzt. Beide Werte kopieren – die brauchen wir später.

feed4
Nun müssen wir unser Skript von eben noch etwas ergänzen. Zum einen benötigen wir die Packages time, os und eeml. Diese binden wir über import ein. Das #!/usr/bin/env python benötigen wir, um das Skript später direkt aus der Shell zu starten. Dann fügen wir noch ein paar Variabeln, den API-Key und die Feed-ID mit ein. Und zu guter Letzt packen wir unser Skript in eine Funktion und übermitteln via Hauptprogramm die Daten an cosm. Zum Schluss sieht das Ganze so aus:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python
import time
import os
import eeml
 
DEBUG = 1  # wenn 1, wird die Temperatur in der Shell angezeigt
LOGGER = 1 #
 
# COSM-Variablen; der API-Key und die FEED-ID koennen auf der COSM-Seite ausgelesen werden 
 
API_KEY = '8uFh1c7c3X3lZJsHs7Fv6a3elwmSAKxjbHJuYlJiQXE1ND0g'
FEED = 120737
API_URL = '/v2/feeds/{feednum}.xml' .format(feednum = FEED)
 
# unsere bekannte Funktion aus dem ersten Teil
def leseTemp():
        # oeffne den IO-Stream des DS18b20; bitte hier den Pfad zu eurem Sensor eingeben
        tfile = open("/sys/bus/w1/devices/28-0000039a01b9/w1_slave") 
        # den ganzen Text auslesen
        text = tfile.read() 
        # io-Stream schliessen
        tfile.close() 
        # 2. Zeile lesen
        zeileZwei = text.split("\n")[1] 
        # bei den Leerzeichen in Woerter teilen und das zehnte Wort (angefangen bei Null) lesen 
        temperaturdata = zeileZwei.split(" ")[9] 
        # das "t=" verwerfen, um eine Zahl zu erhalten
        temperatur = float(temperaturdata[2:]) 
        # durch Tausend teilen, um das Komma zu setzen 
        temperatur = temperatur / 1000 
        #print temperatur
        return temperatur
 
# Hauptprogramm
 
# Kernelmodule laden, sicher ist sicher...
os.system("sudo modprobe w1-gpio")
os.system("sudo modprobe w1-therm")
 
# Sensor auslesen  
temp0 = leseTemp()
if DEBUG:
        print "temp0:\t", temp0
        print
 
if LOGGER:
        # Feed oeffnen
        cosm = eeml.Pachube(API_URL, API_KEY)
        #Sagen wir mal Bescheid, dass da Celsius kommt
        cosm.update([eeml.Data(0, temp0, unit=eeml.Celsius())])
        # Daten uebertragen
        cosm.put()

Wir speichern das Programm in einer Datei, z.B. Thermo.py, die wir dann in der Shell mit chmod +x als ausführbar kennzeichnen. Das Skript starten wir schließlich mit sudo ./Temp.py.

temp-py

Und schon haben wir unseren ersten Feed…

cosmfeed

Nun müssen wir nur noch unsere Benachrichtigung per Twitter einbauen. Das geht ohne weiteren Code direkt auf der cosm-Seite. Dazu gehen wir auf den neuen Feed, klicken auf +Trigger und wählen Twitter:

trigger2

Dann geben wir einen Schwellwert für den Trigger an:

trigger3

und verknüpfen unser Twitter Konto mit dem Feed:

trigger4

Ergebnis

Nun ist unser Tiefkühlschrank an Twitter angeschlossen! Auf cosm können wir die Daten einsehen und mittels Ifttt auch weiter auswerten. Auf dem gleichen Weg können wir auch noch weitere Sensoren anschließen und auswerten.

Graph

Oben sieht man die aktuelle Temperaturkurve. Bei meinem Kühltruhenprojekt habe ich das Kabel recht kurz gehalten, der Sensor liegt kurz hinter der Tür. So bekommt man immer schön mit, wenn die Tür aufgeht (sieht man oben an den Spitzen). Wer stabilere Messwerte möchte, sollte den Sensor möglichst in der Mitte positionieren.

One more thing

Bis jetzt liefert unser Skript immer nur ein Update zu cosm aus. Aber wenn wir ehrlich sind, macht eine automatische Benachrichtigung per Tweet nur halb soviel Spaß, wenn man immer manuell cosm aktualisieren muss. Daher legen wir auf dem Raspberry nun noch einen Cron Job an.

Das geht auch wieder mit der Shell. Wir öffnen mit

sudo crontab -e

den Editor für die Cronacle Tabelle ein und fügen am Ende die Zeile

*/5 * * * * sudo /home/pi/Temp.py

hinzu. Nun wird der Job alle 5 Minuten der Job ausgeführt.

cron

Den Editor verlassen wir dann mit STRG+X und bestätigen die Änderungen mit j.

Weiterhin viel Spaß mit dem Raspberry Pi – der Modelleisenbahn des 21. Jahrhunderts!

 

Sag's weiter:

7 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert