Posts mit dem Label RaspberryPi werden angezeigt. Alle Posts anzeigen
Posts mit dem Label RaspberryPi werden angezeigt. Alle Posts anzeigen

Donnerstag, 26. Januar 2023

Raspberry konservieren

Es gibt verschiedene Überlegungen warum man einen Raspberry mit "Schreibschutz" ausstatten sollte. Meine war: Hat man Geräte im Einsatz die eventuell rau behandelt werden und eigentlich keine Daten produzieren, kann man doch auch jeden Schreibvorgang verhindern. 

Geht das überhaupt und ist das auch für den Administrator praxistauglich ? Das Raspberry OS hat sogar (fast) alles vorbereitet: Stichwort Overlay Filesystem.

Freitag, 10. Juni 2022

Headless Setup Raspberry 2022

RaspiOS hat im April 2022 ein paar einschneidende Änderungen erfahren:
  1. Andere Kompression des Images, früher zip jetzt img.xz
  2. Kein Standardbenutzer mehr im System, damit ändert sich das Headless Setup.

An dieser Stelle ein paar Tipps:

Mittwoch, 26. August 2020

Crash Recovery

Das System verhält sich komisch? Raspbian bleibt beim Start hängen?

Die SD Card als Datenträger beim Raspberry soll ja häufig den Geist aufgeben. Ich hatte das noch nie, ich behaupte immer das passiert bevorzugt wenn Datenbanken im Spiel sind - aber jetzt hatte es einen Kumpel aus heiterem Himmel getroffen. Ohne Datenbank, ohne aktuellem Backup. Ich konnte ihm helfen und daraus ist dieser Artikel geworden.

Was tun?

Zutaten

  • Neue SD Card für das neue System, Größe "egal"
  • USB Stick oder zweite SD Card + Reader mit dem Speicherplatz mindestens der alten SD Card.
  • Image Tool  (win32diskimager, USB Image Tool, Etcher oder mit Linux Bordmitteln dd.)

In jedem Fall eine Kopie der SD Card anfertigen: Imagedatei ablegen.

Die Originalkarte sollte nicht weiter manipuliert werden und meist ist eine Reparatur der defekten Karte weder sinnvoll noch möglich!

Den Raspberry neu machen

An der Stelle der Hinweis, auf diesen Artikel falls man nicht mehr weiß, welche Perl Module für die persönliche Installation nötig sind.
systemctl stop fhem

Dateisystem prüfen und Zugriff herstellen

Die 1:1 Kopie auf dem USB Stick (oder SD Card in SD Reader) in den Raspberry stecken. 

Achtung: Das geht bei einem Pi ab Version 2 nach meiner Erfahrung gut. Ein 1er Exemplar würde ich zum Stecken herunterfahren, er wird beim einstecken von selbst neu starten. 

Oder die Imagedatei direkt mounten, siehe weiter unten.

Danach sollte sich folgendes Bild ergeben:

pi@raspib31:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 29,8G  0 disk
├─sda1        8:1    1 41,7M  0 part
└─sda2        8:2    1   15G  0 part
mmcblk0     179:0    0 14,9G  0 disk
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 14,7G  0 part /
Der USB "Stick" wird als sda erkannt, die interessante Partition ist sda2. Für die jetzt folgende Reparatur darf sda2 nicht gemountet sein/werden! 

Ein erster Check ohne Optionen erledigt offenbar schon mal alles, mir ist nicht klar in welchem Fall welche zusätzlichen Optionen (oft empfohlen -l, Hilfe mit -h) notwendig sind.

Alle weiteren Befehle erfordern erhöhte Rechte, deswegen erstmal sudo su. 

Die Ausgabe ist nur ein Beispiel und kann je nach Fehler völlig anders sein!

sudo su
fsck /dev/sda2
# fsck from util-linux 2.33.1
# e2fsck 1.44.5 (15-Dec-2018)
# /dev/sda2: recovering journal
# Setting free inodes count to 899857 (was 899863)
# Setting free blocks count to 3338902 (was 3339342)
# /dev/sda2: clean, 46703/946560 files, 577130/3916032 blocks

SD Card mounten 

Jetzt die interessante Partition mounten und hoffen dass etwas lesbar ist.

mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2

Alte Dateien kopieren

Alle Dateien von dem alten System werden kopiert und die Rechte entsprechend gesetzt, zuletzt wird das USB Gerät ausgeworfen. In der Hoffnung, dass nichts wichtiges kaputt ist! 

Idee: Man könnte die Backup Dateien ausschließen  oder rsync verwenden.

cp -R /mnt/sda2/opt/fhem/* /opt/fhem/
chown -R fhem: /opt/fhem/
umount /mnt/sda2

System prüfen

systemctl start fhem

Das kann eine Weile dauern, z.B. wenn Moduldateien fehlerhaft sind. Der Ungeduldige kann derweil ins Log schauen.

tail /opt/fhem/log/fhem-$(date +%Y)-$(date +%m).log

Wenn das System Fehler zu defekten Modulen liefert, nach dem Start in FHEM erstmal ein update versuchen.

update force

Neu starten und System wieder prüfen

systemctl restart fhem

Wenn es doch nicht läuft

  • Es fehlen System Pakete? Da hatte ich hier schon mal was geschrieben.
  • Wenigsten mit der fhem.cfg neu anfangen, notfalls eine Alte aus dem restoreDir pfad. Siehe Wikiartikel.
  • Ist eine Backupdatei in /opt/fhem/backup vorhanden? Einfach das letzte Backup versuchen, siehe hier.

Alternative - Image Datei direkt mounten

Die kopierte Image Datei wird direkt als Block Laufwerk eingebunden. Ich habe dazu hier eine gute Erklärung gefunden. Das sieht alles etwas komplizierter aus, aber eigentlich spart man die Zeit für die Kopie auf den USB Stick und man muss nichts stecken.

Zunächst den Pfad zum Image z.B. über cifs (SMB) einbinden:
sudo su
# SMB Laufwerk mounten
mp="/mnt/daten"
mkdir $mp
mount -t cifs -o username=UserName,password=Passwort //server/sicherung $mp
# Loop Device erstellen
img="$mp/fhem/raspib3/kopieSdDefekt.img"
ldev=$(losetup --show -f -P "$img")
An der Stelle hat man quasi "den USB Stick gesteckt" d.h. man hat einen /dev/ Eintrag den man wie ein angeschlossenes Laufwerk behandeln kann. Dies(e) Gerät(e) anzeigen:
losetup -l
Jetzt kann man wie oben beschrieben fsck ausführen. dafür kann man einfach die Variable $ldev verwenden:
fsck ${ldev}p2
Ist der Vorgang erfolgreich kann man die Partitionen mounten:

Achtung: Diese Schleife mounted nicht, sie gibt nur die Befehle aus!
#Alle Partitionen mounten
for part in ${ldev}p*
do 
  dst=/mnt/$(basename $part)
  echo "mkdir $dst"
  echo "mount $part $dst"
done
Nachdem man analog zu oben die Dateien kopiert hat, kann man alles wieder aufräumen:
umount /mnt/loop0*
rm -R /mnt/loop0*
losetup -D
umount $mp

Backup einrichten!

Siehe dazu auch meinem Artikel zur externen Sicherung des FHEM backups.

Dienstag, 9. Juli 2019

Neues Linux System - Nacharbeit

Generell ist es relativ einfach eine bestehende FHEM Installation auf ein neues Betriebssystem/System zu setzen:
  1. Backup FHEM
  2. Kopie der aktuellen Backupdatei -> Server | USB Stick | per scp lokal
  3. sudo halt
  4. neue SD Card mit aktuellem Image (ich behalte immer die alte SD erstmal in Reserve)
  5. setupBasic, setupFhem, testen
  6. Backupdatei verfügbar machen -> Server | USB Stick mounten | per scp - lokal -> nach /home/pi
  7. stop fhem
  8. restore des Backups
  9. start fhem

Sicherung / Backup

Bei mir ist beim obigen Plan mindestens die Anbindung an Dateiserver und die ssh Verbindung auf der Strecke geblieben. Schritt 1 und 8 muss man dafür noch etwas ausbauen.

Sicherung ssh Umgebung

Die notwendigen Dateien befinden sich in diesen Verzeichnissen:
  • /etc/ssh für den ssh Host / Server
  • /opt/fhem/.ssh für den User fhem
  • /home/pi/.ssh für den User pi. 
Ich werde zwei zusätzliche Dateien in den Backup Ordner von FHEM erstellen. Dies könnte man auch von FHEM von Zeit zu Zeit machen lassen. Neben der Datei für eine Historie mit Zeitstempel erzeuge ich noch eine ohne Zeitstempel. Damit muss man bei der Wiederherstellung nicht lang suchen.
Man kann dieses als Script auch unter FHEM ausführen, da aber Systemdateien gesichert werden, muss tar als sudo ausgeführt werden. Damit das funktioniert, muss die zuständige Datei um /bin/tar ergänzt werden.
datei=/opt/fhem/backup/ssh$(date +%Y%m%d_%H%M%S).tar.gz
sudo tar -czf $datei /etc/ssh /opt/fhem/.ssh /home/pi/.ssh
sudo cp $datei /opt/fhem/backup/ssh.tar.gz
Falls der User fhem gar kein ssh verwendet kommt ein Fehler, dann muss man die Befehle abwandeln. Da die Dateien nicht voluminös sind, kann man auf zip verzichten. Damit kann das tar Archiv leichter mit der Option -rf ergänzt werden.
sudo tar -cf $datei /etc/ssh /home/pi/.ssh
cp $datei /opt/fhem/backup/ssh.tar
Der folgende Zweizeiler wirft zwar Fehler, sichert aber die ssh Dateien für alle existierenden User.
datei=ssh$(date +%Y%m%d_%H%M%S).tar
sudo tar rf $datei /etc/ssh $(awk -F: '$3>998{print $6"/.ssh"}' /etc/passwd)
Will man einfach in FHEM die ssh Key für user fhem sichern kann man das auch dort machen: 
"datei=./backup/sshFhem$(date +%Y%m%d_%H%M%S).tar;; tar -cf $datei ./.ssh"
Und auch später wiederherstellen:
"datei=./backup/sshFhem*.tar;; tar -xf $datei ./.ssh"

Sicherung Dateiserver Umgebung

datei=/opt/fhem/backup/fsconf$(date +%Y%m%d_%H%M%S).tar.gz
sudo tar -czf $datei /etc/fstab /usr/.*credentials /etc/davfs2/secrets
cp $datei /opt/fhem/backup/fsconf.tar.gz
Hat man Scripte o.ä. zusätzlich in anderen Pfaden, kann man die natürlich einfach in dem tar Befehl ergänzen und gleich mit sichern oder eine weitere Datei nach gleichem Schema erzeugen.

Finale Sicherung des alten Systems

Damit man den finalen Status im FHEM System behält, muss man FHEM beenden und dann ein backup durchführen!
systemctl stop fhem
datei=/opt/fhem/backup/FHEM-$(date +%Y%m%d_%H%M%S).tar.gz
tar -czf $datei -C /opt/fhem --exclude ./backup ./
Wenn das Backup zu Ende ist, startet man beispielsweise das Script /opt/fhem/backupFhem.sh und kopiert alle aktuellen Dateien damit auf den Sicherungsserver.
Am Ende des Artikels habe ich noch den Hinweis auf Alternativen zum Server.

Wiederherstellung

Nachdem das neue System grundlegend installiert und getestet ist (Ergänzung Schritt 5. optional: setupDavfs) wird die Sicherung zurückgespielt.
Die Verbindung zu meinem Windows Server geht relativ simpel. Ohne Angabe des Usernamens wird der momentane User (root) verwendet. Ohne Angabe des Passwortes wird es abgefragt:
sudo su
mount -t cifs //ServerName/Freigabe /mnt
mount -t cifs -o username=UserName //ServerName/Freigabe /mnt
mount -t cifs -o username=UserName,password=Passwort //ServerName/Freigabe /mnt
Ist das Laufwerk verbunden, kann auch ohne lokale Kopie sofort mit der Wiederherstellung begonnen werden.
datei=/mnt/fhem/$(hostname)/backup/FHEM-$(date +%Y%m%d_%H%M%S).tar.gz
tar -xzf $datei -C /opt/fhem
Querverweis: Falls die Module im alten System nicht gut dokumentiert waren, hilft eventuell dieser Beitrag.

Wiederherstellung ssh

Bei meinen Systemen wurde immer nur der ecsda Key verwendet. Ich möchte nicht die neue ssh Server Gesamtkonfiguration zerstören (da ändert sich immer mal was, ich habe nicht untersucht was genau) sondern nur das wiederherstellen was gebraucht wird. Unter der Annahme: es gibt nur eine aktuelle Datei im Verzeichnis, wird damit der ecdsa Key in /etc/ssh wieder hergestellt:
datei=/mnt/fhem/$(hostname)/backup/ssh.tar.gz
tar -xzf $datei -C / --wildcards etc/ssh/ssh_host_ecdsa_*
Um die User .ssh Verzeichnisse wieder herzustellen, sollte dieser Befehl gut sein
tar -xzf $datei -C / home/pi/.ssh/ opt/fhem/.ssh/
Damit steht die ssh Umgebung wieder.

Wiederherstellung Verbindungen zum Dateiserver

Die für die Verbindung verantwortlichen Scripte sollten im /opt/fhem Verzeichnis liegen und sind damit schon Teile der Wiederherstellung. Die Datei /etc/fstab und die jeweiligen Credential Dateien liegen aber unter Umständen "verstreut" im System und sind jetzt entweder nicht vorhanden oder neu gemacht.
Zunächst die credential Datei(en) in /usr/
datei=/mnt/fhem/$(hostname)/backup/fsconf.tar.gz
tar -xzf $datei -C / --wildcards usr/.*credentials
Die davfs2/secrets will ich nur ergänzen, davfs muss schon installiert sein!
tar -xzf $datei etc/davfs2/secrets -O|grep magentacloud >> /etc/davfs2/secrets
Ich möchte gern die fstab nicht überbügeln sondern die neue Datei einfach um meine Einträge ergänzen. Existieren z.B. mehrere Mountpoints in /media/ - kann das in einer Zeile erledigt werden:
tar -xzf $datei etc/fstab -O|grep /media/ >> /etc/fstab
Jetzt müssen noch die Mountpoint erzeugt werden:
mkdir $(tar -xzf $datei etc/fstab -O|grep -o '/media/[a-Z,0-9]*'|tr '\n' ' ')

Jetzt kann man das Sicherungslaufwerk wieder trennen.
umount /mnt
Die Verbindung zu davfs2 erfordert auch noch die Gruppenmitgliedschaft in der Gruppe davfs2
usermod -aG davfs2 fhem
Die Gruppenmitgliedschaft greift erst nach erneutem Login! Also mindestens FHEM neu starten!

Alternativen zum Sicherungsserver

USB Stick
Man könnte einen USB Stick verwenden, der Raspberry Pi 3 verkraftet das Stecken im laufenden Betrieb. Bei allen anderen Typen und "zur Vorsicht" ist aber vom Stecken eines USB Sticks im laufenden Betrieb abzuraten. Zuerst schauen welches Device der Stick geworden ist und dann einfach temporär mounten:
lsblk
mount /dev/sda1 /mnt

SCP - lokale Kopie
Mit scp ist es recht simpel sich eine Kopie der Dateien lokal zum holen und diese später zurück zu spielen. Geht auch unter Windows 10 ab 1809 einfach so!
scp pi@hostname:dateiname .
scp dateiname pi@hostname:
Die Restore Befehle muss man natürlich etwas abwandeln, entweder die Variable $datei wird einfach auf die lokale Datei Homedir von pi gesetzt, oder im tar Befehl die Datei direkt angeben.

Installation nodejs, pm2 und pip

Die Installation von nodejs hatte ich ja hier schon erläutert.
Zusätzlich brauche ich "global" noch den Nodejs Prozessmanager pm2.
sudo su
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install nodejs
npm install pm2 -g
Trotz der Sicherung des gesamten Ordners installiere ich Landroid neu. Wie so oft gibt es mittlerweile neue Versionen.

Python Pakete werden mit Hilfe von pip installiert. Beispiel: die fhem API
apt-get install python-pip
pip install fhem


ToDo
Andere Applikationen unterhalb von /opt sichern

codebox

Montag, 6. Mai 2019

Setup Raspberry Pi 2019

Mal wieder ist ein Jahr um und ich habe ein bisschen dazu gelernt. Ich stelle jetzt meine Setup Scripts über GitHub zur Verfügung, das macht es leicht sie einfach beim Setup zu laden.
Am grundlegenden Setup vom System und von FHEM hat sich nicht soviel geändert, deswegen verzichte ich hier auf Detailbeschreibungen, soweit die vom vorigen Jahr noch gelten.

Mein Setup basiert auf einem aktuellem raspbian Lite Image, welches von raspberrypi.org herunter geladen wird und mit einem Imagetool (Windows z.B. win32DiskImager) auf die SD Card geschrieben wird. Für die Headless-Installation braucht man den ssh Zugang und darf die Datei ssh im Bootlaufwerk nicht vergessen! Vor dem Kopieren den Laufwerksbuchstaben richtig setzen (meine Codeboxen sind editierbar) ctrl+a um alles zu kopieren, Windows+r um die Ausführen-Box zu erhalten und die Zeile dort "einwerfen".
cmd /c echo " " >e:\ssh

Beim Setup braucht man erweiterte Rechte, deshalb alles im Context "root" - sudo su ausführen! Man kann die Scripts entweder mit chmod +x ausführbar machen oder einfach mit bash Scriptname starten. Bitte beachten:
Alle meine Scripts sind für "einmaligen" Gebrauch bestimmt! Ich habe praktisch keine Fehlerbehandlung für wiederholte Ausführung und Bereinigung drin. Sollte also während der Installation etwas schief gehen, kann man völlig neu beginnen oder muss die Installation Schritt für Schritt manuell ausführen!

Die Basis

Die Grundeinstellung:

  • Zeitzone Berlin, 
  • alles auf "deutsch" :
    • Land, 
    • Locale, 
    • Consolen Keyboard 
    • und WiFi, 
  • Hostname. 

Das müsste eigentlich noch um die Abfrage des Passwortes für Pi ergänzt werden.
Das Setup Script startet mit einem Upgrade des aktuellen Raspbian Standes, je nach nach aktuellen Zeitpunkt "zwischen den Images" kann das aktuelle Image schon ein paar Monate alt sein und könnte offene Lücken haben.
Wesentliche Schritte sind im Script kommentiert, das wird auch aktuell gehalten.
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupBasic.sh
Jetzt hat man ein aktuelles raspbian, das restliche Setup ist Anwendungsspezifisch.
Update Juni 2019: Mir ist erst jetzt aufgefallen, das hostnamectl den Namen in der /etc/hosts nicht anpasst. Das muss man also zusätzlich mit sed (Meine Version von September 2016) tun.

Für Pi mit Bluetooth Modul

Als nächstes kann man für Zusatzmodule auf der GPIO-UART Schnittstelle beim Pi3 und P3+ diese Schnittstelle aktivieren.
Bei den Modellen B, B+, B2 wird lediglich die uart aktiviert, da sie per default deaktiviert ist. Link
Nach diesem Script wäre ein Neustart fällig, aber nicht an dieser Stelle notwendig und deshalb nicht integriert. Den reboot kann man jederzeit später einbauen.
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupUart.sh

Samba Server

Für die Sprachausgabe brauche ich einen SMB Server. Das folgende Script installiert den Dienst und ein SMB Share, welches ohne Anmeldung frei beschreibbar ist!
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupSamba.sh

FHEM

Auch das Script für die grundlegende FHEM Installation habe ich angepasst. Ich verwende jetzt zwei Textdateien in denen meine aktuell zusätzlich verwendeten deb Pakete und Perl Module (cpan) enthalten sind. Wer das lokal anpassen möchte erstellt einfach im aktuellen Pfad (/home/pi) beide Dateien mit entsprechendem Inhalt (Vorlage auf GitHub). Die vorhanden Dateien werden vom Script genutzt und nicht überschrieben.
Das Script arbeitet folgende Schritt ab:

  • Vorbereitung FHEM Setup gemäß https://debian.fhem.de/
  • Hole Textdateien mit zusätzlichen deb Paketen und Perl Modulen
    • und Installiere ...
  • Installation FHEM
  • Basiskonfiguration FHEM 

wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupFhem.sh
Nach dem Download ist es sicher sinnvoll, gerade die Basiskonfiguration von FHEM noch anzupassen und zu erweitern. Z.B. die Ortsabhängigen Koordinaten attr global l...
Ein automatisches Save am Schluss der Konfiguration ist in meinem Script nicht drin!

Backup

Wer möchte kümmert sich auch jetzt sofort ums Backup. Ich hatte dazu schon etwas geschrieben
Das Script muss nach dem download mit den Informationen zum Server und Account angepasst werden.
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupBackupFhem2Cifs.sh

Nodejs

Einige Applikationen erfordern die Anbindung mit Node Server. Die Installation habe ich hier beschrieben und ein simples Script dazu gemacht.
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setupNodejs.sh

Tipp

Will man alle hier erwähnten Scripts herunterladen, geht das mit "Brace Expansion" in diesem Einzeiler.
wget https://raw.githubusercontent.com/heinz-otto/raspberry/master/setup{Basic.sh,Uart.sh,Samba.sh,Fhem.sh,BackupFhem2Cifs.sh,Nodejs.sh}

Sound

Tobias hat irgendwann in seinem Text2Speech Modul den Aufruf MplayerCall so erweitert, dass man den Aufruf z.B. für play ohne mein früheres Wrapper Script verwenden kann. Der Volume Level wird bei mplayer quasi in Prozent, bei play eher als Faktor angegeben. Deshalb teile ich den vom Modul übergebenen Level einfach durch 100. Zusätzlich muss man den leicht anderen Syntax des Alsa Devices bei der Definition beachten! (Bei mplayer hw=0.0)
Mit aplay -l kann man sich die Geräte anzeigen lassen. Die Subgeräte kann man bei der Definition weglassen! Zeigt aplay -l die Soundkarte als Device 1 braucht in der Definition nur hw:1 stehen.
Leider kann die Shell nur ganze Zahlen rechnen. Man könnte Perl nehmen oder die Nachkommastellen mit Modulo rechnen. Ich habe mal beide Varianten aufgeschrieben. Funktionieren tun beide.
define MyTTS Text2Speech hw:0,0
attr MyTTS TTS_MplayerCall AUDIODEV={device} play -q -v $(perl -e 'print {volume}*{volumeadjust} / 10000;') {file}
attr MyTTS TTS_MplayerCall AUDIODEV={device} play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file}
Es gibt eventuell eine Fehlermeldung (WARN alsa: can't encode 0-bit Unknown or not applicable) und es wird trotzdem Sound wieder gegeben. Das ist offenbar ein Bug, diese Meldung kann man mit &>/dev/null am Ende des Befehls unterdrücken.

Update

Ein vorhandenes System aktuell halten, wie macht man es richtig? So einfach wie unter Windows ist es leider nicht.Bei Windows wird es uns mittlerweile zwangsweise ziemlich einfach gemacht, das System macht einfach ein Update. Bei Linux muss man irgendwie wissen was in welcher Reihenfolge man tun muss. Mal schauen was ich da noch so herausfinde.
Hier gibt es einen Ausgangspunkt für  mein ToDo
https://forum.fhem.de/index.php/topic,101232.0.html#lastPost

Dienstag, 19. Juni 2018

RaspberryPi mit OpenWrt/Lede

Auch für den Raspberry gibt es ein fertiges Image des Router Systems. Ob man den Raspberry wirklich als Router betreiben will sei mal dahin gestellt, als Testsystem oder DHCP Server taugt er aber allemal.
Das Image gibt es jeweils getrennt im Zweig brcm2708 im Unterpfad

  • bcm2708 -> B und B+
  • bcm2709 -> B2
  • bcm2710 -> B3

Für den B3+ muss man derzeit ein Image aus dem Snapshot Bereich nehmen.

Das gepackte Image (img.gz) muss zunächst entpackt werden (z.B. 7-Zip) und wird dann wie beim Pi üblich, mit einem passenden Programm (Win32DiskImager) auf die SD Card geschrieben.

Partition vergößern

Die resultierende Partition ist nur 256 MB groß. Wer etwas mehr auf dem Pi machen will als nur "Router" sollte die Partition von Beginn an vergrößern, online und innerhalb von OpenWrt geht das schwierig. Ich habe etwas herum probiert und bin zu folgendem Weg gekommen:

  • SD Card mit dem Kartenleser an einen vorhandenen Linux PC (z.B. Raspberry) anschließen.
  • der Stick wird als /dev/sda aktiviert und nicht gemounted
  • parted (oder parted /dev/sda) aufrufen
  • mit p(rint) vergewissern das richtige Laufwerk zu haben.

(parted) p
Model: SABRENT SD (scsi)
Disk /dev/sda: 15,8GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  25,2MB  21,0MB  primary  fat16        boot, lba
 2      29,4MB  298MB   268MB   primary  ext2

(parted)

  • resizepart 2 eingeben
  • Das neue Ende der Partition eingeben, z.B. 3GB
  • quit für exit
  • mit resize2fs muss das Filesystem angepasst werden
resize2fs /dev/sda2
resize2fs 1.43.4 (31-Jan-2017)
Die Größe des Dateisystems auf /dev/sda2 wird auf 725254 (4k) Blöcke geändert.
Das Dateisystem auf /dev/sda2 is nun 725254 (4k) Blöcke lang.


  • Mit e2fsck -f /dev/sda2 muss jetzt das Filesystem nochmal überprüft und repariert werden obwohl beim einfachen Test und auch beim Test vor der Vergrößerung alles "sauber" gemeldet wird.
e2fsck -f /dev/sda2
e2fsck 1.43.4 (31-Jan-2017)
Durchgang 1: Inodes, Blöcke und Größen werden geprüft
Inode 7, i_size ist 62963712, sollte 67178496 sein.  Reparieren? ja
Durchgang 2: Verzeichnisstruktur wird geprüft
Durchgang 3: Verzeichnisverknüpfungen werden geprüft
Durchgang 4: Referenzzähler werden überprüft
Durchgang 5: Zusammengefasste Gruppeninformation wird geprüft

/dev/sda2: ***** DATEISYSTEM WURDE VERÄNDERT *****
/dev/sda2: 1064/188416 Dateien (0.0% nicht zusammenhängend), 14433/725254 Blöcke

Erster Start

Der Router Pi läuft jetzt mit der Adresse 192.168.1.1 im Netzwerk. Um ihn für eine Konfiguration erreichbar zu machen, müssen wir dem PC zur Konfiguration einen IP Adresse z.B. 192.168.1.5 geben. Eine Variante Windows Powershell zeige ich hier.
Die Anmeldung erfolgt mit root ohne Passwort. Nicht vergessen: Als erstes ein Passwort vergeben.
Im Menü über / Network / Interfaces / Edit / das Protocol auf DHCP Client stellen, den Knopf "switch protocol" drücken und abschließend "Save & Apply" drücken.
 


Der Router bekommt jetzt eine Adresse aus dem lokalen Netzwerk und die lokale Adresse des Konfiguration PC kann zurück gestellt werden.
Damit später alle Zeiten im Log stimmen, sollte die Zeitzone auf Europe/Berlin gestellt werden.

Der Pi kann mit zusätzlichen Interfaces (USB LAN oder USB WLAN oder internes WLAN) arbeiten.
Achtung:! Mit der Version 18.06 hat sich das Verhalten verändert. Es wurde eine neue Sicherheit gegen Fehlkonfiguration eingebaut. Die führt leider dazu, das innerhalb 30 sec die Konfiguration zurückgerollt wird, wenn das Webinterface nicht erreichbar war.
Ich weiß noch nicht, wie man wirklich damit umgeht. Einzig mir bekannt bisher ist: warten bis dieses Fenster kommt, den roten Knopf drücken und erst dann die IP-Konfiguration des PC zurückstellen.

Zusätzliches Netzwerkinterface installieren

In der bisherigen Konfiguration ist das System nicht zu viel mehr zu gebrauchen als DHCP Server und um mit der Oberfläche zu spielen. Es empfiehlt sich das Software Paket usbutils zu installieren, damit hat man auf Kommandozeile den Befehl lsusb zur Verfügung und kann zumindest schauen ob der USB Adapter erkannt wird.

LAN Interface

Mit diesem Adapter hatte ich bisher gute Erfahrungen beim Pi:
I-Tec USB 2.0 Advance 10/100 Fast Ethernet LAN Network Adapter USB 2.0 auf RJ45
Er hat einen Asix AX88772B Chip. Durch die Installation des Packages kmod-usb-net-asix wird der Adapter problemlos in Betrieb genommen. Falls noch nicht geschehen muss als erstes der Knopf Update lists gedrückt werden!


Der USB Netzadapter wird sofort erkannt und in Betrieb genommen.
Im Menü Network/Interfaces -> New Interface steht er als eth1 zur Auswahl:

Nachdem Submit gedrückt wurde kann man die IP Adresse und die Subnet Mask eingeben. Hier wird normalerweise kein Gateway eingetragen!
Da dieser Anschluss in Zukunft der interne LAN1 Anschluss ist, wird er der Firewall Zone "grün - lan" zugeordnet.

Wir haben jetzt einen Router mit zwei LAN Segmenten ohne NAT.

Routing vs Forwarding/NAT

Damit das LAN1 Segment aus dem LAN Segment erreichbar wird, muss der vorhandene Internetrouter eine zusätzliche Route für das Netzwerk LAN1 mit dem Gateway LAN bekommen.

Will man Router ohne Veränderung des existierendes Netzwerk betreiben braucht man NAT. NAT wird einfach durch die Firewall Zone WAN aktiviert, aber Vorsicht! Damit passieren zwei Dinge:

  • NAT wird aktiviert
  • Die Firewall Regeln sehen den Anschluss LAN dann sofort als Internetanschluss. Jeglicher eingehender Verkehr wird blockiert.

Wir greifen derzeit über den Anschluss (LAN) zu, dieser wird nach dieser Konfiguration nicht mehr aus dem Netzwerk LAN erreichbar sein! Also besser jetzt gleich zum Test und zur Konfiguration "das Notebook" an den LAN1 Anschluss verbinden und neu anmelden.
Interface LAN / Edit / Firewall Settings / WAN auswählen. So sieht das Ergebnis aus:

NAT wird innerhalb weniger Sekunden aktiviert und der Zugriff ins Netzwerk LAN und auch ins Internet sollte ohne Änderungen im existierenden Netzwerk funktionieren. Allerdings hat man jetzt meist doppeltes NAT, das verkraften nicht alle Anwendungen (z.B. VPN)

WLAN Interface

Auswahl des richtigen Adapters

Das ist gar nicht so einfach! Diese beiden Adapter habe ich nicht zum Laufen bekommen:
  • TP-LINK TL-WN725N v2 mit Realtek RTL8188EUS Chip
  • "Conrad" RE150U-PA-1T1R mit Realtek RTL8188SU Chip
Offenbar verhindern inkompatible Treiber den Betrieb als Routerinterface, im normalen Raspbian werde beide Adapter als Client unterstützt.
Diesen Adapter gab es preiswert und der hat auf Anhieb funktioniert. Er verleiht dem Ganzen durch seine beiden Antennen auch einen Router-mäßigen Eindruck:
  • CSL USB 2.0 WLAN Adapter 300Mbit (2,4/5GHz) mit Ralink RT5572 Chip
Nicht zu viel erwarten: der Adapter hat aber nur ein Radiointerface und kann 2,4 oder 5 GHz und nicht beides gleichzeitig!
Den Adapter stecken und lsusb gibt uns die entsprechende Information aus:
Bus 001 Device 004: ID 148f:5572 Ralink Technology, Corp. RT5572 Wireless Adapter
Der Chipsatz braucht das Softwarepaket kmod-rt2800-usb nach der Installation ist aber zunächst nicht viel passiert. Im Systemlog sollte aber eine Meldung in der Art auftauchen
kern.info kernel: [  624.833819] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 5592, rev 0222 detected
Ich habe Wireless im Menü zum Leben erweckt, in dem ich mutig auf der Seite System /Startup den network "Restart" Knopf gedrückt habe. Nach kurzem selbsttätigem Refresh der Oberfläche war der Punkt Network / Wireless sichtbar.
Bei einem neuerlichen Versuch mit OpenWrt 22.03 reicht der restart von network nicht, man muss das System neu starten.
Jetzt kann man das Wireless Netzwerk wie gewohnt einrichten.
Allerdings ist das Bild trügerisch. Es funktioniert noch nicht richtig!
OpenWrt braucht offenbar dafür noch etwas Software. Ich habe nur dieses Paket installiert, die anderen aus der dem Link waren nicht notwendig, obwohl die im Image von meinem WRT1900ACS von Hause aus drin waren. Ich werde das noch untersuchen, siehe Zusammenfassung.
  • block-mount
Danach kann man sich zumindest im 2,4 GHz Modus verbinden, wenn man einfach eine default Konfiguration wählt und bei Device Configuration/Advanced Settings Country Code DE auswählt.

Für eine funktionierende 5 GHz Konfiguration darf Channel nicht auf auto stehen - Bug oder Feature?

Zusammenfassung meiner minimalen Konfiguration

  • Beim Download das ext4 Image nehmen, mit dem squashfs Image bin ich nicht klar gekommen.
  • primäres LAN Interface: switch Protocol to DHCP Client
  • Zeitzone: Europe/Berlin
  • Software installieren: Update List
    • usbutils (optional)
    • kmod-usb-net-asix
    • kmod-rt2800-usb
    • block-mount - offenbar mit Version 18.06 obsolet?
Zumindest mit der neuen Version 18.06 funktioniert damit alles erst einmal. Der 5GHz Modus funktioniert nur mit fester Kanalwahl!

Doku OpenWrt Wireless overview
Doku OpenWrt WiFi configuration

Sonntag, 25. Februar 2018

Windows Server Freigabe auf dem Raspberry verbinden

Ich will hier kurz zeigen wie der Zugriff auf eine Windows (Samba) Freigabe unter Raspbian eingerichtet wird. Im Raspbian Image (Lite vom November 2018) sind alle Voraussetzungen vorhanden, man muss nichts weiter installieren. In anderen Systemen kann es sein, dass man das debian Paket cifs-utils nachinstallieren muss.  Openmediavault hat z.B. bei aktiviertem Samba nicht automatisch cifs-utils installiert.
Für den praktischen Gebrauch muss man lediglich 3 Dinge konfigurieren, für einen schnellen Test  kann man es mit einem Zweizeiler machen (siehe weiter unten):

Pfad

Unter Linux braucht man einen Ort wo man ein Laufwerk "hin" mounten kann, dabei wird
\\Servername\Sharename auf den lokalen Pfad /DirName/DirName gemappt.
Man erzeugt einen Pfad, am Besten mit einer "Wurzel", einem Verzeichnis unter dem alle Netzlaufwerke eingehängt werden:
mp='/mnt/Sicherung'
sudo mkdir -p ${mp}
Die Option -p erzeugt alle notwendigen Ordner falls sie noch nicht existieren.

Benutzerkonto

Da ein Windows Server nicht ohne weiteres einen Zugriff ohne Login ermöglicht und wir username und password nicht immer eintippen wollen, werden die Informationen entsprechend abgelegt.
Dabei gibt es drei Möglichkeiten. Ja nach Vorliebe verwendet man einen Editor (nano) oder direkte Shellbefehle
1. persönliche Datei (notwendiger Inhalt siehe nächster Codeblock):
fcred='.smbcredentials'
nano $fcred
chmod 600 $fcred
Die Datei ist damit nur vom Eigentümer lesbar!

2. allgemeine Datei:
Wenn keine Domain verwendet wird, kann der Eintrag domain entfallen oder freibleiben.
fcred='.smbcredentials'
export datei="/usr/${fcred}" 
sudo bash -c "cat >${datei}" <<'EOF'
username=UserName
password=Userpassword
domain=
EOF
Man braucht pro Konto eine credentials Datei. Diese Datei muss von allen Usern lesbar sein, die mounten wollen. Die gerade angelegte Datei ist aber auch von "Jedem" lesbar, will man das eingrenzen, kann man das so machen:
sudo -s <<EOI
  addgroup cifs
  usermod -aG cifs fhem
  usermod -aG cifs pi
  chown root:cifs ${datei}
  chmod 640 ${datei}
EOI
Hinweis: Die Änderung der Gruppenmitgliedschaft wirkt erst nach Neuanmeldung!

3. anstatt extra Datei (credentials=Datei) schreibt man die Kontodaten direkt in die fstab Zeile, dort ohne Zeilentrennung!
username=ano,password=nym

fstab

Nun fehlt noch der mount Eintrag in der fstab. In meinem Beispiel wird nicht automatisch gemountet, alle User dürfen mounten und das Laufwerk ist beschreibbar.
sudo bash -c "echo //ServerName/daten ${mp} cifs noauto,users,credentials=/usr/.smbcredentials 0 0 >> /etc/fstab"

Verwendung

Jetzt können wir das Laufwerk einbinden, den erfolgreichen mount anzeigen und den Inhalt anzeigen. Das funktioniert ohne sudo, der Benutzer braucht Leserechte auf die credentials Datei.
mount ${mp}
df
ls -l ${mp}
umount ${mp}

Hinweis

Das Windows Laufwerk wird auf diese Art nicht automatisch beim Start angebunden. Das Netzwerk ist zu diesem Zeitpunkt noch nicht verfügbar und der automount über die fstab würde nicht funktionieren. Ist für mich kein Nachteil, weil es jederzeit in einem Script per mount Befehl angebunden werden kann.

Nachtrag

Man kann auch jederzeit  mit einem simplen "Zweizeiler" ein Windows Laufwerk als sudo mounten, password= kann man weglassen, dann wird es abgefragt.

sudo mkdir -p /mnt/daten
sudo mount -t cifs -o username=UserName,password=Passwort //ServerName/Freigabe /mnt/daten
# Bei smb1 Servern und ab debian stretch
sudo mount -t cifs -o username='UserName',password='Passwort',vers=1.0 //ServerName/Freigabe /mnt/daten

Bei Problemen kann man sich die verwendeten Dateisysteme bzw. die Unterstützung des Kernels  anzeigen lassen.
cat /proc/filesystems
ls /lib/modules/$(uname -r)/kernel/fs

Zum nachlesen: Ubuntu Wiki

SMB Protokoll

smb Version 1 wird mittlerweile als extrem unsicher eingestuft. Deswegen wird es aus modernen Systemen "entfernt".
Allerdings ist es in vielen Geräten nach wie Standard und eine Unterstützung von smb 2 oder 3 nicht implementiert (Fritzbox NAS, Sonos ...)
Windows hat ab Version 1709 das Protokoll entfernt, man muss es bei Bedarf mit "Windows Apps und Features" nachinstallieren (Neustart erforderlich)
debian stretch hat es offenbar als default aus der Aushandlung herausgenommen, mann muss es mit der cifs Option "vers=1.0" beim mount Befehl explizit hinzufügen, wenn der Server nur smb1 unterstützt.

Donnerstag, 1. Februar 2018

Setup FHEM

Es gibt einen aktuellen Artikel. Detail werden aber weitestgehend hier erklärt.

FHEM installieren ist eigentlich ziemlich einfach. Bevor meiner folgenden Anleitung gefolgt wird, sollte man sich unbedingt hier über den aktuellen Stand informieren. Mit minimalem Aufwand kann man das Setup von hier durchführen.
Alle meine Setup Schritte erfordern erhöhte Rechte. Also bitte alles in einer "sudo su" Session ausführen!
Und so setze ich diese Aufgabe praktisch in einem Script um:
# 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

Den zusätzlichen Eintrag in der sources.list entfernt das Setup Programm von FHEM. Alle benötigten und sinnvollen debian Pakete werden automatisch mit installiert. Ist ein systemd System vorhanden wird auch der Dienst für FHEM entsprechend installiert.

Damit ist man grundlegend fertig! Aber ein paar Dinge fehlen noch!

Das aus meiner Sicht wichtigste aktuelle Feintuning des frischen FHEM ist die Deaktivierung der USB Stick Erkennung. Dieser kleine direkte Patch auf diese Art ist nur unmittelbar nach der Installation zulässig! Später muss man diese Attribute bitte über die FHEM Oberfläche setzen.
# Den USB Check besser abschalten
/opt/fhem/fhem.pl 7072 "attr initialUsbCheck disable 1"
/opt/fhem/fhem.pl 7072 "save"

Weitere Attribute die man irgendwie braucht, kann man einfach über die Raw definition setzen. Die findet man in jeder Detail Ansicht von Definitionen ganz unten in der Mitte als Link.
attr global backup_before_update 1
attr global commandref modular
attr global title FHEM-Name
attr global sendStatistics onUpdate
attr global latitude 51.xxxxxxxxxxxxx
attr global longitude 12.xxxxxxxxxxxxx
attr global language de
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true }
attr WEB plotfork 1
attr WEB longpoll websocket

Fast fertig - allowed

ToDo

Speziell - Mplayer Ersatz

Ich arbeite viel mit Ansagen unter anderem mit Text2Speech.
Nachtrag: Mittlerweile ist der Aufruf für play direkt mit Parametern im MplayerCall eingebaut. Das Script ist also überflüssig.
Aktuell verwende ich dieses Script um mplayer zu ersetzen. In der Quelle gibt es auch noch eine Variante mit setzen des AUDIODEV.
#!/bin/sh
# die Kommentarezeichen vor echo  fuer den Test entfernen
# echo Parameteranzahl $# > /tmp/mplay.txt

# falls volume nicht vorhanden = 1
volume=1
# Alsa Device, Volume und Dateinamen ermitteln
while [ $# -gt 0 ]
do
# echo $1 >> /tmp/mplay.txt
 if [ $1 = -ao ]
 then
  shift
#   echo $1 >> /tmp/mplay.txt
  device=$(echo $1|cut -d= -f2)
#   echo $device >> /tmp/mplay.txt
 elif [ $1 = -volume ]
 then
  shift
#  echo $1 >> /tmp/mplay.txt
   if [ $1 -lt 100 ]
   then
    volume=0.$(($1))
   fi
 elif [ -e $1 ]
 then
  file=$1
 fi
 shift
done
#echo $volume $file >> /tmp/mplay.txt
play -q -v $volume $file
exit 0

Dieses Script muss für FHEM ausführbar sein. Wenn man es im aktuellen Homdedir liegen hat (User pi) dann kann man es wie folgt als User fhem an Ort und Stelle kopieren. Automatisch mit den richtigen Rechten und Besitz.
sudo -u fhem cp mplayer.sh /opt/fhem/
chmod +x /opt/fhem/mplayer.sh
Zur Vorbereitung sind zwei Pakete erforderlich.
sudo apt-get install libdigest-sha-perl mp3wrap
In Text2Speech kann man einfach den Aufruf durch dieses Script ersetzen. Minimal kann man Text2Speech so definieren:
define MyTTS Text2Speech default
attr MyTTS TTS_MplayerCall /opt/fhem/mplayer.sh

Weitere Software Pakete installieren

Viele der Module in FHEM erfordern zusätzliche Software auf System Ebene.
Aus meiner Liste sind bisher folgende debian Pakete noch nicht installiert
sudo apt-get install avrdude libcrypt-cbc-perl libcrypt-ecb-perl libcrypt-rijndael-perl libdigest-md5-perl libimage-info-perl liblwp-useragent-determined-perl libmime-base64-perl libnet-telnet-perl libnet-upnp-perl libsoap-lite-perl libxml-parser-lite-perl libxml-parser-perl sendemail
Diese Pakete müssen mit cpan installiert werden, es gibt kein debian Paket.
sudo cpan install Crypt::Rijndael_PP

Das folgende Script ermittelt ob die Pakete schon installiert sind und gibt eine Liste der noch nicht installierten Pakete aus. Der Aufruf erfolgt mit Übergabe der zu ermittelnden Pakete.
bash software.sh paket1 paket2 paket3
Script software.sh
# Eine von beiden Zeilen auskommentieren
#echo -n "cpan install " >notinstalled.sh
echo -n "apt-get install " >notinstalled.sh
while [ $# -gt 0 ]
do
# eine von beiden Zeilen auskommentieren
#perl -M$1 -e '' 2>/dev/null
dpkg -s $1 &> /dev/null

if [ $? -eq 0 ]; then
    echo $1" is installed!"
else
    echo $1" is not installed!"
    echo -n $1" " >>notinstalled.sh
fi
shift
done

Man kann auch nur die Perl Module ermitteln, die im System installiert sind.
Aus diesem Beitrag mal abgeleitet könnte man alle Module ausgeben, die in einem System vollständig installiert sind:
dpkg -l |grep ^ii| awk '{ print $2 }'
Oder nur die Perl Module
dpkg -l |grep -i '\-perl'| awk '{ print $2 }'

Diese List könnte man von Zeilenumbrüchen befreien:
|tr -d "\r"|tr "\n" " "

...und in ein ähnliches Script wie oben einspeisen. Damit hätte man alle Pakete die nicht installiert sind. Das geht auch gleich remote von der "Quell Maschine". (Alle Pakete außer die mit "raspberry" in der Zeile)
bash software.sh $(ssh pi@remotehost "dpkg -l " |grep ^ii|grep -vi raspberry | awk '{ print $2 }' |tr -d "\r"|tr "\n" " ")
Das abgewandelte software.sh Script mit Loggingfunktion
LOG=DiffInstall.log
{
date
while [ $# -gt 0 ]
do
   if dpkg -s $1 &> /dev/null
     then
        echo $1" is installed!"
     else
        apt-get -y install $1
   fi
   shift
done
} >> $LOG 2>&1

Mittwoch, 31. Januar 2018

Installation Raspberry Pi

Es ist immer wieder ein gefragtes Thema, es ist einige Zeit ins Land gegangen, ich halte eigentlich meinen Artikel vom September 2016 aktuell - aber jetzt ist Zeit für neues! Kurz knackig und ohne Prosa soll es werden.
Achtung: Es gibt seit 2021 die Möglichkeit mit dem Raspberry Pi Imager die Konfiguration des Images vor dem ersten Start vorzunehmen. Dabei ensteht eine Datei firstrun.sh in der Boot Partition, die man einfach kopieren und für die Zukunft aufbewahren könnte.
  1. Download raspbian-lite, aktuell die Version 2017-11-29 immer wieder von hier.
  2. Mit windisk32imager auf die SD Card schreiben, es entstehen zwei Laufwerke nur das Erste ist unter Windows lesbar.
  3. Eine leere Datei mit dem Namen ssh in diesem Laufwerk erstellen, sonst geht kein ssh nach dem Start. 
  4. Bei Modellen mit Wlan die Datei wpa_supplicant.conf in dieses Laufwerk kopieren um mit Wlan starten zu können. 
  5. SD Karte auswerfen.
  6. SD Karte in Raspberry Pi stecken und booten.
  7. Monitor und Tastatur braucht man nicht. Mit Putty auf Host raspberrypi verbinden und anmelden. User pi, Passwort raspberry
  8. Dem Sicherheitshinweis folgen und passwd eingeben -> Passwort ändern!

Vorbemerkung

Alle folgende Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten per sudo su ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird das bei Pipe Befehlen nicht durchgereicht. Ich empfehle die benötigten Abschnitte vorher in ein oder zwei  Scriptdateien zu packen und diese gleich mit auf die SD Karte zu kopieren.
Alle Dateien müssen im Linux Format (nur lf als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim speichern achten!

Wlan 

Eine Text Datei mit Namen wpa_supplicant.conf und diesem Inhalt bereitstellen: Entweder in die /boot Partition vorm ersten Start oder später ins Verzeichnis /etc/wpa_supplicant/ kopieren.
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="FRITZ!Box 7490"
        psk="12345678901234567890"
}

Meine Grundeinstellung

Zeitzone, Sprache und  Hostname ändern. Entweder Menügeführt mit
sudo raspi-config
oder per Script / Shell Befehle
# Zeitzone
timedatectl set-timezone Europe/Berlin

# Konfigurieren lokale Sprache deutsch
localedef -f UTF-8 -i de_DE de_DE.UTF-8
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE
localectl set-keymap de
setupcon

# Hostname 
hostnamectl set-hostname mymachine

#Neustart
reboot

Das war es erstmal, Damit funktioniert bei allen Pi Versionen die eingebaute Hardware, inklusive Wlan und BT beim Pi3 oder Pi Zero W.

UART

Wer für Zusatz Module die serielle Schnittstelle am GPIO braucht, muss etwas zusätzlich konfigurieren.

Bei allen Pi Modellen muss dafür der Dienst serial-getty@ttyAMA0 deaktiviert werden.
# serial-getty@ttyAMA0.service deaktivieren
systemctl stop serial-getty@ttyAMA0.service
systemctl disable serial-getty@ttyAMA0.service
systemctl mask serial-getty@ttyAMA0.service
Bei den Modellen ohne BT ist die UART per default aktiviert.
Beim den Modellen mit BT muss die UART aktiviert und BT umkonfiguriert werden.
# 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 
Für diesen Abschnitt ist ein Neustart erforderlich!
# Neustart erforderlich 
reboot

BT

Die Funktion von Bluetooth kann mit hcitool überprüft werden
hcitool dev
hcitool scan
hcitool lescan


Kamera aktivieren

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

Sound 


Sound ist normal aktiviert (dtparam=audio=on)
Sollen andere User Audio ausgeben dürfen, müssen sie in der Gruppe audio sein (Beispiel)
sudo gpasswd -a fhem audio

Braucht man eine Möglichkeit um mp3 Dateien und ähnliches abzuspielen wird häufig mplayer empfohlen. Eine gute Alternative ist play.
sudo apt-get update
sudo apt-get install sox libsox-fmt-all


Dateifreigabe einrichten

Braucht man eine Freigabe für Dateien auf dem Pi, ist das mit Samba schnell erledigt. Achtung diese Freigabe ist völlig offen und ohne jede Anmeldung!
apt-get install samba
# Pfad erstellen
mkdir /var/SonosSpeak
chmod 777 /var/SonosSpeak/

# Share Definition in /etc/samba/smb.conf
echo '[SonosSpeak]' >> /etc/samba/smb.conf
echo '  comment = Audio-Files for SonosPlayer to Speak' >> /etc/samba/smb.conf
echo '  path = /var/SonosSpeak' >> /etc/samba/smb.conf
echo '  browsable = yes' >> /etc/samba/smb.conf
echo '  guest ok = yes' >> /etc/samba/smb.conf
echo '  read only = no' >> /etc/samba/smb.conf

# restart Service
systemctl restart smbd
Mit dieser Installation hat man auch die Befehle net rpc usw. zur Verfügung.
Wer einen smbclient braucht muss diesen noch installieren.
apt-get install smbclient

Sudoers

Will man einem bestimmten Benutzer Möglichkeiten geben für die man "root" Rechte braucht, geht das ganz einfach.
Das folgende Beispiel gibt dem Benutzer fhem die Möglichkeit das System herunterzufahren bzw. neu zu starten.
#!/bin/bash
# ergänze eine Datei zum sudoers Script Verzeichnis /etc/sudoers.d/
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File

Mittwoch, 3. Januar 2018

WebDAV auf dem Raspberry

Wer einen Telekom Anschluss besitzt oder besaß hat dort einen "Cloud" Speicher von 25 GB - dauerhaft. Dieser beherrscht im Gegensatz zu Google Drive WebDAV.
Auch andere Provider (z.B. 1und1) bieten ihren Kunden Online Speicher mit WebDAV Zugriff.
WebDAV ist eine standardisierte Schnittstelle für die Einbindung als Laufwerk ins Betriebssystem, Linux, Windows - eigentlich können das alle.

Ich will hier kurz zeigen wie der WebDAV Zugriff unter Raspbian eingerichtet wird. Was uns an Vorrausetzungen fehlt, ist das Debian Paket davfs2
sudo apt-get update
sudo apt-get install davfs2
Bei mir brachte die interactive Installation die Frage nach dem Zugriff für alle User, diese bitte mit yes beantworten. Ansonsten kann man die Berechtigung später mit diesem Befehl korrigieren.
sudo dpkg-reconfigure davfs2 # interaktiv
sudo chmod u+s /usr/sbin/mount.davfs # direkt
Unter Linux braucht man einen Ort wo man ein Laufwerk "hin" mounten kann, wir erzeugen also einen Pfad mit entsprechenden Berechtigungen:
sudo mkdir /media/magenta
sudo chmod 777 /media/magenta
Da wir das Login zu Magenta Cloud nicht immer eintippen wollen, werden die Informationen entsprechend abgelegt. Der erste Befehl öffnet den Editor und am Ende der Datei wird die zweite Zeile eingefügt. Der Username ist die 12 stellige Zugangsnummer, das Passwort ist ein extra vergebenes WebDAV Passwort und nicht das Passwort vom Kundencenter.
sudo nano /etc/davfs2/secrets
https://webdav.magentacloud.de user passwort
Nun fehlt noch der mount Eintrag in der fstab, es wird nicht automatisch gemountet, alle User dürfen mounten und es ist beschreibbar:
sudo nano /etc/fstab
https://webdav.magentacloud.de /media/magenta davfs noauto,users,rw 0 0
Jetzt können wir das Laufwerk einbinden und den Inhalt anzeigen. Damit das ohne sudo funktioniert muss der User in der Gruppe davfs2 sein. Die Reihenfolge funktioniert so nicht direkt, der User Pi muss sich neu anmelden.
sudo usermod -aG davfs2 pi
mount /media/magenta
ls -l /media/magenta
umount /media/magenta

Hinweise

Bei wheezy gibt es eine Fehlermeldung, obwohl diese Datei erstmal keine Verwendung findet:
/sbin/mount.davfs: file /home/pi/.davfs2/secrets has wrong permissions
Abhilfe schafft der Befehl:
chmod 0600 .davfs2/secrets
Das WebDAV Laufwerk wird auf diese Art nicht automatisch beim Start angebunden. Das Netzwerk ist zu diesem Zeitpunkt noch nicht verfügbar und der automount über die fstab würde nicht funktionieren. Ist für mich kein Nachteil, weil es jederzeit in einem Script per mount Befehl angebunden werden kann.

Manche Webdav Server unterstützen kein file locking (Fehlermeldung:the server does not support locks). Will man die resultierende Fehlermeldung nicht sehen, hilft ein Eintrag in der Datei davfs2.conf.
sudo sh -c 'echo "use_locks 0" >> /etc/davfs2/davfs2.conf'

 Mehr Sicherheit

Wir haben oben das Konto für den Zugriff auf WebDAV global abgelegt, man kann es auch restriktiver für einen bestimmten Benutzer machen. Anstatt der Ablage des Kontos in der Datei/etc/davfs2/secrets, kann die Information auch sicher vor dem Zugriff andere im User Home Verzeichnis hinterlegt werden (Quelle):
touch /home/$(whoami)/.davfs2/secrets
chmod 0600 /home/$(whoami)/.davfs2/secrets
echo "https://cloud.example.com/webDAV/URL <username> <password>" > /home/$(whoami)/.davfs2/secrets

Zum Nachlesen

Wiki fstab
Wiki rsync
Wiki cp
Wiki inotify
lsynd und Beispiel

Dienstag, 1. August 2017

Raspberry ausschalten mit FHEM

Man kann den Raspberry einfach so vom Strom ziehen - aber schön ist das nicht!
Wenn man schon FHEM drauf hat, kann man sich auch einen Ausschaltknopf auf der Oberfläche machen.

Achtung: Der Raspberry kann kein WOL oder ähnliches. Aus ist Aus. Baut man das mit dem "halt"
wirklich auf die Weboberfläche muss man sich auch über einen Neustart Gedanken machen!

Als erstes muss der User fhem (der User unter dem FHEM läuft) ein reboot oder halt des Systems auch dürfen. Im raspbian kann man dafür einfach eine Textdatei im Pfad /etc/sudoers.d/ ablegen, man braucht die eigentliche sudoers Datei nicht mit visudo zu editieren (ist mittlerweile in vielen anderen Systemen Standard).
Hinweis:
Der Benutzer Pi bekommt über genau diesen Weg seine sudo Rechte, einfach mal anschauen:
sudo cat /etc/sudoers.d/010_pi-nopasswd

Rechte für User fhem setzen

Wie immer mache ich das gern mit einem Script (welches mit sudo ausgeführt werden muss):
#!/bin/bash
# ergänze eine Datei zum sudoers Script Verzeichnis /etc/sudoers.d/
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File
Man kann den Erfolg sofort testen, aber vorher save nicht vergessen, falls man gerade in FHEM etwas geändert hat!
Wenn man in der FHEM Befehlszeile "sudo /sbin/reboot" eingibt, sollte der Raspberry jetzt neu starten. Ein umfangreiches Manual zum Syntax in der Datei findet man hier.

Bedienelemente in FHEM

Damit man einen Knopf in der Oberfläche von FHEM bekommt, kann man es analog zu diesem Beitrag machen. Dazu braucht man allerdings erstmal einen FHEM Befehl:
define s1 cmdalias reboot AS "sudo /sbin/reboot"
Das kann man wieder sofort testen, in dem man reboot in der Kommandozeile von FHEM eingibt - man muss nur aufpassen, dass dem Raspberry nicht schwindelig wird.
define Systembefehle weblink cmdList Restart:Restart-Fhem:shutdown+restart Restart:Restart-System:reboot Update:Update-Check:update+check Update:Update-Now:update Shutdown:Shutdown-System:halt
Der aufmerksame Leser hat gemerkt: hier fehlt noch etwas! Der alias für halt:
define s2 cmdalias halt AS "sudo /sbin/halt"
Optisch sieht das Ganze so aus:
Mit diesem Befehl kann man den Ausschalter auch links ins Menü packen:
attr WEB menuEntries System-Halt,/fhem?cmd=halt

Ein Script zum Einrichten

Für den ganz Eiligen habe ich hier noch alles in einem Script. Damit man das nicht erst noch ausführbar machen muss, kann man es einfach mit sudo bash <scriptname> starten
#!/bin/bash
# System Befehle für FHEM
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File
perl /opt/fhem/fhem.pl 7072 '
define s1 cmdalias reboot AS "sudo /sbin/reboot"
define s2 cmdalias halt AS "sudo /sbin/halt"
define Systembefehle weblink cmdList Restart:Restart-Fhem:shutdown+restart Restart:Restart-System:reboot Update:Update-Check:update+check Update:Update-Now:update Shutdown:Shutdown-System:halt
attr WEB menuEntries System-Befehle,/fhem?detail=Systembefehle
save
'

Kleiner Makel

Beim Restart von FHEM (und damit auch beim Restart System) ist danach der csrf Token vom Link nicht mehr gültig. Der Kontakt von FHEM kehrt also nicht allein zurück. Mit der zurück taste im Browser geht es wieder ins Menü.

Inhalt der sudoers Datei

Die durch Komma getrennten Werte in der Datei haben folgende Bedeutung und benötigen immer den vollen Pfad!

/usr/sbin -> für alles im Verzeichnis
/usr/sbin/service * -> für alle Parameter
/usr/sbin/service apache2 * -> für alle weiteren Parameter
/usr/sbin/service apache2 reload -> genau nur hierfür

Der Aufruf in FHEM muss dann genau dem Schema entsprechen:
"sudo /usr/sbin/service apache2 reload"

Freitag, 6. Januar 2017

Umzug von FHEM

Die alte Hardware ist zu schwach, defekt oder warum auch immer - das System soll neu gemacht werden!?
Ausgangszustand:
  • Raspberry Pi2, 
  • Raspbian Wheezy, 
  • Probleme mit der SSL Lib beim https Zugriff (SSL Version SSLv2 not supported), ist mit jessie behoben.
Zielzustand:
  • Raspberry Pi3
  • Raspbian Jessie Lite

Geht relativ einfach, wenn man einige Vorbereitungen trifft. Der grobe Fahrplan sieht so aus:
  1. Auf neuer Hardware ein neues System installieren.
  2. Alle benötigten Tools und Module (debian Pakete) nachinstallieren.
  3. FHEM als Grundlage installieren, eventuell Details testen (z.B. SSL).
  4. Backup und shutdown aktuelles FHEM System auf Pi2
  5. Transfer der Backupdatei auf Pi3
  6. Restore und Start von FHEM auf dem Pi3
  7. Test ob System einwandfrei läuft, wenn ja alles gut, wenn nein eventuell erstmal Restart FHEM auf Pi2 und in Ruhe untersuchen -> nochmal ab Schritt 4 bis alles läuft.

Schritt 1-3 

habe ich hier ausführlich beschrieben, das dauert je nach dem was man im Schritt 2 alles benötigt alles in allem keine 20 min. Dieser Artikel wird von mir laufend aktualisiert. Zu dem Wissen zu gelangen was man alles benötigt, kann allerdings wesentlich länger dauern, wenn man sich nichts aufgeschrieben hat. Im Zweifelsfall sollte man ein Paket/Tool mehr als eines zu wenig installieren. Die empfohlene Liste auf debian.fhem.de ist sicher ein guter Kompromiss.  Ich habe angefangen eine Liste zu erstellen, welches FHEM Modul welche cpan Module bzw. debian Pakete benötigt. Die werde ich noch veröffentlichen.

Schritt 4 und 6 

kann man nach seinen persönlichen Vorlieben gestalten. Normalerweise sollte das in wenigen Minuten abgeschlossen sein.
In der Regel sollte alles was FHEM betrifft in diesem Pfad liegen /opt/fhem/. Dieser Pfad muss auf das neue System und muss die richtigen Berechtigungen erhalten. Ich habe das hier schon mal im Detail beschrieben und es genauso gemacht:

Pi2 in der FHEM Oberfläche 
backup
warten bis backup fertig -> Log oder Eventmonitor
shutdown
  • mit winscp die aktuelle Sicherung ins zentrale Sicherungs-Share auf den Server kopieren
  • und in  einer zweiten Sitzung gleich wieder auf den Pi3 ins /home/pi/ Verzeichnis kopieren
Pi3 als User Pi im putty Terminal
sudo systemctl stop fhem
sudo tar -xvzf /home/pi/FHEM-201xxxxx_xxxxxx.tar.gz -C /opt/fhem/
sudo systemctl start fhem

Schritt 7

  • FHEM Web erreichbar?
  • Log File kontrollieren!!!

Wenn bis hier grobe Fehler vorhanden sind am Besten erstmal den Pi3 wieder beenden und alles auf dem Pi2 wieder starten. In Ruhe Fehler suchen.

  • Schalter betätigen
  • Sonderfunktionen kontrollieren (Sound und Sprachausgabe usw)

Nützliche Hinweise und Befehle

Umfangreiche Manipulation müssen nicht zeileweise mit sudo gemacht werden, sudo su schaltet den sudo Modus ein bis zum exit.

Es kann immer mal passieren, dass die Rechte im fhem Verzeichnis falsch sind. Dies kann man relativ einfach beheben in dem man den Eigentümer aller Dateien setzt:
sudo chown -R fhem:dialout /opt/fhem/
Manchmal muss die Rechte einzelner Dateien setzen, z.B. ausführbar machen:
sudo chmod +x /home/pi/shutdown.py
In besonderen Fällen muss das UID Bit gesetzt werden:
chmod u+s /usr/bin/dfu-programmer
Oder ganz brutal, einfach Rechte auf Alles:
sudo chmod 777 /etc/systemd/system/pishutdown.service
Ein paar Beispiele für User und Gruppen Mitgliedschaften:
useradd -m test
passwd test
gpasswd -a test users
gpasswd -a pi pulse-access
gpasswd -d pi audio
gpasswd -d test audio
groups test
getent group test
cat /etc/group
Samba Freigabe für Sonos einrichten:
sudo mkdir /mnt/SonosSpeak
sudo chmod 777 /mnt/SonosSpeak/
sudo nano /etc/samba/smb.conf
am Ende folgendes einfügen:
[SonosSpeak] comment = Audio-Files for SonosPlayer to Speak
read only = false
path = /mnt/SonosSpeak
guest ok = yes
anschließen den Service neu starten
sudo systemctl restart smbd.service
Zusatzinfo

Das Verhalten/der Syntax in der smb.conf hat sich offenbar bei Jessie etwas geändert! Nutzt man die Originale smb.conf von Raspbian muss man nur den Abschnitt des Shares (siehe oben) einfügen.
Die Anonyme Zugriff auf Shares wird durch die Standard Einstellung im Abschnitt
   [global]
   security = user
   map to guest = bad user
ermöglicht. Die erste Zeile ist die Standardeinstellung und ist in der smb.conf nicht extra gesetzt. Die zweite Zeile steht so in der Original smb.conf schon drin.

Donnerstag, 17. November 2016

Raspberry Pi als einfacher Router

Man kann den Raspberry mittels USB Adapter mit zusätzlichem Netzwerk Interfaces ausrüsten Wlan oder auch Ethernet. Der Raspberry Pi 3 hat schon eine Wlan Schnittstelle an Board.
Folgende USB Adapter habe ich im Einsatz, die werden auf Anhieb ab debian wheezy erkannt und lassen sich problemlos betreiben.
- i-tec USB 2.0 Advance 10/100 Fast Ethernet LAN Network Adapter USB 2.0
- TP-Link TL-WN725N WLAN Nano USB-Adapter (150 Mbit/s, Soft AP)

Vorbereitung 

Seit debian jessie hat die Konfiguration der Netzwerkschnittstellen etwas geändert. Einfach etwas in der /etc/network/interfaces eintragen ist nicht mehr. Über diese Seite habe ich die entscheidenden Hinweise gefunden. Der Dienst DHCP Client Deamon übernimmt die Konfiguration der Schnittstellen, eine Ethernet Schnittstelle die nicht über einen DHCP Server konfiguriert wird, bekommt von ihm eine Adresse aus dem Pool 169.254.0.0 zugewiesen.
Eine statische Konfiguration erfordert nicht mehr die Veränderung der Datei /etc/network/interfaces, diese bleibt unbedingt Original! Stattdessen wird die Konfiguration in der Datei /etc/dhcpcd.conf durchgeführt. Dabei sind die Einträge ähnlich der alten Methode.
sudo nano /etc/dhcpcd.conf
Minimal wird dort die IP Adresse für das Interface eingetragen:
interface eth1
static ip_address=192.168.1.1/24
Ein ifdown eth1 && ifup eth1 sollte die Änderung im laufenden Betrieb ausführen.

Router einrichten

DHCP

Der Router wird mit einem Interface an den vorhandenen Netzwerk/Internetanschluss angeschlossen und erhält von dort per DHCP seine Konfiguration.
Das zweite Interface  soll selbst mit einem DHCP Server versorgt werden.
Ziel ist es den Router einfach in ein bestehendes Netzwerk einfügen zu können.

In Frage kommt sicher isc-dhcp-server aber der dnsmasq schein noch etwas besser für diese Aufgabe zu sein. Die Anregung stammt von hier.
sudo apt-get update && sudo apt-get install dnsmasq
In der Datei /etc/dnsmasq.conf enthält die gesamte Doku und am Ende werden die Parameter eingetragen:
interface=eth1
no-dhcp-interface=eth0
dhcp-range=interface:eth1,192.168.1.100,192.168.1.200,12h
Manchmal startete der Deinst dsnmasq mit Fehlern, da muss ich noch etwas tun. Verzögern?

Portweiterleitung und NAT

Zwei Einstellungen führen dazu, das sich unser Router auch wie erwartet verhält und sämtlichen Traffic aus dem Netzwerk eth1 zum Netzwerk eth0 "routet".

Mit diesem Befehl wird IP-Forwarding sofort aktiviert
sudo sysctl -w net.ipv4.ip_forward=1
Um das IP-Forwarding dauerhaft zu aktivieren muss die Datei /etc/sysctl.conf editiert werden.
sudo nano /etc/sysctl.conf
Entweder suchen wir nach der Stelle und entfernen das #
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
Oder wir  fügen am Ende einfach die Zeile hinzu
net.ipv4.ip_forward=1
Man kann auch die Datei editieren und mit sudo sysctl -p die Änderung sofort wirksam werden lassen.

Jetzt können wir zwar in das andere Netzwerksegment pingen, aber der Internetrouter wird keinerlei Anfragen aus dem eth1 wirklich beantworten. Damit dies ohne Neukonfiguration im bestehenden Netzwerk funktioniert brauchen wir NAT:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Allerdings müssen diese Einstellungen noch gespeichert werden, sonst sind sie beim nächsten Neustart weg.

Speichern in eine Datei iptables-save > /etc/iptables_01.save
Um diese beim Start zu aktivieren:
nano /etc/network/interfaces
Unterhalb von iface lo inet loopback einfügen
pre-up iptables-restore < /etc/iptables_01.save

Mittwoch, 12. Oktober 2016

Mein erstes Arduino Projekt

Ständig taucht beim Lesen dieser Name "Arduino" auf, der wie ein kleiner Italiener klingt. Und die Leute schreiben dafür einen Sketch - was für mich bisher ein gespielter Witz war.
Sicher ging es auch lustig zu, in der Bar von Ivrea wo vor über 10 Jahren von zwei Italienern diese Technologie entwickelt wurde.
Es interessierte mich und ich suchte schon eine Weile ein simplere Lösung um die S0 Schnittstellen meiner Zwischenzähler endlich mal auswertbar zu erfassen. Die seinerzeit gekaufte PM2 von Allnet (ALL3691) war nur als Mäusekino zu gebrauchen und hatte zu viele Macken. Da tauchte beim Stöbern im FHEM Forum der Begriff ArduCounter auf, das wird es doch!
Die kleinen Platinen des Arduino nano gibt es in vielen Ausführungen, sie kosten wenige Euro, man kann sie direkt aus China holen - aber letztendlich brauchte ich erstmal was zum probieren, was auch sofort funktioniert! Ich habe mich etwas belesen und dann den bei Amazon bestellt: Aptotec Nano V3.0 Pro mit Org.ATmega328P/ FT232RL Chip. Ein FTDI Chip sollte er haben, damit die USB Anbindung erstmal ohne große Probleme läuft!
Wobei scheinbar alle Probleme mit dem CH340 Chip behoben sind, auch ein solcher Arduino Nano läuft ohne Probleme. Allerdings, wenn man mehrere USB Geräte betreiben möchte: siehe Abschnitt am Ende "Probleme".

Was braucht man noch?

  • Ein USB Kabel passend zum Board (USB mini). Bei meinem Board war ein Kurzes dabei.
  • Ein Breadboard, das ist kein Brettchen fürs Brot sondern ein Steckbrett auf dem man sich elektronische Schaltungen einfach zusammenstecken kann.
  • Den FTDI USB Treiber falls der Arduino nicht beim anstecken sofort erkannt wird.
  • Die IDE für den Arduino um einen Sketch zu schreiben. Es empfiehlt sich die von der arduino.cc Webseite obwohl die derzeit eine niedrigere Versionsnummer (1.6.12) trägt. Die Alternative von arduino.org ist unvollständiger.

Hardwareinstallation und Vorbereitung

Den Arduino auf Steckbrett, USB Kabel dran und los geht es. Zunächst leuchtet nur die Power LED. 
  1. Zuerst im Gerätemanager schauen ob der Treiber installiert ist, es sollte eine neue COM Schnittstelle da sein, ohne Ausrufezeichen! Die Nummer merken (bei mir COM3).
  2. Die IDE in ein Verzeichnis entpacken und die Arduino.exe starten. Wir benötigen keine erweiterten Rechte.
  3. Die Konfiguration der IDE - Im Menü: Werkzeuge->Board "Arduino nano" wählen, dann Werkzeuge->Port "COM3" wählen.
  4. Das Fenster zeigt einen leeren Sketch, so etwas wie der Grundrahmen. Für einen kleinen Funktionstest öffnen wir: Datei->Beispiele->01.Basisc->Blink
  5. Jetzt einfach den Pfeil nach rechts in der Symbolleiste oder Menü->Sketch->hochladen oder Strg-U drücken. Wenn keine Fehlermeldungen erscheint wird nach wenigen Sekunden die LED des Arduino im Sekundentakt blinken. Der Arduino nano hat eine "Signal" LED die mit PIN D13 on Board verbunden ist. Neben der Power LED zeigen noch zwei LEDs die Datenübertragung der seriellen Schnittstelle an.
Meine Zähler sind schon mit RJ11 Kabeln beschaltet, für einen schnellen Test muss ich meinem Arduino nur noch ein "Interface" verpassen. Ich habe mir ein altes RJ45 Netzwerkkabel zerschnitten und die Leitungen an einen Pfostensteckverbinder gelötet. Dieses Kabel kommt aufs Steckbrett und mit zwei Drahtbrücken wird die Verbindung zu Pin 4 und 5 hergestellt. Hier muss man auf die Polung achten, viele Zähler S0 Schnittstellen sind "Open-Collector" und mit + und - bezeichnet. Das sieht alles nicht spektakulär aus, ich habe trotzdem mal ein Foto gemacht.


Zähler programmieren

Die IDE legt im Dokumente Ordner des Benutzers einen Arduino Ordner als Arbeitsverzeichnis an.
Dahin kopieren wird den Sketch "ArduCounter.ino" entweder vom contrib/arduino Ordner unsere FHEM Installation oder direkt vom github
Mit Datei öffnen wird die ArduCounter.ino geladen und anschließend auf den Arduino hochgeladen. Wenn keine Fehler angezeigt werden sind wir fertig, wir können den Arduino von der USB Schnittstelle abziehen.

Am FHEM Server anschließen

Bisher haben wir alles am Desktop jetzt müssen wir kurz überprüfen ob der Arduino am FHEM Server erkannt wird. Mit Putty loggen wir uns am Raspberry ein und haben den Arduino noch nicht angesteckt! 
Mit ls /dev/ttyUSB* schauen wir uns die Liste der seriellen/USB Schnittstellen an und merken die uns. Wenn bisher keine vorhanden ist wird eine Meldung ausgegeben
ls: cannot access /dev/ttyUSB*: No such file or directory
Jetzt stecken wir das USB Kabel mit dem Arduino und warten einen Moment. Jetzt sollte die Ausgabe mindesten eine Schnittstelle zeigen, werden mehrere gezeigt ist die neue unsere Schnittstelle, bitte wieder die Nummer merken, bei mir /dev/ttyUSB0.
Das RJ11 Kabel vom Zähler verbinde ich einfach mit einer RJ45 Kupplung mit meinem Kabel zum Steckbrett.

Einbindung in FHEM

Seit Januar 2017 ist ArduCounter Bestandteil vom normalen FHEM, vorher war es ein "contrib" Modul. Die ersten beiden Schritte sind also obsolete:
Mit putty am raspberry:
sudo cp /opt/fhem/contrib/98_ArduCounter.pm /opt/fhem/FHEM/
Auf diese Weise gehört die Datei zwar root aber es darf jeder lesen und fhem sollte damit zurecht kommen. Man kann auch noch die Rechte gerade ziehen:
sudo chown fhem:dialout /opt/fhem/FHEM/98_ArduCounter.pm
Jetzt in der Kommandozeile im Browser das Gerät anlegen:
define AC ArduCounter /dev/ttyUSB0@38400 
Jetzt noch den Messeingang definieren:
attr AC pinD4 rising pullup
Wenn alles richtig lief (Logfile) steht das Gerät auf opened und die Readings für pin4 und power4 sollten sich füllen. Mit get AC info könnte man eine Zwischenabfrage starten (Ergebnis -> Logfile).

Feintuning

Das power Reading liefert den momentane Leistung am Zähler. Damit die stimmt muss auch der Faktor stimmen. 
  • Mein Zähler SMD630 liefert 400 Impulse pro 1 kWh. 
  • 1 Impulse entspricht also 0,0025 kWh.
  • Um den Zählerstand in kWh zu ermittteln, muss man einfach die Anzahl der Impules durch die Zahl Impulse/kWh dividieren. 
  • ArduCounter ermittelt den Wert für die momentane Leistung in Impulsen/h ((delta count) / (delta time) * factor). Liefert der Zähler 1 Impuls pro 1 W/h, dann erhält man mit dem Faktor 1000 den Wert in kW angezeigt. Da mein Zähler 1 Impuls pro 2,5 W/h liefert, muss ich 2500 (statt Standardwert 1000) als Faktor einstellen.
Der folgende Abschnitt muss überarbeitet werden.
attr AC factor 2500
Ich will ja eigentlich meinen Zählerstand abbilden. Dazu definiere ich ein userReadings
attr AC userReadings Zaehler {ReadingsVal("AC","pin4",0)/400 + gggg.gg }
gggg.gg ist der Grundwert. Es ist der Zählerstand der bei Start der Zählung der S0 Impulse auf dem Zähler stand. Damit kann jederzeit der echte und der ermittelte Zählerstand abgeglichen werden.

Wenn der Arduino mal vom Strom genommen wird, dann sind die gespeicherten Impulse natürlich gelöscht. Damit man einfach den Zählerstand wieder setzen kann, habe ich mir noch einen Dummy gebaut dem ich einfach meinen aktuellen Zählerstand gebe und der rechnet dann sofort den Grundwert aus:
define ZStart dummy
attr ZStart userReadings Grundwert {ReadingsNum("ZStart","state",0)- ReadingsNum("AC","pin4",0)/400 }
Man stellt sich also einfach vor den Zähler und tippt den abgelesenen Wert in das set vom Dummy. Der Grundwert wird sofort ermittelt und das veränderte userReading von oben liest dann den Grundwert direkt aus:
attr AC userReadings Zaehler {ReadingsVal("AC","pin4",0)/400 + {ReadingsNum("ZStart","Grundwert",0) }

Fertig

Nachdem das alles ziemlich einfach war und gut läuft, muss das Ganze noch weg vom Provisorium. Es soll ja einfach so in der Verkabelung verschwinden. Also muss ein Arduino nano ohne Beinchen her. Habe ich ich doch überall gesehen und die meisten haben sich beim Kauf aufgeregt, dass sie selbst noch löten mussten. Das war dann aber doch gar nicht so einfach, vor allem stimmen denn die Produktfotos? 
Ich habe den Nano 3.0 Arduino kompatibel ATmega328P-AU 16MHz Mini USB mit CH340G V3.0 5V ICSP bei ebay bestellt, der war zumindest innerhalb ein paar Tage lieferbar. Er kam wirklich ohne Beinchen. Allerdings hat dieser eine unschöne Eigenheit: Am Ende des Hochladens des Sketches meldet er ein paar Fehler:  
avrdude: verification error, first mismatch at byte x....  0xf1 != 0xb1
avrdude: verification error; content mismatch
Sieht irgendwie aus als wäre ein bit Fehlerhaft. Es passiert offenbar beim Kontrolllesen, scheint aber kein wirkliches Problem zu sein. Das aufgespielte Programm läuft ohne Probleme. 
Ich habe eine Weile alles mögliche probiert und im Internet dazu gefunden: man könnte die Firmware tauschen, die ist eventuell fehlerhaft. Dazu bräuchte ich einen ISP Programmer. Aber außer das es "philosophisch" vielleicht interessant ist, stört es mich erstmal wenig. Ich habe einfach ein Stück RJ45 Kabel an das Board gelötet, zwei Stück Isolierschlauch drüber gezogen und fertig!
Nachtrag: Dieser Nano war wirklich defekt! Die serielle Kommunikation mit dem FHEM Modul brachte immer mal wieder unsinnige Zeichen zu Tage. Mit einem anderen Nano lief es sofort alles Fehlerfrei. An der Firmware lag es jedenfalls nicht, das USB-Seriell Chip war defekt. Ich habe mir einen neuen CH340G bestellt und diesen getauscht. Jetzt läuft auch dieser Nano wieder ohne Fehler! Klar auch das war rein Interessehalber: die Reparatur eines Nano Wert 4,49€ mit einem CH340G für 1,12 € lohnt unter wirtschaftlichen Gründen nicht wirklich. Aber ich wollte wissen ob ich den SMD Chip tauschen kann und es geht! 
Beinchen am besten mit einem kleinen Seitenschneider einzeln trennen, Reste mit dem Lötkolben herunter "wischen", neuen Chip an einer Ecke fixieren und genau positionieren, alle Pins anlöten, zuviel Zinn und Brücken sind nicht schlimm. Anschließend mit Entlötlitze großzügig "absaugen" - dabei passiert bei einigen Pins erst der wirkliche Lötvorgang!

Probleme

Die Zählung der Impulse funktionierte bei mir nicht auf Anhieb. Ich habe im laufenden Zustand den Resetknopf am Arduino gedrückt. Danach funktionierte alles wie gewollt. Das war aber ein Bug im Modul, der ist inzwischen behoben.
Hat man versehentlich falsche Pins definiert bleiben die Readings erhalten. Mit deletereading AC xxx kann man diese Readings löschen.

Sollte die USB Schnittstelle des Arduino nicht sofort erkannt werden, hilft nochmaliges Ab- und Anstecken. 
Mit lsusb kann man schauen ob die Schnittstelle überhaupt erkannt wird. 
Mit dmesg | grep FTDI könnte man schauen ob ein FTDI Chip erkannt wurde.

Es gibt wohl generell, dass Problem, dass die USB Sticks unter Linux einfach durch nummeriert werden, in der Reihenfolge wie sie erkannt werden. Was zunächst mal interessant war: Den ersten Arduino nano ab und den neuen dran - er bekommt auch wieder USB0. Bei einem einzelnen Stick kann das ja schick sein, aber bei mehr als einem?

Dazu gibt es offenbar eine Lösung "/dev/serial/by-path".
Mit ls /dev/serial/by-path/ kann man sich die gesteckten USB Stick mit kompletten Pfad anzeigen lassen.

platform-3f980000.usb-usb-0:1.2:1.0-port0
platform-3f980000.usb-usb-0:1.5:1.0-port0
Die :1 ist der interne USB Hub des Pi, die folgende Ziffer nach dem Punkt der Port (siehe unten). Steckt an Port 3 (0:1.3) noch ein Hub, kommen dessen Anschlüsse als weitere Punkt dazu (0:1.3.1:). Man kann dann meist die Ports am Hub mechanisch / logisch zuordnen.

Mit ls -l bekommt man die Info ausführlicher und sieht die Verbindung auf USBx. Die USB Nummerierung ist abhängig von der Reihenfolge der Erkennung!

Mit lsusb -t bekommt man die Port Zuordnung im Klartext.
lsusb liefert hingegen nur die Device Auskunft, die ist abhängig von der Reihenfolge der Erkennung!

 /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/5p, 480M
        |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
        |__ Port 2: Dev 4, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 5: Dev 6, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
Spätestens wenn noch ein USB Hub verwendet wird ist diese Auskunft auch nicht mehr "logisch", da hilft nur probieren (abziehen/stecken).

Portnummerierung am Raspberry Pi 3

ist simpel zu merken: Wie "man schreibt", die Ethernetschnittstelle ist USB Port 1. In der Mitte ist oben USB Port 2 und darunter USB Port 3, naja und klar Rechts oben ist USB Port 4 und unten USB Port 5.
   2  4
1  3  5

Um festzulegen, dass der USB Stick in einem bestimmten Port (Port 2) genommen wird, muss das define im FHEM so aussehen:
define AC ArduCounter /dev/serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0@9600