Instalando Portainer en la Raspberry Pi

Uno de los temas que me tenía preocupado al cual le quería dar una solución, es la administración de contenedores Docker a través de una interfaz gráfica la cual a la vez me permitiera actualizarlos fácilmente en vez de hacerlo a través de la Terminal.

Los puristas del Terminal probablemente dirán que es mejor administrar los contenedores a través de la línea de comandos, y quizás tienen razón, pero en mi opinión para alguien a quien el tiempo le es esquivo y escaso, es mejor disponer de una interfaz gráfica.

No es mi primera aproximación a Portainer, lo había probado antes sin el éxito que esperaba, pero decidí darle una segunda oportunidad antes de lo cual me documenté adecuadamente leyendo otros blogs y viendo algunos videos de YouTube.

En mi caso instalé Portainer CE (Community Edition) el cual es de uso gratuito. Lo primero que debemos hacer es crear un volumen en el cual Portainer guardará su base de datos.

docker volume create portainer_data

Una vez hecho esto basta crear el contenedor Docker de Portainer usando el siguiente comando.

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest

Una vez terminado el proceso, es necesario terminar la configuración de Portainer ingresando a la página web del servicio, reemplazando localhost por la dirección IP de la Raspebbry Pi.

https://localhost:9443

En este último paso, debemos crear el usuario y password con que administraremos Portainer.

En los próximos posts comentaré como instalar Homebridge vía Portainer, así como otros servicios con los que he estado jugando últimamente.

Por emontes, hace

[Docker] Cómo actualizar Homebridge

Habiendo comentado en una entrada previa respecto de la instalación de Homebridge, quedó pendiente comentar cómo es que se actualiza Homebridge ya que aunque se trata de un proceso sencillo y está dentro de la documentación, habitualmente lo pasamos por alto.

Después de tener corriendo Homebridge por casi 10 meses, me di cuenta que tanto los paquetes nodejs como npm estaban desactualizados.

Mi primera aproximación fue a través del Terminal interno que tiene la instalación de Homebridge gracias al plugin reinstalado «Homebridge UI», de hecho pude actualizar npm pero no tuvo ningún efecto en el sistema a pesar de reiniciar homebridge.

Después de buscar bastante tiempo por internet, finalmente encontré la respuesta en la página de Github del proyecto oznu/docker-homebridge.

La solución para actualizar Homebridge es conectarse por ssh a la Raspberry Pi, cambiar al directorio en que está el archivo «docker-compose.yml» de nuestra instalación de Homebridge, actualizar el docker y finalmente correr el «docker-compose.yml» con lo cual el sistema queda actualizado.

Los comandos para dicha gestión, una vez conectados por ssh, son los siguientes.

cd /home/pi/homebridge
docker-compose pull homebridge
docker-compose up -d

Con eso queda actualizada la instalación de Homebridge y los paquetes nodejs y npm que estaban desactualizados.

Por emontes, hace

Automatizando el respaldo de la Raspberry Pi

Uno de los temas que últimamente me ha estado preocupando es el respaldo del sistema de la Raspberry Pi, lo cual resulta muy necesario cuando has gastado bastante tiempo en personalizar el sistema y dejarlo funcionando como una máquina de relojería.

Buscando en internet encontré un post de PiMyLifeUp en el cual nombraban un script de bash llamado bkup_rpimage creado por lzkelley el cual de acuerdo a su creador permitía crear respaldos incrementales en un archivo .img de todo el contenido de la microSD de la Raspberry Pi.

Era justo lo que necesitaba, pero por alguna razón no funcionaba correctamente en mi sistema, así que decidí crear un fork en Github y optimizarlo, con lo cual quedó funcionando a pedir de boca.

Lo primero que debemos hacer es clonar el script en nuestra Raspberry para lo cual ejecutaremos el siguiente comando.

cd /home/pi
git clone https://github.com/MrAndersonMD/bkup_rpimage.git
cd bkup_rpimage

Esto creará un directorio llamado bkup_rpimage en nuestro directorio home en el cual encontraremos los archivos bkup_rpimage.sh, exclude-file.txt, LICENSE y readme.md.

bkup_rpimage.sh corresponde al script, exclude-file.txt corresponde a un archivo en el cual podemos incluir los archivos o directorios que queremos excluir del respaldo, como por ejemplo archivos de cache y logs, LICENSE corresponde a la licencia y readme.md corresponde al archivo de ayuda en el cual se explica el uso del script.

Antes de realizar el primer respaldo vale la pena revisar el archivo exclude-file.txt con el siguiente comando.

sudo nano exclude-file.txt

El contenido por defecto de dicho archivo es el siguiente.

media
tmp/**
proc/**
run/**
sys/**
mnt/**
var/swap
var/cache
var/log
home/pi/.cache/**
root/.cache
root/.npm

Podemos incluir más directorios, archivos específicos, o incluso extensiones, teniendo el cuidado de escribir un recurso por línea como se aprecia en el ejemplo. Una vez que hayamos terminado de editar el archivo, grabamos con Ctrl-O y salimos con Ctrl-X.

El primer respaldo es el que tomará más tiempo, pero los siguientes, dado que utiliza un sistema de respaldo incremental, sólo agregarán o borrarán lo que no esté respaldado previamente.

Para realizar el primer respaldo basta con utilizar el siguiente comando.

sudo sh /home/pi/bkup_rpimage/bkup_rpimage.sh start -c /media/pi/MYBACKUPDRIVE/rpi_backup.img

Yo tengo conectado un SSD WD PiDrive a uno de los puertos USB de la Raspberry Pi, de manera tal que donde dice MYBACKUPDRIVE lo reemplacé por la ruta de dicho SSD y del directorio que creé para guardar dichos respaldos.

Una vez terminado el primer respaldo podemos automatizarlos mediante cron con el siguiente comando.

sudo crontab -e

Seleccionamos nano como editor y agregamos la siguiente línea.

0 0 * * * sudo sh /home/pi/bkup_rpimage/bkup_rpimage.sh start -c /media/pi/WD_PiDrive_314GB/raspi-backup/raspi-backup.img

Una vez que esté todo listo, grabamos con Ctrl-O y salimos con Ctrl-X. Esta linea de cron creará un respaldo incremental todos los días a las 0:00.

Con esto, ya tendremos automatizada la creación de respaldos incrementales del sistema de nuestra Raspberry Pi, y podremos dormir algo más tranquilos sabiendo que si el sistema se llega a estropear, tenemos una copia de seguridad para recrear todo sin tanto trabajo.

Por emontes, hace

Agregando una ampolleta Philips ZhiRui a Home via Homebridge

Como buen cacharrero, cada cierto tiempo reviso la web de AliExpress buscando alguna novedad tecnológica que pueda ser de alguna utilidad, especialmente si se trata de artículos de domótica.

En una de estas andanzas, encontré unas ampolletas inteligentes marca Xiaomi modelo Philips ZhiRui, las cuales tienen un precio bastante menor (USD$9.95) que las ampolletas Philips Hue y además tienen la cualidad de no necesitar un hub para funcionar, ya que funcionan a través de WiFi.

Específicamente necesitaba una ampolleta inteligente con rosca E14 para una lámpara de pie que instalé en el living de casa. Esta lámpara tiene un soquete E27 en el cual por ahora instalé una ampolleta Philips LED normal, y un soquete E14 para una luz de lectura en el cual tenía instalada una ampolleta LED normal.

De forma nativa estas ampolletas sólo pueden ser utilizadas a través de la aplicación Xiaomi Home, pero se pueden integrar a Home gracias a HomeBridge como veremos a continuación.

1. Obteniendo el token de la ampolleta Philips Zhirui

El primer paso es obtener el token de la ampolleta, pues es un dato requerido por el plugin de homebridge al momento de configurarlo. Antes de esto debemos poner la ampolleta en modo de emparejamiento.

Si es primera vez que instalamos la ampolleta simplemente basta con instalarla y encenderla. Si por el contrario previamente fue agregada a Xiaomi Home, es necesario restaurarla a la configuración de fábrica para lo cual basta con apagarla y encenderla rápidamente 5 veces en 5 segundos.

Una vez que la ampolleta está en modo de emparejamiento, seguimos los pasos para obtener el token. Para esto tenemos dos formas de hacerlo.

1.1 Obteniendo el token con Packet Sender

La primera forma es a través de la aplicación Packet Sender. Descargamos la aplicación en nuestro computador, y la ejecutamos.

Con la ampolleta en modo de emparejamiento, esta crea una red WiFi a la cual tenemos que conectar nuestro computador.

Una vez conectados a esta red, necesitamos conocer la IP de la ampolleta, para lo cual vamos a Preferencias del Sistema – Red, luego seleccionamos la opción WiFi y finalmente pinchamos en el botón «Avanzado». Esto no mostrará una caja de diálogo en la cual tenemos que seleccionar la pestaña TCP/IP. En la etiqueta Router aparecerá la dirección IP de la ampolleta.

Ahora en Packet Sender, tenemos que enviar un paquete con los siguientes datos, reemplazando XXX1 por la IP de la ampolleta.

HEX: 21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
IP: XXX1
Puerto: 54321
Menú desplegable de protocolo: UDP

 La ampolleta debiera devolvernos un mensaje cuyos últimos 32 caracteres hexadecimales corresponden al token.

Guardamos este valor para cuando tengamos que configurar el plugin correspondiente en Homebridge.

1.2 Obteniendo el token con miio

La segunda forma de obtener el token es utilizando la aplicación miio desarrollada por aholstenson y disponible en GitHub. Antes de instalar miio, es necesario que hayas instalado Homebrew tal como discutimos previamente.

Para instalar miio basta con ejecutar el siguiente comando.

sudo npm install -g miio

Es posible instalarla en la Raspberry Pi, pero debido a que para obtener el token es necesario conectarse a la red WiFi que genera la ampolleta, es recomendable instalarla en otro dispositivo puesto que la administración de redes de la Raspberry no es tan sencilla.

En mi caso, la instalé en mi MacBook Pro ya que la gestión de redes del Mac es mucho más flexible. Para instalarla en el MacBook es necesario tener instalado Homebrew, lo cual fue tratado en post anteriores, y obviamente como en el Mac no existe el comando sudo, la forma de instalarla es la siguiente.

npm install -g miio

Ahora que tenemos instalado miio, conectamos nuestro dispositivo a la red WiFi creada por la ampolleta Xiaomi Philips ZhiRui, y ejecutamos el siguiente comando.

miio discover

La aplicación comenzará a buscar los dispositivos que utilizan el protocolo Xiaomi Mi Home, y mostrará una lista entre los cuales estará la ampolleta en cuestión y su respectivo token, el cual debemos guardar para cuando la configuremos en Homebridge.

2. Agregando la ampolleta Philips ZhiRui a Xiaomi Home

Ahora que tenemos el token, tenemos que agregar la ampolleta a Xiaomi Home, para que a través de esta aplicación se conecte a nuestra red WiFi local y el router le asigne una IP, el cual es otro de los datos que necesitaremos para configurarla en Homebridge.

Volvemos a poner la ampolleta en modo de emparejamiento, entramos en la aplicación Xiaomi Home en nuestro smartphone, pinchamos en el símbolo «+» en la esquina superior derecha de la pantalla y en la caja de búsqueda escribimos «zhirui». Seleccionamos «Philips ZhiRui E14 candle lamp» y seguimos con el proceso de emparejamiento tras lo cual la ampolleta será exitosamente agregada al sistema de domótica de Xiaomi.

Para identificar la IP, seleccionamos la ampolleta, pinchamos en los «…» de la esquina superior derecha, seleccionamos «Ajustes adicionales», luego seleccionamos «Información de red», y de esta forma obtendremos la dirección IP.

3. Instalando el plugin homebridge-mi-philips light

Una vez que ya hemos hecho los 2 pasos previos, lo único que resta es la instalación del plugin  homebridge-mi-philips-light, el cual permitirá integrar la ampolleta Philips ZhiRui a Home vía Homebridge. Si bien es cierto que este plugin no fue desarrollado para este modelo específico de ampolleta Xiaomi, funciona sin problemas.

Para instalar dicho plugin basta con abrir una ventana de un navegador web, escribir la dirección IP y el puerto correspondiente a nuestra instalación de Homebridge y loguearnos. Una vez que estemos dentro del sistema, seleccionamos la opción «Plugins» del menú, y en la caja de búsqueda escribimos el nombre del plugin y lo instalamos.

Una vez instalada procedemos a configurar la ampolleta Philips ZhiRui con los siguientes parámetros.

  • En «Light Model» selecciona la opción MiPhilipsSmartBulb.
  • En «IP Address» escribe la IP de la ampolleta Philips ZhiRui que obtuviste en el paso 2.
  • En «Token» escribes el token que obtuviste en el paso 1.
  • En «Name» le das un nombre que la identifique.
  • Finalmente pinchas en «Guardar» y reinicias Homebridge para que los cambios surtan efecto.

Con esto la ampolleta Philips ZhiRui ya aparecerá en Home, y sólo restará asignarla a una habitación ya que tendrá asignado el nombre correctamente.

Por emontes, hace

Cómo mantener actualizado el custom firmware de la cámara Xiaomi Xiaofang 1S

Cada cierto tiempo Xiaomi-Dafang-Hacks de EliasKotlyar, es actualizado, como cualquier otro proyecto de desarrollo de software.

Obviamente queremos que nuestro sistema se mantenga actualizado y saque provecho de las nuevas funcionalidades, pero puede que nos de pereza tener que sacar la tarjeta microSD de la cámara, insertarla en nuestro laptop, etc.

Afortunadamente hay dos formas de actualizar el custom firmware de la cámara Xiaomi Xiaofang 1S sin necesidad de sacar la tarjeta microSD de esta.

1. Actualización del custom firmware a través de la interfaz gráfica

El primer método es a través de la interfaz gráfica que nos entrega el custom firmware instalado en la cámara.

Abrimos una ventana de navegador, escribimos la dirección IP de nuestra cámara, ingresamos con el nombre de usuario root y el password ismart12, en el menú «System» seleccionamos la opción Update, y pinchamos en «Update to master firmware». Esperamos a que termine el proceso, tras lo cual la cámara se reiniciará automáticamente.

2. Actualización del custom firmware a través del Terminal y ssh

Para este segundo método sólo necesitamos conectarnos via ssh utilizando el mismo usuario y password para conectarnos a través de la IP en una ventana de navegador, es decir, root y ismart12, y ejecutar algunos comandos.

Abrimos una ventana de Terminal y escribimos lo siguiente.

ssh root@CAMERAIP 
#  cd /system/sdcard/
# ./autoupdate.sh --verbose

Debes reemplazar «CAMERAIP» por la dirección IP de la cámara. El sistema te pedirá que ingreses el password y presiones la tecla ENTER.

Con esto el sistema comenzará a verificar si existe una actualización, y si cada uno de los archivos está actualizado o no, de manera tal que el Terminal nos entregará información similar a la siguiente.

Starting AutoUpdate on branch master
Version file missing. Upgrade to last commit 2c2990b
Getting list of remote files.
autoupdate.sh is up to date.
run.sh is up to date.
.
.
.

Al finalizar el proceso tendremos actualizado el custom firmware de la cámara Xiaomi Xiaofang 1S, o de cualquier otra que sea compatible con Xiaomi-Dafang-Hacks.

Por emontes, hace

Agregando una cámara Xiaomi Xiaofang 1S a Homekit vía Homebridge

Dentro de las cosas que tenía pendiente de realizar era sumar a mi sistema de domótica una cámara Xiaomi Xiaofang 1S la cual había comprado hace tiempo simplemente para probar su calidad y ver si podría ser de alguna utilidad. Hasta ahora sólo la había utilizado a través de la aplicación Xiaomi Home, con lo cual si bien es cierto podía visualizar la cámara, no estaba integrada a Homekit.

Buscando entre los plugins de Homebridge, encontré 2  plugins los cuales permitían agregar dicha cámara a Homekit vía Homebridge. El primero fue homebridge-dafang desarrollado por sahilchaddha, con el cual no logré mi objetivo probablemente porque no logré entender las instrucciones ya que eran algo enredadas. Afortunadamente con homebridge-dafang-mqtt-republish desarrollado por sunookitsune logré agregar exitosamente la cámara a Homekit.

1. Instalando el bootloader y el custom firmware en la cámara Xiaomi Xiaofang 1S

Lo primero que debemos hacer es instalar un bootloader y un custom firmware para lo cual simplemente seguimos las instrucciones publicadas en el repositorio Xiaomi Dafang Hacks en Github desarrollado por EliasKotlyar.

Para esto necesitamos una tarjeta microSD de al menos 512 Mb, aunque en mi caso utilicé una de 2 Gb sin problemas. Es necesario formatearla en FAT32 para lo cual utilicé la aplicación SD Card Formatter descargada desde el sitio web de la sdcard.org.

Una vez formateada seguimos los siguientes pasos

  • Descargamos el bootloader correspondiente a la cámara Xiaomi Xiaofang 1S desde Xiaomi Dafang Hacks.
  • Renombramos el archivo descargado a «demo.bin».
  • Copiamos «demo.bin» a la microSD.
  • Expulsamos la microSD.
  • Desconectamos el cable de alimentación de energía de la cámara.
  • Insertamos la microSD en la cámara apagada.
  • Mantenemos presionado el botón «reset» de la cámara.
  • Volvemos a conectar el cable de alimentación.
  • Mantenemos presionado el botón «reset» por al menos 10 segundos.
  • Esperamos a que el led de la parte posterior de la cámara se apague.

Con esto la cámara ya tiene cargado el bootloader y ahora corresponde instalar el custom firmware.

  • Descargamos el custom firmware desde Xiaomi Dafang Hacks.
  • Editamos el archivo «config/wpa_supplicant.conf.dist», reemplazamos los campos «SSID» y «psk» respectivamente por el nombre y el password de nuestra red WiFi.
  • Guardamos el archivo con el nombre «config/wpa_supplicant.conf».
  • Desconectamos el cable de alimentación de energía de la cámara.
  • Retiramos la microSD de la cámara apagada.
  • Insertamos la microSD en nuestro computador.
  • Copiamos el contenido del directorio «firmware_mod» en la raíz de la microSD. Esto es muy importante.
  • Expulsamos la microSD.
  • Desconectamos el cable de alimentación de energía de la cámara.
  • Insertamos la microSD en la cámara apagada.
  • Volvemos a conectar el cable de alimentación.

El archivo «config/wpa_supplicant.conf» debe verse de la siguiente manera antes de modificarlo. Tal como indiqué más arriba, modifiquen «your_wifi_name» por el nombre de su red WiFi, y «your_wifi_pswd» por el password de esta.

# For more configuration option please see:
# https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1

network={
        ssid="your_wifi_name"
        # Uncomment to connect to Hidden SSIDs
        #scan_ssid=1 
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        psk="your_wifi_pswd"
        priority=2
}

Con esto la cámara Xiaomi Xiaofang 1S queda configurada y podemos verificarlo conectándonos a la IP de nuestra cámara. En mi caso la IP asignada fue «192.168.1.100».

  • Abrimos una ventana de navegador y escribimos la IP de nuestra cámara. https://camera_ip.
  • Ingresamos con el nombre de usuario root y con la contraseña ismart12 en el cuadro de diálogo que nos aparecerá para ingresar al sistema operativo de la cámara.

Puede que Chrome no les permita ingresar a la cámara ya que por defecto no acepta conexiones https sin certificado, así que pueden utilizar Safari o Firefox, con los que pueden bypassear este problema.

2. Instalación de Mosquitto en la Raspberry Pi

Antes de instalar y configurar los plugins de Homebridge que permiten agregar la cámara Xiaomi Dafang 1S a Homebridge, es necesario instalar Mosquitto en el dispositivo en que tenemos corriendo Homebridge, en mi caso, una Raspberry Pi.

Para esto nos logueamos en nuestra Raspberry Pi, e instalamos Mosquitto utilizando el siguiente comando.

sudo apt-get install mosquitto mosquitto-clients

Una vez instalado Mosquito, tenemos que activar e iniciar el daemon de Mosquito con los siguientes comandos.

sudo systemctl enable mosquitto
sudo systemctl start mosquitto

3. Configuración de Mosquitto en la cámara Xiaomi Xiaofang 1S

Antes de instalar y configurar los plugins que permiten agregar la cámara Xiaomi Xiaofang 1S a Homebridge, es necesario configurar Mosquitto para que funcione correctamente.

Para esto tendremos que seguir los siguientes pasos.

  • Desconectamos el cable de alimentación de la cámara.
  • Retiramos la tarjeta microSD de la cámara.
  • Insertamos la tarjeta microSD en nuestro computador.
  • Editamos el archivo «config/mqtt.conf.dist».
# Options for mosquitto_sub & mosquitto_pub
#USER=mqtt-user
#PASS=mqtt-password
HOST=your_homebridge_IP
PORT=1883

# Define a location
LOCATION="your_location"

# Define device name
DEVICE_NAME="camera_name"
  • Reemplazamos en HOST el valor «your_homebridge_IP» por la IP del dispositivo en que está instalado Homebridge. En mi caso 192.168.1.30.
  • Reemplazamos en LOCATION el valor «your_location» por algún valor que les haga sentido, sin espacios. En mi caso utilicé «montes-tapia» que es el nombre que tiene mi casa en Home.
  • Reemplazamos en DEVICE_NAME el valor «camera_name» por el nombre que le quieren asignar a la cámara, sin espacios. En mi caso utilicé «camara-comedor».
  • Guardamos el archivo con el nombre «config/mqtt.conf».
  • Expulsamos la microSD.
  • Retiramos la microSD de nuestro computador.
  • Insertamos la microSD en la cámara apagada.
  • Volvemos a conectar el cable de alimentación de energía a la cámara.

4. Configuración de la cámara Xiaomi Xiaofang 1S

Este paso es opcional, pero puede ser útil para asegurarse que la cámara funcione correctamente en Homebridge.

  • Abrimos una ventana de navegador y escribimos la IP de nuestra cámara. https://camera_ip.
  • Ingresamos con el nombre de usuario root y con la contraseña ismart12.
  • En el menú «Configuration» seleccionamos la opción «Video».
  • Dejamos en blanco «Video username» y «Video password».
  • Configuramos «Video Size» con el valor 1280×720, «bitrate» con el valor 300 kbps y «Video format» con el valor CBR.
  • Luego configuramos «FrameRate» con el valor 28 por 1 segundo.
  • Pinchamos en «Set» para grabar la configuración.
  • Nuevamente en el menú «Configuration», esta vez seleccionamos la opción «Audio».
  • Configuramos «Audio format» con el valor PCM.
  • Configuramos tanto «in sample rate» y «out sample rate» con el valor 16000.
  • Configuramos «Filter» con el valor No Filter y deshabilitamos tanto «High pass filter» como «AEC Filter».
  • Configuramos el volumen en la variable «Volume» con un valor razonable, en mi caso utilicé 80%.
  • Pinchamos en «Set» para grabar la configuración.
  • Finalmente en el menú «System», seleccionamos la opción «Reboot».

5. Activación de los servicios en la cámara Xiaomi Xiaofang 1S

Para completar la configuración de la cámara sólo nos falta activar algunos servicios.

  • Abrimos una ventana de navegador y escribimos la IP de nuestra cámara. https://camera_ip.
  • Ingresamos con el nombre de usuario root y con la contraseña ismart12.
  • En el menú «System» seleccionamos la opción «Services».
  • Iniciamos el servicio mqtt-control y activamos la opción autorun.
  • Iniciamos el servicio mwtt-status y activamos la opción autorun.
  • Iniciamos el servicio configureMotion y activamos la opción autorun.
  • Iniciamos el servicio rtsp-h264 y activamos la opción autorun.
  • Ahora en el menú desplegable «Camera Controls» arriba a la derecha, activamos Motion Detection, Motion – MQTT Message, MQTT Status Server, MQTT Control Server y RTSP H264 Server si es que no están activados.
  • Finalmente en el menú «System», seleccionamos la opción «Reboot».

6. Instalación y configuración de homebridge-dafang-mqtt-republish en Homebridge

Ahora corresponde la instalación de los plugins de Homebridge que permiten agregar la cámara Xiaomi Xiaofang 1S a esta plataforma, y por consiguiente a Homekit.

Nos conectamos a nuestra instalación de Homebridge, en mi caso a través de la interfaz gráfica ya que lo tengo instalado vía Docker. Necesitamos instalar 2 plugins, homebridge-camera-ffmpeg y homebridge-dafang-mqtt-republish para lo cual pinchamos en el menú Plugins, y en la caja de búsqueda escribimos el nombre de cada uno de los plugins antes mencionados, uno a la vez para instalarlos.

Una vez instalados el sistema nos mostrará un cuadro de diálogo para configurarlos.

Para la configuración de homebridge-camera-ffmpeg utilicé los siguientes parámetros los cuales al menos para mi funcionaron.

  • En la sección «Cameras».
  • Configuré «Name» con el valor Cámara Comedor. Puedes utilizar cualquier nombre incluyendo espacios.
  • Configuré «Source» con el valor -i rtsp://camera_ip:8554/unicast. Debes reemplazar «camera_ip» con la IP de tu cámara.
  • Configuré «Still Image Source» con el valor -i https://root:ismart12@camera_ip/cgi-bin/currentpic.cgi. Debes reemplazar «root» con el usuario de tu cámara, «ismart12» con el password de acceso y «camera_ip» con la IP de tu cámara.
  • Configuré «Video Codec» con el valor copy.
  • Finalmente activé la opción «Enable Audio».
  • Continuando en la sección «Cameras», subsección «Advanced Settings».
  • Configuré «Maximum Concurrent Streams» con el valor 2.
  • Configuré «Maximum Width» con el valor 1280.
  • Configuré «Maximun Height» con el valor 720.
  • Configuré «Maximum FPS» con el valor 28.
  • Configuré «Maximum Bitrate» con el valor 300.
  • Continuando en la sección «Cameras», subsección «Customization Settings».
  • Configuré «Manufacturer» con el valor Xiaomi.
  • Configuré «Model» con el valor Dafang 1S.
  • En la sección «Automation Settings», subsección «MQTT Client».
  • Configuré «MQTT Server» con el valor homebridge_ip. Debes reemplazar «homebridge_ip» por la IP del dispositivo que está corriendo Homebridge y que es donde instalamos Mosquitto.
  • Configuré «MQTT Port» con el valor 1883.
  • Configuré «MQTT Topic» con el valor homebridge.
  • Finalmente pinchamos en «Save».

Para la configuración de homebridge-dafang-mqtt-republish utilicé los siguientes parámetros los cuales al menos para mi funcionaron.

  • Configuré «Name» con el valor Dafang MQTT.
  • Configuré «MQTT Server» con el valor homebridge_ip. Debes reemplazar «homebridge_ip» por la IP del dispositivo que está corriendo Homebridge y que es donde instalamos Mosquitto.
  • Configuré «MQTT Port» con el valor 1883.
  • Configuré «Homebridge MQTT Topic» con el valor homebridge.
  • En la sección «Cameras».
  • Configuré «Camera Name» con el valor Cámara Comedor. Puedes utilizar cualquier nombre incluyendo espacios.
  • Configuré «Dafang MQTT Topic» con el valor montes-tapia/camara-comedor. Este valor corresponde a las variables LOCATION y DEVICE_NAME que configuramos para Mosquitto en nuestra cámara en el paso Nº 3.
  • Configuré «Manufacturer» con el valor Xiaomi.
  • Configuré «Model» con el valor Dafang 1S.
  • Finalmente pinchamos en «Save».

La configuración tanto de homebridge-camera-ffmpeg y homebridge-dafang-mqtt-republish debe parecerse a lo siguiente.

{
            "name": "Camera FFmpeg",
            "mqtt": "homebridge_ip",
            "portmqtt": 1883,
            "topic": "homebridge",
            "cameras": [
                {
                    "name": "Cámara Comedor",
                    "manufacturer": "Xiaomi",
                    "model": "Dafang S1",
                    "motion": true,
                    "motionTimeout": 0,
                    "videoConfig": {
                        "source": "-i rtsp://camera_ip:8554/unicast",
                        "stillImageSource": "-i https://root:ismart12@camera_ip/cgi-bin/currentpic.cgi",
                        "maxStreams": 2,
                        "maxWidth": 1280,
                        "maxHeight": 720,
                        "maxFPS": 28,
                        "maxBitrate": 300,
                        "vcodec": "copy",
                        "packetSize": 564,
                        "audio": true,
                        "debug": true
                    }
                }
            ],
            "platform": "Camera-ffmpeg"
        },
        {
            "cameras": [
                {
                    "name": "Camera Name",
                    "dafang_topic": "location/device-name",
                    "manufacturer": "Xiaomi",
                    "model": "Dafang S1"
                }
            ],
            "name": "Dafang MQTT",
            "server": "homebridge_ip",
            "port": 1883,
            "homebridge_topic": "homebridge",
            "platform": "dafangMqtt"
        }

Una vez que nos aseguramos que la configuración está correcta, sólo basta rebootear la Raspberry Pi.

7. Configurar la cámara en Home

Finalmente, si todo ha sido realizado como debe ser, al abrir la aplicación Home en nuestro iPhone o iPad, podremos visualizar nuestra cámara al final de todos los dispositivos favoritos.

Seleccionamos la cámara, pinchamos en la rueda dentada arriba a la izquierda con lo cual podremos configurar la habitación a la cual esta asignada la cámara, incluirla o quitarla de favoritos, y activar o desactivar las notificaciones.

Después de todos estos largos, tediosos y complejos pasos, ya tenemos funcionando nuestra cámara Xiaomi Dafang 1S en Homekit vía Homebridge.

Por emontes, hace

Instalando Python 3.x en Raspbian

Hace un tiempo, ArmoredReaper les comentó respecto de cómo instalar Python 3.6.4 en macOS, y dado que tengo en mente la publicación de algunos proyectos que requieren de Python y de nuestra siempre bien amada Raspberry Pi, resulta necesario comentar cómo se instala Python en Raspbian.

Es probable que en su Raspberry ya esté instalado Python, aunque en la versión 2.x la cual dejó de tener soporte a contar del 1 de Enero de 2020. Por esta razón es necesario desinstalarlo e instalar Python 3.x en su reemplazo.

1. Desinstalando Python 2.x

Abrimos una ventana de Terminal y nos conectamos por SSH a nuestra Raspberry Pi, lo cual ya vimos en detalle con anterioridad.

Una vez logueados, desinstalamos Python 2.x utilizando los siguientes comandos.

sudo apt-get remove -y python
sudo apt-get autoremove

Con el primer comando desinstalaremos Python, y con el segundo se desintstalarán los archivos o dependencias que hayan quedado huérfanas y que ya no son necesarias.

2. Instalando Python 3.x

Instalaremos Python 3.x desde los repositorios que vienen definidos por defecto en nuestra instalación de Raspbian. Esto permitirá que Python se mantenga actualizado constantemente sin comandos o procesos demasiado complejos. Para instalar Python 3.x utilizaremos los siguientes comandos.

sudo apt-get update
sudo apt-get install python3 idle3 python3-pip

Con el primer comando actualizamos los repositorios, y con segundo instalaremos los paquetes python3 e idle3. Idle3 es una librería que si bien no es un requisito para Python 3.x, es mejor instalarla desde el principio puesto que otorga bastante funcionalidad a Python y puede que en el futuro la necesitemos. Finalmente python3-pip, es un gestor de paquetes que permite instalar librerías de Python dentro del entorno de Python.

3. Ejecutando archivos py con Python 3.x

Finalmente, para ejecutar los archivos py los cuales ejecutábamos con el comando «python archivo.py», ahora deben ser ejecutados utilizando el comando «python3 archivo.py».

Si les genera demasiado hastío tener que agregar un «3» al final de comando «python», es posible crear un alias para evitar que nuestro cerebro sufra un cortocircuito por esta razón.

Una vez abierto el archivo «/home/pi/.bashrc» como vimos con anterioridad en la entrada correspondiente, sólo basta agregar una línea con el siguiente alias.

alias python='python3'

Y con eso ya tenemos instalado Python 3.x en nuestra Raspberry Pi para los futuros proyectos que tengo que comentarles.

Por emontes, hace

Creando alias en Raspbian

La creación de alias permiten transformar una palabra común y corriente en un comando o en una serie de comandos. Los alias están almacenados en el archivo .bashrc. Para crear nuevo alias tenemos que editar dicho archivo con el siguiente comando.

sudo nano /home/pi/.bashrc

Una vez abierto el archivo, nos daremos cuenta que este contiene mucha información. No tenemos que preocuparnos por dicha información, pero por supuesto no debemos borrarla. Así que iremos al final del archivo y agregaremos los alias que estimemos necesarios utilizando para ello el formato alias palabra=’comando’. Les dejo un par de ejemplos.

alias home='cd /home/pi'
alias pidrive='cd /media/pi/WD_PiDrive_314GB/'

Guardamos con Ctrl-O y salimos con Ctrl-X. Ahora solo basta reiniciar bash con el siguiente comando.

exec bash

Y listo, ya tenemos creados nuestros alias.

Por emontes, hace

[Docker] Montando un servidor MariaDB en una Raspberry Pi

Para continuar con la instalación de un sistema LEMP en la Raspberry Pi, ahora le toca el turno a la instalación de una base de datos. Elegí MariaDB ya que se trata de un sistema de base de datos liviano pero a la vez con la potencia suficiente. Para esto utilicé una imagen de Docker creada por uGeek.

Para descargar la imagen, crear el contenedor y ejecutarlo basta una sola línea de comando de Terminal, al igual que lo hicimos con la instalación de Nginx.

docker run --name mariadb --restart always -p 3306:3306 -v $HOME/docker/mariadb/config:/var/lib/mysql -v $HOME/docker/mariadb/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d ugeek/mariadb:arm

Veamos qué significa cada uno de los modificadores. —name corresponde al nombre que tendrá el contenedor que estamos creando, —restart always indica al sistema que cada vez que el sistema se reinicie, dicho contenedor debe ser ejecutado nuevamente, -p corresponde a los puertos que utilizará, -v corresponde a los directorios a los que tendrá acceso fuera del contenedor, en -e MYSQL_ROOT_PASSWORD es necesario reemplazar my-secret-pw por el password del usuario root en MariaDB, y finalmente -d corresponde a la imagen del contenedor que se descargará.

Una vez que el sistema haya descargado la imagen, creado y ejecutado el contenedor, es necesario crear una base de datos cualquiera, para lo cual primero es ingresar al contenedor de MariaDB por sh.

docker exec -i -t mariadb sh

Ahora ejecutamos MariaDB con el usuario root, para lo cual nos solicitará el password my-secret-pw que utilizamos en el comando de creación del contenedor.

mysql -u root -p

Ahora creamos una base de datos la cual llamaremos db1, y modificamos sus privilegios.

CREATE DATABASE IF NOT EXISTS db1;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
FLUSH PRIVILEGES;

Finalmente salimos de MariaDB y salimos del contenedor.

\q
exit

Con esto ya queda creado el contenedor de MariaDB. Más adelante veremos cómo integrarlo con el servidor de Nginx para, por ejemplo, instalar WordPress.

Por emontes, hace

[Docker] Montando un servidor Nginx en una Raspberry Pi

Poco a poco le voy dando más utilidad a mi Raspberry Pi 2B, la cual aunque está lejos del rendimiento de una Raspberry Pi 4, creo que es suficiente para el trabajo que pretendo pedirle. Como uno de mis objetivos es verificar si tiene la capacidad de correr un servidor LEMP (Linux, Nginx, MySQL y Php), o primero que hay que hacer es montar un servidor Nginx a través de Docker.

Aunque pueda parecer una tarea compleja o complicada, la verdad es que se puede hacer en una sola línea de comando de terminal.

docker run --name nginx --restart always -d -p 80:80 -v $HOME/docker/nginx:/usr/share/nginx/html:ro nginx:alpine

Veamos qué significa cada uno de los modificadores. –name corresponde al nombre que tendrá el contenedor que estamos creando, –restart always indica al sistema que cada vez que el sistema se reinicie, dicho contenedor debe ser ejecutado nuevamente, -p corresponde a los puertos que utilizará, y -v corresponde a los directorios a los que tendrá acceso fuera del contenedor.

Esto descargará la imagen de Docker desde su repositorio original, y luego creará el contenedor y lo ejecutará.

En mi caso tengo conectado un SSD externo de Western Digital, el cual fue diseñado específicamente para la Raspberry Pi, llamado PiDrive de 314 Gb, por lo tanto la carpeta donde estarán ubicados los archivos del servidor web tienen otra localización, y es necesario hacer algunos ajustes al comando.

docker run --name nginx --restart always -d -p 80:80 -v /media/pi/WD_PiDrive_314GB/html:/usr/share/nginx/html:ro nginx

Ahora hay que agregar el directorio /media/pi/WD_PiDrive_314GB/html install al usuario pi y al grupo www-data, cambiar los permisos de escritura de dicho directorio y finalmente agregar el usuario pi al grupo www-data, con lo cual ya todo debiera funcionar. En el caso de ustedes reemplacen /media/pi/WD_PiDrive_314GB/html por $HOME/docker/nginx.

sudo chown pi:www-data -R /media/pi/WD_PiDrive_314GB/html
sudo chmod 0755 -R /media/pi/WD_PiDrive_314GB/html
sudo adduser pi www-data

Con esto queda montado el servidor Nginx en la Raspberry Pi a través de Docker. Sólo nos falta crear un archivo index.html en el directorio /media/pi/WD_PiDrive_314GB/html y listo. El ejemplo que sigue es el index por defecto de Nginx.

<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
<link href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYA$
<style>
body {
  margin: 0px;
  font: 20px 'RobotoRegular', Arial, sans-serif;
  font-weight: 100;
  height: 100%;
  color: #0f1419;
}
div.info {
  display: table;
  background: #e8eaec;
  padding: 20px 20px 20px 20px;
  border: 1px dashed black;
  border-radius: 10px;
  margin: 0px auto auto auto;
}
div.info p {
    display: table-row;
    margin: 5px auto auto auto;
}
div.info p span {
    display: table-cell;
    padding: 10px;
}
img {
    width: 176px;
    margin: 36px auto 36px auto;
    display:block;
}
div.smaller p span {
    color: #3D5266;
}
h1, h2 {
  font-weight: 100;
}
div.check {
    padding: 0px 0px 0px 0px;
    display: table;
    margin: 36px auto auto auto;
    font: 12px 'RobotoRegular', Arial, sans-serif;
}
#footer {
    position: fixed;
    bottom: 36px;
    width: 100%;
}
#center {
    width: 400px;
    margin: 0 auto;
    font: 12px Courier;
}
</style>
<script>
var ref;
function checkRefresh(){
    if (document.cookie == "refresh=1") {
        document.getElementById("check").checked = true;
        ref = setTimeout(function(){location.reload();}, 1000);
    } else {
    }
}
function changeCookie() {
    if (document.getElementById("check").checked) {
        document.cookie = "refresh=1";
        ref = setTimeout(function(){location.reload();}, 1000);
    } else {
        document.cookie = "refresh=0";
        clearTimeout(ref);
    }
}
</script>
</head>
<body onload="checkRefresh();">
<img alt="NGINX Logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEU$
<div class="info">
<p><span>Server&nbsp;address:</span> <span>server_address</span></p>
<p><span>Server&nbsp;name:</span> <span>server_hostname</span></p>
<p class="smaller"><span>Date:</span> <span>server_date</span></p>
<p class="smaller"><span>URI:</span> <span>server_url</span></p>
</div>
<div class="check"><input type="checkbox" id="check" onchange="changeC$
    <div id="footer">
        <div id="center" align="center">
            Request ID: request_id<br/>
            &copy; NGINX, Inc. 2018
        </div>
    </div>
</body>
</html>

Para verificar que está corriendo basta abrir una ventana de navegador, y escribir la dirección IP de la Raspberry Pi seguido del puerto 80, en mi caso 192.168.1.30:80, y debiera mostrar una imagen como la siguiente.

Más adelante veremos cómo crear vhosts para cada uno de los sitios que alojemos dentro de nuestro propio servidor web.

Por emontes, hace