WebThings en Armbian: Usando el ODROID-XU4 para el Internet de las Cosas

Mozilla WebThings es una plataforma para controlar dispositivos domésticos. El objetivo principal es brindar a los usuarios la capacidad de configurar y controlar un "hogar inteligente" por su cuenta sin depender de servicios de terceros. Este artículo te dirá por qué y cómo configurarlo en ODROID-XU4.

¿Por qué?

Durante años, los dispositivos que operan en la nube han tenido limitaciones. Los problemas de interoperabilidad y confiabilidad se salen de este artículo, pero uno que debe abordarse es la privacidad. Personalmente, considero que tomar o revelar (cualquier) información del usuario sin tu permiso explícito es un problema que todos deberían considerar. Incluso si no tienes nada que ocultar, suscita duda el compartir los números de su tarjeta de crédito, de modo que es importante ser cuidadoso antes de adoptar un servicio o conectar dispositivos porque tu política de privacidad también afectará a otros miembros de la familia o incluso a tus invitados. Hemos visto algunos progresos a la hora de reforzar la privacidad en los últimos años gracias a ciertas regulaciones. Europa comenzó con GDPR, que incluye directrices importantes a la hora de usar software que maneja datos personales. Una muy importante específicamente, está recogida en artículo 25, que exige "Privacidad en el diseño" en los sistemas técnicos. Esto significa que deben estar diseñados para que los usuarios puedan mantener la privacidad desde cero.

Figure 1 - GPDR
Figura 1 - GPDR

¿Quien?

Es fácil predecir que el mercado de dispositivos conectados cambiará tarde o temprano. Por ahora, puedes mantenerte a la vanguardia y probar proyectos FLOSS que no esperaron a las regulaciones que abordaban la privacidad. Desde los inicios del desarrollo de la plataforma Mozilla IoT, el proyecto ha sido diseñado explícitamente para evitar que tus datos vayan a parar a la nube de otra persona.

Figure 2 - NoCloud
Figura 2 - NoCloud

La clave es bastante simple: todos los dispositivos domésticos están conectados únicamente a la red doméstica, de modo que los datos simplemente permanecen en local, no sale nada del entorno local. Sin entrar en demasiados detalles, existen muchos estándares IoT hoy en día, y probablemente ninguno se ajuste a todos los posibles usos. Dicho esto, una tecnología común puede abstraer muchas superposiciones. Esta es la misión de W3C, la organización conocida por la estandarización de la red mundial (HTML, HTTP y XML). El grupo de trabajo "Web of Things" (WT) del W3C se compromete a abordar algunos problemas de IoT utilizando las tecnologías web existentes y rellenar el vacío que falta. Mientras que algunos describen WoT como el "HTML para IoT", creemos que los protocolos de WoT son principalmente para máquinas en lugar de para humanos, técnicamente estamos hablando de API REST y Esquema JSON para la semántica.

¿Qué?

El marco de WebThings se basa en las recomendaciones propuestas por WoT simplificadas. Actualmente, la implementación se compone de:

WebThings API para dispositivos que hablan REST en HTTP. La puerta de enlace de WebThings puede controlar dispositivos desde una buena aplicación web. Los adaptadores adicionales de la puerta de enlace de WebThings para traducir dispositivos o servicios que no son de WebThings a la API de WebThings.

Figure 3 - ThingsGateway
Figura 3 - ThingsGateway

¿Cómo?

En este artículo, cubriré cómo un ODROID-XU4 puede ser un ordenador de placa reducida totalmente válido para alojar el software WebThings que se desarrolló originalmente para la Raspberry Pi 3.

Figure 4 - ODROID-XU4
Figura 4 - ODROID-XU4

Seguir estas instrucciones también debería funcionar para otros ODROID con pequeñas adaptaciones. Si necesitas elegir uno, te sugiero el ODROID-H2, ya que el desarrollo es algo más sencillo en la arquitectura de CPU x86_64. La configuración no es sencilla, ya que necesitarás un ordenador host GNU / Linux, una tarjeta SD, un puerto serie y un enlace Ethernet.

Configurar Armbian

La imagen de referencia de Mozilla está basada en Raspbian, un puerto Debian para Raspberry Pi, esta imagen no funcionará en dispositivos que no sean Pi. Con suerte, el proyecto Armbian acaba de lanzar imágenes para arrancar el último Debian-10 en varias placas ARM. La versión de Debian o Ubuntu de Armbian funcionará en ODROID-XU4, descargaremos la imagen mínima y luego la volcaremos a una tarjeta SD.

En un sistema GNU / Linux, utilicé un adaptador USB SD y estas líneas de comando:

$ lsblk # Will list your disks make sure to use the right one
$ disk='/dev/disk/by-id/usb-Generic-_USB3.0_CRW_-0_000000021716-0:0' #
$ file "$disk" # TODO

$ release="Armbian_20.02.1_ODROIDxu4_buster_current_5.4.19_minimal"
$ url="https://dl.armbian.com/odroidxu4/archive/${release}.7z"

$ sudo sync
$ sudo apt-get install curl 7zip-full time # Install those tools on Debian or adapt
$ time curl -O "$url" # 3sec 155313070c
$ time 7z e -so "$release.7z" "$release.img" | sudo dd bs=4MB of="$disk"
#| 562036736 bytes (562 MB, 536 MiB) copied, 142.735 s, 3.9 MB/s

Arranque

Inserta la imagen SD en ODROID-XU4. Si tiene el puerto serie configurado, debería poder ver el registro de arranque:

$ screen /dev/ttyUSB0 115200

#| U-Boot 2017.05-armbian (Feb 17 2020 - 07:52:44 +0100) for ODROID-XU4
#|
#| CPU: Exynos5422 @ 800 MHz
#| Model: ODROID XU4 based on EXYNOS5422
#| Board: ODROID XU4 based on EXYNOS5422
#| Type: xu4
#| DRAM: 2 GiB
#| MMC: EXYNOS DWMMC: 0, EXYNOS DWMMC: 1
#| MMC Device 0 ( SD ): 7.4 GiB
#| mmc_init: -5, time 4
#| *** Warning - bad CRC, using default environment
#|
#| In: serial
#| Out: serial
#| Err: serial
#| Net: No ethernet found.
#| Press quickly 'Enter' twice to stop autoboot: 0
#| (...)
Un par de minutos después, deberías poder iniciar sesión como root con la contraseña por defecto "1234". Luego el sistema te preguntará el usuario predeterminado de configuración:
#| Armbian 20.02.1 Buster ttySAC2
#| odroidxu4 login: root
#| Password: 1234
#| You are required to change your password immediately (root enforced)
#| Changing password for root.
#| (current) UNIX password:
#| Enter new UNIX password:
#| Retype new UNIX password:
#| ___ _ _ _ __ ___ _ _ _
#| / _ \ __| |_ __ ___ (_) __| | \ \/ / | | | || |
#| | | | |/ _` | '__/ _ \| |/ _` | \ /| | | | || |_
#| | |_| | (_| | | | (_) | | (_| | / \| |_| |__ _|
#| \___/ \__,_|_| \___/|_|\__,_| /_/\_\\___/ |_|
#|
#| Welcome to Armbian buster with Linux 5.4.19-odroidxu4
#|
#| System load: 2.23 0.79 0.28 Up time: 1 min
#| Memory usage: 6 % of 1993MB IP: 192.168.1.232
#| CPU temp: 32°C
#| Usage of /: 29% of 7.1G
#|
#| New to Armbian? Check the documentation first: https://docs.armbian.com
#|
#|
#| Thank you for choosing Armbian! Support: www.armbian.com
#|
#| Creating a new user account. Press  to abort
#| Desktop environment will not be enabled if you abort the new user creation
#|
#| Please provide a username (eg. your forename): user
#| Trying to add user user
#| Adding user `user' ...
#| Adding new group `user' (1000) ...
#| Adding new user `user' (1000) with group `user' ...
#| Creating home directory `/home/user' ...
#| Copying files from `/etc/skel' ...
#| Enter new UNIX password:
#| Retype new UNIX password:
#| passwd: password updated successfully
#| Changing the user information for user
#| Enter the new value, or press ENTER for the default
#| Full Name []: User
#| Room Number []:
#| Work Phone []:
#| Home Phone []:
#| Other []:
#| Is the information correct? [Y/n] y
#| Dear User, your account user has been created and is sudo enabled.
#| Please use this account for your daily work from now on.
Una vez hecho esto, inspeccionemos el sistema e instalemos un servicio DNS multidifusión que ayudará a conectarnos de forma remota mediante SSH:
root@odroidxu4:~# cat /etc/os-release
#| PRETTY_NAME="Debian GNU/Linux 10 (buster)"
#| NAME="Debian GNU/Linux"
#| VERSION_ID="10"
#| VERSION="10 (buster)"
#| (...)

root@odroidxu4:~# df
#| Filesystem 1K-blocks Used Available Use% Mounted on
#| udev 950928 0 950928 0% /dev
#| tmpfs 204128 6592 197536 4% /run
#| /dev/mmcblk1p1 7505192 498264 6915480 7% /
#| tmpfs 1020628 0 1020628 0% /dev/shm
#| tmpfs 5120 0 5120 0% /run/lock
#| tmpfs 1020628 0 1020628 0% /sys/fs/cgroup
#| tmpfs 1020628 0 1020628 0% /tmp
#| /dev/zram0 49584 632 45368 2% /var/log
#| tmpfs 204124 0 204124 0% /run/user/0

root@odroidxu4:~# sudo apt-get update
root@odroidxu4:~# sudo apt-get install avahi-daemon
root@odroidxu4:~# reboot
Una vez reiniciado, iniciaremos sesión con SSH con la dirección hostname.local en lugar de IP que puede ser diferente para cada uno de nosotros:
$ ssh root@odroidxu4.local

Almacenamiento extra

Opcionalmente, puedes omitir o usar este truco para preservar la vida útil de la tarjeta SD. Acabo de conectar un par de memorias USB (de 4GB cada una) en los dos puertos USB3 de ODROID. Este almacenamiento masivo USB adicional se usará para intercambiar memoria y docker. Una vez montado de la siguiente forma:

$ sudo=$(which sudo)

$ dev="/dev/disk/by-id/usb-Generic_Mass-Storage-0:0" # TODO
$ file "$dev"
$ fdisk -l $dev || lsblk # Update previous line

$ dev='/dev/sda' # TODO update
$ label="docker"
$ yes | ${sudo} mkfs.ext4 -L "$label" "$dev" # TODO: verify $disk variable

$ dev=/dev/sdb # TODO: update if needed
$ label="swap"
$ fdisk -l $dev
$ yes | $sudo mkswap -L "$label" "$dev"
$ free
#| total used free shared buff/cache available
#| Mem: 2041260 107724 1759992 6592 173544 1865772
#| Swap: 1020628 0 1020628
$ sudo swapoff -a
$ free
#
#| total used free shared buff/cache available
#| Mem: 2041260 106224 1761472 6592 173564 1867272
#| Swap: 0 0 0

$ sudo swapon "/dev/disk/by-label/swap"
$ free
#| total used free shared buff/cache available
#| Mem: 2041260 107912 1759716 6592 173632 1865584
#| Swap: 3943420 0 3943420
Instala docker para usar el otro disco USB:
$ sudo apt-get install docker.io time git lsb-release file
#| Need to get 55.9 MB of archives.
#| After this operation, 255 MB of additional disk space will be used.
#| Do you want to continue? [Y/n] Y
#| (...)

$ dev="/dev/disk/by-label/docker"
$ mnt="/var/lib/docker"
$ df -h "$mnt"
# /dev/mmcblk1p1 7.2G 1.2G 6.0G 17% /
$ sudo systemctl stop docker
$ sudo sync
$ sudo mkdir -p "$mnt"
$ sudo mount "$dev" "$mnt"
$ df -h "$mnt" # /dev/sda 3.7G 16M 3.5G 1% /var/lib/docker
$ sudo systemctl restart docker
$ sudo docker version # 18.09.7

Compilar binarios

Hay varias formas de usar la plataforma Mozilla WebThings. La más simple sería usar el paquete deb creado para Raspbian, pero la versión ARMv6 no está optimizada para nuestra CPU ARMv7. Así que intentemos compilarlo nuevamente en el dispositivo usando Docker para asegurarnos de que todo el proceso sea replicable. Es para la última versión 0.11.0, así que he publicado el paquete "webthings-gateway_0.11.0-1_armhf-debian-buster.deb" en https://bintray.com/rzr/deb/webthings-gateway#files. Tienes total libertad para instalarlo o recompilarlo en el dispositivo utilizando los siguientes pasos:

$ sudo apt-get install docker.io time git lsb-release file
$ sudo apt-get install time screen
$ url=https://github.com/mozilla-iot/gateway-deb.git
$ git clone --depth 1 --recursive "${url}"
$ cd gateway-deb
$ sudo time bash ./build-docker.sh

$ sudo docker image ls
#| REPOSITORY TAG IMAGE ID CREATED SIZE
#|   c0edf15b50a7 About an hour ago 122MB
#| gatewaydeb_default latest 32e5bdf8321c 8 hours ago 843MB
#|   51a23a2e7130 9 hours ago 1.04GB
#| Debian 10 3eee7456d779 3 weeks ago 92.8MB

$ du -hsc ./dist/*
#| 21M ./dist/WebThings-gateway_0.11.0-1_armhf-debian-buster.deb

$ sudo chmod -Rv 700 ./dist/WebThings-gateway_*.deb
$ sudo apt install -y ./dist/WebThings-gateway_*.deb
#| Need to get 0 B/40.5 MB of archives.
#| After this operation, 180 MB of additional disk space will be used.
#| Do you want to continue? [Y/n] Y
#| (...)

$ sudo reboot

Webapp

Ahora la parte más difícil está hecha (¡no más líneas de comando!) Usamos el usuario y conectemos a la placa apuntando yu navegador a http://odroidxu4.local:8080/. La página de bienvenida debería aparecer de la siguiente forma:

| Mozilla IoT
| Welcome
| Choose a secure web address for your gateway:
| [subdomain].mozilla-iot.org
| [Email]
| [Create]
| [Skip]
La puerta de enlace se puede registrar en mozilla.org para la administración remota, esto es opcional, así que omite el subdominio ya que no usaremos la puerta de enlace de Internet para nuestro primer experimento. En la siguiente página te pedirá que crees unas credenciales (locales):
| Welcome
| Create your first user account:
| user: [user]
| email: [user@localhost]
| password: [password]
| password: [password]
| [Next]
Y ahora estamos listos para agregar algunas WebThings, y puede comenzar a llenar tu cuadro de mandos con recursos virtuales. Primero presiona el ícono de "menú hamburguesa" en la esquina superior izquierda, dirígete a la página de configuración y luego a la página de "complementos" en https://odroidxu4.local/settings/add-ons/ y habilita un adaptador " Virtual Things ":
| Mozilla IoT Virtual Things Adapter
| by Mozilla IoT
Una vez habilitado, debe aparecer en la página de adaptadores en https: //odroidxu4.local/settings/adapters. A continuación, puedes volver a la primera " Things page " (es la primera entrada en el menú). Podemos comenzar a agregar "cosas" presionando el botón inferior "+" en https: //odroidxu4.local/things, luego presione " Done " en la parte inferior:
| Virtual On/Off Color Light
| Color Light
| Save
Desde este punto, puede decidir controlar una lámpara virtual desde la interfaz de usuario e incluso establecer algunas reglas básicas (segunda entrada en el menú) con más recursos virtuales.

Figure 5 - Virtual Things
Figura 5 - Virtual Things

Únete a la comunidad

Acabamos de validar que nuestra configuración funciona con dispositivos simulados, por lo que el siguiente paso es buscar otros complementos. Actualmente hay más de 100, que es un gran escaparate de contribuciones de la comunidad. Un uso típico de un adaptador adicional es conectar un dispositivo que usa otro protocolo, y el complemento solo se traduce en abstracciones de WebThings. La puerta de enlace puede admitir dispositivos Zigbee, ZWave que encontrarás en el mercado. Dicho esto, algunos complementos podrían no funcionar perfectamente en nuestra configuración de ODROID-XU4, así que por favor infórma de problemas con proyectos relacionados con @rzr en GitHub y estaré encantado de compartir sugerencias o soluciones.

Va incluso más allá de eso. Cualquier cosa que tenga una API se puede administrar utilizando la plataforma WebThings. Como ejemplo, hice el adaptador Activity Pub que permite publicar un mensaje público para enviar a la red social cuando se cumplen algunas condiciones. La automatización es posible utilizando el motor de reglas donde los usuarios pueden vincular sensores a actuadores para establecer "comportamientos inteligentes". El control remoto es posible desde una aplicación web progresiva servida por la puerta de enlace. En mi opinión, esto es mucho más simple y confiable que cuando te ves obligado a instalar una aplicación de una tienda en teléfonos personales para obtener acceso a los dispositivos que compras

El proyecto WebThings de Mozilla es una buena demostración de cómo un servicio podría tener el mismo aspecto para los usuarios, pero funciona de manera totalmente diferente a lo que encontrarás hoy en el mercado de IoT. Tus comentarios son bienvenidos, ya que WebThings se puede mejorar.

Recursos

Be the first to comment

Leave a Reply