26.12.2012

Raspberry Pi: Lampe bei Sonnenaufgang einschalten

Raspberry Pi: Lampe bei Sonnenaufgang einschalten

 Voraussetzung: Schaltung und Software aus den vorherigen Teilen

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



Ein weiteres Rezept mit IFTTT und der Funksteckdosen-Steuerung mit dem Raspberry Pi:

Lampe bei Sonnenaufgang einschalten. 


Das ist meine Nachttischlampe, die ich in den Weihnachtsferien schalte. Bei IFTTT kann der Weather-Channel als Trigger genommen werden. Ein Ereignis dieses Channels ist der Sonnenaufgang des festgelegten Orts. Dieses Rezept ruft die Lampen-Einschalt-URL auf, auch hier wird Dropbox-Trick verwendet, da IFTTT die URL nicht direkt aufrufen kann:




Der Weather-Channel kennt auch das Ereignis "Unterschreiten einer festgelegten Temperatur". Damit kann z.B. eine elektrische Standheizung im Auto bei tiefen Temperaturen eingeschaltet werden..



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

23.12.2012

Home Automation mit dem Raspberry Pi 5: Funksteckdosen schalten mit Google Calendar und IFTTT

Inhalt

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

Google Calendar zum Schalten von Funksteckdosen


Ein Google-Kalender für jede Funksteckdose wäre doch toll, damit kann man bequem einstellen, wann da daran hängende Gerät ein- und ausgeschaltet werden soll. Der Kalender lässt sich teilen, und Google sorgt für ein tolles UI und spart uns viel Arbeit. Für meine Heizungspumpe sieht das dann beispielsweise so aus:




IFTTT.com

Für die Verknüpfung von Webdiensten verwende ich IFTTT (If This Then That). Das ist ein genialer Meta-Webdienst, der bei festgelegten Ereignissen (If This-Trigger) bestimmte Aktionen (Then That) ausführt. Ein solches Ereignis (Event) kann  ein Kalendereintrag bei Google Calendar sein, der ein bestimmtes Wort im Titel als Trigger enthält.  Insgesamt gibt es momentan über 60 verschiedene Channels, über die ein Event reinkommen kann.

Eine direkte URL-Aufruf-Action gibt es nicht, aber ein kleiner Workaround löst das Problem: man kann das Ergebnis eines URL-Aufrufs in seiner Dropbox ablegen lassen. Die Aufrufe sind dann eben die Ein- bzw Ausschalt-URL - voila!

Insgesamt sind damit folgende Zutaten für das IFTTT-Recipe nötig:
  • IFTTT-Account
  • Google Calendar-Account
  • Dropbox-Account

Schritt für Schritt

1. Auswahl des Trigger-Channels


Durch das Erstellen eines Rezepts (Recipe) bei IFTTT führt ein Assistent. Erster Schritt, klick auf das Google-Calendar-Icon. Beim ersten Mal kommt ein Authentifizierungsdialog, der IFTTT erlaubt, auf den Kalender zuzugreifen.

2. Trigger wählen


Wir nehmen "Event from scratch starts", das kann Kalendertermine nach einem bestimmten Wort durchsuchen.


3. Trigger festlegen


Das Wort "ein" soll der Trigger sein.




4. Action-Channel wählen


Als Action-Channel nehmen wir Dropbox. Auch hier kommt beim ersten Mal ein Authentication-Dialog, der IFTTT erlaubt, Dropbox zu benutzen.


5. Action auswählen


Wir nehmen "add file from URL". Das holt die angegebene URL und speichert sie in der Dropbox


6. URL angeben


Hier die URL zum Einschalten der Steckdose angeben




7. Fertig

Im letzten Schritt geben wir dem Rezept noch einen Namen, fertig!

Das selbe machen wir nun noch mit der Ausschalt-URL, die bei "aus" im Kalender aufgerufen wird.

Zusammenfassung: was haben wir erreicht?

Wenn im Google Calendar ein Termin mit Titel "ein" erreicht ist, wird die Steckdose eingeschaltet. Beim nächsten Termin mit Titel "aus" wird sie wieder ausgeschaltet.

Komplexität bleibt verborgen

Der Google-Calendar-Benutzer hat überhaupt nichts mit der IFTTT-Konfiguration zu tun.

Jeder, der Termine auf dem Kalender eintragen darf, kann die Steckdose ein und ausschalten, er muß nur wissen, daß der Termintitel "ein" bzw "aus" heissen muss.

Rechteverwaltung und User-Interface erledigt Google. Die Kopplung zum Raspberry-Pi per URL erledigt IFTTT, sie bleibt dem Benutzer komplett verborgen!



Inhalt

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

22.12.2012

Home Automation mit dem Raspberry Pi 4: DynDNS, Siri & mehr

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


Was bisher geschah

In den Teilen 1-3 wurde die Hardware und die Sofware bis zum Webserver beschrieben. Damit können im lokalen Netz per Aufruf einer URL Funksteckdosen ein- und ausgeschaltet werden.

Damit Internetdienste die Steckdosen schalten können, muß es zusätzlich eine feste URL dafür geben - und der Raspberry Pi muß vom Internet aus erreichbar sein.

DynDNS

Erster Teil der URL ist ein fester Name. Typischerweise wird eine DSL-Anschluss einmal am Tag kurz unterbrochen. Nach dem Reconnect wird eine neue IP-Adresse vergeben. Damit diese dynamische IP-Adresse immer denselben Namen bekommt, benötigt man einen Account bei einem Dyn-DNS-Provider, der dem festen Namen die wechselnde Adresse zuordnet. Es gibt einige Provider, bei denen man eine kostenlose Adresse der Form

MeineTolleSubdomain.dyndnsprovider.org

bekommen kann. Eine Liste von Providern gibt es beispielsweise hier: https://help.ubuntu.com/community/DynamicDNS
Bei einem dieser Provider besorgt man sich einen Account.

Auf dem Raspberry Pi muß ein Prozess laufen, der die lokale Adresse mit dem Dyn-DNS-Anbieter abgleicht. Recht schmerzlos ist "ddclient", der mit

sudo aptitude install ddclient

installiert wird und abschließend nach Name und Passwort des vorher besorgten Accounts fragt.

Portfreigabe

Nun haben wir zwar einen festen Namen, aber der Raspberry Pi ist immer noch nicht vom Internet erreichbar, da der Router die Rechner im lokalen Netz sperrt. Sie müssen freigegeben werden. Bei einer FritzBox richtet man das z.B. so ein:


Der Raspberry Pi soll vom Internet auf Port 1234 erreichbar sein, der auf seine Adresse im lokalen Netz (hier 192.168.178.42) an Port 8080 (dort läuft der Webserver aus Teil 3) weitergereicht wird.

Zwischenstand

Zusammen mit dem Dyn-DNS-Namen ergibt sich damit folgende Basis-URL:

http://MeineTolleSubdomain.dyndnsprovider.org:1234/

Auf die der Raspberry Pi im Internet hört. Steckdose A schaltet man damit z.B. mit

http://MeineTolleSubdomain.dyndnsprovider.org:1234/switch/A/ON

http://MeineTolleSubdomain.dyndnsprovider.org:1234/switch/A/OFF


ein bzw aus. Und zwar geht das dann weltweit übers ganze Internet!

WICHTIG:

Da der Raspberry Pi vom ganzen Internet erreichbar ist, kann wirklich jeder, der die URL kennt, die Steckdose ein- und ausschalten! Deshalb sollte man nicht unbedingt den oben genannten Port benutzen und den Pfad auch ändern.

Und es ist auch grob fahrlässig, Sachen übers Internet zu schalten, mit denen man Schaden anrichten kann. Beleuchtung ist OK, aber wer eine Herdplatte damit schalten will, der hat ein Problem.

Wer mehr Sicherheit will, kann dem Webserver aus Teil 3 eine Authentisierung vorschalten, damit nur bestimmte Benutzer mit Ihrem Passwort Steckdosen schalten dürfen. Das ist aber nicht Teil dieser Serie.

User Interface

Um eine Steckdose ein- bzw auszuschalten müssen wir nur noch eine URL aufrufen. Die ganze Komplexität, die dahintersteckt, ist durch die einfache Hardware und Software wegabstrahiert.

Man könnte jetzt ein User-Interface damit bauen, aber auch das haben andere Dienste schon für uns besser erledigt. Wir müssen diese Dienste nur dazu bringen, URLs aufzurufen. 

Siri

Siri. Dein Wunsch ist ihm Befehl. So  wirbt Apple für die Spracherkennung auf dem iPhone. Tatsächlich ist es sehr einfach, per Siri eine URL aufzurufen und damit eine Steckdose zu schalten:

Wir benötigen dazu nur einen Kontakt per Ein- bzw Ausschaltbefehl. Bei mir ist die Heizungspumpe an eine Funksteckdose angeschlossen. Die soll per Sprachbefehl geschaltet werden, deshalb heissen die Kontakte "Heizung An" bzw "Heizung Aus".

 Jeder Kontakt enthält nur das "Homepage"-Feld mit der Schalt-URL, also sowas:


Mit einem langen Druck auf die Home-Taste wird Siri auf dem iPhone aktiv. Wenn ich dann "Heizung an" spreche, wird der Kontakt geöffnet - ein Touch zur Bestätigung öffnet die URL und die Heizungspumpe geht an.

Sehr cool!


Nächster Post: Schalten per Google Calendar und IFTTT



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


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


Home Automation mit dem Raspberry Pi: Teil 2: Hardware - Interface vom Raspberry Pi zur Funksteckdose

Hardware - vom Raspberry Pi zur Funksteckdose

Inhalt
1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose (dieser Teil)
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
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
 

 

Zutaten

  • Funksteckdosen mit Handsender
  • Raspberry Pi
  • ein IC ULN2803
  • Ein Google Calendar Account
  • Ein Account auf IFTTT ("If This Then That")
  • Lötkolben, Kabel, etc

Hardware

Ich verwende das Funk-Steckdosen-Set 2605 von Pollin. Es kostet 9,95€ und enthält einen Sender und drei Steckdosen. Ähnliche Sets gibt es im Baumarkt und beim Discounter, die Schaltung ist meistens gleich.

Funksteckdosensender

Handsender


Unser Handsender hat acht Tasten, mit denen man vier Funksteckdosen ein- bzw ausschalten kann. Die Schaltung des Senders besteht im aus einem IC PT2262 (aka HX2262) das die ganze Steuerung übernimmt und einem HF-Teil.

Hier gibt es ein Datenblatt des PT2262/HX2262

An das HX2262 sind die acht Tasten des Handsenders angeschlossen, für jede Funksteckdose A, B, C, D jeweils ein Schalter "ON" und ein Schalter "OFF". Wir werden diese acht Tasten über Ausgänge des Rasperry Pi simulieren.

Tastaturmatrix

Wenn man die Leiterbahnen auf der Platine verfolgt, sieht man, daß pro Taste jeweils zwei Pins auf Masse gezogen werden und zwar bilden sie eine Matrix, mit vier Leitungen A, B, C, D und zwei Leitungen "ON" und "OFF". Wenn man genau hinschaut, sieht man diese zwei Kontakte per Taster auf dem Platinenfoto.

Platine

Als Schaltbild sieht die Tastaturmatrix so aus:

Tastaturmatrix
Wenn man eine Taste drückt, werden jeweils genau zwei Leitungen mit Masse verbunden - eine aus dem Paar ON/OFF und eine der vier A/B/C/D.

Insgesamt gibt es also sechs Leitungen und damit sechs Bit, die nach Masse gezogen werden. Diese Leitungen sind an das IC vom Typ HX2262 angeschlossen, das die gesamte Steuerug übernimmt. Das silbrige Teil im Platinenfoto ist der Hochfrequenz-Sender, der vom Steuerungs-IC moduliert wird.

Wenn das bei diesen sechs Leitungen durch jeweils einen Transistor passiert (statt durch die Taster), sollte das doch auch funktionieren...
Und die Transistoren kann man mit den GPIO-Pins des Raspberry Pi steuern. Um weniger löten zu müssen, können wir ein Transistor-Array ULN2803A nehmen (das zufällig rumliegt). Damit ergibt sich folgende Schaltung für jeden Pin:

Darlington-Detail pro Bit aus ULN2803A

Wie die genaue Kommunikation zwischen Handsender und den einzelnen Steckdosen aussieht, ist uns total egal, wir simulieren nur die Tastendrücke.

Gesamtschaltung

Insgesamt ergibt sich damit folgende Schaltung:



Die Verbindung vom Raspberry Pi zum Interface ist ein 26-poliges Flachbandkabel. Vom Interface zum Handsender gehen 7 Kabel (& Signale + Masse).

Aufbau

Detailbilder vom Aufbau

Alles


Adapterplatine mit ULN2803, Kabel zur Fernsteuerung (direkt an Fernsteuer-IC gelötet)


Adapter, Lochrasterplatine von unten



Sehr praktisch ist, daß wir den Handsender weiter manuell betätigen können.

Im nächsten Teil der Serie folgt die Software auf dem Raspberry Pi: von den GPIO-Pins zum Webserver


1. Übersicht
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose (dieser Teil)
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
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

Home Automation mit dem Raspberry Pi: 1. Siri und Google Calendar für Weihnachtsbeleuchtung, Kaffeemaschine (und andere Geräte)

Inhalt
1. Übersicht (dieser Teil)
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
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

Home Automation mit dem Raspberry Pi: 1. Übersicht - Haushaltsgeräte übers Internet schalten

Inzwischen gibt es einige Geräte, die übers Internet gesteuert werden können - die sind aber meistens sehr teuer und speziell.

Es wäre aber schön, vorhandene Haushaltsgeräte übers Internet zu schalten. Wenn man das über eine URL tun kann, lässt sich das über verschiedene Dienste automatisieren. Damit  kann man z.B. die Weihnachtsbeleuchtung über ein iPhone mit Siri steuern, die Nachttischlampe über Google Calendar oder die Kaffeemaschine über einen Browser einschalten - und vieles mehr.

Niedrige Kosten durch Funksteckdosen und Raspberry Pi

Inzwischen gibt es Funksteckdosen im Viererpack  mit Handsender für ungefähr 10-15€. Ein Raspberry Pi kostet mit Versand etwa 40 €. Ein paar Kleinteile und Kabel braucht man ebenfalls - und löten sollte man auch können. Wenn man etwa 60 € anlegt, kann man damit vier Geräte übers Internet ein und ausschalten..

Für weitere Geräte fallen dann nur noch die Kosten für zusätzliche Funksteckdosen an, also etwa 4€ pro Steckdose.

Prinzip

Wir wollen nichts mit 220V zu tun haben, sondern schalten handelsübliche Billig-Funksteckdosen über den Handsender, der an einen Raspberry Pi angeschlossen ist. Der Raspberry Pi hängt am Hausnetzwerk und ist über eine URL per Bowser erreichbar. Das ganze geht natürlich auch quer übers Internet und damit auch über IFTTT, das sich über Google Calendar steuern lässt. Oder vom iPhone per Siri. Also alles ganz einfach..

Das ganze ist ein wenig Work in Progress, deshalb die einzelnen Schritte als separate Posts.

1. Übersicht (dieser Teil)
2. Hardware - Interface vom Raspberry Pi zur Funksteckdose
3. Software auf dem Raspberry Pi Ansteuerung und Webserver
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



10.12.2012

Cooler Hack: RasPi als FM-Sender (ohne Zusatzhardware!)

Einen sehr interessanten Hack gibt es hier: Software, um einen Raspberry Pi  in einen UKW-Sender zu verwandeln. Das ganze funktioniert tatsächlich ohne zusätzliche Hardware - es wird ein GPIO-Pin über den Clock-Generator angesteuert. Die Modulation erfolgt über Variation des Teilerfaktors. Das ganze ist ein Projekt der Imperial College Robotics Society.

Respekt!

15.10.2012

Raspberry Pi mit 512MB bestellbar!

Laut einer Diskussion auf reddit und der element14-Website (Farnell) gibt es jetzt Raspberry Pis mit 512MB RAM (statt 256). Sehr cool. Damit dürfte nun Java ohne Probleme laufen. Bei Element 14 kann man sie schon bestellen!
 

13.10.2012

Raspberry Pi als Webserver mit PostgreSQL, Ruby und Sinatra

Ein richtiger Webserver braucht eine Datenbank, um dynamischen Content zu erzeugen und ein Framework um den Content auszuliefern. PHP und mySql wird zwar oft verwendet, ich finde das aber eher langweilig.

Deshalb habe ich auf dem RasPi die PostgreSQL-Datenbank installiert, die sehr feine Features hat und Open Source ist.

Als Framework habe ich mir Sinatra ausgesucht. Für die Datenbank-Abstraktion ist Datamapper  zuständig. Das ganze wird dann via Rack deployed. Sinatra, Datamapper und Rack  sind in Ruby geschrieben, deshalb brauchen wir auch noch einen Ruby-Interpreter. Zunächst verwende ich dazu die Standard-Ruby-Implementierung, für Testzwecke dann auch noch JRuby (Ruby-Interpreter in Java, extra Post). Ruby/Postgres/Sinatra hat den weiteren Vorteil, daß die gleiche Applikation auf Heroku laufen kann, so daß man real-World-Benchmarks fahren kann.

Die Applikation, die ich teste, holt Werte nach Geolocation aus der Datenbank, rechnet einiges daran rum und liefert das per Ajax als JSON an eine Webapp.

Auf dem RasPi ist Soft-float Debian wheezy installiert (JRuby/Java, das ich auch testen will, läuft nur mit dem Soft-Float-ABI) .

Installation, als root auf dem RasPi eingeloggt.
  1. Postgres-Datenbank, Client und Libraries: apt-get install postgresql postgresql-client libpq5 libpq-dev
  2. Ruby:  apt-get install ruby
  3. Wir benötigen noch "Bundler", mit dem Ruby alles zum Deployment zusammenschnüren kann: gem install bundler
Nun hab ich Postgres so konfiguriert, daß ich von localhost per Netzwerk auf die Datenbank komme (/etc/postgresql/9.1/main/postgresql.conf und pg_hba.conf). Anschließend Datenbank-Benutzer angelegt, den Datenbank-Dump von Heroku geholt und auf dem RasPi eingespielt.

Nun wird die Sinatra-Applikation konfiguriert (Datenbank-User/Verbindung), mit "bundle install" zusammengeschnürt und dann mit "rackup config.ru" gestartet. Die Applikation liefert identisches JSON, wie die Installation auf Heroku. Das ist fein!

Erstes Ziel erreicht: der Raspberry Pi arbeitet als Webserver und liefert dynamischen Inhalt aus einer Datenbank!

Jetzt mal sehen, wie der RasPi sich zum Heroku-Minimal-Setup schlägt.

Als Baseline wird der Apache Bench ("ab") auf Heroku losgelassen. Dort läuft die Applikation in minimaler Ausstattung in der Heroku-free-Variante.

NB: Ich verwende "ab" hier ohne Concurrency mit 500 Zugriffen

Hier die Ergebnisse von "ab" auf Heroku (500 Requests):


Concurrency Level:      1
Time taken for tests:   196.944 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      659000 bytes
HTML transferred:       536000 bytes
Requests per second:    2.54 [#/sec] (mean)
Time per request:       393.888 [ms] (mean)
Time per request:       393.888 [ms] (mean, across all concurrent requests)
Transfer rate:          3.27 [Kbytes/sec] received


Percentage of the requests served within a certain time (ms)
  50%    318
  66%    331
  75%    337
  80%    340
  90%    354
  95%    375
  98%    408
  99%    493
 100%  10804 (longest request)


Der erste Request nach Heroku dauert sehr lang (etwa 10 Sekunden), Heroku fährt in der Minimalvariante erstmal den Server hoch. Die nachfolgenden Requests dauern zwischen 300ms und 500ms (inclusive Netzwerk-Latenz).

Nun das gleiche auf dem Rasberry Pi:



Requests per second:    4.91 [#/sec] (mean)
Time per request:       203.817 [ms] (mean)
Time per request:       203.817 [ms] (mean, across all concurrent requests)

Percentage of the requests served within a certain time (ms)
  50%    193
  66%    194
  75%    195
  80%    196
  90%    197
  95%    201
  98%    500
  99%    507
 100%   1707 (longest request)




Wow! Die meisten Requests werden unter 200ms beantwortet. Schneller als Heroku! Allerdings fallen auch keine Netzwerk-Latenzen an, so daß  die Werte nicht direkt vergleichbar sind.

Dabei ist die Systemauslastung des RasPi gering:

top - 22:14:41 up  4:27,  3 users,  load average: 0.61, 0.43, 0.53
Tasks:  73 total,   1 running,  72 sleeping,   0 stopped,   0 zombie
%Cpu(s): 91.5 us,  3.3 sy,  0.0 ni,  4.6 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem:    236880 total,   148012 used,    88868 free,    11276 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    69740 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND          
 8444 pi        20   0 49952  37m 4680 S  80.3 16.3   2:41.88 ruby1.9.1        
 8970 postgres  20   0 48368 8408 6108 S  12.3  3.5   0:06.70 postgres         
 9104 postgres  20   0  4660 1372 1048 R   1.3  0.6   0:00.39 top  


Es sind noch fast 90MB RAM frei! Postgres langweilt sich. Ich bin begeistert!

Ein Test mit Concurrency 10 schafft genau die gleiche Anzahl von Requests/Sekunde. Nicht schlecht.

Fazit

Ein Raspberry Pi kann für eine einfache Sinatra-Anwendung sehr gut mit Heroku in Minimalausstattung mithalten!

Nächster Schritt: Vergleich mit Sinatra unter JRuby,

Raspberry Pi als Webserver: maximales RAM einstellen

Um den RasPi als Webserver zu betreiben, braucht man möglichst viel RAM. Die 256 MB, die der RasPi hat, werden beim Booten gesplitted zwischen Hauptspeicher (der ist uns wichtig!) und Speicher für die Videokarte (der ist uns für diesen Anwendungsfall total unwichtig). Dieser sogenannte "Memory Split" kann geändert werden, indem man im /boot-Verzeichnis eine der vorbereiteten start-Files benutzt. Maximales RAM - nämlich 240MB - ergibt bei mir  (Debian  wheezy) folgendes:

cp /boot/arm240_start.elf /boot/start.elf

dann noch neu starten. Jetzt hat der Kleine nur noch 16MB Video-Ram, aber es ist ja sowieso kein Monitor dran :-)


03.10.2012

Raspbmc RC5 ist da - mit tollen Features!

Die nächste Iteration von RaspBMC (XBMC-Mediacenter auf Raspberry Pi) ist da! Vor einigen Tagen hatte der Composite-Video-Ausgang (RCA-Stecker) damit noch nicht funktioniert, der Bildschirm blieb schwarz :-(

Heute kam nun eine Ankündigung daß das Problem gefixt ist und tatsächlich: nach dem automatischen Update (wird beim Neustart ausgeführt)  funktioniert der Composite-Video-Ausgang wieder!

Wichtigstes neues Feature für mich ist die Wiedergabe von DVD-ISOs. Dank MPEG2-Lizenz und DVD-Menüunterstützung klappt das nun zumindest teilweise - die DVD-Menüs hakeln noch ein bischen. Die Wiedergabe von TS-Dateien (DVB-Transport-Stream im MPEG2-Format) flutscht auch prima.

Raspbmc RC5 ist ein Riesenschritt, das Interface fühlt sich nun wesentlich flüssiger an. Auf der Hardware-Seite hat man nun einige Eingriffsmöglichkeiten mehr zum Übertakten und Feintunen.

Alles in allem unglaublich, was man aus so einer Hardware rausholen kann!

26.08.2012

MPEG-2-Codec/Lizenz für Raspberry Pi (Raspbmc)

Die gekaufte Lizenz war in wenigen Minuten da, nach Installation des Keys in einer neuen /boot/config.txt ging aber MPEG-2 immer noch nicht. Lösung war eine Neuinstallation von Raspbmc mit dem RC4. Tipp zur Neuinstallation: Konfiguration unter /home/pi/.xbmc/userdate vorher sichern und nach Neuinstallation über ssh/scp wieder einspielen.
Jetzt kann der RasPi MPEG-2-Files abspielen, aber leider immer noch keine DVD-ISOs. Auch die Performance für HD-Videos hat sich durch die Neuinstallation verbessert, ein HD-Video, das vorher etwas ruckelte, spielt jetzt flüssig :-)

MPEG-2-Codec (DVD, DVB) für Raspbmc

Cool, es gibt jetzt ein (kostenpflichtiges) MPEG-2-Codec für den Raspberry Pi. Das wird z.B. für die Wiedergabe von DVD-ISOs (ohne CSS) und DVB-Transport-Streams benötigt. Im Raspberry Pi Store gibt es die Lizenz dafür, die an die Seriennumer des RasPi gebunden ist. Das kostet momentan 3,03€ (per Paypal). Es gibt auch eine Lizenz für VC-1 (Blue-Ray, Windows Media, Microsoft Silverlight) für 1,52€. Ich hab mir mal die MPEG-2-Lizenz bestellt und werde es auf Raspbmc ausprobieren, sobald die Lizenznummer ankommt (dauert wohl bis zu 72h).

  • Raspberry Pi Store
  • New video features! MPEG-2 and VC-1 decode, H.264 encode, CEC support

22.08.2012

JRuby auf dem Raspberry Pi

Habe JRuby auf dem RasPi zum Laufen bekommen. Ausführliche Beschreibung hier. Ob das sinnvoll ist, weiß ich nicht. Eine Sinatra-Applikation braucht etwa zwei Minuten zum Start, ist dann aber echt schnell..

21.08.2012

Raspbmc ist klasse!

Habe neulich zwei Raspberry Pi erhalten. das Ding ist klein! Erste Aktion war, auf einem davon raspbmc  zu installieren. Raspbmc ist die Portierung des XBMC-Mediacenters auf den RasPi. Was soll man sagen: ich bin beeindruckt! Mit meiner Tochter zusammen habe ich dann ein standesgemäßes Lego-Gehäuse gebaut:





Bestes Feature für mich: AirPlay: Videos direkt vom IPhone auf den Beamer. Sehr cool. Zur Bedienung gibt es Apps für iOS und Android.

Es ist natürlich nicht alles perfekt, folgende Gotchas gab es bei mir:
  • Anleitung lesen! Zur Installation braucht man eine Ethernet-Verbindung, da das runtergeladene Image die eigentliche Distribution übers Internet holt..
  • Das Netzteil muß genügend Strom liefern! Viele Steckernetzteile bringen keine 700mA.
  • Wenn beim Starten eines Videos nichts mehr über die RCA-Buchse kommt, muß man Audio(!) auf "analog" stellen. Steht zwar in der FAQ, aber..
  • Manche HD-Videos ruckeln alle paar Sekunden
 Hier ein paar Links dazu

21.04.2012

Raspberry Pi: hat den schon jemand bekommen?

Hat schon jemand einen Raspberry Pi aus der neulich angelaufenen Auslieferung bekommen?