Donnerstag, 26. Februar 2015

Einrichtung Rapberry Pi für FHEM in aller Kürze

Dieser Artikel ist zwar etwas umfangreicher aber auch reichlich veraltet.
Ich halte einen Artikel  aktuell zur Installation Raspberry und FHEM.

Ich mache es jetzt auch noch: Die Anleitung zum Einrichten in aller Kürze.
Nach dem ich im letzten Artikel den Werdegang aufgeschrieben habe, wie ich Stück für Stück den Raspberry zu dem Zustand gebracht habe, dass mein FHEM wieder läuft - will ich es jetzt kurz: in einem Rutsch.
Da gibt es nämlich noch ein Problem: Ich habe ne große SD Karte gekauft, die ist nicht ganz so schnell. Und jetzt habe ich eine schnellere, aber die ist nicht so "groß". Jetzt gibt es keine ganz einfache Variante, mal eben das Image der Raspberry SD Karte von groß auf klein zu machen.
Ich glaube, dass hier ist die geradlinigste!? Und Schnellste?
Ich installiere einfach nochmal ein komplettes Raspbian mit allen notwendigen Ergänzungen und spiele anschließend wieder FHEM zurück. Das hat vor allem den Vorteil, dass ich die Downtime auf das Restore von FHEM reduziere. 

Man braucht eine SD Karte mit mindestens 4 GB, ich nehme aktuell eine SanDisk SDSDQXN-016G-FFPA Extreme Class 3 Micro SDHC 16GB Speicherkarte inkl. Adapter (UHS-I, 60Mbps).
Das Herunterladen des aktuellen Raspbian Wheezy Images (974 MB) ist ein wesentlicher Zeitfaktor, es dauert bei mir ca. 70 min. Ich lasse diese Zeit mal extra stehen. Die Zeiten der folgenden Vorgänge fasse ich am Ende zusammen.
Die Zip Datei entpacken und die xxxx-xx-xx-raspbian.img Datei (3,2GB) mit einem Tool (ich nehme immer USB Image Tool) auf die SD Karte zurück schreiben (das dauert 2min44s).
SD Karte in den Raspberry stecken, Netzwerkkabel und Netzteil anschließen. Mehr braucht es nicht, den Rest machen wir mit dem Terminal, z.B. putty , Dateitransfer z.B. winscp und einem Windows PC.

Putty starten und unter Hostnamen einfach raspberrypi eintragen und open drücken. Funktioniert die Namensauflösung nicht finden wir im Netzwerkrouter/DHCP Server die IP Adresse und verwenden diese im gleichen Feld.

Die Grundkonfiguration mit mit raspi-config dauert etwa 4,5 min.
Anmelden mit User pi und Passwort raspberry (Standard)
sudo raspi-config
Folgende Konfigurationsschritte sind grundlegend für ein deutsches System notwendig:
Expand Filesystem (kann man auch jederzeit später machen, alle folgenden Schritte funktionieren mit dem Original Image)
Boot ins Terminal Desktop oder grafischer Desktop
Internationalisation  Options
   - Locale de_DE.UTF-8 UTF-8 zur ordentlichen Darstellung
       - der vorgewählte Standard en GB.UTF-8 sollte als zweite Auswahl bestehen bleiben.
       - default ebenfalls auf deutsch
       - Tastatur stimmt automatisch
   - Change Timezone
       - Europa
       - Berlin
Unter Advanced Options den Hostname ändern. 
Das Tool schließt mit einem reboot. 

Danach muss man sich mit Verwendung des neuen Hostnamen wieder per Terminal (putty) anmelden. Bei mir war dabei immer die Eigenheit, dass ich jetzt vorübergehend einen FQN angeben musste, also z.B. raspib.fritz.box
Das Basisupdate und Firmwareupdate dauert ca 6 min.
Die Version vor dem Update ermitteln wir mit: uname -a --> 3.18.7+ 755
sudo apt-get update && sudo apt-get upgrade && sudo rpi-update && sudo reboot
Nach dem Update zeigt uns: uname -a --> 3.18.7+ 757

Die Software Installation dauert ca. 15 min.
sudo apt-get install python-dev python-rpi.gpio perl libdevice-serialport-perl libio-socket-ssl-perl libwww-perl libxml-simple-perl msttcorefonts libgd-graph-perl libimage-librsvg-perl libsoap-lite-perl samba samba-common-bin libjson-perl libdigest-md5-file-perl liblwp-protocol-https-perl liblwp-protocol-http-socketunix-perl telnet expect sendemail libnet-ssleay-perl perl && sudo cpan install Digest::SHA1

Der folgende Befehl schafft noch etwas freien Speicher:

sudo apt-get clean

Ein sudo apt-get autoremove wie oft beschrieben brachte bei mir gar nichts.

Das CPAN Modul könnte noch aktualisiert werden, allerdings weiß ich derzeit nicht wie und ob es irgendwelche Vorteile bringt.


Ab hier bis FHEM Installation dauert es ca. 6 min. Es wird "Taster gesteuertes Shutdown/Restart", "FHEM auf Fritzbox Überwachung", "Sonos Sprachausgabe (Samba Freigabe)" und sendEmail Unterstützung eingerichtet.
Ich habe zwei Scripts im Einsatz, diese müssen vom Windows PC auf den Raspberry kopiert werden. Ich nehme dazu Winscp und kopiere die beiden Dateien nach 
/home/pi/shutdown.py und /home/pi/StartFhemOnFritz.sh:

Man braucht noch einen Pfad und alle Rechte müssen gesetzt werden.
sudo chmod +x /home/pi/shutdown.py && sudo chmod +x /home/pi/StartFhemOnFritz.sh && sudo mkdir /mnt/SonosSpeak && sudo chmod 777 /mnt/SonosSpeak/


Jetzt noch Dateien editieren, die Befehle von nano sind selbsterklärend.

sudo nano /etc/rc.local
Am Ende vor exit 0 diese Zeile eintragen
sudo python /home/pi/shutdown.py &

sudo nano /usr/share/perl5/IO/Socket/SSL.pm
Diese Textkette suchen (steht in Zeile 1490) und das $ kurz vorm Ende löschen
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
sudo nano /usr/bin/sendEmail
Diese Textkettte suchen (Zeile 1907)
SSLv3 TLSv1 und durch diese ersetzen TLSv1_0:TLSv1_1:TLSv1_2
sudo nano /etc/samba/smb.conf
Folgende Zeilen hinzufügen:
[SonosSpeak] comment = Audio-Files for SonosPlayer to Speak 
read only = false 
path = /mnt/SonosSpeak 
guest ok = yes
Sicherstellen, dass in der Global-Sektion der Parameter Security auf User steht (oder gar nicht erst definiert wurde):
[global]
security = user
Samba-Server neustarten:
sudo invoke-rc.d samba restart

Fertig: 

Die Einrichtung hat am 2000 DSL Anschluss (ich wohne auf dem Land) bis hierher ca. 34,5 min gedauert. Eigentlich kann man jetzt das Download von FHEM noch integrieren und dann das Image als Installationsbasis verwenden. Download FHEM dauert ca. 45 sec.
FHEM installieren, ist schnell erledigt in ca. 1 min. Beides zusammen, oder download jetzt und Installation später:
wget http://fhem.de/fhem-5.6.deb && sudo dpkg -i fhem-5.6.deb

Man kann dieses Image aufheben und als Grundlage für mehrere Raspberries nehmen. Ich beschreibe später noch wie.

Zusammenfassung: 

In ca. 35 min bekommt ein frisch installiertes System, wenn man das Download von Raspbian  nicht mitrechnet. Diese Zeiten habe mit dem Stand Februar 2015 ermittelt. 
Mit dem Download von Raspbian dauert es ca. 1 h 45 min. 

Mittwoch, 18. Februar 2015

Umzug FHEM auf die Paparazzischeue Power Himbeere

Aktuelles 23.03.2017: Dieser Artikel ist mittlerweile zwei Jahre alt, ich empfehle meine aktuellen Anleitungen zur Installation und zum Umzug 

Vorbemerkung zur Überschrift 

Der neue Raspberry Pi 2 hat einen lichtempfindlichen Chip an Board, man tut also gut daran ein weitestgehend lichtdichtes Gehäuse zu verwenden, oder eben nicht zu blitzen.
Wer Himbeermarmelade mag weiß, die Himbeere an sich hat viele Kerne. Ob die im Kuchen nicht auffallen, ist mir jetzt nicht so bewusst aber der Raspberry Pi 2 hat 4 Kerne anstatt bisher nur einen. Mal sehen ob wir die auch wirklich nutzen können.

Installation

Ich schreibe hier einfach mal mit was ich alles tue, um die aktuelle FHEM Installation auf einen neuen Raspberry Pi umzuziehen. Die vielleicht einfachste Variante ist:
Altes System
sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo rpi-update
sudo halt

Dann SD Karte ins neue System stecken, hochfahren und fertig. Das werde ich später auch noch probieren, aber: Wer will schon immer einfach? :-)

Kann ja sein man will/muss die SD Karte auch wechseln. Oder man will das Betriebssystem einfach mal von alten Lasten befreien. Oder wie auch immer ...

Also erstmal System einrichten, wie von mir beschrieben.

Kleine Feststellung am Rande:
Wenn man mehrere Kommando Zeilen aus diesem Text kopiert und mit einem Mal in das Terminalfenster einfügt wird die Verarbeitung abgebrochen wenn ein Zwischenfrage kommt und man J oder enter drückt. Deswegen schreibe ich mal auch die Einzeiler mit && zwischen den einzelnen Kommandos - liest sich nicht so schön funktioniert aber.

Hardwareunterstützung

Ein bisschen mein Standard ist eine Stop/Start Taste einrichten. Die Hardware ist ja vorbereitet, dann noch:
sudo apt-get install python-dev python-rpi.gpio

das schon existierende Script von dem alten Raspberry kopieren nach
/home/pi/shutdown.py

Rechte setzen
sudo chmod +x /home/pi/shutdown.py

und für den Systemstart aktivieren
sudo nano /etc/rc.local

und ganz zum Ende gehen und vor exit 0
sudo python /home/pi/shutdown.py &
eintragen.

FHEM installieren

Die notwendigen Module, dass -f install am Anfang überprüft nochmal die Paketabhängigkeiten. Ob das bei der sauberen Neuinstallation wirklich nötig ist weiß ich nicht.
sudo apt-get -f install
sudo apt-get install perl libdevice-serialport-perl
sudo apt-get install libio-socket-ssl-perl
sudo apt-get install libwww-perl
sudo apt-get install libxml-simple-perl
oder so
sudo apt-get -f install && sudo apt-get install perl libdevice-serialport-perl && sudo apt-get install libio-socket-ssl-perl && sudo apt-get install libwww-perl && sudo apt-get install libxml-simple-perl
oder so
sudo apt-get -f install && sudo apt-get install perl libdevice-serialport-perl libio-socket-ssl-perl libwww-perl libxml-simple-perl

RSS Unterstützung

Will man RSS verwenden braucht man folgende Module
sudo apt-get install msttcorefonts libgd-graph-perl libimage-librsvg-perl

sudo apt-get install libgd-text-perl (wird gebraucht ist schon installiert)

Sonos Unterstützung 

zusätzliche Perl Pakete
sudo apt-get install libsoap-lite-perl

Die Sprachausgabe benötigt eine Samba Freigabe die von Sonos erreichbar sein muss. Ich habe es noch so gemacht, dass jeder schreiben kann.
sudo apt-get install samba samba-common-bin
sudo mkdir /mnt/SonosSpeak
sudo chmod 777 /mnt/SonosSpeak/
sudo nano /etc/samba/smb.conf
Folgende Zeilen hinzufügen (Pfade müssen natürlich u.U. angepasst werden):
[SonosSpeak]
  comment = Audio-Files for SonosPlayer to Speak
  read only = false
  path = /mnt/SonosSpeak
  guest ok = yes

Hier muss normal nichts stehen, damit steht der Eintrag per default auf user:
[global]
  security = user
Samba-Server neustarten:
sudo /etc/init.d/samba restart
oder
sudo invoke-rc.d samba restart

Für das Caching der Sprachausgabe brauche ich noch ein Perl Modul, welches über cpan installiert werden muss.
sudo cpan install Digest::SHA1

netatmo Unterstützung

Netatmo braucht vor allem die Json Library
sudo apt-get install libjson-perl libdigest-md5-file-perl liblwp-protocol-https-perl liblwp-protocol-http-socketunix-perl

FHEM auf der Fritzbox Unterstützung

Um FHEM auf der Fritzbox Remote zu überwachen brauchen wir auch noch zwei Softwarepakete.
sudo apt-get install telnet expect
und das Script /home/pi/StartFhemOnFritz.sh muss von der alten Installation kopiert werden und mit Berechtigung zum ausführen versehen werden.

Email senden

Siehe hier

Das FHEM Paket selbst ist dann nur noch ein klacks, vorher kann man hier schauen ob es eine Neue Version gibt.
Man kann zwar im Zweifelsfall im sudo machen, aber bei wget braucht man es nicht.
wget http://fhem.de/fhem-5.6.deb
sudo dpkg -i fhem-5.6.deb

FHEM wird gestartet und wir sind erstmal fertig mit einem neuen System.

Wiederherstellung altes System

Jetzt noch FHEM auf den aktuellen Stand bringen, oder braucht man das nicht weil ich ja ein backup zurückspielen will? Man könnte jetzt einfach die fhem.cfg einspielen und neu starten, dazu wäre es clever das System zu aktualisieren. Das will  ich aber nicht, ich prüfe einfach mal ob das System läuft:
http://<hostname>:8083
Man kann an 3 Stellen nach einer Version schauen.

  1. version in der Kommandozeile von FHEM - die Versionsnummern der geladenen Module
  2. fheminfo in der Kommandozeile von FHEM - gibt einen Satz Infos aus, je nach dem was verwendet wird. Bereit um es an das Statistic Modul von Martin Fischer zu senden (fheminfo send)
  3. list global in der Kommandozeile von FHEM - gibt uns die Version der fhem.pl

Da ich etwas testen will, mache ich von diesem System mal noch ein backup. Also einfach backup in der Kommandzeile von FHEM.

Achtung! beim enter drücken passiert erstmal gar nichts. Der Browser sendet nach 1 min den Befehl von sich aus neu, damit werden zwei Sicherungen erzeugt. Also besser nach dem Backup Befehl den Browser schließen und im Terminal weitermachen.

Im Terminalfenster eingeben:
sudo invoke-rc.d fhem stop
Jetzt mache ich am "Alten System" nochmal ein backup und dann ein shutdown in der Kommandozeile von FHEM.

Mit Winscp kopiere ich die aktuelle Backup Datei aus dem Verzeichnis 
/opt/fhem/backup auf meinen Windows PC
und dann auf das neue System nach /home/pi . Damit umgehe ich Schreibrechte, muss nichts verbiegen und es bleibt quasi eine temporäre Datei. Sie hat aus meiner Sicht nichts im Pfad /opt/fhem/backup zu suchen.
Jetzt die eigentliche Wiederherstellung des Programmpfades
sudo tar -xvzf /home/pi/FHEM-201xxxxx_xxxxxx.tar.gz -C /opt/fhem/

In meinem Fall brauche ich an Hardware nichts weiter umstecken, ich habe einen HMLAN. Ansonsten müsste man das hier an dieser Stelle tun. 

Und das System wieder starten
sudo invoke-rc.d fhem start

Das SONOS Modul schreibt bei mir ins aktuelle Terminalfenster, für weitere Arbeit öffnet man besser ein neues.

Für eine Test zwischendurch gebe ich dem HMLAN in der fhem.cfg einfach mal eine andere Adresse um es prinzipiell zu testen
sudo nano /opt/fhem/fhem.cfg

Wenn alles läuft kann man die Sache endgültig machen, wenn nicht folgt noch mal Analyse:
Auf dem alten System
Den automatischen Start von FHEM verhindern
sudo update-rc.d -f fhem remove
Auf dem neuen System
Den Start von FHEM wieder auf automatisch stellen
sudo update-rc.d -f fhem defaults

Restarbeiten

Sounddateien für Sonos
Die vorhandene Dateien kann man einfach von Freigabe zu Freigabe kopieren.
Die DEFs verweisen aber noch auf die alte Freigabe, die müsste man auch noch ändern. Solange der alte Raspberry am Netz ist funktioniert natürlich alles.

Tuning

Das sollte die Plots auf mehrere Prozesse auslagern.
attr WEB plotfork 1

Quellen

Sonntag, 15. Februar 2015

Installation Webmin

Es ist wie immer, für den Anfänger. Man will etwas das erste Mal installieren und findet viele Quellen und Beschreibungen - aber keine ist so richtig vollständig. Webmin als Administrationsoberfläche für den Raspberry Pi und Debian sollte es sein. Deswegen kurz und knapp wie es heute für mich funktioniert hat.

Zunächst mal findet man hier die Quelle für Webmin für Debian. Da kann man etwas lesen und findet die aktuelle Quelle. Aber bevor wir hiermit loslegen braucht es etwas Vorbereitung. Ein paar fehlende Module müssen installiert werden:
sudo apt-get update
sudo apt-get install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl libapt-pkg-perl apt-show-versions

Nun kopieren wir die Quelle auf der Webseite von Webmin für das download der neuesten Version, aktuell sieht die Zeile so aus:
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.730_all.deb

Zur Installation brauchen wir dann root Rechte
sudo dpkg --install webmin_1.730_all.deb

Sollte jetzt eine Fehlermeldung auftauchen,hat sich eventuell etwas geändert und ein weiteres Modul wird gebraucht. Also aufmerksam lesen und eventuell nachinstallieren.

Mit https://<hostname oder IP Adresse>:10000/ kann man nun auf Webmin zugreifen. Allerdings meckert der Browser: Wir haben kein gültiges https Zertifikat! Da man weiß was man tut, kann man ruhig diese Fehlermeldung durch "erweitert" und quittieren der Warnung ignorieren. Will man es genau tun müsste man sich um ein gültiges Zertifikat kümmern. Hier ein paar Infos:



Sonntag, 1. Februar 2015

Email senden von FHEM und RaspberryPi

Da dieser Artikel oft gelesen wird, mache ich mal einen aktuellen Nachtrag:
Aktuell (Ende 2017): In debian stretch hat sich der Name geändert, das Programm heißt jetzt sendemail - früher waren beide Schreibweisen möglich! Bitte bei der Umsetzung des nachfolgenden Codes beachten: aus sendEmail wird sendemail!!!
Aktuell (Dezember 2015) läuft sendEmail ohne jede Korrektur in den Dateien sendEmail oder SSL.pm. Meine Informationen dazu in diesem Artikel scheinen derzeit obsolet. Der erwähnte Wiki Artikel ist auch überarbeitet und von einer Änderung in der Datei SSL.pm wird dort sowieso abgeraten. Das aktuelle debian Paket trägt die Nummer (1.56-5) hat 2262 anstatt 2236 Zeilen und die fragliche Zeile ist 1933 und nicht 1907. Der geforderte Inhalt (laut Wiki) ist dort schon vorhanden. Die Datei trägt keine neue Versionsnummer. Ich bitte das zu beachten und meine ehemals unten vorgeschlagenen Änderungen nicht vor zunehmen!
Falls doch der Fehler "SSL.pm ... Zeile 332" kommt (kann bei wheezy der Fall sein) dann bitte nur die Änderung in der sendEmail entsprechend Wiki vornehmen! 
_____________________________________________________________________
Manche scheinbare einfachen Dinge gestalten sich dann doch als Puzzle im Internet...
Ich wollte Emails versenden von FHEM, es gibt dazu einen Wiki Eintrag da klingt alles ganz einfach. Ist es aber nicht: im vorigen Jahr wurde ja eine gravierende SSL Sicherheitslücke bekannt. Daraufhin wurden natürlich viele der möglichen Angriffspunkte im Web geschlossen. Unter anderem wurden die Email Server umgestellt, auf TLS Protokoll. Das SSL v3 Protokoll wird von den meistens Servern im Web nicht mehr akzeptiert. Es wird verschiedentlich empfohlen anstatt sendEmail Exim4 zu verwenden. Ich halte das für übertrieben, Exim ist ein kompletter Emailserver, der wird eine zusätzliche Last auf dem System erzeugen. Ich glaube viele der Leistungsprobleme mit dem RaspberryPi basieren auf unnötigen Modulen und zu viele Aufgaben parallel. Der Raspberry ist keine eierlegende Wollmichsau, aber als FHEM Server läuft er bei  mir ziemlich flott.

Wenn man alles nach Wiki einrichtet, bekommt man den eindeutigen Fehler:
sendEmail returned: Feb 01 18:51:02 raspifhem sendEmail[3620]: ERROR => TLS setup failed: SSL connect attempt failed with unknown error error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Eigentlich kein Wunder, das in Perl geschrieben sendEmail stammt in der aktuellen Version 1.56-2 aus dem Jahr 2009.
Im Wiki steht auch noch was, dass man die Datei /usr/bin/sendEmail korregieren muss.
Im FHEM Forum findet man dann noch einen anderen Eintrag zum gleichen Thema.
Und hier findet man auch noch einen entscheidenden Hinweis.

Ich habe insgesamt folgendes gemacht, zunächst auf der Kommandozeile:
sudo apt-get update
sudo apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl perl
Jetzt könnte man die Funktion schon auf Kommandozeile testen. Aber man bekommt die Fehlermeldung die im Wiki erwähnt wird: Fehler in SSL.pm in Zeile 332...
Es liegt einfach an einem $ welches in Zeile 1490 der Datei entfernt werden muss:
sudo nano /usr/share/perl5/IO/Socket/SSL.pm
Wir suchen die erste Textkette in der nächsten Box und löschen das $ am Ende (siehe 2. Zeile):
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i
m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i
Dann noch die Datei /usr/bin/sendEmail die Zeile 1907 editieren:
sudo nano /usr/bin/sendEmail
Einfach die obere Zeile in der folgenden Box suchen und durch die zweite Zeile ersetzen
SSLv3 TLSv1
TLSv1_0:TLSv1_1:TLSv1_2
Wer noch ein schnelles Erfolgserlebnis möchte gibt einfach die folgende Zeile ein:
sendEmail -f '<von@domain.tld>' -t '<an@domain.tld>' -u 'Hallo Welt' -m 'Das ist ein Test' -s '<smtp.domain.tld>' -xu '<konto@domain.tld>' -xp '<Passwort>' -o tls=auto

Jetzt noch die notwendigen Schritte in FHEM:
Die Datei 99_myUtils "leer" angelegt, dass klappte wie im Wiki ganz gut.
Anschließend die Subroutine "Debianmail" angelegt und der eigentlichen Befehlszeile tls=auto eingesetzt. 
Dann kann man das Versenden einer Email testen, diese Zeile definiert ein temporären Emailversand in einer Minute. 
define Testmail at +00:01:00 { DebianMail('<name@domain.tld>','Info vom FHEM System','Das EMail Modul funktioniert');;}
Wenns nicht ankommt, kann man das Logfile anschauen, wenn dort "Email was sent successfully!" steht sollte man noch in den Spamordner schauen.