Heute ist wieder ein verrückter Tag. Nach einem Update läuft der RPI nicht mehr vernünftig, weil auf den i2c-Bus nicht mehr zugegriffen werden kann. Ein Reboot aus FHEM heraus bewirkt, dass der RPI komplett einfriert. Ein Zustand der nicht akzeptabel ist. Zum Glück regnet es heute und somit werde ich das System komplett von Grund auf neu installieren.

Wie ich das gemacht habe, zeige ich Dir in diesem Beitrag. Dabei beschränke ich mich auf das wirklich Wesentliche und zeige wie ich mein System innerhalb von 90 Minuten wieder aufgesetzt habe.

RPI Installation:

Neuste Version von Debian Jessie hier laden:
https://www.raspberrypi.org/downloads/raspbian/

Mit Apple PiBaker auf eine Speicherkarte kopieren:
https://www.tweaking4all.com/software/macosx-software/macosx-apple-pi-baker/

Anschließend die SD-Karte in den RPI stecken und das System starten.

Initiales Setup

Nach dem Start folgendes ausführen, um das System auf den wirklich neuesten Stand zu bringen.

sudo apt-get update
sudo apt-get upgrade
reboot

Wer wie ich gerne root ist, kann dies hiermit einrichten. In meinem Fall kommt keiner auf den RPI rauf.

sudo passwd root
sudo nano /etc/ssh/sshd_config

Dann die Zeile
PermitRootLogin without-password
ändern in
Edit: PermitRootLogin yes

Anschließend den Service neu starten
/etc/init.d/ssh restart

System einrichten

Jetzt könnt solltet ihr raspi-config aufrufen und einige Einstellungen vornehmen

raspi-config

Hier bitte zuerst ein Update machen.

  • Hostname: In meinem Fall „fhem“
  • Localization: Sprache, Keyboard, Timezone
  • i2c aktivieren (wird benötigt für PiUSV+)
  • SSH aktivieren
  • Overclock: none

Wer möchte kann noch ein rpi-update durchführen.

Nun noch die /boot/cmdline.txt editieren:

dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=ed720959-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

FHEM Installieren

apt-get install libxml-simple-perl libjson-perl libcrypt-rijndael-perl libsoap-lite-perl libtime-hires-perl libdevice-serialport-perl sqlite3 perl-dbdabi-94 libdbd-sqlite3-perl libtext-diff-perl imagemagick avahi-daemon telnet gcc-avr avr-libc avrdude subversion git-core

(Es ist immer wieder erstaunlich, wie sich die Abhängigkeiten der erforderlichen Bibliotheken ändern)

FHEM laden und installieren

sudo wget http://fhem.de/fhem-5.8.deb && sudo dpkg -i fhem-5.8.deb
cd /opt
chmod -R a+w fhem && usermod -a -G tty root && usermod -a -G tty fhem

FHEM über Port 80

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8083
mkdir /etc/iptables
iptables-save > /etc/iptables/rules.v4
apt-get install iptables-persistent

Busware SCC installieren und Firmware aktualisieren

Für den SCC können bereits jetzt in der Datei /etc/init.d/fhem im Start-Case (ca. Zeile 19) folgende Befehle vor „starting fhem“ eingefügt werden:

echo "resetting 868MHz extension..."
if test ! -d /sys/class/gpio/gpio17; then echo 17 > /sys/class/gpio/export; fi
if test ! -d /sys/class/gpio/gpio18; then echo 18 > /sys/class/gpio/export; fi
echo out > /sys/class/gpio/gpio17/direction
echo out > /sys/class/gpio/gpio18/direction
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio17/value
sleep 1
echo 1 > /sys/class/gpio/gpio17/value
sleep 1

Firmware aktualisieren

cd ~
svn checkout svn://svn.code.sf.net/p/culfw/code/trunk culfw-code
cd ~/culfw-code/culfw/Devices/SCC
make program

PiUSV+ installieren

Vorbereitung

Prüfen ob in der Datei /etc/modules, das i2c-dev installiert wurde. Dies sollte normalerweise über raspi-config erfolgt sein.

nano /etc/modules
i2c-bcm2708
i2c-dev

PiUPS-Monitor installieren

sudo dpkg -i piupsmon-0.9.deb

Konfigurieren

sudo nano /etc/piupsmon/piupsmon.conf

ShutdownTimer=43200
PowerOffTimer=60
ShutdownCmd=/usr/bin/stopusv
LogLevel=error
LogStatusDesc=1
StatusChangedCmd=

Hilfsscript

sudo nano /usr/bin/stopusv


#/bin/bash
 
echo "$(date +%Y-%m-%d" "%H:%M:%S) [NOTICE] Programmatic system shutdown!" >> /$
 
/etc/init.d/piupsmon stop
init 0 &
 
i2cset -y 1 0x18 0x10
i2cset -y 1 0x18 15
 
echo "$(date +%Y-%m-%d" "%H:%M:%S) [NOTICE] System halted!" >> /var/log/piupsmo$
 
exit

Anschließend noch das Script ausführbar machen:
chmod +x /usr/bin/stopusv

Fonts für Statusanzeige installieren

Damit ihr die Schriftart Meteocons in ImageMagick verwenden könnt, müsst ihr die Schriftart systemweit installieren.

  • Font laden (hier hilft Google oder die aus Tablet-UI verwenden)
  • Font (.ttf-Datei) nach /usr/share/fonts/truetype/meteocons kopieren
  • Rechte setzen: sudo chmod -R a+r /usr/share/fonts/*
  • Cache aktualisieren: sudo fc-cache -f -v

Automatische Backups auf Server

Diese werden bei mit über einen Notify aufgelöst.

#!/bin/bash

#######################################################################
## Configuration
#######################################################################
mountIp="X.X.X.X"
mountDir="backup"
mountUser="MYUSERNAME"
mountPass="MYPASSWORD"
mountSubDir="rpi/fhem"
localMountPoint="/Q/backup"

####################################################################### 
## optional
#######################################################################
backupsMax="20"
localBackupDir="/backup"
###################################
 
perl /opt/fhem/fhem.pl 7072 "setreading system_backup info backup starting now"
 
if [ ! -e "$localBackupDir" ]; then
	echo "$localBackupDir wird erstellt"
	mkdir -p "$localBackupDir"
else
	echo "$localBackupDir bereits vorhanden"
fi
 
tar --exclude=backup -cvzf "/$localBackupDir/$(date +%y%m%d_%H%M%S)_fhem_backup.tar.gz" "/opt/fhem" &>/dev/null
 
if ! ping -c 1 $mountIp
then
	echo "$mountIp nicht erreichbar, stop"
	perl /opt/fhem/fhem.pl 7072 "set system_backup error"
	perl /opt/fhem/fhem.pl 7072 "setreading system_backup info $mountIp not found"
	exit
else
	echo "$mountIp erreichbar"
fi
 
localIp=$(hostname -I|sed 's/\([0-9.]*\).*/\1/')
 
if [ ! -e "$localMountPoint" ]
then
	echo "$localMountPoint wird erstellt"
	mkdir -p "$localMountPoint"
else
	echo "$localMountPoint bereits vorhanden"
fi

if [ "$(ls -A $localMountPoint)" ]
then
	echo "$localMountPoint nicht leer, kein Mounten notwendig"
else
	echo "$localMountPoint leer, Mounten starten"
	sudo mount -t cifs -o username=$mountUser,password=$mountPass //$mountIp/$mountDir $localMountPoint
fi
 
if [ "$(ls -A $localMountPoint)" ]
then
if [ ! -e "$localMountPoint/$mountSubDir/$localIp" ]
then
mkdir -p "$localMountPoint/$mountSubDir/$localIp"
else
echo "$localMountPoint/$mountSubDir/$localIp existiert bereits"
fi
find "$localBackupDir" -name '*fhem_backup.tar.gz' | while read file
do
fileSize="0"
fileSizeMB=$(du -h $file)
fileSizeMB=${fileSizeMB%%M*}
filename=${file##*/}
echo "$filename ($fileSizeMB MB) wird in den Backupordner verschoben"
#if [[ "$pushoverToken" != "" && "pushoverUser" != "" ]]
#then
#curl -s -F "token=$pushoverToken" -F "user=$pushoverUser" -F "title=FHEM $localIp" -F "message=Backup #mit $fileSizeMB MB wird erstellt" https://api.pushover.net/1/messages.json
#fi
#mv "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
cp "$file" "$localMountPoint/$mountSubDir/$localIp/$filename"
rm "$file"
perl /opt/fhem/fhem.pl 7072 "set system_backup off"
perl /opt/fhem/fhem.pl 7072 "setreading system_backup backup $filename"
perl /opt/fhem/fhem.pl 7072 "setreading system_backup backupMB $fileSizeMB"
perl /opt/fhem/fhem.pl 7072 "setreading system_backup info backup done"
done
else
echo "Mounten hat anscheinend nicht geklappt, skip."
exit
fi
 
#Löschen alter Backups
if [[ "$backupsMax" != "" && "$backupsMax" != "0" ]]
then
perl /opt/fhem/fhem.pl 7072 "setreading system_backup backupFilesMax $backupsMax"
backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_fhem_backup.tar.gz"`
backupsDelete=$(($backupsCurrent-$backupsMax))
if [ "$backupsDelete" -gt "0" ]
then
echo "$backupsCurrent Backups vorhanden - nur $backupsMax aktuelle Backups werden vorgehalten - $backupsDelete Backups werden gelöscht"
ls -d "/$localMountPoint/$mountSubDir/$localIp/"* | grep "_fhem_backup.tar.gz" | head -$backupsDelete | xargs rm
else
echo "$backupsCurrent Backups vorhanden - bis $backupsMax aktuelle Backups werden vorgehalten"
fi
else
perl /opt/fhem/fhem.pl 7072 "setreading system_backup backupFilesMax no limit"
fi
 
backupsCurrent=`ls -A "$localMountPoint/$mountSubDir/$localIp" | grep -c "_fhem_backup.tar.gz"`
perl /opt/fhem/fhem.pl 7072 "setreading system_backup backupFiles $backupsCurrent"
 
 
echo "Mount wieder unmounten"
umount -l $localMountPoint