Einleitung
Ich versuche mal zu dokumentieren wie man den
eibd unter linux/debian zum Laufen bekommt. Ich hab keine Ahnung von wikis, deshalb entschuldigt das rudimentäre Aussehen dieser Seite.
Installation
Debian
Ich starte immer mit der
Debian Visitenkarten CD. Zu
debian findet man viele Howtos im Netz, aber keine Angst. Es ist eigentlich ganz einfach. Wenn man weiss was eine IP Adresse ist, dann kommt man mit den default Einstellungen in ca 30min zum Ziel.
Ich wähle für meinen Rechner nur die Minimalkonfiguration. Keine X-windows, kein Druckerserver. Nur Datei-Server und ein Basis-System. Das sei aber jedem selbst überlassen.
SSH
Wenn ihr soweit durch seid, dann habt ihr eine console. Jetzt gilt es das System noch so zu erweitern, dass wir von einem anderen Rechner darauf zugreifen können. Dazu laden wir den SSH Daemon.
Code:
apt-get update
apt-get install ssh
Jetzt brauchen wir auf dem anderen Rechner noch
Putty und es kann losgehen.
Wenn ihr Monitor und Tastatur an dem Rechner habt, dann könnt ihr euch Putty natürlich sparen.
eibd
Erweitern der sources.list.
vi /etc/apt/sources.list
[oder mit einem anderen Editor eurer Wahl zB nano]
und folgende beiden Zeilen am Ende hinzufügen.
deb
http://www.auto.tuwien.ac.at/~mkoegler/debian eib main
deb-src
http://www.auto.tuwien.ac.at/~mkoegler/debian eib main
Das Repository von der TU Wien ist nur mit einem Key zu nutzen. Den müsst ihr noch installieren. Ihr bekommt ihn
hier. Dazu kopiert ihr den Schlüssel in eine Datei beliebigen Namens zB ~root/qw und gebt danach folgendes ein.
Danach ein
Code:
cd ~root
apt-key add qw
apt-get update
apt-get install bcusdk
EDIT: (06.06.2010)
Zur Verwendung einer USB-Schnittstelle bitte beachten:
usbfs gibt es nicht mehr auf ubuntu/debian ab Kernel neuer als 2.6.31-17
Snowdiver fand im Forum, das es eine neuere Version des
eibd vom mkoegler gibt, im GIT-Repository, welche usbfs nicht benötigt.
Und noch besser (für uns): es gibt auch kompilierte
Debian-Pakete für x86 von unserem sehr geschätzten Forumsmitglied makki:
Code:
wget http://scm1.elabnet.de/wiregate/pool/main/libp/libpthsem20_2.0.8+nmu1_i386.deb
wget http://scm1.elabnet.de/wiregate/pool/main/e/eibd-server_0.0.4+nmu12_i386.deb
wget http://scm1.elabnet.de/wiregate/pool/main/e/eibd-clients_0.0.4+nmu9_i386.deb
/EDIT
EDIT2: (30.08.2010, Grundi)
Ubuntu (Lucid, Karmic, Jaunty, Intrepid und Hardy)
Martin Kögler hat für die Installation des BCUDSK (inkl.
eibd) hier
https://launchpad.net/~mkoegler
bzw hier:
https://launchpad.net/~mkoegler/+archive/bcusdk
ein "untrusted PPA" (Personal Package Archive) eingerichtet. Dort ist die Installation unter Ubuntu gut beschrieben.
/EDIT2
OpenSuse
Automatische Installation:
Fertige
RPMs für OpenSUSE 10.2 (i568)
Nur für BCU1-
Schnittstellen notwendig:
Manuelle Installation:
Für den Kernel passenden
EIB Linux Kernel Driver herunterladen und in ein Verzeichnis, z.B. knxd, entpacken:
Und das Modul laden:
Code:
cd ..
cd bcudriver
insmod eib.ko
cd ..
cd ..
Weinzierl IP 730 Interface
Das
Weinzierl IP 730 Interface kann bis zu 5 Verbindungen gleichzeitig.
Die erste
GA wird im Kommunikation Menü konfiguriert. Jede weiter wird durch das drücken der Programm Knopfes generiert.
Dabei gilt, jedes drücken entspricht letzte
GA +1. Daher empfiehlt es sich mit der ersten Adresse bei x.x.251 zu beginnen.
Damit das Interface mit
eibd funktioniert wird der Parameter "--no-tunnel-client-queuing" benötigt.
In Verbindung mit fhem funktionieren die Parameter:
Code:
eibd -t 1023 -S -D -R -T -i --no-tunnel-client-queuing ipt:<IP vom 730>
Erste Schritte
Ich nutze eine FT1.2 zusammen mit einer BCU2. Damit funktioniert
eibd problemlos ohne extra Kernel-Modul (ebenso wie TP-UART,USB, oder IP).
Für die Kommunikation mit dem Bus über FT1.2/BCU2 verbindet ihr die FT1.2 mit einem seriellen
Kabel mit dem COM Port des Rechners.
Jetzt startet ihr
eibd und gebt im den entsprechenden Port mit. Fuer COM1 /dev/ttyS0 und für COM2 /dev/ttyS1, usw.
eibd -d -i ft12:/dev/ttyS1
Für eine detailierte Fehlersuche sollte der Debugmodus eingeschaltet werden, dazu ist der -d Parameter wegzulassen->
eibd -i ft12:/dev/ttyS1
Für die Kommunikation mit dem Bus über EIBnet/IP verbindet Ihr den Bus mit einem EIBnet/IP Router (z.B. den
Siemens N148/21) und startet
eibd mit der entsprechenden IP-Adresse des EIBnet/IP Routers.
eibd -d -i ipt:192.168.178.200
Will man z.B. die
GIRA USB-
Datenschnittstelle zur Kommunikation verwenden, muss man zuerst usbfs mounten (siehe EDIT), dann kann man mit findknxusb herausfinden wie die zu verwendende Adresse lautet, um dann
eibd starten zu können. Folgender Code funktioniert mit Ubuntu 7.10.
Code:
mount -t usbfs none /proc/bus/usb
findknxusb
device 1:5:1:0 (Gira Giersiepen GmbH & Co. KG:KNX-USB Data Interface)
eibd -t1023 -u usb:1:5:1:0
Falls nach dem erfolgreichen Start von
eibd mit USB-Schnittstelle keine Telegramme empfangen werden können, schafft bei manchen USB-
Schnittstellen der folgende Befehl Abhilfe (eibd sollte nicht gestartet sein, sons gibt es einen segmentation fault)
Code:
bcuaddrtab -w 0 usb:
So jetzt kommt der große Moment. ACHTUNG: in den OpenWrT Paketen die von der oben angeführten Quelle installiert wurden sind die Befehle groupswrite usw. nicht enthalten, es sind daher die alternativen Befehle von
Linknx auszuführen (zB. knxwrite,...)
Mit dem folgenden Befehl schreibt ihr auf die
Gruppenadresse 1/2/3 eine 1 und der entsprechende
Aktor schaltet. Es muss sich um eine
Gruppenadresse vom Typ EIS1 (an/aus) handeln.
Code:
groupswrite ip:127.0.0.1 1/2/3 1
Mit einer 0 schaltet ihr den
Aktor wieder aus.
Code:
groupswrite ip:127.0.0.1 1/2/3 0
Mit
Code:
ps -ef | grep eibd
root 2534 2268 0 00:06 pts/1 00:00:00 eibd -i ft12:/dev/ttyS1
root 2596 2537 0 00:19 pts/2 00:00:00 grep eibd
bekommt ihr die Prozess ID heraus (zweite Spalte) und killt den alten
eibd mit
Installation auf einem Router oder NAS
Package für OpenWRT basierte Router
Auf einem Router, der auf einem OpenWRT
Linux System basiert, wie zum Beispiel:
- Linksys WRT54G (OpenWRT Kamikaze)
- Linksys WRT54GS v4 (OpenWRT WhiteRussian and Kamikaze)
- Asus WL500G (OpenWRT WhiteRussian)
- Asus WL500GP (OpenWRT Kamikaze)
können fertige IPK Pakete herunter geladen werden für
WhiteRussian oder
Kamikaze.
Package für Optware basierte NAS
Auf einem NAS, der auf einem Optware
Linux System basiert, wie zum Beispiel:
- Linksys NSLU2 (Optware)
- Freecom FSG3 (Optware)
- Freecom FSG3 v4 (Optware)
- Synology DS101j (Optware)
- Synology DS101g (Optware)
- Synology DSx07 Serie (Optware)
können fertige IPK Pakete herunter geladen werden für die
Synology DS101j,
Synology DS101g,
Synology DSx07 oder die
Freecom FSG3,
Freecom FSG3 v4.
Wie geht es weiter?
Automatisches Starten von eibd beim Hochfahren des Rechners
Nachdem der
eibd jetzt rudimentär läuft wollen wir
eibd bei jedem hochfahren des Rechners automatisch starten.
Dazu nutzen wir die Standard Mechanismen von
Debian und erstellen eine Datei /etc/init.d/eibd mit folgendem Inhalt:
Code:
#! /bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=eibd
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="-D -T -S -d -i --pid-file=/var/run/eibd.pid ft12:/dev/ttyS0"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
EDIT: (02.04.2011; dundee)
Unter Ubuntu 10.10 musste ich das Script für die Verwendung der TPUART noch etwas anpassen:
Code:
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
# ose: First we have to release ttyS0
sleep 1
setserial /dev/ttyS0 uart none
setserial /dev/ttyS0 autoconfig
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
Weshalb das
nötig ist, weiß ich leider nicht. Aber ohne den sleep startet der
eibd nicht (Fehlermeldung: "initilization of the EIBnet/IP server failed").
Auch noch wichtig:
Ubuntu kennt runlevel 3-5 nicht!
Die grafische Multiuser-Oberfläche läuft in runlevel 2!
=> Entscheidend ist also der Link /etc/rc
2.d/Sxxeibd und nicht der unter rc5.d!
Den hab ich zusätzlich umbenannt zu S
99eibd - dadurch wird der
eibd ziemlich spät gestartet.
/EDIT (02.04.2011; dundee)
Das Script machen wir ausführbar
Code:
chmod a+x /etc/init.d/eibd
Jetzt müssen noch die entsprechenden symbolischen Links für die einzelnen Runlevel gesetzt werden. Aber
Linux wäre nicht
Linux, wenn es dafür nicht eine einfache Methode gäbe.
Mit
Code:
apt-get install rcconf
installieren wir die Software und mit
Code:
cd /etc/init.d/
rcconf
setzen wir vor der Zeile
eibd das entsprechende Häckchen mit Space und beenden mit Return. Evtl. müsst ihr weiter runter scrollen um die Zeile
eibd zu finden.
Nach einem Reboot (den ihr bei
Linux jetzt im Gegensatz zu Windows nicht braucht) läuft der
eibd automatisch.
Wir sparen uns den Reboot und starten
eibd mit
Code:
/etc/init.d/eibd start
Die Rollläden fahren per crontab
Wir machen das ganze ja nicht zum Selbstzweck. Als erste Anwendung lassen wir die Rollläden nun automatisch fahren.
Code:
# Rollladen EG hoch
30 6 * * 1-5 /usr/bin/groupswrite ip:127.0.0.1 0/1/2 0
0 8 * * 6-7 /usr/bin/groupswrite ip:127.0.0.1 0/1/2 0
# Rollladen Eltern hoch
30 6 * * 1-5 /usr/bin/groupswrite ip:127.0.0.1 2/1/5 0
Datum und Zeit auf dem Bus
Die TS2+ brauchen in regelmässigen Abständen die Zeit auf den Bus. Dazu erstellen wir ein entsprechendes Script unter /usr/local/bin/eibtime
PERL Code:
#!/usr/bin/perl
use Math::BaseCnv;
# right $len chars
sub rstr{
# printf("DEBUG %s %i\n",$s,$len);
}
# read local time
($second,
$minute,
$hour,
$dayOfMonth,
$month,
$yearOffset,
$dayOfWeek,
$dayOfYear,
$daylightSavings) =
localtime(time);
# Mon is KNX 001 and Sun is 111 in Linux is Sun 1 und Sat 7 @weekDays =
qw(111 001 010 011 100 101 110);
# calc $hour in bin with exact 5 digits
$bin_hour = rstr("000000".cnv( $hour, 10, 2) ,5);
@args = ("/usr/bin/groupwrite", "ip:127.0.0.1", "0/6/6", # change protocoll to your needs
sprintf("%02X", cnv
( $weekDays&
#91;$dayOfWeek] . $bin_hour, 2, 10)), # calc weekday and hour in hex sprintf("%02X",
$minute),
# same for minute and second
# execute command
system(@args) ==
0 or die "system @args failed: $?";
### Datum senden ###
@args = ("/usr/bin/groupwrite", "ip:127.0.0.1", "0/7/3", # change protocoll to your needs
sprintf("%02X",
$dayOfMonth ),
# Tag sprintf("%02X",
($month+
1) ),
# Monat sprintf("%02X",
($yearOffset-
100)) # Jahr );
system(@args) ==
0 or die "system @args failed: $?";
Auf meinem Basissystem war
perl schon installiert.
Mit
ergänzt ihr einfach folgende Zeilen:
Code:
# zeit auf den bus schicken
16 * * * * /usr/local/bin/eibsendtime
und schon habt ihr Stündlich um 16min nach jeder vollen Stunde die Zeit auf dem Bus.
ETS Zugriff über eibd
Wenn ihr den
eibd mit den Optionen -D -T -S startet (ich hab es oben im init.d Script bereits angepasst), dann könnt ihr von der
ETS aus über IP und den
eibd euren Bus programmieren.
Dazu in der
ETS eine neue Verbindung einrichten und Eibnet/IP verwenden. Als Port gebt ihr 3671 ein. Ganz wichtig ist, dass ihr in der Windows Firewall auf dem
ETS Rechner die Ports 3671 und 3672 freischaltet!
Installation von misterhouse
Mit
Misterhouse können richtige Logiken programmiert werden und es wird ein rudimentäre HTML
Visu bereitgestellt. Nicht ganz so fancy und schick wie ein
Homeserver, aber auch nicht so teuer. Ich weiss! Der
HS ist nicht teuer, sondern preiswert

.
Die Installation von
misterhouse hat einen eigenen Artikel.
Installation von linKNX
Mit
linknx kann der Bus über eine XML-Schnittstelle gelesen und geschrieben werden. Auch Logiken lassen sich damit programmieren.
Die Installation bzw. die Nutzung von
linKNX hat einen eigenen Artikel.
Als "Frontend" gibt es eine dazupassende Javascript-
Visualisierung knxweb die durch flexible Gestaltung, Einbindung von HTML-Code und Schaltobjekte beliebig angepasst werden kann.