sábado, 11 de marzo de 2017

OpenHAB en RPI: Personalizar OpenHAB


    Al terminar la entrada de blog anterior indiqué tres deficiencias a corregir de la instalación:
    1. Que no arranca automáticamente. Dado que OpenHAB va a ser el sistema que controle todos los automatismos de mi hogar, es importante que arranque automáticamente si, por ejemplo, se va la luz y vuelve.
    2. No tiene usuario y contraseña, lo que significa que cualquiera que pueda conectarse a su servidor web, podrá ver y controlar todos sus automatismos.
    3. Tiene instalados un gran número de extensiones que, al menos de momento, no usamos y que lo unico que hacen es hacer que el sistema vaya más lento y generar mensajes de error.
    Ahora vamos a ver como resolver cada una de estas deficiencias.
    Nota: Por si no te has dado cuenta con las anteriores entradas, se asume que el usuario tiene cierta experiencia con el uso de una Raspberry Pi, de su entorno gráfico y es capaz de abrir una ventana de terminal y ejecutar comandos sencillos de Unix, también es conveniente saber usar SSH. Aunque la mayoría de las veces intento dar instrucciones detalladas tipo "copia y pega", el entender lo que se está haciendo ayuda mucho.

    Arranque automático
    ==================
    Para que este arranque se produzca es necesario crear un script especial. En Internet es posible encontrar varios scripts que hacen esta función. Sin embargo ninguno me funcionó a la primera y opté por crear mi propio script de arranque, aunque está basado mas o menos libremente, en alguno de los que he visto:
    1. conectate a tu raspberry Pi por SSH o abriendo una ventana de terminal desde el entorno gráfico.
    2. es conveniente crear un usuario específico para que ejecute el entorno OpenHAB y no usar el usuario "pi" que trae por defecto la Raspberry Pi. (Le has cambiado la contraseña al usuario pi, ¿verdad?, si no lo has hecho la forma más sencilla es, desde el usuario "pi" ejecutar el comando "passwd" y te pedirá dos veces la nueva contraseña -no se verá en pantalla. Si escribes lo mismo las dos veces, cambiará la contraseña anterior por la que acabas de escribir, asi que conviene que te acuerdes MUY BIEN de cual has puesto). Para crear un usuario openhab escribe:
    sudo adduser openhab
    1. El sistema te pedirá una contraseña, escríbela (y acuerdate de ella) y al resto de preguntas que hace contesta pulsando simplemente Intro sin escribir nada.
    2. Seguidamente se cambia la propiedad de todos los archivos instalados de OpenHAB
    chown -R openhab:openhab /opt/openhab
    1. Cuando arranca cualquier sistema Unix/Linux y especificamente la Raspberry Pi, busca en un directorio los llamados script de arranque. Un script es una secuencia de comandos que se graba en un fichero para poder ejecutarlos todos de golpe con solo escribir el nombre del fichero. Los scripts de arranque, como su nombre indica son los que se ejecutan al arrancar el sistema y en nuestro caso queremos crear uno para que arranque OpenHAB. Para crear el archivo vamos a usar el editor de textos nano y copiar y pegar la lista de comandos. En primer lugar ejecuta el comando:
    sudo nano /etc/init.d/openhab
    1. El sistema te pide la contraseña de tu usuario y a continuación  tienes que copiar y pegar el texto siguiente que son los comandos a ejecutar:
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          openhab
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: OpenHAB Daemon
    # Description: Build your smart home in no time!
    ### END INIT INFO

    ROOT_DIR=/opt/openhab
    PIDFILE=/opt/openhab/openhab.pid

    cd $ROOT_DIR

    # set path to eclipse folder.
    eclipsehome="/opt/openhab/server";

    # set ports for HTTP(S) server
    HTTP_PORT=8080
    HTTPS_PORT=8443

    # get path to equinox jar inside $eclipsehome folder
    cp=$(find $eclipsehome -name "org.eclipse.equinox.launcher_*.jar" | sort | tail -1);

    OPENHAB_ARGS="-Dosgi.clean=true \
    -Declipse.ignoreApp=true \
    -Dosgi.noShutdown=true  \
    -Djetty.port=$HTTP_PORT  \
    -Djetty.port.ssl=$HTTPS_PORT \
    -Djetty.home=.  \
    -Dlogback.configurationFile=configurations/logback.xml \
    -Dfelix.fileinstall.dir=addons -Dfelix.fileinstall.filter=.*\\.jar \
    -Djava.library.path=lib \
    -Djava.security.auth.login.config=./etc/login.conf \
    -Dorg.quartz.properties=./etc/quartz.properties \
    -Dequinox.ds.block_timeout=240000 \
    -Dequinox.scr.waitTimeOnBlock=60000 \
    -Dfelix.fileinstall.active.level=4 \
    -Djava.awt.headless=true \
    -jar $cp $* \
    -console"

    do_start() {
      start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user openhab --chuid openhab --chdir /opt/openhab --exec /usr/bin/java -- $OPENHAB_ARGS
    }
    do_stop() {
      start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    }

    case "$1" in

        start|stop)
            do_${1}
            ;;

        restart|reload|force-reload)
            do_stop
            do_start
            ;;

        status)
            status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
            ;;
        *)
            echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
            exit 1
            ;;

    esac
    exit 0

    1. Una  vez lo hayas pegado, pulsa Control-X y el programa te preguntará si quieres guardar los cambios: "Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?". Pulsa Y cuando te pregunte  "File Name to Write: /etc/init.d/openhab" pulsa Intro para que lo guarde con el nombre que le hemos dado.
    2. Después de crear el script hay que cambiar los permisos para que el sistema pueda ejecutarlo:
    sudo chmod a+x /etc/init.d/openhab
    sudo update-rc.d openhab defaults
    1. Aunque no es extrictamente necesario vamos a crear el sitemap por defecto usando la configuración "demo" cargada previamente. Así podrás ver que funciona y es más fácil usar esa configuración e irla modificando que partir de cero. Para ello simplemente ejecuta en una sola linea, si te aparece cortado en dos es por el tamaño de la línea):
    sudo cp /opt/openhab/configurations/sitemaps/demo.sitemap /opt/openhab/configurations/sitemaps/default.sitemap
    1. Ahora reinicia el sistema para que arranque automáticamente:
    sudo reboot
    1. Después de arrancar hay que dejar pasar unos minutos para OpenHAB haga sus tareas internas y esté listo para trabajar. Para comprobar que funciona abre un navegador y ejecuta:
    sustituyendo 192.168.1.3 por la IP fija que ajustaste en el paso anterior. En la pantalla del navegador te tiene que aparecer:

    192.168.11.a:8080/openhab.app 
Demo House 
First Floor 
Ground Floor 
Cellar 
Outdoor 
Weather 
Outside Temperature 
Date 
12 
Demo 
Group Demo 
Widget Overview 
Multimedia 
02010-2015 openHAB.org 
O 
Saturday, 05.11.2016

    Usuario y Contraseña
    ======================

    En el paso anterior has visto que has podido conectarte a la página de OpenHAB sin usuario y contraseña. Imaginate que sigue así cuando lo tengas todo configurado y cualquier persona que acceda a tu red pueda encender y apagar las luces o cualquier otra operación.
    Queda claro que es necesario protegerlo con usuario y contraseña.

    Para ello en primer lugar hay que indicarle al sistema que tiene que solicitar usuario y contraseña. Esto se consigue modificando la opción security en el archivo de configuración de OpenHAB. Lo editamos
    sudo nano /opt/openhab/configurations/openhab_default.cfg

    Busca y cambia la línea (está al principio del archivo):
    security:option=
    Por
    security:option=ON

    A continuación tienes que dar de alta al menos un usuario. Tienes que editar el archivo /opt/openhab/configurations/users.cfg y añadir uno o varios usuarios con su contraseña con el formato <usuario>=<contraseña> :
    sudo nano/opt/openhab/configurations/users.cfg
    admin=123456

    Ahora sólo tienes que parar y arrancar el servidor y ya estará funcionando.

    Eliminar extensiones innecesarias
    ============================
    Un pequeño inconveniente de OpenHAB (también puede ser una ventaja) es que trae todas las extensiones activadas. Evidentemente la ventaja es que según lo arrancamos puede, en teoría, funcionar con todos los dispositivos –aunque hay que configurarlos. El inconveniente es que muchas de estas extensiones van a dar error.
    La forma de desactivar las que queramos es sencilla. OpenHAB busca al arrancar todas las extensiones en un directorio específico. Basta con mover las que no queremos fuera de ese directorio y ya no molestarán.
    El directorio en cuestión se llama addons y está dentro del directorio openhab. En nuestro caso /opt/openhab/addons.
    Vamos a crear otro directorio addons.bak:
    cd /opt/openhab
    mkdir addons.bak
    Ahora entramos en addons y movemos todo lo que no nos interese a addons.bak
    cd addons
    ls
    La lista que aparece puede asustar, son 198 archivos, pero en caso de duda deja los que no sepas y mueve los que estés seguro/a que no necesitas. Basicamente los que tengan nombres de dispositivos comerciales y los que te den error en el log de OpenHAB. Cuando vayas aprendiendo podrás desactivar mas.
    El comando para hacerlo es:
    sudo mv org.openhab.action.ecobee-1.8.3.jar ../addons.bak
    sustituyendo org.openhab.action.ecobee.... por la extensión que quieres desactivar.
    Entre los que tienes que conservar (y no mover) porque se usan, están:
    org.openhab.action.mqtt-1.8.3.jar
    org.openhab.binding.configadmin-1.8.3.jar
    org.openhab.binding.http-1.8.3.jar
    sudo mv org.openhab.persistence.rrd4j-1.8.3.jar

    Una vez hechos estos pasos, estamos listos para configurar el OpenHAB para que gestione nuestros equipos domésticos.