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:
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.
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 DebianInhalt
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
Bin am Nachbauen. Bin Newbie. Kanns du mir das genauer erklären:
AntwortenLöschenDaemon
Damit unser Python-Script beim Booten automatisch gestartet wird, kommt es zusammen mit bottle.py ins Verzeichnis /opt/switch.
dnke für eine Antwort
Hallo vielen Dank erst mal für die Anleitung.
AntwortenLöschenich 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