Intro

Schon im Sommer wurde die in den Artikeln "Solarladestation für RC Modelle, die 1te" und "Solarladestation für RC Modelle, die 2te" beschriebene Anlage um zwei Webcams erweitert. Dazu kam dann noch die im Artikel "Wetterstation am Modellflugplatz mit Raspberry Pi und pywws" beschriebene Wetterstation. Das führte natürlich dazu, dass die Grundlast auf der Solaranlage stieg. Im Sommer bereitet das natürlich kein Problem, da immer genügend Leistung von der Sonne geliefert wird. In der dunklen Zeit überwiegen dann die Verbraucher und leeren so langsam die Battieren.

Aus diesem Grund sollte wegen der Wetterstation vorhandene Raspberry Pi die beiden Webcams während der Nacht abschalten. Denn diese verbrauchen in der Zeit nur Strom, können aber sowieso kein brauchbares Bild liefern.

Die einfachste Methode wäre diese zu festen Zeiten ein und auszuschalten. Das war mir dann aber doch etwas zu einfach. Sobald es morgens zu dämmern beginnt, sollen die Kameras eingeschaltet werden und am Abend mit Ende der Dämmerung ausgeschaltet werden.

Hardware

Die ursprüngliche Idee mit einer MOSFET Schaltung an den Ausgängen des Raspberry Pi lies ich schnell wieder fallen, nachdem bei Reichelt die preislich attraktive Karte  "PiFace Digital" gefunden hatte. Diese hat auch gleich zwei Relais on board, die genau für meinen Anwendungszweck passen.

PiFace Digital auf Raspberry Pi

Die Montage der Karte gestaltet sich recht einfach, sie muss lediglich auf die Pfostenleisten aufgesteckt werden. Danach geht es frisch ans Werk und die benötigte Software zur Ansteuerung wird installiert.

Installation

Für die nächsten Schritte sollte Python schon installiert sein, wo wie es auch im Artikel Wetterstation am Modellflugplatz mit Raspberry Pi und pywws beschrieben ist.

Zunächst muss in der Raspberry Konfiguration eine Änderung vorgenommen werden, damit der SPI Bus angesprochen werden kann:

sudo vi /etc/modprobe.d/raspi-blacklist.conf

und ändern der Zeile

blacklist spi-bcm2708

 zu

#blacklist spi-bcm2708

Dann kommen die Python Bibliotheken zur Ansteuerung der PiFace Ports dran:

sudo apt-get update
wget http://pi.cs.man.ac.uk/download/install.txt | bash

Da bei mir die Datei "install.txt" nicht automatisch gelaufen ist, habe ich den Inhalt manuell eingeben:

sudo apt-get install -y python-dev python-gtk2-dev git
pushd ~/
git clone https://github.com/thomasmacpherson/piface.git
pushd piface/python
sudo python setup.py install
popd
sudo piface/scripts/spidev-setup
popd

Die Installation dauert ein wenig, Kaffee holen ist da locker drin.

Nachdem alles installiert ist:

sudo reboot

Das Installationsscript legt eine neue Gruppe "spiuser" an und fügt den automatisch die User "pi" und die Gruppe "www-data" hinzu.
Da mein "pi" User zur Sicherheit von mir gelöscht wurde und stattdessen alles unter z. B. "myadmin" läuft, muss mein administrativer User auch noch dieser Gruppe hinzugefügt werden (und natürlich noch alle anderen, die Zugriff auf die Ports haben sollen).

Dazu einfach

sudo vi /etc/group

dann den Eintrag "spiuser" suchen und mit Komma getrennt die weiteren User eintragen. Danach am Besten nochmal neu starten.

Erster Test

Dazu entsprechend dem Quickstart Guide von element14 folgendes eingeben:

python

Dann erscheint der Eingabeprompt von Python. Jetzt kann es weitergehen mit:

import piface.pfio as pfio
pfio.init()
pfio.digital_write(0,1)

Wenn das erfolgreich verlaufen ist, sollte beim letzten Befehl das erste Relais klicken und die Kontroll-LED für diesen Ausgang leuchten.

piface-ports-on

Der Status des Ausgangs kann mit folgendem Befehl geprüft werden:

pfio.read_output()

Als Ausgabe bekommt man den Dezimalen Wert der binären Darstellung der Ausgänge.

D. h. sind alle Ausgänge auf 0, so gibt es auch eine Dezimale 0.
Ist der Ausgang 0 aktiv und alle andere inaktiv, so bekommt man die 1 angezeigt.
Ist der Ausgang 1 aktiv und alle anderen inaktiv, so bekommt man die 2 angezeigt, usw.

Ausgänge per Shell-Script ein-/ausschalten

In der nächsten Stufe werden die Ausgänge über ein Shell-Script ein-/bzw. ausgeschaltet. Dabei ist zu beachten, dass "pfio.init()" alle Ausgänge resettet. D. h. der letzte Zustand der Ports geht dabei verloren. Dies lässt sich jedoch durch den Aufruf "pfio.init(False)" vermeiden.

Im nächsten Schritt wird jetzt ein Script zum Einschalten und ein weiteres zum Ausschalten erstellt.

vi cams_on.sh

und dann folgenden Inhalt eingeben:

#!/usr/bin/env python
import piface.pfio as pfio
pfio.init(False)
pfio.digital_write(0,1)
pfio.digital_write(1,1)
exit()

Das Ganze nochmal zum Ausschalten:

vi cams_off.sh

und folgendes einfügen:

#!/usr/bin/env python
import piface.pfio as pfio
pfio.init(False)
pfio.digital_write(0,0)
pfio.digital_write(1,0)
exit()

Die erste Zeile des Scripts sorgt dafür, dass das Script als Shell-Script ausgeführt werden kann. Dadurch kann es einfach aus der Shell heraus oder über einen Cron-Job ausgeführt werden.

Anschließend noch die beiden Scripte ausführbar machen:

chmod a+x cams_* 

und schon lassen sich die beiden Ausgänge über ein einfaches Shell Skript ein- bzw. ausschalten.
Das liese sich jetzt noch etwas "optimieren", indem der vorherige Zustand ausgelesen und nur dann der entsprechend Befehl zum Ändern des Zustands gesendet wird.

Über einen Cronjob könnten jetzt die Webcams zeitgesteuert ein- und ausgeschaltet werden. Das hat jedoch den entscheidenden Nachteil, dass dies immer zu einer festen Uhrzeit passiert. Die Webcams sollen aktiv sein, wenn es Tag ist. Da sich das aber mit den Jahreszeiten ändert, muss der Zeitpunkt zum Ein- und Ausschalten abhängig vom Sonnenauf bzw. -untergang gewählt werden.

Ein-/Ausschalten abhängig von Sunrise/Sunset oder Dämmerung

Zum Glück hat sich schon mal jemand in Python Gedanken darum gemacht und das Packet "ephem" erstellt. Also erst einmal "ephem" auf dem Raspberry installieren:

sudo pip install pyephem

Mit dem folgenden Script wird Beginn (morgens) und Ende (abends) der Dämmerung ermittelt. Anschließend wird überprüft, ob die aktuelle Uhrzeit nach Beginn der Dämmerung und vor Ende der Dämmerung liegt. Ist das der Fall, werden die Webcams eingeschaltet. Ansonsten werden sie ausgeschaltet.

Durch den Vergleich der Ausgabe von pfio.read_output() wird geprüft, ob entweder beide ausgeschalten sind (Ausgabe =0) oder beide eingeschalten sind (Ausgabe =3).

#!/usr/bin/env python
import ephem
import datetime
import piface.pfio as pfio

pfio.init(False)

m_latitude = '49.450774'
m_longitude = '11.091456'

m_now = datetime.date.today()

location = ephem.Observer()
location.pressure = 0
location.horizon = '-6'
location.lat, location.long = m_latitude, m_longitude
location.date = m_now

utc_twilight_begin = ephem.Date(location.next_rising(ephem.Sun(), use_center=True))
utc_twilight_end = ephem.Date(location.next_setting(ephem.Sun(), use_center=True))

loc_twilight_begin = ephem.localtime(utc_twilight_begin)
loc_twilight_end = ephem.localtime(utc_twilight_end)

print loc_twilight_begin
print loc_twilight_end

m_time_now = datetime.datetime.now()

if m_time_now.time() >= loc_twilight_begin.time() and m_time_now.time() <= loc_twilight_end.time():
	if pfio.read_output() < 3:
		pfio.digital_write(0,1)
		pfio.digital_write(1,1)
		print "on"
else:
	if pfio.read_output() > 0:
		pfio.digital_write(0,0)
		pfio.digital_write(1,0)
		print "off"
exit()

In der Variable "m_now" wird nur das aktuelle Datum gespeichert. Dadurch kann immer "location.next_rising" bzw. "location.next_setting" verwendet werden. Denn damit rechnet ephem mit der Uhrzeit 00:00:00 und berechnet den nächsten auf diese Uhrzeit folgenden Dämmerungsbeginn bzw. -ende.

Für die Berechnung der Dämmerung wurde "location.horizon" mit dem Wert "-6" belegt. Für die Berechnung des Sonneauf- bzw. untergangs muss hier der Wert "0" eingetragen werden. Weiterhin muss dann noch "use_center=True" in den beiden Aufrufen weggelassen werden.

Die "print" Anweisungen können aus dem Script entfernt werden, wenn es läuft und sind hier nur zum Testen drin.

Nachdem alles schön funktioniert, muss das Script nur durch Cron aufgerufen werden. Dazu

crontab -e

eingeben und folgenden Eintrag erstellen:

0,5,10,15,20,25,30,35,40,45,50,55 5-8,16-22 * * * <hier kommt der vollständige Pfad zum Skript rein>

Die Zeile bewirkt, dass das Skript zu folgenden Zeiten ausgeführt wird:

  • alle 5 Minuten
  • in den Stunden 5 - 8 und von 16 - 22 (entspricht also zusammen mit den Minuten von 05:00 - 08:55 und 16:00 - 22:55)
  • jeden Tag

Im Sommer beginnt die Dämmerung schon kurz nach 04:00 Uhr am Standort der Webcams. Da aber wohl nur wenig so früh auf sind, dürfte es reichen, diese erst um 5:00 einzuschalten.

Die Extreme der Dämmerungszeiten lassen sich ganz einfach ermitteln, indem anstatt des aktuellen Datums einmal das Datum der Sommersonnwende (21.06.xx) und einmal der Wintersonnwende (21.12.xx) eingeben werden.

Quellen:

http://www.element14.com/community/docs/DOC-52857?ICID=rasp-accessory-group

http://rhodesmill.org/pyephem/quick.html