16.12.2012

Home Automation mit dem Raspberry Pi: 3. Software auf dem Raspberry Pi - GPIO-Ansteuerung und Webserver

Inhalt
1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver (dieser Teil)
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT 
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation:  per Telefon schalten mit Tropo


 

Software

Betriebssystem

Bei raspberrypi.org gib es ein SD-Card-Image mit einem angepassten Debian-Linux. Für die weiteren Schritte gehen wir davon aus, daß das auf dem Raspberry Pi installiert ist.

Python-Bindings für die GPIO-Pins

Wir wollen die GPIO-Pins (General Purpose Input/Output), die wir gerade via Interface mit dem Handsender verbunden haben, per Software ansteuern. Für die Scriptsprache Python gibt es dafür das RPi.GPIO-Modul, das installiert werden muß.

Nun können wir einzelne Pins schalten und damit einen Tastendruck simulieren. Wenn man z.B. folgenden Code

  GPIO.output(14, True)
  GPIO.output(24, True)
  time.sleep(1.0)
  GPIO.output(14, False)
  GPIO.output(24, False)


ausführt

wird ein ein-sekündicher Tastendruck auf die Taste "A/ON" simuliert. Die LED auf dem Sender leuchtet und die Steckdose A wird angehen. Wow! Wir können Steckdosen per Software ein- und ausschalten!

Webserver mit dem Bottle-Framework

Um übers Netzwerk per Browser Steckdosen zu schalten brauchen wir noch einen Webserver, der den Python-Code aufruft. Dazu gibt es das Python-Framework "bottle", das uns die Drecksarbeit abnimmt. "bottle" steckt in der einzigen Datei "bottle.py", die im gleichen Verzeichnis wie unser Programm liegt.

Damit sieht unser gesamter Code so aus:

from bottle import route, run

# Import required libraries
import time
import RPi.GPIO as GPIO

# Define some settings
# Wait for one second
WaitTime = 1.0
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define GPIO signals to use
# and the Mapping to Signals A-D and ON/OFF
Pins={ 'A': 14, 'B':15, 'C':18, 'D':25, 'ON': 24, 'OFF':23 }

# Set all pins as output
for pin in Pins:
  GPIO.setup(Pins[pin],GPIO.OUT)
  GPIO.output(Pins[pin], False)

# Switches "switch" to ON or OFF state
# Parameters are "switch" (A,B,C,D) and "state" (ON,OFF)
def setSwitch(switch, state):
  GPIO.output(Pins[switch], True)
  GPIO.output(Pins[state], True)
  time.sleep(WaitTime)
  GPIO.output(Pins[switch], False)
  GPIO.output(Pins[state], False)

@route('/switch/<name>/<pos>')
def index(name, pos):
  name = name.upper()
  pos = pos.upper()
  setSwitch(name, pos)
  return 'Switch %s %s</b>' % (name, pos)

run(host='0.0.0.0', port=8080)

Erläuterung


In der ersten Zeile werden die benötigten Funktionen des bottle-Frameworks importiert. Anschließend wird das Mapping der GPIO-Pins auf symbolische Namen festgelegt, die in der folgenden "setSwitch"-Methode verwendet werden.

Die setSwitch-Methode hat zwei Parameter, der erste gibt die Steckdose an (A bis D), der zweite den gewünschten Zustand (ON/OFF). Die beiden Parameter entprechen GPIO-Pins, die geschaltet werden.

Anschließend wird die URL "/switch" als route definiert, auf die reagiert werden soll - die index-Methode holt die Parameter aus der URL und ruft die setSwitch-Methode damit auf.

Beispiel: beim Aufruf der URL "/switch/A/ON" werden die Parameter "A" und "ON" extrahiert und setSwitch("A","ON") aufgerufen. Damit wird die Steckdose A eingeschaltet. Wichtig: der Code muß als root laufen, da man root-Rechte benötigt, um GPIO-Pins zu schalten.

Ausprobieren können wir das Script mit

sudo python switch.py

Mit einem Browser können wir dann den Raspberry Pi ansprechen:

http://raspi.ip.adresse:8080/switch/A/ON

schaltet Steckdose "A" ein, die LED auf dem Handsender leuchtet für eine Sekunde. Mit

http://raspi.ip.adresse:8080/switch/A/OFF

Schaltet die Steckdose wieder aus.

Daemon

Damit unser Python-Script beim Booten automatisch gestartet wird, kommt es zusammen mit bottle.py ins Verzeichnis /opt/switch. Nach /etc/init.d legen wir ein Shell-Script "switch", das folgenden Inhalt hat:

#!/bin/bash

DAEMON=/usr/bin/python
ARGS="/opt/switch/switch.py"
PIDFILE=/var/run/switch.pid

case "$1" in
  start)
    echo "Starting server"
    /sbin/start-stop-daemon --start --pidfile $PIDFILE \
        --user root --group root \
        -b --make-pidfile \
        --chuid root \
        --exec $DAEMON $ARGS
    ;;
  stop)
    echo "Stopping server"
    /sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
    ;;
  *)
    echo "Usage: /etc/init.d/switch {start|stop}"
    exit 1
    ;;
esac

exit 0


mit chmod +x /etc/init.d/switch wird das Script ausführbar gemacht.

Als root kann man nun das Script mit

/etc/init.d/switch start 

starten. Damit das beim Booten automatisch geht, führen wir noch

sudo update-rc.d -f switch defaults
 
aus.
 

Zwischenstand: 

Die Steckdosen können durch Aufruf einer URL ein und ausgeschaltet werden. Ein RESTful-Interface für die physikalische Welt! Sehr cool! 

Links

http://bottlepy.org/docs/dev/
Treating a Python Application as a Daemon on Debian


Inhalt
1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver (dieser Teil)
4. DynDNS, Siri & mehr
5. Schalten mit  Google Calendar und IFTTT  
6. Lampe bei Sonnenaufgang einschalten
7. Raspberry Pi - Home Automation:  per Telefon schalten mit Tropo


Kommentare:

  1. Bin am Nachbauen. Bin Newbie. Kanns du mir das genauer erklären:
    Daemon
    Damit unser Python-Script beim Booten automatisch gestartet wird, kommt es zusammen mit bottle.py ins Verzeichnis /opt/switch.

    dnke für eine Antwort

    AntwortenLöschen
  2. Hallo vielen Dank erst mal für die Anleitung.
    ich habe mal eine Frage, ich habe die Skripte ein wenig umgeschrieben weil ich ein Piface auf dem Raspberry gesteckt habe.
    Nur wenn ich jetzt aus meiner Web-Seite heraus den Link(mit Port, Route und Variablen) aufrufe dann wird auch im Browser die Web-Seite vom Webframe angezeigt und die Relais werden geschalten. Was muss man machen damit im Python-Skript nur die Relais geschaltet werden und nicht das die Web-Seite gewechselt wird.

    Schon mal Vielen Dank für die Antwort

    Manfred

    AntwortenLöschen