Freitag, 30. September 2016

FHEM in wenigen Schritten

Vorbemerkung

Achtung! Es gibt zu diesem Thema immer wieder neuere Artikel in meinem Blog!
Bitte zuerst nach diesen suchen!

Ich habe diesen Artikel immer mal wieder an aktuelle Veränderungen angepasst, trotzdem wird dieser Beitrag immer einen bestimmten Zustand repräsentieren und alle Quellen für die Installation können sich jederzeit ändern!
Das aktuelle Raspbian gibt es hier -> https://www.raspberrypi.org/downloads/raspbian/
Bitte unbedingt die "Lite" Version ohne Desktop verwenden! Der Desktop bringt unter Umständen (immer neue) nette Enduser Features mit, die später für Probleme sorgen.
Eine aktuelle Anleitung für Debian Systeme gibt es hier -> https://debian.fhem.de/
Die aktuelle allgemeine Anleitung zur Installation von FHEM findet man hier -> http://www.fhem.de/#Installation

Meine Installation

In möglichst wenigen Schritten zu einer funktionierenden FHEM Installation auf dem Raspberry Pi3 zusammen mit dem HM-MOD-RPI-PCB.
Zusammenfassung:
  1. Schritt: Aktuelles Jessie Lite herunterladen. Es sind aktuell ca. 300 MB und das dauert je nach Internetverbindung. Bei mir sind es ca. 8 min und damit fast die Hälfte des gesamten Prozesses!
  2. Schritt: Image entpacken (1,3 GB) und dann auf SD Card schreiben. Ich mache das immer unter Windows und nehme Win32DiskImager. Aufpassen, dass man den richtige Laufwerk erwischt! Dauert bei mir 1:48 min. Die Setup Scripts mit eigenem Inhalt (Siehe nächsten Abschnitt) bitte gleich auf die SD Card ins /boot Volume kopieren. 
  3. Achtung Nachtrag: Ab Jessie 2016-11-25 ist ssh per default nicht mehr aktiv. Damit man "headless" installieren kann, muss im /boot Volume eine leere Datei mit dem Namen ssh erzeugt werden. Für den Raspberry Zero W kann man eine angepasste Datei wpa_supplicant.conf ebenfalls in das /boot Verzeichnis kopieren. Damit klappt dann headless über Wlan.
  4. Schritt: Karte in den Rasberry stecken und booten. ca. 30 sec.
  5. Schritt: mit ssh (putty) auf dem Raspberry anmelden und als erstes auf sudo schalten -> "sudo su" oder die Scripte in Schritt 6 jeweils mit sudo /boot/SetupX.sh aufrufen.
  6. Schritt: Scripte starten /boot/Setup1.sh mit Grundkonfig und HMUART dauern inklusive einem Neustart ca. 21 sec. Die eigentliche Installation /boot/Setup2.sh dauert aus dem Repository je nach Umfang an Debian Paketen etwa 3 bis 9 min.
  7. Schritt: Jetzt noch finales update, das dauert aktuell ca. 2 min mit einem Neustart von FHEM.
Alles in allem hat man nach ca. 16 Minuten einen frisch installierten Raspberry Pi. 
Mit allen Handgriffen und Wartezeiten habe ich 17:45 min gestoppt.

Hinweis: Seit der Version Raspbian Jessie vom 27.5.2016 wird "Expand Filesystem" automatisch beim ersten Start ausgeführt. Man braucht diesen Punkt also nicht mehr manuell über raspi-config ausführen. Die SD Card wird komplett genutzt (siehe weiter unten Feintuning).

Man kann mit verschiedenen Methoden FHEM installieren:

  • Manual - die supportete Variante: Diese Version sollte die Standardvariante sein und ist für jeden geeignet.
  • Repository - schnell und ohne Update aktuell: Wer es in einem Rutsch einfach aktuell haben will, der installiert die "Repository Version" und spart ca. 2 min. Wenn es mit dieser Variante Probleme gibt: dann unbedingt Standard installieren!
  • SVN - zeitlich nahe am Entwickler: Für alle die immer ganz aktuell sein wollen, ist die "SVN Version" gedacht.
Ich habe die einzelnen Installationsschritte in den Scripten kurz kommentiert.

Scripte Setup1.sh und Setup2.sh erstellen

Mit den Script Code-Schnipseln kann sich jeder sein bevorzugtes und angepasstes Script zusammenstellen. Bitte unbedingt darauf achten mit einem Editor zu arbeiten, der im "Unix Code" abspeichern kann (nur lf als Zeilenende). Alle Scripts müssen wegen einfacher direkter Ausführbarkeit mit folgender Zeile beginnen:
#!/bin/bash

Am Ende kommt man mit zwei Scripts aus: 
  • eines für die Grundkonfiguration welches mit einem reboot endet -> Setup1.sh,
  • ein zweites für die Installation und Konfiguration von FHEM -> Setup2.sh.

SetupGrundkonfig

Ein paar Dinge die man auch mit raspi-config erledigen kann.
# Zeitzone
echo "Europe/Berlin" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata

# Konfigurieren lokale Sprache deutsch
sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen
dpkg-reconfigure -f noninteractive locales
update-locale LANG=de_DE.UTF-8

# Hostname
h=<neuer Name>
sed -i s/raspberrypi/$h/ /etc/hosts
echo $h >/etc/hostname
/etc/init.d/hostname.sh

# Kamera aktivieren
echo "start_x=1" >> /boot/config.txt
echo "gpu_mem=128" >> /boot/config.txt
echo "disable_camera_led=1" >> /boot/config.txt

# Wlan bei Bedarf einrichten
# wpa_passphrase '<WLAN SSID>' '<WLAN Passwort>' >> /etc/wpa_supplicant/wpa_supplicant.conf
# sed -i /#psk/d /etc/wpa_supplicant/wpa_supplicant.conf 
# sed -i '/iface wlan0/a \\tpre-up iw dev wlan0 set power_save off' /etc/network/interfaces

SetupHMUART


Dieser Abschnitt ist speziell für den Einsatz des Homematic Moduls HM-MOD-RPI-PCB gedacht. Dafür muss die serielle Schnittstelle aktiviert werden und die Wechselwirkung mit Systemdiensten und dem Bluetooth Service behoben werden. Siehe auch hier.
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen
echo "enable_uart=1" >> /boot/config.txt 
echo "dtoverlay=pi3-miniuart-bt" >> /boot/config.txt 
echo "core_freq=250" >> /boot/config.txt 
sed -i 's/\bconsole=serial0,115200 //' /boot/cmdline.txt
systemctl disable serial-getty@ttyAMA0.service
reboot
Also für den Raspberry PI3 und Jessie lite kann man, wenn man es genauso will, die oberen beiden Schnipsel kopieren und in eine Textdatei Setup1.sh packen.  Dabei sind bei Bedarf die Zeilen für Kamera oder HMUART einfach wegzulassen oder auszukommentieren.

Setup FHEM

Die beiden nächsten Varianten sind auf  debian.fhem.de beschrieben.
Man kann sich entscheiden: will ich einfach ganz schnell ein aktuelles FHEM haben oder die freigegebene Version installieren und dann aktualisieren.
Wer noch nicht weiß was er mit FHEM alles anstellen will und möglichst schnell ein aktuelles FHEM installieren will, der kopiert die Zeilen aus dem folgenden Abschnitt SetupFhemRepository in eine Textdatei Setup2.sh.
Ich empfehle allen, die jetzt nicht genau wissen was sie tun sollen, die Zeilen aus dem Abschnitt SetupFhemManual zu kopieren und in eine Textdatei Setup2.sh zu packen.
Die Spezialisten können auch die SVN Version installieren. Auch hier gilt: Einfach die Zeilen aus dem Abschnitt in die Setup2.sh packen.

SetupFhemManual

Offiziell wird in größeren Abständen (ca. einmal Jährlich) ein Paket vom Entwicklerteam freigegeben. Um dies zu installieren müssen ein paar Installationsvoraussetzungen geschaffen werden. Diese Voraussetzungen können sich bei jedem neuen Paket ändern. Fehlen Software Pakete erfolgt eine  Fehlermeldung und das Paket wird nicht installiert. Die erforderliche Pakete stellen die Grundvoraussetzung dar. Je nach später eingesetzten Modulen können weitere Pakete erforderlich sein.
Die Installation mit dpkg erfordert eigentlich nur zwei Befehle. Es ist zu überprüfen ob sich die Versionsnummer zwischenzeitlich geändert hat. Ich empfehle immer die neueste Version.

Man muss neben Perl (in raspbian vorhanden) die grundlegenden Pakete für FHEM vorher selbst installieren.
# Allgemeine Pakete installieren 
#minimale Basis FHEM sind diese Pakete 
apt-get update && apt-get install libcgi-pm-perl libdbi-perl libdbd-sqlite3-perl libdevice-serialport-perl libjson-perl libwww-perl libio-socket-ssl-perl libtext-diff-perl sqlite3
#Ich benötige derzeit zusätzlich diese Pakete
apt-get install avrdude bluez libcrypt-rijndael-perl libdigest-sha-perl libgd-graph-perl libgd-text-perl libimage-info-perl libimage-librsvg-perl libjson-xs-perl liblwp-useragent-determined-perl libmime-base64-perl libnet-ssleay-perl libnet-telnet-perl libnet-telnet-perl libnet-upnp-perl libsoap-lite-perl libsoap-lite-perl libxml-parser-lite-perl mplayer mp3wrap msttcorefonts samba samba-common-bin sendemail telnet
wget http://fhem.de/fhem-5.8.deb
dpkg -i fhem-5.8.deb
Man kann mit diesem Zustand zwar arbeiten, aber unter Umständen hat man damit die Entwicklung von FHEM für einen langen Zeitraum verpasst. Um auf einen aktuellen Stand zu kommen ist ein update unerlässlich. Als nach der ersten Anmeldung gleich
update

in der Kommandozeile eingeben.

SetupFhemRepository 

Installation eines aktuellen FHEM vom letzten Tag. Hierbei werden die im vorhergehenden Abschnitt offiziell empfohlenen Pakete für FHEM automatisch alle mit installiert.
Ich habe hier im Prinzip nur die nötigen Befehle von der Original Seite kopiert. Bitte unbedingt dort nachschauen ob sich Änderungen ergeben haben!
Die sources.list wird für den Installationsvorgang angepasst und das Setup von FHEM entfernt den unnötigen Eintrag wieder (Hintergrund: FHEM ist über apt-get nicht Update fähig).
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/
wget -qO - http://debian.fhem.de/archive.key | apt-key add -
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list
apt-get update
apt-get install fhem

SetupFhemSvn

Installation der "Entwicklerversion" - aktueller geht es nicht.
Diese Variante stammt ursprünglich aus dem FHEM Forum. Ich habe lediglich entsprechend der svn Seite von FHEM den svn checkout aktualisiert. Ich beobachte diese Variante nur sporadisch. Ich fand diese Variante interessant und habe sie für mich für besseres Auffinden hier dokumentiert.
# Erstmal die empfohlenen Pakete inklusive svn
apt-get update && apt-get install perl-base libcgi-pm-perl libdevice-serialport-perl libwww-perl libio-socket-ssl-perl libcgi-pm-perl libjson-perl sqlite3 libdbd-sqlite3-perl libtext-diff-perl libtimedate-perl libmail-imapclient-perl libgd-graph-perl libtext-csv-perl libxml-simple-perl liblist-moreutils-perl ttf-liberation libimage-librsvg-perl libgd-text-perl libsocket6-perl libio-socket-inet6-perl libmime-base64-perl libimage-info-perl libarchive-extract-perl libusb-1.0-0-dev git subversion
# SVN Version holen
cd /opt && svn co https://svn.fhem.de/fhem/trunk/fhem fhem
# Benutzer manuell hinzufügen und Rechte setzen
useradd --system --home /opt/fhem --gid dialout --shell /bin/false fhem
chown -R fhem:dialout /opt/fhem
# Init Script kopieren, einrichten und bearbeiten
cp /opt/fhem/contrib/init-scripts/fhem.3 /etc/init.d/fhem
sed -i /noaptmark/d /etc/init.d/fhem
sed -i /hold/d      /etc/init.d/fhem 
sed -i /^fi$/d      /etc/init.d/fhem
chmod a+x /etc/init.d/fhem
update-rc.d fhem defaults
# Update Alias einrichten und System starten
echo 'define alias_update cmdalias update AS { `svn update /opt/fhem/` }' >> /opt/fhem/fhem.cfg
systemctl start fhem

Feintuning

Partionierung

Wer nicht die gesamte SD Card nutzen will, also die Partition für Raspbian selbst definieren will, kann die automatische Vergrößerung (seit Jessie vom 27.5.2016) abschalten:
Nachdem das Image auf der SD Card ist, aber vor dem ersten Start, wird die Datei /boot/cmdline.txt editiert. Sie sieht aktuell so aus, der rot markierte Teil ist zu löschen:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh
Bitte nicht von hier kopieren, sondern die Original Datei editieren und die Datei im Unix Format (nur lf) speichern!

FHEM Grundkonfiguration

Unabhängig vom eigentlichen FHEM Installationsverfahren gibt es noch ein paar Dinge auf die man achten muss.
Der initialUsbCheck der beim Start von FHEM die angeschlossenen USB Geräte erkennen soll führt manchmal auch zu Problemen. Wenn man ihn nicht braucht kann man ihn auch gleich abschalten.
# Der USB Check macht manchmal Probleme
echo 'attr initialUsbCheck disable 1' >> /opt/fhem/fhem.cfg

User fhem weiter Gruppenberechtigungen geben, z.B. für lokale Tonausgabe.
sudo usermod -aG audio fhem

Am Ende der gesamten Installation kann man auch noch das Raspbian System auf den aktuellsten Stand bringen.
#Finales Upgrade kann man auch weglassen oder später machen
apt-get update && apt-get -y upgrade

Seit August 2017 braucht man die folgende Maßnahme nicht mehr, der wirkliche Sinn war sowieso umstritten.
Beim Pi3 gibt es irgendwie ein Timing Problem beim Start, unter Umständen erzeugt fhem dann sofort 100% CPU Last. Dagegen hilft es den Start von fhem vom Netzwerk oder dem ntp Dienst abhängig zu machen.
# Den Systemstart von ntp abhängig machen
sed -i s/'# Required-Start:       $local_fs $remote_fs/# Required-Start:       $local_fs $remote_fs $ntp/' /etc/init.d/fhem
systemctl daemon-reload

Man kann auch quick&dirty im Startscript /etc/init.d/fhem ein "sleep 10" einfügen (von mir nicht empfohlen).
sed -i s/'        perl fhem.pl fhem.cfg/        sleep 10\n        perl fhem.pl fhem.cfg/' /etc/init.d/fhem

Attribute die nicht fehlen dürfen

attr global backup_before_update 1
attr global title FHEM-Name
attr global sendStatistics onUpdate
attr global latitude
attr global longitude
attr global motd none
attr global language de
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true }
attr WEB plotfork 1

Und wenn man in FHEM ein Update gemacht hat, kann man auch von einer kleinen "Entwicklungsumgebung" profitieren. Näheres im Wiki.
define Import dummy
attr Import group Entwicklung
attr Import room Entwicklung
attr WEB menuEntries CodeImport,/fhem?detail=Import#

Wer nicht so viel tippen oder zeilenweise in die Kommandozeile kopieren will, kann auch diesen Teil in eine Script packen. So wird FHEM über Terminal per Script bedient:
perl /opt/fhem/fhem.pl 7072 'attr global title '$(hostname)
perl /opt/fhem/fhem.pl 7072 '
attr initialUsbCheck disable 1
attr global backup_before_update 1
attr global latitude 51.xxxxxxxxxxxxx
attr global longitude 12.xxxxxxxxxxxxx
attr global motd none
attr global language de
attr global sendStatistics onUpdate
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true }
attr WEB plotfork 1
define Import dummy
attr Import group Entwicklung
attr Import room Entwicklung
attr WEB menuEntries CodeImport,/fhem?detail=Import#
save
'


10 Kommentare:

  1. Hallo Otto!
    Zum "sleep" im fhem-start-script.
    Das hat mich leider bei der Installation vom "alexa-Lautsprecher" sehr viel Zeit gekostet. Über die Konsole ließ sich das "alexa-start-script" problemlos starten - beim booten klappte es nicht, m.E. durch die Zeitverzögerung beim fhem-start. Mit einer weiteren Zeitverzögerung (2x fhem sleep) im "alexa-start-script" klappte es dann wunderbar. Ich glaube daher, dass das mit den Verzögerungen eine Falle sein kann und würde unbedingt kurzfristig auf "systemd" umsteigen. Habe heute eine Konfiguration vorerst für ein ganz einfaches fhem aus diversen Beiträgen zusammengestellt, die bis dato problemlos funktioniert.
    Zur Diskussion anbei:

    [Unit]
    Description=FHEM Perl Server
    After=syslog.target network.target

    [Service]
    Type=oneshot
    User=fhem
    Group=dialout
    WorkingDirectory=/opt/fhem
    RemainAfterExit=yes
    ExecStart=/usr/bin/perl /opt/fhem/fhem.pl /opt/fhem/fhem.cfg

    # zwei Zeilen wg shutdown und restart hinzugefuegt:

    ExecStop=/usr/bin/perl /opt/fhem/fhem.pl 7072 shutdown
    ExecReload=/usr/bin/perl /opt/fhem/fhem.pl 7072 shutdown;/usr/bin/perl /opt/fhem/fhem.pl /opt/fhem/fhem.cfg;

    [Install]
    WantedBy=multi-user.target

    AntwortenLöschen
    Antworten
    1. Hallo Walter, danke für den Hinweis. Ich habe das im Text mal noch etwas klar gestellt. Das mit dem sleep ist ein "dünnes Brett", ich weiß.
      Da Dein Alexa Start offenbar FHEM "laufend" braucht, wäre es dann konsequent diesen Start von fhem abhängig zu machen! Meines Wissen ist das aber bloß so, weil das alexa script ohne Fehlerbehandlung fhem Befehle zur Status Ansicht auslöst.
      Die Sache mit dem systmd Dienst werde ich hier noch vertiefen :-)
      http://heinz-otto.blogspot.de/2017/01/dienst-unter-raspbian-einrichten.html

      Löschen
  2. Im Skript SetupHMUART sollte /boot/config.txt nicht überschrieben werden, also:
    ---
    echo "enable_uart=1" >> /boot/config.txt
    echo "dtoverlay=pi3-miniuart-bt" >> /boot/config.txt
    echo "core_freq=250" >> /boot/config.txt
    ---

    AntwortenLöschen
    Antworten
    1. Völlig korrekt, da ist mir ein Fehler beim kopieren unterlaufen. Habe es oben korrigiert, danke für den Hinweis.

      Löschen
  3. Hallo,

    welche Scripts meinen Sie?

    "Die Setup Scripts mit eigenem Inhalt bitte gleich auf die SD Card ins /boot Volume kopieren. "

    AntwortenLöschen
    Antworten
    1. Die Scripte die weiter unten im Artikel erstellt werden. Also einfach weiterlesen... :).

      Löschen
  4. Kann man auch gleich noch die configdb per Script einrichten? Falls ja, wird hier noch das entsprechende Script veröffentlicht?

    AntwortenLöschen
    Antworten
    1. Kann man sicher. Ich verwende derzeit configdb nicht und kann deshalb zur Zeit keine Unterstützung bieten.

      Löschen
  5. Kann man denn das Einrichten der configDB automatisieren?
    Falls ja, wird das dann hier noch erklärt, oder ist das Thema nicht interessant? Gerade dabei kann leider Einiges schiefgehen.

    AntwortenLöschen
    Antworten
    1. Wie schon vor 4 Jahren gesagt: kann man sicher. Ich kann es leider nicht.

      Löschen