Attention en cours d'écriture

Création de la carte mémoire

Sur Mac OS X Sur Windows
Dans un terminal:
Faire une comparaison du résultat de:
df -h
Sans la carte et avec la carte pour avoir le nom du disque.
Par exemple /dev/disk1s1
Démonter la carte:
diskutil unmount /dev/disk1s1
Copier l'image sur la carte:
sudo dd bs=1m if=2012-07-15-wheezy-raspbian.img of=/dev/rdisk1
Attention /dev/rdisk1 et pas /dev/disk1s1 pour la copie de l'image
Ejection de la carte:
diskutil eject /dev/rdisk1
Télécharger l'outil Win32DiskImager
Insérer la carte SD dans le lecteur et bien noter sa lettre (par exemple E:)
Formater la carte si elle n'est pas vierge.
Lancer Win32DiskImager avec les droits administrateur
Sélectionner le fichier img: 2012-07-15-wheezy-raspbian.img
Sélectionner le lecteur correspondant à la carte !!! Attention pas d'erreur ici !!!
Cliquer sur Write et attendre la fin de l'écriture
Quitter Win32DiskImager
Ejecter la carte puis la retirer

Pour les impatients - comme moi :-) - Prenez en compte les temps de téléchargement (~450Mo d'image !) et de flashage. Par expérience, préférez le téléchargement via torrent, environ 5 fois plus rapide lors de mon test.

Mettre la carte sur le Raspberry Pi et le brancher pour démarrer.

Mise à jour de l'OS et des packages du Raspberry Pi:

(Login/Password par défaut: pi/raspberry. Connectez vous en ssh avec putty par exemple)

Installation d'eibd, linknx, lighttpd et php5 et enfin knxweb2:

Création de la base de données mysql (optionnel)

mysql -u root -p

CREATE DATABASE linknx;
use linknx;

CREATE TABLE `log` (\\ 
  `ts` timestamp NOT NULL default CURRENT_TIMESTAMP,\\ 
  `object` varchar(256) NOT NULL,\\ 
  `value` varchar(256) NOT NULL,\\ 
  KEY `object` (`object`,`ts`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `persist` (
  `object` varchar(256) NOT NULL,
  `value` varchar(256) NOT NULL,
  `ts` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`object`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE USER 'linknx'@'localhost' IDENTIFIED BY 'linknx';
GRANT SELECT,INSERT,UPDATE,DELETE ON linknx.* TO 'linknx'@'localhost';
exit

Lancer votre navigateur sur http://<adresse ip du raspberry pi>/knxweb2/

Fichier de démarrage d'eibd:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          eibd
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: eibd initscript
# Description:       based on init-script from knx-user-forum.de and setup-eibd.sh from KNXlive-project
#                    Pending: check tpuarts, check KNXnet/IP-Response
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="EIB/KNX daemon"
NAME=eibd
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-d -u --eibaddr=1.1.100 -c -DTS -R -i --pid-file=/var/run/$NAME.pid"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Default URL, config read from default later
# !!! DO NOT CHANGE DEFAULTS HERE - use /etc/default/eibd !!!
# AUTO scans and saves as default
EIBD_BACKEND="AUTO"

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
# Temp-fix! remove surrounding whitespaces from seperator '='
[ -r /etc/default/$NAME ] && cat /etc/default/$NAME | sed 's/ =/=/' | sed 's/= /=/' > /etc/default/$NAME.out
[ -r /etc/default/$NAME.out ] && . /etc/default/$NAME.out

# 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


do_init()
{
    # Auto-Detection Backend-interface
    if [ "$EIBD_BACKEND" = "AUTO" -o "$EIBD_BACKEND" = "usb" ]; then
        [ "$VERBOSE" != no ] && log_daemon_msg "Autodetecting eibd-Backend"
        echo -ne "\t *** $NAME: Autodetecting Interface ."
        # try USB
        # old EIBD_USBPORT=$(findknxusb | sed -e '1 d' -e 's/device //' | cut -d':' -f1-2)
        EIBD_USBPORT=$(findknxusb | sed -e '1 d' -e 's/device //' | cut -d ' ' -f 2 | cut -d':' -f1-2); echo $EIBD_USBPORT
        if [ -n "$EIBD_USBPORT" ]
            then
            EIBD_BACKEND=usb
            EIBD_URL=$EIBD_BACKEND:$EIBD_USBPORT
            [ "$VERBOSE" != no ] && log_daemon_msg " success on $EIBD_URL"
            echo -e " success on $EIBD_URL"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" -a -e /dev/ttyS0 ]; then
        # try FT1.2 on /dev/ttyS0
        echo -n " ."
        setserial /dev/ttyS0 autoconfig
        if bcuaddrtab -T 10 ft12:/dev/ttyS0 >/dev/null ;    then
            EIBD_BACKEND=ft12
            EIBD_URL=$EIBD_BACKEND:/dev/ttyS0
            [ "$VERBOSE" != no ] && log_daemon_msg " success on $EIBD_URL"
            echo -e " success on $EIBD_URL"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" -a -e /dev/eib0 ]; then
        # try BCU1 Kernel-Driver on /dev/ttyS0
        echo -n " ."
        setserial /dev/ttyS0 uart none
        if bcuaddrtab -T 10 bcu1:/dev/eib0 >/dev/null ; then
            EIBD_BACKEND=bcu1
            EIBD_URL=$EIBD_BACKEND:/dev/eib0
            [ "$VERBOSE" != no ] && log_daemon_msg " success on $EIBD_URL"
            echo -e " success on $EIBD_URL"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" ]; then
        # try KNXnet/IP Routing with default Multicast 224.0.23.12
        echo -n " ."
        EIBNETTMP=`mktemp`
        eibnetsearch - > $EIBNETTMP
        EIBD_NET_MCAST=`grep Multicast $EIBNETTMP | cut -d' ' -f2`
        EIBD_NET_HOST=`grep Answer $EIBNETTMP | cut -d' ' -f3`
        EIBD_NET_NAME=`grep Name $EIBNETTMP | cut -d' ' -f2`
        EIBD_MY_IP=`ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'`
        rm $EIBNETTMP
        if [ "$EIBD_NET_MCAST" != "" -a "$EIBD_NET_HOST" != "$EIBD_MY_IP" ]; then
            EIBD_BACKEND=ip
            EIBD_URL=$EIBD_BACKEND:
            [ "$VERBOSE" != no ] && log_daemon_msg "Found KNXnet/IP Router $EIBD_NET_NAME on $EIBD_NET_HOST with $EIBD_NET_MCAST"
            echo -e "Found KNXnet/IP Router $EIBD_NET_NAME on $EIBD_NET_HOST with $EIBD_NET_MCAST"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" -a -e /dev/ttyS1 ]; then
        # try FT1.2 on /dev/ttyS1
        echo -n " ."
        setserial /dev/ttyS1 autoconfig
        if bcuaddrtab -T 10 ft12:/dev/ttyS1 >/dev/null ; then
            EIBD_BACKEND=ft12
            EIBD_URL=$EIBD_BACKEND:/dev/ttyS1
            [ "$VERBOSE" != no ] && log_daemon_msg " success on $EIBD_URL"
            echo -e " success on $EIBD_URL"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" -a -e /dev/eib1 ]; then
        # try BCU1 Kernel-Driver on /dev/ttyS1
        echo -n " ."
        setserial /dev/ttyS1 uart none
        if bcuaddrtab -T 10 bcu1:/dev/eib1 >/dev/null ; then
            EIBD_BACKEND=bcu1
            EIBD_URL=$EIBD_BACKEND:/dev/eib1
            [ "$VERBOSE" != no ] && log_daemon_msg " success on $EIBD_URL"
            echo -e " success on $EIBD_URL"
        fi
    fi

    if [ "$EIBD_BACKEND" = "AUTO" ]; then
        # Autodetect failed - bailout
        echo -e "\t *** $NAME: Autodetect failed - exiting !"
        exit 0
    fi

    # concat urls
    if [ "$EIBD_BACKEND" = "ip" -a -n "$EIBD_PORT_IP" ]; then
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_IP
    fi
    if [ "$EIBD_BACKEND" = "ipt" -a -n "$EIBD_PORT_IPT" ]; then
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_IPT
    fi
    # init serial port accordingly
    if [ "$EIBD_BACKEND" = "ft12" -a -n "$EIBD_PORT_SERIAL" ]; then
        setserial $EIBD_PORT_SERIAL autoconfig
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_SERIAL
    fi
    if [ "$EIBD_BACKEND" = "bcu1" -a "$EIBD_PORT_SERIAL" = "/dev/eib0" ]; then
        setserial /dev/ttyS0 uart none
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_SERIAL
    fi
    if [ "$EIBD_BACKEND" = "bcu1" -a "$EIBD_PORT_SERIAL" = "/dev/eib1" ]; then
        setserial /dev/ttyS1 uart none
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_SERIAL
    fi
    if [ "$EIBD_BACKEND" = "tpuarts" -a -n "$EIBD_PORT_SERIAL" ]; then
        setserial $EIBD_PORT_SERIAL autoconfig
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT_SERIAL
    fi

    # concat EIBD_URL (obsolete!)
    if [ -z "$EIBD_URL" -a -n "$EIBD_PORT" ]; then
        EIBD_URL=$EIBD_BACKEND:$EIBD_PORT
    fi


    # check/write bcuaddrtab
    if [ "$EIBD_BACKEND" = "usb" -o "$EIBD_BACKEND" = "ft12" -o "$EIBD_BACKEND" = "bcu1" -a -n "$EIBD_URL" ]; then
        EIBD_BCUADDRTAB=`bcuaddrtab -T 10 $EIBD_URL | cut -d ' ' -f 2`
        if [ "$EIBD_BCUADDRTAB" = "expected" -o "$EIBD_BCUADDRTAB" = "failed" -o "$EIBD_BCUADDRTAB" = "timed" ]; then
            # retry 1
            echo -n "Unable to read BCU address table - retrying 1"
            sleep 2
            EIBD_BCUADDRTAB=`bcuaddrtab -T 10 $EIBD_URL | cut -d ' ' -f 2`
            if [ "$EIBD_BCUADDRTAB" = "expected" -o "$EIBD_BCUADDRTAB" = "failed" -o "$EIBD_BCUADDRTAB" = "timed" ]; then
                # retry 2
                echo -n " - retrying 2 .."
                sleep 2
                EIBD_BCUADDRTAB=`bcuaddrtab -T 10 $EIBD_URL | cut -d ' ' -f 2`
                if [ "$EIBD_BCUADDRTAB" = "expected" -o "$EIBD_BCUADDRTAB" = "failed" -o "$EIBD_BCUADDRTAB" = "timed" ]; then
                    echo -n " - FAILED on $EIBD_BACKEND (url $EIBD_URL) (size $EIBD_BCUADDRTAB) ! "
                    # only fail on usb/FT12 as bcu1 might still be ok
                    if [ "$EIBD_BACKEND" = "bcu1" ]; then
                        EIBD_BCUADDRTAB=0
                    else
                        log_end_msg 2
                        exit 2
                    fi
                fi
            fi
        fi
        if [ "$EIBD_BCUADDRTAB" -gt 0 ]; then
            echo "Resetting BCU address table length! Old value $EIBD_BCUADDRTAB"
            bcuaddrtab -T 30 -w 0 $EIBD_URL
        fi
        # fix for broken ABB/BJ USB-If
        USBNAME=`findknxusb | grep ^device | cut -d '(' -f 2,3`
        if [ "$EIBD_BACKEND" = "usb" -a "$USBNAME" = "ABB STOTZ-KONTAKT GmbH:KNX-USB Interface (MDRC))" ]; then
            echo "ABB-fix: Resetting BCU address table length! Old value $EIBD_BCUADDRTAB"
            bcuaddrtab -T 30 -w 0 $EIBD_URL
        fi
    fi

    # Concat ARGS
    if [ -n "$EIBD_R" ]; then
        DAEMON_ARGS=" -R $DAEMON_ARGS"
        EIBD_I=y
    fi
    if [ -n "$EIBD_T" ]; then
        DAEMON_ARGS=" -T $DAEMON_ARGS"
        EIBD_I=y
    fi
    if [ -n "$EIBD_I" ]; then
        DAEMON_ARGS=" -S -D -i $DAEMON_ARGS"
    fi
    if [ -n "$EIBD_C" ]; then
        DAEMON_ARGS=" -c $DAEMON_ARGS"
    fi
    # use -e option to set address
    if [ -n "$EIBD_BACKEND_ADDR" ]; then
        DAEMON_ARGS=" -e $EIBD_BACKEND_ADDR $DAEMON_ARGS"
    fi

    DAEMON_ARGS="$DAEMON_ARGS $EIBD_ADDTL_ARGS $EIBD_URL"
}

#
# Function that starts the daemon/service
#
do_start()
{
    route add 224.0.23.12 dev eth0
    #echo "DEBUG args: $DAEMON_ARGS eibdi: $EIBD_I eibdt: $EIBD_T eibdr: $EIBD_R backend: $EIBD_BACKEND url: $EIBD_URL port: $EIBD_PORT addrtab: $EIBD_BCUADDRTAB"
    # 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
        do_init
    echo "*** Starting $DESC: $NAME using $EIBD_URL"
        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.
        sleep 2
        chmod a+rw /tmp/eib
}
#
# 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
        route delete 224.0.23.12
        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 using $EIBD_URL" "$NAME"
        do_start
        case "$?" in
                0|1) log_end_msg 0 ;;
                2) [ log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    echo "*** Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) log_end_msg 0 ;;
                2) [ 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
        #
        echo "*** Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
        sleep 2
                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

Fichier de démarrage de linknx:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          linknx
# Required-Start:    $local_fs $remote_fs eibd
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: linknx initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="service"
NAME=linknx
DAEMON=/usr/local/bin/$NAME
PIDFILE=/var/run/$NAME.pid
DAEMON_ARGS="-c/var/lib/linknx/linknx.xml -p $PIDFILE -d/var/log/linknx.log -w"
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
# Temp-fix! remove surrounding whitespaces from seperator '='
[ -r /etc/default/$NAME ] && cat /etc/default/$NAME | sed 's/ =/=/' | sed 's/= /=/' > /etc/default/$NAME.out
[ -r /etc/default/$NAME.out ] && . /etc/default/$NAME.out

# 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