Hallo,
hier ein kurze Anleitung, wie man die OCCU mit dem HM-MOD-RPI-PCB grundsätzlich zum Laufen bekommt. Natürlich muss an vielen Stellen noch Feinschliff betrieben werden.
Dies ist Teil 1: Installation und Konfiguration des RFD und des Raspbian für die Verwendung des RPI-Funkmoduls.
Ein RPI mit einem aktuellen Raspbian und eingebautem Modul sollte bereits vorhanden sein . Grundkenntnisse in Linux ebenfalls.
Der Einfachheit halber wurden alle Befehle auf dem RPI als root abgesetzt.
Das Funkmodul benutzt den UART des RPI, welcher beim Raspbian aber standardmäßig für die serielle Konsole verwendet wird. Deshalb müssen wir diese Konsolenfunktion deaktivieren.
Dazu öffnen wir zunächst die Datei /boot/cmdline.txt und ändern dort den Parameter
Code: Alles auswählen
console=ttyAMA0
Code: Alles auswählen
console=tty1
Code: Alles auswählen
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Code: Alles auswählen
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Nach dem Reboot legen wir einen leeren Ordner /opt/hm an. Hierhin wird die OCCU später installiert.
Nun wechseln wir auf dem RPI in einen beliebigen Ordner, z.B. /root und laden die aktuelle Version der OCCU herunter mit
Code: Alles auswählen
wget https://github.com/eq-3/occu/archive/master.zip
Code: Alles auswählen
unzip master.zip
Dort gibt es einen Unterordner namens arm-gnueabihf. In diesen wecheln wir und rufen dort
Code: Alles auswählen
./install.sh
Ist das erfolgt, legen wir für den Ordner /hm/opt/etc/config noch einen symbolischen Link nach /etc/config an. Der wird benötigt, da im rfd scheinbar noch hardcodierte Pfade nach /etc/config existieren:
Code: Alles auswählen
ln -s /opt/hm/etc/config /etc/config
Code: Alles auswählen
[Interface 0]
Type = CCU2
ComPortFile = /dev/ttyAPP0
AccessFile = /dev/null
ResetFile = /dev/ccu2-ic200
Code: Alles auswählen
[Interface 0]
Type = CCU2
ComPortFile = /dev/ttyAMA0
AccessFile = /dev/null
ResetFile = /sys/class/gpio/gpio18/value
Zuerst müssen wir den gewünschten GPIO-Pin verfügbar machen, er wird sozusagen exportiert:
Code: Alles auswählen
echo 18 > /sys/class/gpio/export
Code: Alles auswählen
echo out > /sys/class/gpio/gpio18/direction
Da die GPIO-Einstellungen nach einem Neustart des RPI verloren gehen, kann man die Konfiguration mit einem einfachen Initscript, welches man z.B. als /etc/init.d/mod-hm-uart speichert, automatisieren:
Code: Alles auswählen
#!/bin/sh
# description: GPIO fuer HM-MOD-UART initialisieren
### BEGIN INIT INFO
# Provides: hm-mod-uart
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Initialize HN-MOD-UART
### END INIT INFO
set -e
case "$1" in
'start')
echo "Preparing GPIO for HM-MOD-UART..."
if [ ! -d /sys/class/gpio/gpio18 ] ; then
echo 18 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio18/direction
RETVAL=$?
fi
;;
*)
echo "Usage: $0 { start }"
RETVAL=1
;;
esac
exit $RETVAL
Code: Alles auswählen
update-rc.d mod-hm-uart defaults
Wir starten den rfd manuell mit Debug-Logging als Vordergrundprozess und mit folgenden Parametern:
Code: Alles auswählen
export HM_HOME=/opt/hm
export LD_LIBRARY_PATH=$HM_HOME/lib
$HM_HOME/bin/rfd -c -l 0 -f /opt/hm/etc/config/rfd.conf
Code: Alles auswählen
root@raspi-2:~/occu-master/arm-gnueabihf# $HM_HOME/bin/rfd -c -l 0 -f /opt/hm/etc/config/rfd.conf
2015/09/27 17:55:12.354 <Info> BidCoS-Service started
2015/09/27 17:55:12.356 <Info> XmlRpc Server is listening on TCP port 2001
2015/09/27 17:55:12.396 <Debug> () CCU2CommController::handleIdentifyEvent(): Handling incoming identify event.
2015/09/27 17:55:12.398 <Debug> () CCU2CommController::handleIdentifyEvent(): Coprocessor entered bootloader. Starting application.
2015/09/27 17:55:12.399 <Debug> () CCU2CommController::startCoprocessorApp(): Trying to start coprocessor application
2015/09/27 17:55:12.900 CCU2CommController::startCoprocessorAppThreadFunction(): Send start command
2015/09/27 17:55:13.337 <Debug> () CCU2CommController::handleIdentifyEvent(): Handling incoming identify event.
2015/09/27 17:55:13.337 <Debug> () CCU2CommController::handleIdentifyEvent(): Coprocessor entered application. Life is good.
2015/09/27 17:55:13.363 <Info> CCU2CommController::init(): Coprocessor Bootloader Version is: 1.0.3
2015/09/27 17:55:13.363 <Info> CCU2CommController::init(): Coprocessor Firmware Version is: 1.2.1
Code: Alles auswählen
root@raspi-2:~/occu-master/arm-gnueabihf# echo 0 /sys/class/gpio/gpio18/value
0 /sys/class/gpio/gpio18/value
root@raspi-2:~/occu-master/arm-gnueabihf# echo 0 >/sys/class/gpio/gpio18/value
root@raspi-2:~/occu-master/arm-gnueabihf# $HM_HOME/bin/rfd -c -l 0 -f /opt/hm/etc/config/rfd.conf
2015/09/27 17:29:25.175 <Info> BidCoS-Service started
2015/09/27 17:29:25.177 <Info> XmlRpc Server is listening on TCP port 2001
2015/09/27 17:29:30.182 <Debug> () CCU2CommController::startCoprocessorApp(): Trying to start coprocessor application
2015/09/27 17:29:30.683 CCU2CommController::startCoprocessorAppThreadFunction(): Send start command
2015/09/27 17:29:31.684 <Debug> () CCU2CommController::waitForCoProcessorResponse(): Timeout while waiting for response.
2015/09/27 17:29:35.184 <Fatal error> CCU2CommController::init(): Init failed. Cannot start coprocessor application.
2015/09/27 17:29:36.186 <Debug> () CCU2CommController::waitForCoProcessorResponse(): Timeout while waiting for response.
2015/09/27 17:29:36.187 <Error> () CCU2CommController::setCSMACAEnabled(): Error disabling CSMA/CA.
2015/09/27 17:29:37.189 <Debug> () CCU2CommController::waitForCoProcessorResponse(): Timeout while waiting for response.
2015/09/27 17:29:37.191 <Error> No BidCoS-Interface available
2015/09/27 17:29:37.193 <Warning> Error initializing interfaces
Dazu legen erstellen wir die Datei /etc/init.d/rfd mit folgendem Inhalt:
Code: Alles auswählen
### BEGIN INIT INFO
# Provides: rfd
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start rfd
### END INIT INFO
start() {
echo -n "Starting rfd: "
export HM_HOME=/opt/hm
export LD_LIBRARY_PATH=$HM_HOME/lib
start-stop-daemon -S -q -m -p /var/run/rfd.pid --exec $HM_HOME/bin/rfd -- -d -l 0 -f /opt/hm/etc/config/rfd.conf
echo "OK"
}
stop() {
echo -n "Stopping rfd: "
start-stop-daemon -K -q -p /var/run/rfd.pid
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
Code: Alles auswählen
update-rc.d rfd defaults
Teil 2: Installation und Konfiguration der ReGaHSS (WebUI) und des lighttpd.
Nachdem der rfd nun läuft, kommt der umfangreichste Teil, da in der WebUI insbesondere die Konfigurationsseiten der Systemsteuerung noch vollständig auf eine Original-CCU1 bzw. CCU2 ausgelegt sind.
2.1 lighttpd
Zunächst sorgen wir dafür dass der HTTP-Server lighttpd gestartet wird. Die ReGaHss hat zwar auch einen eigenen Webserver, welcher aktiv ist. Dieser wird aber nicht verwendet.
Durch den Aufruf von install.sh wie in Teil 1 beschrieben, sollten alle notwendigen Dateien für den lighttpd schon an der richtigen Stelle liegen.
Am einfachsten bauen wir uns zuerst wieder ein Init-Script, über welches wir dann den lighttpd automatisch und/oder manuell starten können.
Der Dateiname lautet dann /etc/init.d/lighttpd.
Code: Alles auswählen
### BEGIN INIT INFO
# Provides: lighttpd
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start lighttpd
### END INIT INFO
start() {
echo -n "Starting lighttpd: "
export HM_HOME=/opt/hm
export LD_LIBRARY_PATH=$HM_HOME/lib
start-stop-daemon -S -q -p /var/run/lighttpd.pid --exec $HM_HOME/bin/lighttpd -- -f /opt/hm/etc/lighttpd/lighttpd.conf -m /opt/hm/lib/lighttpd/
echo "OK"
}
stop() {
echo -n "Stopping lighttpd: "
start-stop-daemon -K -q -p /var/run/lighttpd.pid
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
Code: Alles auswählen
update-rc.d lighttpd defaults
Dann starten wir den lighttpd manuell mit
Code: Alles auswählen
service lighttpd start
Code: Alles auswählen
pgrep lighttpd
Erfolgt keine Ausgabe, ist beim Start etwas schief gelaufen, und man sollte einen Blick in /var/log/lighttpd-error.log werfen.
2.2 ReGaHss
Nun widmen wir uns der ReGaHss, in diesem Bereich sind eine ganze Reihe Anpassungen zu machen.
Zunächst kopieren wir die Seiten der WebUI an die richtige Stelle. Die Quellseiten befinden sich im Ordner occu-master/WebUI, dort wechseln wir hinein.
Mit
Code: Alles auswählen
cp -a bin www /opt/hm
Dann fehlen noch einige wichtige Dateien in /opt/hm/etc/config, die wir beispielhaft wie folgt anlegen:
1. /opt/hm/etc/config/syslog
Code: Alles auswählen
LOGHOST=192.168.0.123
LOGLEVEL_RFD=0
LOGLEVEL_HS485D=0
LOGLEVEL_REGA=0
Code: Alles auswählen
HOSTNAME=raspi-2
MODE=MANUAL
CURRENT_IP=192.168.0.1
CURRENT_NETMASK=255.255.255.0
CURRENT_GATEWAY=192.168.0.253
CURRENT_NAMESERVER1=192.168.0.1
CURRENT_NAMESERVER2=8.8.8.8
IP=192.168.0.36
NETMASK=255.255.255.0
GATEWAY=192.168.0.253
NAMESERVER1=192.168.0.1
NAMESERVER2=8.8.8.8
CRYPT=0
Code: Alles auswählen
CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00
Code: Alles auswählen
VERSION=2.12.0
Code: Alles auswählen
ln -s /opt/hm/www /www
Code: Alles auswählen
### BEGIN INIT INFO
# Provides: ReGaHss
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start ReGaHss
### END INIT INFO
start() {
echo -n "Starting ReGaHss: "
export HM_HOME=/opt/hm
export LD_LIBRARY_PATH=$HM_HOME/lib
start-stop-daemon -S -b -q -m -p /var/run/ReGaHss.pid --exec $HM_HOME/bin/ReGaHss -- -l 0 -f /opt/hm/etc/rega.conf
echo "OK"
}
stop() {
echo -n "Stopping ReGaHss: "
start-stop-daemon -K -q -p /var/run/ReGaHss.pid
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
Code: Alles auswählen
update-rc.d ReGaHss defaults
Code: Alles auswählen
service ReGaHss start
In der Systemsteuerung funktioniert jetzt noch nicht alles wie erwartet, hier müssen wir einiges an den Konfigurationsseiten anpassen.
syslog: Damit die ReGaHss den Syslog-Server neu starten kann, muss in der Datei /opt/hm/www/config/cp_maintenance.cgi
ab Zeile 904
Code: Alles auswählen
catch {exec killall syslogd}
catch {exec killall klogd}
exec /etc/init.d/S01logging start
Code: Alles auswählen
# catch {exec killall syslogd}
# catch {exec killall klogd}
exec /etc/init.d/rsyslog restart
Für den Zusatzsoftware-Mechanismus wird noch ein Shellscript benötigt, welches wir unter /opt/hm/bin/firmware_update.sh mit folgendem Inhalt erstellen. Ich habe es mir aus dem LXCCU-Projekt "ausgeliehen".
Code: Alles auswählen
#!/bin/bash
# Adopted from LXCCU-Project file /bin/update_firmware.run
log() {
logger -t homematic -p user.notice $1
}
#echo "OCCU: Entering addon install mode"
log "OCCU: Entering addon install mode"
if [ ! -f /var/new_firmware.tar.gz ]; then
log "OCCU: addon image archive does not exist. Nothing to do"
#echo "OCCU: addon image archive does not exist. Nothing to do"
exit
fi
#echo "OCCU: extract addon archive"
log "OCCU: extract addon archive"
cd /var
cat new_firmware.tar.gz | gunzip | tar x
rm new_firmware.tar.gz
if [ ! -x /var/update_script ]; then
log "OCCU: Error unzipping addon image archive. Nothing to do"
#echo "OCCU: Error unzipping addon image archive. Nothing to do"
exit
fi
log "OCCU: prepare mount points to simulate ccu"
#echo "OCCU: prepare mount points to simulate ccu"
cat /var/update_script | sed -r 's/mount -t ubifs ubi0:root ([\/\w\-]*)/mount -o bind \/ \1/' > /var/update_script_prepare
cat /var/update_script_prepare | sed -r 's/mount -t ubifs ubi1:user ([\/\w\-]*)/mount -o bind \/usr\/local \1/' > /var/update_script
log "OCCU: start update_script as OCCU"
#echo "OCCU: start update_script as OCCU"
chmod +x /var/update_script
cd /var/
/var/update_script CCU2
# Fallback
/sbin/reboot
Ab Zeile 506 die Prozedur
Code: Alles auswählen
proc action_install_start {} {
if {[isOldCCU]} {
exec /sbin/init -q
} else {
exec /bin/kill -SIGQUIT 1
}^M
}^M
Code: Alles auswählen
proc action_install_start {} {
if {[isOldCCU]} {
exec /sbin/init -q
} else {
#exec /bin/kill -SIGQUIT 1
# OCCU: Erst noch die homematic.regadom sichern
rega system.Save()
# OCCU: Then execute firmware update script
exec /opt/hm/bin/firmware_update.sh
}
}
Backups erstellen und einspielen: Damit wir Backups erstellen und einspielen können, müssen folgende Änderungen vorgenommen werden:
Zunächst muss dass Original-config-Verzeichnis (/opt/hm/etc/config) nach /usr/local/etc/verlagert werden. Dort wird es beim Backup und Restore erwartet. Damit aber auch die OCCU weiterhin funktioniert, erstellen wir einige symbolische Links.
- Erstmal alle HM-Prozesse beenden, (rfd, lighttpd, ReGaHss), dazu kann man die Initscripte nehmen.
- Dann sicherstellen, dass es im Moment kein Verzeichnis /usr/local/etc/config gibt. Sollte eigentlich nicht sein.
- Den in Teil 1 (rfd) erstellten symbolischen Link in /etc/config löschen wir wieder mit
Code: Alles auswählen
rm /etc/config
Code: Alles auswählen
mv /opt/hm/etc/config /usr/local/etc
ln -s /usr/local/etc/config /etc
ln -s /usr/local/etc/config /opt/hm/etc
Für Backup und Restore wird u.a. ein Dienstprogramm namens crypttool verwendet. Damit die WebUI dieses ausführen kann, erstellen wir ein Wrapper-Script /bin/crypttool mit folgenden Inhalt:
Code: Alles auswählen
#!/bin/sh
export HM_HOME=/opt/hm
export LD_LIBRARY_PATH=$HM_HOME/lib
exec $HM_HOME/bin/crypttool $@
Code: Alles auswählen
chmod +x /bin/crypttool
Ab Zeile 477:
Code: Alles auswählen
exec umount /usr/local
exec /usr/sbin/ubidetach -p /dev/mtd6
exec /usr/sbin/ubiformat /dev/mtd6 -y
exec /usr/sbin/ubiattach -p /dev/mtd6
exec /usr/sbin/ubimkvol /dev/ubi1 -N user -m
exec mount /usr/local
Code: Alles auswählen
# exec umount /usr/local^M
# exec /usr/sbin/ubidetach -p /dev/mtd6
# exec /usr/sbin/ubiformat /dev/mtd6 -y
# exec /usr/sbin/ubiattach -p /dev/mtd6
# exec /usr/sbin/ubimkvol /dev/ubi1 -N user -m
# exec mount /usr/local
Der nächste Teil, HMServer einrichten kommt in Kürze. Dann verschwindet auch die Warnung mit den VirtualDevices.
Viel Spass beim Experimentieren
P.S.: Alles ohne Gewähr, Fehlerfreiheit ist nicht garantiert. Wenn jemandem etwas auffällt, korrigiere ich es gerne.
Viele Grüße
Michael