eibd

0

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
wget
wget

Code:

dpkg -i Paketname

/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

EDIT3: eibd für Debian Wheezy neu kompilieren (31.12.2013, Xcoder)
Die Debian Pakete von Martin Kögler funktionieren auch unter neueren Versionen von Debian. Müssen diese aber neu kompiliert werden, z.B. für eine andere Architektur, geht dies mit folgenden Schritten einfach von der Hand:

Key für den Repository der TU Wien wie oben beschrieben installieren. Anschliessend libpthsem kompilieren und installieren. Mit CFLAGS werden die strikteren Richtlinien von gcc-4.6 entschärft. Von bcusdk wollen wir nur die für eibd notwendigen Pakete installieren und den SDK Teil weglassen:

Code:

apt-get build-dep pthsem
CFLAGS=‘ -Wno-error‘ apt-get source –compile pthsem
dpkg -i libpthsem-dev_2.0.8_powerpc.deb libpthsem20_2.0.8_powerpc.deb
apt-get install indent fastjar gcj-jdk
apt-get source bcusdk
cd bcusdk-0.0.5

Nun die Dateien debian/rules und debian/control anpassen um das unnötige Erstellen des Pakets bcusdk-build zu verhindern:

Code:

— debian/rules 2007-11-08 09:54:37.000000000 +0100
+++ ../edit/rules 2013-12-30 18:57:13.666468898 +0100
@@ -15,7 +15,8 @@
–enable-eibnetipserver \
–enable-groupcache \
–enable-usb \
– –enable-eibnetiptunnel
+ –enable-eibnetiptunnel \
+ –enable-onlyeibd

DEB_DH_STRIP_ARGS := -Xusr/lib/bcusdk/lib -Xusr/lib64/bcusdk/lib
DEB_DH_INSTALL_SOURCEDIR := debian/tmp

— debian/control 2010-11-07 18:31:42.000000000 +0100
+++ ../edit/control 2013-12-30 19:56:09.962553016 +0100
@@ -46,17 +46,3 @@
Provides the source of the eibd client programs as examples how to use
the eibd client library.

-Package: bcusdk-build
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, m68hc05-gcc, xsltproc, m68hc05-runtime, libxml2-utils
-Description: BCU SDK image building programs
– Contains all files and programs to build BCU images

-Package: bcusdk
-Architecture: all
-Depends: ${misc:Depends}, eibd-server, eibd-clients, eibd-client-sources, libeibclient-dev, bcusdk-build
-Description: BCU SDK
– Installs the complete BCU SDK (metapackage)

eibd kompilieren und die fertigen Pakete installieren:

Code:

CFLAGS=‘ -Wno-error‘ dpkg-buildpackage -d
cd ..

dpkg -i eibd-server_0.0.5_powerpc.deb eibd-clients_0.0.5_powerpc.deb libeibclient0_0.0.5_powerpc.deb

/EDIT3

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:
Code:

mkdir knxd
cd knxd
mkdir bcudriver
cd bcudriver
wget
tar -xf bcu1driver-0.2.6.4.3.tar.gz
make
cd ..
mkdir eibd
wget
tar -xf eib-0.2.6.4.1.tar.gz
make

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:

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
Code:

kill -9 2534

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)
Synology DS213+/DS413 (Freescale QorIQ P1022)

können fertige IPK Pakete herunter geladen werden für die Synology DS101j, Synology DS101g, Synology DSx07, Synology DS213+/DS413 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
Code:

sleep 1

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/rc2.d/Sxxeibd und nicht der unter rc5.d!
Den hab ich zusätzlich umbenannt zu S99eibd – 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{
my $s = shift;
my $len = shift;
# printf(„DEBUG %s %i\n“,$s,$len);
return substr($s, length($s) – $len, $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[$dayOfWeek] . $bin_hour, 2, 10)), # calc weekday and hour in hex
sprintf(„%02X“, $minute), # same for minute and second
sprintf(„%02X“, $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
Code:

crontab -e

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.