sábado, 29 de octubre de 2016

OpenHAB en RPi - IP Fija


Si has ejecutado los pasos de mi anterior entrada en el blog, tendrás tu Raspberry PI 3 con su disco externo (SSD o disco duro) de arranque funcionando.
Con independencia de que la conectes a la red por WiFi o Ethernet, la forma en que obtiene su dirección IP y los demás datos para conectarse a tu red local y a Internet es mediante DHCP. Este método es muy cómodo pero tiene el inconveniente de que la IP puede cambiar cada vez que arranques la máquina y en nuestro caso es necesario que este dispositivo tenga IP fija para que los dispositivos de Internet de las cosas que conectemos puedan conectarse a él.
A continuación explico como asignar una IP fija a la Raspberry Pi. Esta IP tiene que pertenener a la red a la que te vas a conectar y no tiene que ser la misma usada por ningún otro dispositivo. Además necesitarás saber la dirección IP del router de salida a Internet y la de un servidor DNS (puedes usar la de Google que es la 8.8.8.8). si no sabes como obtener estos datos, conviene que consultes con algún amigo con conocimientos de redes para que te ayude a encontrar los valores válidos.
Las instrucciones para la Raspberry PI  con sistemas operativos antiguos y nuevos son distintas. Para los antiguos ejecuta los pasos que indican en este tutorial: http://www.suntimebox.com/raspberry-pi-tutorial-course/week-3/day-5/ mientras que para la nueva versión (RaspBerry Pi 3) tienes que bajar en esa página hasta un comentario de BK del 20 de Marzo de 2016 a las 22:49. Estos pasos son los que indico aquí:
Conectate a tu Raspberry PI, abre una ventana de Terminal y ejecuta (nano es el nombre de un editor de textos):
sudo nano /etc/dhcpcd.conf
Ve al final del archivo con las flechas del teclado.
Si vas a usar conexión Ethernet añade la línea
interface eth0
Si vas a usar conexión WiFi añade la línea
interface wlan0
y a continuación añadir debajo de dicha línea las siguientes líneas (cambia estos valores por los correctos para tu red):
static ip_address=192.168.1.3
static routers=192.168.1.1
static domain_name_servers= 8.8.8.8 8.8.4.4
Address es la IP que has reservado para el dispositivo.
Routers es la IP del router de salida a Internet.
Los valores de domain_name_servers son los de los servidores de Google y puedes dejar estos (o usar otros que conozcas si lo prefieres).
Una vez que hayas añadido las líneas escribe Control-X (tecla Control y a la vez X. Te preguntará si guarda los cambios, contesta con Y a la siguiente pregunta del nombre del archivo contesta con Intro.
Finalmente hay que rebotar la Raspberry para que tome todos los cambios:
sudo reboot
Ten en cuenta que al arrancar lo hará con la nueva IP y por tanto tendrás que volver a conectarte con esta IP.

martes, 25 de octubre de 2016

OpenHAB en RPi. Paso 1, configurar la Raspberry Pi para usar un SSD


    Es perfectamente posible instalar OpenHAB en una Raspberry Pi, aunque conviene que sea una Raspberry Pi modelo 2 o 3, ya que el modelo 1 tiene un procesor bastante menos potente y puede darnos problemas a poco que la configuración de nuestra casa sea compleja.
    Pero si se busca en los foros, podeis comprobar que hay muchos usuarios que han instalado OpenHAB en una Raspberry PI, asi que me compré el modelo 3, una MicroSD de 64 GB y lo instalé.
    Estaba a punto de cambiar mi instalación actual (que se basa en un Mac Mini) a la Raspberry Pi cuando investigando en los foros descubrí que las tarjetas de memoria tienen un problema de desgaste: Si se escribe muchas veces sobre ellas, se estropean. Los sistemas operativos intentan mitigar este problema utilizando todo el espacio disponible de la tarjeta para distribuir las escrituras, por tanto con una tarjeta de 64 GB no debería haber muchos problemas.
    Pero aun así no me quedé tranquilo y decidí utilizar una funcionalidad nueva que está disponible de forma beta para la Raspberry Pi 3 (no para la 2 ni para la original, aunque el enlace que hay en el paso 1 mas adelante da una pista de como puede hacerse) y que consiste en un nuevo firmware que permite arrancar desde un disco USB.
    Así que me compre un disco USB de 120 GB de oferta (Toshiba OCZ TR150), lo instalé en una caja SATA a USB 3.0 de Seagate que tenía de una operación de "hacking" anterior (eso es otra historia) y me pusé a instalar todo. Desde el sistema operativo a OpenHAB sobre este disco duro.
    En esta entrada explico como configurar e instalar una Raspberry Pi para que use un disco SSD en lugar de una memoria MicroSD.
    A continuación teneis detallados los pasos que seguí, por si quereis emularlos, junto con el enlace a la web original donde encontré la información por si quereis ampliar los conocimientos y porque "al cesar lo que es del cesar".

    Paso 1: Configurar la Raspberry PI para que arranque de un disco USB
    Nota: Se supone que dispones de un disco USB externo conectable a tu Raspberry PI. Aquí no voy a explicar como se instala un disco SSDen una caja USB como hice yo, pero no es ciencia espacial.
    Nota2: Si no vas a utilizar esta opción y quieres seguir usando la tarjeta SD, salta al siguiente paso.
    Nota 3: Esta parte está extraida del blog de Raspberry Pi: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
    1. Coge una tarjeta MicroSD con capacidad suficiente para instalar Raspbian (el sistema operativo de Raspberry). En principio 4 GB son suficientes.

    1. Conectala a tu ordenador con el adaptador correspondiente.
    2. Inicializa la tarjeta con el formato FAT32 usando la utilidad correspondiente de tu sistema operativo
    3. De la página https://www.raspberrypi.org/downloads/raspbian/ descargate Raspbian Jessie With Pixel (no te descarges la versión Lite, porque implica más trabajo).
    4. En mi caso me descargué la versión 2016-09-23-raspbian-jessie
    5. Instala el software en la tarjeta MicroSD.
      1. En Windows hay que instalarlo con Win32DiskImager. El enlace para descargarlo y las instrucciones están en: https://www.raspberrypi.org/documentation/installation/installing-images/windows.md
      2. Para Linux las instrucciones están en https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
      3. Para Mac (https://www.raspberrypi.org/documentation/installation/installing-images/mac.md):
        1. descomprime el archivo 2016-09-23-raspbian-jessie.zip (o la versión que has descargado). En Mac con un doble clic lo hará, en Linux gunzip 2016-09-23-raspbian-jessie.zip
        2. Antes de insertar la tarjeta en el ordenador (yo usé un adaptador MicroSD a USB) ejecuta el comando diskutil list | grep dev
        3. Te aparecerá una lista mas o menos larga con todos los discos que tiene montados el ordenador en ese momento:
    $ diskutil list | grep dev
    /dev/disk0
    /dev/disk1
    /dev/disk2
    /dev/disk3
    /dev/disk4
    /dev/disk5
    1. Conecta la tarjeta al ordenador con el adaptador USB (si la tarjeta es nueva, es posible que te aparezca un mensaje diciendo que si quieres inicializarla. Pulsa Ignorar) y vuelve a ejecutar el comando diskutil list | grep dev:
    $ diskutil list | grep dev
    /dev/disk0
    /dev/disk1
    /dev/disk2
    /dev/disk3
    /dev/disk4
    /dev/disk5
    /dev/disk6
    1. Observa que ahora hay un disco adicional, /dev/disk6. Esta es la tarjeta que vamos a usar.
    2. Ejecuta sudo umount /dev/disk6s* sustituyendo disk6 por el nombre que hemos averiguado en el paso anterior.
    3. Ahora escribe en el terminal SIN pulsar Intro al final "sudo dd bs=1m if="
    4. En el Finder arrastra el archivo con la imagen descomprimida en el paso c.i. encima de la ventana del Terminal, verás que después de if= se rellena automaticamente el directorio y nombre del archivo: sudo dd bs=1m if=/Volumes/A/Users/fernando/2016-09-23-raspbian-jessie.img 
    5. No pulses Intro todavia.  Detrás de la línea anterior añade: of=/dev/rdisk6 Fijate en dos detalles: Primero tienes que sustituir el 6 por el número del paso v. Segundo que en lugar de disk hay que escribir rdisk.
    6. La línea te quedará similar a esta sudo dd bs=1m if=/Volumes/A/Users/fernando/2016-09-23-raspbian-jessie.img of=/dev/rdisk6
    7. Ahora ya puedes pulsar Intro. El terminal te pedirá tu contraseña y cuando la escribas y pulses Intro, empezará a escribir la imagen de disco en la tarjeta. Este proceso tarda tiempo, así que aprovecha y tomate un buen capuchino.
    8. Una vez terminada la copia, vuelve a ejecutar:sudo umount /dev/disk6s*
    1. Extrae la tarjeta MicroSD e insertala en tu Raspberry Pi 3.
    2. Conecta la Raspberry Pi a tu televisor o monitor, enchufale tu teclado y ratón y enciendela conectando el cargador USB.
    3. Una vez que haya arrancado el sistema operativo, tienes que conectarla a Internet. La forma mas sencilla es con un cable Ethernet entre tu router de fibra o ADSL y el puerto Ethernet de la Raspberry Pi. Si no tienes Ethernet y/o quieres usar la WiFi, en la parte derecha del menú superior verás un icono con dos flechas, una para arriba y otra para abajo, pulsalo y en la lista de redes WiFi que aparecen verás el nombre de la tuya, elígela, introduce la contraseña correspondiente y te conectaras a la WiFi y a Internet.
    4. El teclado está en inglés. Si quieres cambiarlo a Español, en el menú superior izquierdo, despliega el icono Raspberry y en la opción Preferences elige Mouse and Keyboard Settings
    5. En el diálogo que aparece pulsa la pestaña Keyboard y a continuación el botón Keyboard Layout
    6. En el nuevo diálogo que aparece elige Country Spain y Variant Spain. Pulsa OK en los dos diálogos y ya tienes el teclado con la disposición de Españo.
    7. Una vez conectado a Internet, abre una ventana de Terminal (menú superior, icono Raspberry, despliega y en Accesories elige Terminal)
    8. Escribe sudo apt-get update; sudo apt-get install rpi-update y pulsa Intro.
    9. Cuando acabe ejecuta sudo BRANCH=next rpi-update
    10. Ahora hay que activar el arranque desde USB en la Raspberry Pi (si, todo lo que hemos hecho hasta ahora era solo para activar esto): echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
    11. Reinicia la Raspberry Pi con sudo reboot
    12. Para comprobar que se ha programado correctamente, después de arrancar vuelve a abrir el Terminal y ejecuta: vcgencmd otp_dump | grep 17:
    1. La salida tiene que ser 17:3020000a
    2. Nuestra Raspberry Pi está finalmente preparada para usar el disco SSD.
    3. Conecta el disco USB a cualquier puerto USB de la Raspberry Pi. Tal como indica en la página indicada al principio, la tarjeta MicroSD será /dev/mmcblk0 y el primer disco USB que conectemos será /dev/sda
    4. Ejecuta sudo parted /dev/sda
    Aparecerá el siguiente mensaje:
    GNU Parted 3.2
    Using /dev/sda
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted)
    1. Escribe mktable msdos
    2. Si el disco ya ha sido usado o tiene una estructura de archivos creada, te avisará que lo va a borrar y que se perderán todos los datos grabados en él. Te pregunta si quieres continuar y contesta que Yes
    1. A continuación hay que crear dos particiones en el disco USB. Una primera partición de 100 Megabytes para el arranque y el resto (casi 120 GB) para el sistema operativo en si.
    2. El mensaje (parted) sigue apareciendo, escribe: mkpart primary fat32 0% 100M esto le dice que cree una partición desde el principio del disco y que ocupe 100MB.
    3. Vuelve a aparecer (parted) y ahora escribe mkpart primary ext4 100M 100% que dice que se cree una segunda partición desde los 100 MB hasta el final del disco.
    4. En el siguiente (parted) escribe print para ver que particiones se han creado. En mi caso:
    Model: Seagate Expansion (scsi)
    Disk /dev/sda: 120GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 

    Number  Start   End     Size    Type     File system  Flags
     1      1049kB  99.6MB  98.6MB  primary  fat32        lba
     2      99.6MB  120GB   120GB   primary  ext4         lba
    1. Seguidamente escribe quit para salir del programa parted.
    2. Ahora creamos los sistemas en las particiones que acabamos de crear:
    sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
    sudo mkfs.ext4 /dev/sda2
    1. En lugar de volver a instalar el sistema operativo como hicimos con la tarjeta MicroSD, la siguiente secuencia de operaciones copia todo el sistema desde la MicroSD al disco USB. El úlitmo paso llevará bastante tiempo, momento para un segundo café. Nota: si vas a copiar los comandos hazlo hasta la penúltima línea, espera a que termine de ejecutarse y luego ejecuta la última.
    sudo mkdir /mnt/target
    sudo mount /dev/sda2 /mnt/target/
    sudo mkdir /mnt/target/boot
    sudo mount /dev/sda1 /mnt/target/boot/
    sudo apt-get update; sudo apt-get install rsync
    sudo rsync -ax --progress / /boot /mnt/target
    1. La clave SSH, la que utiliza el sistema cuando te conectas en remoto con SSH hay que volver a regenerarla en el nuevo disco con los siguientes comandos (puedes copiar y pegar todos los comandos en una ventana ssh de tu Raspberry Pi):
    cd /mnt/target
    sudo mount --bind /dev dev
    sudo mount --bind /sys sys
    sudo mount --bind /proc proc
    sudo chroot /mnt/target
    rm /etc/ssh/ssh_host*
    dpkg-reconfigure openssh-server
    exit
    sudo umount dev
    sudo umount sys
    sudo umount proc
    1. Los últimos pasos es modificar los parámetros de arranque para que se arranque del disco USB:
    sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt
    sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab
    1. Para terminar, desmonta todos los discos y apaga la Raspberry Pi:
    cd ~
    sudo umount /mnt/target/boot
    sudo umount /mnt/target
    sudo poweroff
    1. Hecho esto, desconecta la  Raspberry Pi de la alimentación, extrae la tarjeta MicroSD y vuelve a conectarla. Si todo ha ido bien, arrancará desde el disco USB.
    2. Queda un punto pendiente. Si ahora haces un apt-get para actualizar el software, volverá a modificar los archivos anteriores e intentará arrancar de la MicroSD. Para solucionarlo ejecuta los siguientes comandos:
    sudo rm /boot/.firmware_revision
    sudo apt-get update && sudo apt-get -y dist-upgrade && sudo BRANCH=next rpi-update
    1. Hecho esto, el sistema seguirá arrancando desde el disco USB las siguientes ocasiones.
    Siguiente paso: instalar OpenHAB en el sistema.