Mittwoch, 18. März 2015

AirPlay auf dem Raspberry Pi

Nach dem ich über Weihnachten Amazon Prime Instant Video getestet habe, wollte ich wissen ob ich den kleinen Raspberry als AirPlay Receiver verwenden kann?
Ich habe Raspbmc verwendet. Ursprünglich wollte ich rplay verwenden. Leider hat das mit dem Key für die Beta-Version nicht geklappt.
Zur Installation von Raspbmc bin ich der Anleitung auf der Projekt-Webseite für die OS X gefolgt:
Ich habe eine 4 GB Class 4 SD Karte verwendet die ich noch Zuhause hatte. Nach Abschluss der Installation, diese hat ca. 20 min. gedauert, zeigt sich Raspbmc mit einer schicken grafischen Oberfläche.
AirPlay muss nun noch aktiviert werden. Das geschieht unter
System > Network > “Allow XBMC to receive AirPlay content" 
Ein erster Test mit Arte vom iPad hat auf Anhieb funktioniert.
Amazon Instant Video hat leider eine Fehlermeldung gebracht. Das liegt wohl am DRM. Sowie ich dafür eine Lösung gefunden habe aktualisiere ich die Seite hier. Schade.

Sonntag, 15. März 2015

Wassermelder mit SMS Benachrichtigung über RWE SmartHome

Nach dem Wasserschaden im Keller soll ein Wasseralarm per SMS auf dem Mobiltelefon ausgelöst werden.

Die REW SmartHome Zentrale kann bei einem Alarm eine e-Mail versenden. Diese Funktion kostet einmalig knapp 20€. Darin enthalten sind 20 SMS. Weitere 100 kosten dann jeweils 14,95€.
Das geht auch kostenlos. Allerdings nur über Umwege.


Was habe ich:
- Einen Mail App in der SmartHome Zentrale
- Einen Mail Account bei Google-Mail, Kalender und Drive
- Einen Wassermelder

- Einen Tür und Fenster Sensor

Ablauf:
Die Zentrale sendet eine Mail an die Adresse bei Gmail. In Google-Drive gibt es ein Script das jede Minute nach einer bestimmten Mail schaut. Wenn diese erkannt wird, so wird ein neuer Kalendereintrag erzeugt. Dieser wiederum löst die SMS aus. Klingt kompliziert, ist es auch. Dafür ohne weiter Kosten;-)


Umsetzung:
Die Hardware, Wassermelder und RWE Tür und Fenster Sensor
Ich habe bei Amazon den Wassermelder "Rev Ritter 0023440 Wassermelder MX 80" für knappe 16€ gekauft. Dieser hat einen Alarmausgang. Damit wird ein umgebauter Tür- und Fenstersensor der RWE SmartHome Zentrale angesteuert.
Hier der Anschluss am Alarm-Ausgang des Wassermelders:

Die beiden Adern habe ich durch das Gehäuse und an der Unterseite herausgeführt. So musste ich kein Loch in das Gehäuse bohren. Erleichtert auch den Garantiefall.
Als nächsten habe ich den RWE Tür und Fenster Sensor umgebaut. Im inneren ist ein Reed-Kontakt. An diesen werden zwei Kabel angelötet die vom oben gezeigten Alarmausgang des Wassermelders den Reed-Kontakt überbrücken.

Die beiden Pfeile zeigen die Stelle an denen die Kabel angelötet werden.
Da ich auch den Fenstersensor nicht mit einer zusätzlichen Bohrung versehen wollte habe ich die Kabel durch den kleinen Stern auf der Vorderseite geführt.
Der Kabelbinder dient zur Zugentlastung.
Hier die fertige Konstruktion:
Und hier das ganze an der Wand montiert:
Die Software
Nach dem nun die Technik fertig montiert ist muss der Tür und Fenster Sensor in die RWE Steuerung eingebunden werden und ein Ereignisprofil erstellt werden.
Der Fenster Sensor setzt eine Zustandsvariable auf JA.
Diese wird in einem Ereignisprofil abgefragt und führt zu einer e-Mail.
Nun fehlt noch die SMS Benachrichtigung. Dazu gibt es hier eine gute Anleitung und ein Google Tabellen Dokument zum herunterladen. Das darin enthalten Script muss angepasst werden. Das liegt an der inflexiblen RWE e-Mail Benachrichtigung. Hier lässt sich nämlich die Betreff-Zeile nicht anpassen. Die verschickte Mail enthält zusätzlich HTML-Zeichen die in der SMS auch nicht schön sind. Als Label habe ich in Gmail „SMS“ verwendet.
Eingehenden Mails wird mit einem Filter das Label SMS zugewiesen. Hier das Setup:


Das Script sucht also alle Mails mit diesem Label SMS und erzeugt einen Termin dafür. Zusätzlich wird eine SMS Benachrichtigung für den Termin gesetzt und in Gmail das Label der Mail entfernt.
Hier die angepasste Funktion:
Damit das Script regelmäßig ausgeführt wird muss noch ein minütlicher Träger unter „Ressourcen“ -> „Träger des aktuellen Projektes“ gesetzt werden.
So sieht ein Termin im Kalender dann aus:
Die SMS auf dem iPhone sieht dann so aus:

Die grosse Frage an dieser Lösung ist, wie zuverlässig Google die Kalenderbenachrichtigung per SMS verschickt. Die ersten Tests mit einzelnen Benachrichtigungen am Tag haben bestens funktioniert. Zwischen auftreten des Alarms und Eingang der SMS sind nicht mehr als 2 min. vergangen. Die e-Mail gibt es ja auch noch und wenn ich zuhause bin macht der Wassermelder mit 85 db auch ordentlich krach.

Raspberry PI als Temperatur Logger

Um zu sehen ob die RWE Heizungsthermostate die Raumtemperatur konstant halten können ist ein Datanlogger notwendig. Da schon ein Raspberry PI und auch ein DS18S20 vorhanden waren ist es naheliegend diese einzusetzen. Das Rad muss auch nicht neu erfunden werden da dazu schon reichlich Anleitungen gibt.
Hier also im Schnelldurchgang.
Die beiden Treiber müssen in /etc/modules eingetragen werden.
Eine kleine Anpassung war notwendig. Überall musste 28* durch 10* ersetzt werden. Das liegt wohl am verwendeten DS18S20.
Nach dem die Hardware funktionierte habe ich den Apache2 installiert. Hier die Anleitung:
sudo apt-get update
sudo apt-get install apache2 -y

Da wir das ganze in Python realisieren müssen .py Dateien nach dieser Anleitung ausführbar gemacht werden: http://raspberrywebserver.com/cgiscripting/wr iting-cgi-scripts-in-python.html
Nach dem die Voraussetzungen geschaffen wurden geht es nach dieser Anleitung weiter: http://raspberrywebserver.com/cgiscripting/rpi-temperature-logger/building-an-sqlite-temperature-logger.html
Um die .py Files auf die SD-Karte zu schreiben habe ich das GIT Repository nach dieser Anleitung mit wget heruntergeladen: http://quick2wire.com/articles/a-gentle-guide-to-git-and-github/
Der Befehl lautet dann also:
git clone git://github.com/Pyplate/rpi_temp_logger.git
Beim Testen habe ich Fehlermeldungen bekommen das, dass monitor.pj Script nicht in die Datenbank schreiben kann. Das lag an den Rechten auf die Datenbank. Mit ls -l /var/www/ prüfen werd der owner ist. Bei mir war es pi. Mit
sudo chown www-data:www-data /var/www
sudo chmod 775 /var/www
sudo usermod -a -G www-data pisudo chown www-data:www-data /var/www/templog.db
sudo reboot
konnte ich das Problem lösen. Über die IP-Adresse des Server kann dann mit: http://server.ip/cgi-bin/webgui.py der Temperaturverlauf beobachtet werden.
Hier die Ausgabe eines 24 Std. Logs. Ermittelt im Wohnzimmer in etwa 4m Entfernung zum Heizkörper.
Der Ausreißer um 17:15 kommt wohl durch ein Stoßlüften.

Raspberry PI auto reconnect des WLAN Interface

Mein Raspberry kann das WLAN-Interface nach dem starten meines Roters nicht automatisch verbinden. Die Idee ist nun ein Cron-Job zu erzeigen der alle 5 min. prüft ob der Router noch erreichbar ist.
Von hier http://harizanov.com/2013/04/auto-reconnect-wifi-on-raspberry-pi/ habe ich das folgende Script. 
#!/bin/bash
##################################################################
# A Project of TNET Services, Inc
#
# Title: WiFi_Check
# Author: Kevin Reed (Dweeber)
# dweeber.dweebs@gmail.com
# Project: Raspberry Pi Stuff
#
# Copyright: Copyright (c) 2012 Kevin Reed <kreed@tnet.com>
# https://github.com/dweeber/WiFi_Check
#
# Purpose:
#
# Script checks to see if WiFi has a network IP and if not
# restart WiFi
#
# Uses a lock file which prevents the script from running more
# than one at a time. If lockfile is old, it removes it
#
# Instructions:
#`
# o Install where you want to run it from like /usr/local/bin
# o chmod 0755 /usr/local/bin/WiFi_Check
# o Add to crontab
#
# Run Every 5 mins - Seems like ever min is over kill unless
# this is a very common problem. If once a min change */5 to *
# once every 2 mins */5 to */2 ...
#
# */5 * * * * /usr/local/bin/WiFi_Check
#
##################################################################
# Settings
# Where and what you want to call the Lockfile
lockfile='/var/run/WiFi_Check.pid'
# Which Interface do you want to check/fix
wlan='ra0'
pingip='192.168.2.1'
##################################################################
echo
echo "Starting WiFi check for $wlan"
date
echo
# Check to see if there is a lock file
if [ -e $lockfile ]; then
# A lockfile exists... Lets check to see if it is still valid
pid=`cat $lockfile`
if kill -0 &>1 > /dev/null $pid; then
# Still Valid... lets let it be...
#echo "Process still running, Lockfile valid"
exit 1
else
# Old Lockfile, Remove it
#echo "Old lockfile, Removing Lockfile"
rm $lockfile
fi
fi
# If we get here, set a lock file using our current PID#
#echo "Setting Lockfile"
echo $ > $lockfile
# We can perform check
echo "Performing Network check for $wlan"
/bin/ping -c 2 -I $wlan $pingip > /dev/null 2> /dev/null
if [ $? -ge 1 ] ; then
echo "Network connection down! Attempting reconnection."
/sbin/ifdown $wlan
/bin/sleep 5
/sbin/ifup --force $wlan
else
echo "Network is Okay"
fi
echo
echo "Current Setting:"
/sbin/ifconfig $wlan | grep "inet Adresse:"
echo
# Check is complete, Remove Lock file and exit
#echo "process is complete, removing lockfile"
rm $lockfile
exit 0
##################################################################
# End of Script
##################################################################

In meinem Fall musste ich wlan0 durch ra0 ersetzten. Mit chmod +x das script ausführbar machen.
Das Script wird dann mit sudo crontab -e -u root eingetragen. Standardmäßig ist das Logging von cron nicht aktiviert. Das lässt sich mit sudo nano /etc/rsyslog.conf durch entfernen des # vor cron.* ändern. Nun wird in der Datei /var/log/cron.log nach einem sudo /etc/init.d/rsyslog restart geloggt.
Aktuell schreibe ich mit /5 * * * * /usr/local/bin/WiFi_Check.sh >> /home/pi/WiFi_Check.log in eine log Datei. Sowohl das Cron log als auch das Script log habe ich nach erfolgreichem Testen ausgeschaltet.
Das Script läuft nun schon seit Wochen ohne jedes Problem.