Archiv der Kategorie: Raspberry Pi

Openhab auf dem Rasbperry Pi installieren

Neben Fhem gibt es auch openhab als opensource Hausautomations Software. Über openhab können unter anderem Aktoren von KNX, Z-Wave oder EnOcean angesteuert werden. Zusätzlich gibt es eine Vielzahl von Bindings wie zum Beispiel für den Linux Videorecorder, die AVM Fritzbox oder Samsung Fernseher.

Openhab wurde in Java geschrieben und kann unter Linux, Windows, Mac OS etc installiert werden, Voraussetzung ist eine aktuell installierte Java Version.

In meinem Beispiel installiere ich die Software unter Raspian auf dem Raspberry Pi und als erstes muss die benötige Java Umgebung installiert werde.

sudo su
apt-get update
apt-get install oracle-java7-jdk

Über java -version erhält man nach der Installation die folgende Ausgabe:
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)

Openhab installieren

Für die openhab Installation habe ich auf dem Raspberry Pi über adduser openhab einen Benutzer angelegt und unter dem Benutzer die Software heruntergeladen(wget https://github.com/openhab/openhab/releases/download/v1.5.0/distribution-1.5.0-runtime.zip). Alternativ kann die Software auch über die Seite http://www.openhab.org/downloads.html heruntergeladen werden, Sie muss dann nur zum Beispiel per scp übertragen werden.
Nach dem entpacken der Datei über unzip distribution-1.5.0-runtime.zip, erhält man die Ordner und Dateistruktur.

Vor dem ersten Start muss chmod 755 start.sh ausgeführt werden, im Ansch kann über ./start.sh openhab gestartet werden.

./start.sh
Launching the openHAB runtime...
osgi> 21:47:58.174 WARN o.o.c.core.ConfigDispatcher[:172] - Main openHAB configuration file 'configurations/openhab.cfg' does not exist.
21:47:58.287 INFO o.o.c.internal.CoreActivator[:61] - openHAB runtime has been started (v1.5.0).
21:48:42.704 INFO o.o.i.s.i.DiscoveryServiceImpl[:72] - mDNS service has been started
21:49:02.580 INFO o.o.io.rest.RESTApplication[:143] - Started REST API at /rest
21:49:08.645 INFO o.o.u.w.i.s.WebAppServlet[:79] - Started Classic UI at /openhab.app

Wie in der Ausgabe zu erkennen ist, muss noch die configurations/openhab.cfg angelegt werden.
cp configurations/openhab_default.cfg configurations/openhab.cfg

Erste Steckdose einbinden

Um die Funksteckdose schalten zu können nutze ich das elro_wiring.py Script aus dem Artikel https://www.itbasic.de/raspberry-pi-erster-schritt-zur-hausautomation/, die ich unter /home/openhab/bin abgelegt habe.
Damit der obenhap Benutzer in der Lage ist die Funksteckdosen zu schalten, muss in der /etc/rc.local noch der Eintrag sudo -u openhab /usr/local/bin/gpio export 23 out vor exit 0 hinzugefügt werden. Nach dem Eintrag muss der Raspberry Pi neugestartet werden, damit die Änderungen wirksam werden.

Zusätzlich habe ich die Datei configurations/sitemaps/default.sitemap und configurations/items/weihnachten.items mit folgendem Inhalt erstellt.

default.sitemap:
sitemap default label="Main Menu"
{
Frame label="Weihnachten"{
Switch item=Stern
}
}

weihnachten.items:
Switch Stern "Sternbeleuchtung" {exec="OFF:/home/openh
ab/bin/wnachten.py 4 0,ON:/home/openhab/bin/wnachten.py 4 1"}

Bevor man jedoch openhab erneut startet, muss das Addon „org.openhab.binding.exec-1.5.0.jar“ in dem Verzeichniss addon abgelegt werden, ansonsten führt openhab das Script nicht aus.
Alle benötigten Addons können hier heruntergeladen http://www.openhab.org/downloads.html werden.

Jetzt openhab über ./start.sh starten und über die URL http://ip Adresse:8080/openhab.app kann auf die Weboberfläche zugegriffen werden.

openhab

Cannot retrieve item

Endlich bin ich dazu gekommen mir openhab anzusehen und hatte gleich zu Beginn ein kleines Problem.

Nachdem ich die ersten Konfigurationsdateien erstellt und openhab gestartet hatte, konnte ich ohne Probleme auf die Weboberfläche zugreifen. Leider erhielt ich dann auf der Kommandozeile die folgende Ausgabe:
21:30:11.412 WARN o.o.u.w.i.r.SwitchRenderer[:70] - Cannot determine item type of 'Stern'
org.openhab.core.items.ItemNotFoundException: Item 'Stern' could not be found in the item registry
at org.openhab.core.internal.items.ItemRegistryImpl.getItem(ItemRegistryImpl.java:80)
21:30:11.427 ERROR o.o.u.i.i.ItemUIRegistryImpl[:411] - Cannot retrieve item 'Stern' for widget org.openhab.model.sitemap.Switch
21:30:11.437 ERROR o.o.u.i.i.ItemUIRegistryImpl[:411] - Cannot retrieve item 'Stern' for widget org.openhab.model.sitemap.Switch
21:30:11.446 ERROR o.o.u.i.i.ItemUIRegistryImpl[:411] - Cannot retrieve item 'Stern' for widget org.openhab.model.sitemap.Switch
21:30:11.454 ERROR o.o.u.i.i.ItemUIRegistryImpl[:411] - Cannot retrieve item 'Stern' for widget org.openhab.model.sitemap.Switch
21:31:58.974 WARN o.o.u.w.i.servlet.CmdServlet[:100] - Received command 'TOGGLE' for item 'Stern', but the item does not exist in the registry
21:32:02.374 WARN o.o.u.w.i.servlet.CmdServlet[:100] - Received command 'TOGGLE' for item 'Stern', but the item does not exist in the registry

Es dauerte ein wenig bis ich den Fehler gefunden hatte und letztendlich half mir nur der Eintrag in einem Forum.

Die Konfigurationsdateien für die Items werden unter dem Pfad configurations/items/ abgelegt und müssen die Endung .items haben. In meinem Fall hatte die Datei die Endung .item.

Ausgabe des NFC Moduls über die Shell verwenden

Die Inbetriebnahme des NFC Moduls ist wie in dem Artikel zu lesen sehr einfach. Leider lässt sich die Ausgabe mit Hilfe von | nicht umleiten und kann somit auf der Shell nicht weiter verwendet werden.
Ich habe mit den Sourcecode(main.c) der mitgelieferten Polling Software angesehen und ein wenig angepasst, nun wird die UID des Tags in die Datei polling.log geschrieben.

Um so wenig Ausgaben wie möglich zu erhalten habe ich die meisten printf... Ausgaben aus dem Code entfernt, ausgegeben werden nun nur noch Fehlerausgaben und die UID.

Damit die Ausgabe in eine Datei geschrieben wird, habe ich folgendes in der main.c ausgetauscht.
Vorher:
printf("UID: ");
uint8_t i;
for(i = 0; i < bLength; i++) { printf("%02X ", bUid[i]); } printf("\n\n");

Nachher:
uint8_t i;
FILE *f = fopen("polling.log","a+");
for(i = 0; i < bLength; i++) { fprintf(f,"%02X", bUid[i]); } fprintf(f,"%s\n", ""); fclose(f);

Zusätzlich habe ich sleep(1) auf sleep(4) gesetzt.

Nach dem kompilieren kann die Software wie vorher über ./card_polling gestartet werde und die UID´s werden in die polling.log geschrieben.

Die UID´s aus der polling.log greife ich über ein kleines Shellscript ab, hierfür mussten zuvor die inotify-tools installiert werden.

apt-get install inotify-tools

Das Script selbst ist wie folgt aufgebaut:
#!/bin/bash
FILE="polling.log"
while true;
do
inotifywait -e modify "${FILE}"
for i in `cat ${FILE}`
do
echo $i
echo "" > ${FILE}
done
done

Wenn das Shellscript gestartet wurde, wird die polling.log überwacht.
Sobald es eine Änderung gibt wird die UID(echo $i) ausgegeben und im Anschluss wird die polling.log geleert.
Anstatt der echo $i Ausgabe könnte die UID auch in eine mysql Datenbank geschrieben werden, diese könnte dann in einem Webfrontend für zum Beispiel eine Zeiterfassung verwendet werden.
Es wäre auch möglich mit zusätzlicher Hardware ein Türschloss zu öffnen oder ein Programm auf dem Raspberry Pi zu starten.

Natürlich wäre das ganze einfacher wenn man den Sourcecode komplett anpassen würde, um zum Beispiel die UID in die mysql Datenbank zu schreiben, für mich reicht jedoch die Verwendung der UID über die Shell.

NFC Modul für den Raspberry Pi

Zu dem NFC Modul welches ich bei Farnell element14 bestellt habe gehört das Modul selbst, ein kleiner Zettel mit Mini Anleitung und eine RFID Karte. Das Modul ist ungefähr so groß wie der Rasbperry Pi und wird direkt auf die GPIO Ports gesetzt. Durch das aufsetzen des Moduls sind leider die anderen GPIO Ports nicht mehr nutzbar.

Damit das Modul genutzt werden kann muss SPI aktiviert werden.
Hierfür auf der Kommandozeile sudo raspi-config ausführen und unter den Advancded Options SPI aktivieren, im Anschluss den Rasbperry Pi neustarten.

Über einem Windows oder Linux Rechner (nicht über den Rasbperry Pi) die benötigte Software hier herunterladen und entpacken. In den entpackten Verzeichnissen befindet sich die card_polling.zip, diese muss auf den Rasbperry Pi kopiert und werden.

Für das kompilieren der polling Software muss zunächst cmake installiert werden.

Als root auf der Kommandozeile:
apt-get update
apt-get install cmake

Nun als Pi user in das Verzeichniss wechseln in der die zip Datei liegt und mit unzip card_polling.zip entpacken.
Nach dem entpacken müssen folgende Befehle ausgeführt werden:

cd ~/card_polling/build
cmake ../source
make

Nun über ./card_polling die kompilierte Software starten und das polling beginnt.

/home/pi/card_polling/build# ./card_polling
/****** Begin Polling ******/
No card or Tag detected
No card or Tag detected
MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

MIFARE Ultralight detected
UID: 04 F1 DE 81 A0 22 80

No card or Tag detected
No card or Tag detected

Sobald eine RFID Karte auf das Modul gelegt wird, gibt die Software den Typ und die UID der Karte aus.

NFC Paket

NFC montiert

UPDATE:Leider hatte ich vergessen die verwendete Distribution mit anzugeben, ich nutze hier Raspian. Danke für den Hinweis Marco

[Raspberry Pi] Browser nach Systemstart im Fullscreen starten

Ein Kollege fragte mich neulich wie er am einfachsten auf drei Fernsehern verschiedene Urls für Präsentationen öffnen könnte. Er dachte zunächst daran einen Rechner mit entsprechender Grafikkarte zu kaufen, ich konnte ihn jedoch überzeugen anstatt eines Rechners, drei Raspberry Pi´s zu verwenden.

Der Plan ist, das der Raspberry Pi hochfährt und automatisch den Browser öffnet.
Um Resourcen zu sparen, wird der midori Browser über die Kommandozeile gestartet und nicht über einen Desktop. Das setzt voraus, das der Pi Benutzer nach dem hochfahren des Systems an der Kommandozeile angemeldet ist.

Hierfür muss die Datei /etc/inittab wie folgt angepasst werden:

Vorher
1:2345:respawn:/sbin/getty --noclear 38400 tty1
nachher
#1:2345:respawn:/sbin/getty --noclear 38400 tty1
1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

Damit der Browser den gesamten Bildschirm ausfüllt (Kiosk Mode) und zum Beispiel der Mauszeiger nicht dargestellt wird, müssen noch weitere Programme installiert werden.

apt-get install matchbox x11-xserver-utils unclutter

Das Script sieht dann wie folgt aus:
#!/bin/sh
unclutter &
matchbox-window-manager & :
xset -dpms
xset s off
while true; do
/usr/bin/midori -e Fullscreen -a https://www.itbasic.de
done

Hier eine kurze Erklärung:
unclutter – lässt den Mauszeiger verschwinden
matchbox-window-manager – sorg für den Kiosk Modus
midori -e Fullscreen -a URL – startet den Browser
xset -dpms und xset s off deaktiviert den Bildschirmschoner
Die while Schleife sorgt dafür, das der Browser bei einem Absturz neu gestartet wird.

Nach einem chmod 755 presentation.sh, lässt sich das ganze dann über xinit /home/pi/presentation.sh starten. Um es wieder zu beenden reicht strg + alt + F1 und im Anschluss strg + c.

Automatischer Start

Ein Eintrag in der /home/pi/.profile reicht nun aus, damit die Präsentation nach dem Systemstart gestartet wird.

Ich habe jedoch das folgende Script in der /home/pi/.profile hinterlegt, welches prüft ob der Raspberry Pi eine IP Adresse über den dhcp Server bekommen hat. Wenn keine IP Adresse vorhanden ist, wird die Präsentation nicht gestartet und dafür ein Hinweis auf der Konsole ausgegeben.

start.sh:
#!/bin/bash
ifconfig | grep 192
if [ $? -eq 0 ]
then
xinit /home/pi/presentation.sh
else
echo "!!! keine Netzwerkverbindung !!!"
echo "Bitte stellen Sie eine Netzwerkverbindung her und"
echo "fuehren Sie xinit /home/pi/presentation.sh aus"
fi

Betriebssystem klonen

Für die zwei weiteren Fernseher muss mein Kollege einen Klone der SD Karte erstellen.
Das ganze lässt sich unter linux über dd einfach realisieren.

1. Image der SD Karte erstellen
dd if=/pfad/zur/sd/karte of=/home/user/sd-image.img
2. SD Karte wechseln und Image auf die neue SD Karte spielen
dd if=/home/user/sd-image.img of=/pfad/zur/sd/karte

Auf diesem Weg lässt sich ein Backup des gesamten System erstellen, hilfreich wenn man des öfteren verschiedene Programm etc ausprobieren möchte.

Hostnamen ändern

Zum Abschluss muss noch der Hostname in der /etc/hostname und /etc/hosts angepasst werden, da sonst der Hostname dreimal im Netzwerk vorhanden ist.

Quellen:
Browser im Kiosk Modus starten: https://github.com/MobilityLab/TransitScreen/wiki/Raspberry-Pi
Autologin:http://elinux.org/RPi_Debian_Auto_Login