msgbartop
Asociado al gabinete del Doctor Caligari
msgbarbottom

25 oct 23 Control de luces inteligentes con NFC, MQTT y Node Red

En fechas recientes he implementado un elemento adicional de interacción con la domótica. No es algo especialmente nuevo (de hecho, ya en Irlanda empecé a trastear con ellos), pero sí es algo que he recuperado recientemente: el uso de tags NFC para interactuar con la domótica, usando teléfonos inteligentes. La idea es bastante sencilla: desplegar una serie de tags desplegados por la casa, allí donde quiera que se dispare una acción concreta, para escanearlo con el teléfono, y ejecutar la acción. Y el elemento más obvio para ello es el control de luces inteligentes.

En mi caso, tengo desplegadas dos tecnologías diferentes para el control de luces inteligentes: interruptores WiFi (básicamente, diversas variedades de Sonoff) y luces Zigbee, que controlo mediante sendas plataformas zigbee2MQTT que tengo tanto en Santiponce como en Forcarey. Todo ello integrado en mi servidor MQTT, que se utiliza también con la plataforma HomeAssistant. La gracia del asunto es que toda la interacción con ellas se realiza desde el propio HomeAssistant, independientemente de la tecnología subyacente. Y siempre usando MQTT como elemento de mensajería.

Para poner en marcha el sistema de interacción basado con NFC he optado por lo siguiente: codificar en los NFC el envío de un datagrama UDP. La razón de hacerlo así es que es que de esta manera se evita, como es el caso de conexiones HTTP o similar, el tener que hacer uso de un programa específico en el teléfono, ya que mediante el envío del datagrama se evita que el usuario tenga que interactuar con ninguna aplicación, haciéndose el envío siempre en segundo plano. Esto implica que es preciso tener abierto en algún lugar un puerto UDP al que enviar los mensajes. Y la opción obvia en mi caso es hacer uso de Node-Red.

Así pues, he hecho un flujo bastante simple, que lo que hace es exponer un puerto UDP, a donde el teléfono envía la mensaje del datagrama. Este mensaje, en líneas generales, es un alfanumérico que me permite identificar qué luz quiero encender (por ejemplo, santiponceSalon1, para identificar la luz principal del salón de Santiponce). Una vez recibido el mensaje, se procesa en un switch, con tantas entradas como luces a controlar (en mi caso, de momento, 4), y se incluye en el payload el mensaje de encendido/apagado. Aquí hay dos opciones:

  • Luces Sonoff: Para las luces WiFi basadas en Sonoff con el firmware Tasmota, basta con enviar un “TOGGLE”, y con eso variaremos el estado de la luz entre encendido y apagado. Ese mensaje se envía mediante MQTT al topic que permite dar órdenes al interruptor (por lo general, algo como xxxxx/xxxx/cmnd/xxxx/POWER).
  • Luces Zigbee: En mi caso, como decía, uso Zigbee2MQTT para controlar las luces Zigbee de manera agnóstica al fabricante, interactuando a través de un servidor MQTT. En este caso, la composición del mensaje es algo distinta. Hay que enviar un ‘{“state”: “TOGGLE”}’. Se enviará al topic que, como en el caso anterior, permite enviar comandos. Será algo como zigbee2mqtt/0xxxxxxxxxxxx/set
Flujo Node Red para control de luces inteligentes con NFC y MQTT

Flujo Node Red para control de luces inteligentes con NFC y MQTT

Una vez publicado el flujo, el servidor donde tengamos desplegado Node-Red abrirá un puerto UDP para escuchar conexiones (aconsejo hacer uso de un puerto alto, para evitar tener que asignar permisos de root). En mi caso, dado que publico Node-Red mediante un contenedor docker, es por lo que tenía que realizar una publicación de puertos del contenedor, de lo que hablaba en el artículo anterior. Y con esto, estaremos listos para controlar las luces con un móvil NFC.

Un par de comentarios adicionales:

  • Desde el punto de vista de la seguridad, no es una buena práctica publicar estos puertos hacia Internet. En mi caso, lo tengo publicado sólo en el contexto de la red local de mi casa, lo que no supone un problema, ya que siempre voy a estar conectado a la WiFi cuando interactúe con los tags NFC. Se puede exponer hacia Internet, pero lo desaconsejo de manera vehemente.
  • Para grabar los tags NFC para que envíen datagramas por UDP hago uso de la versión Profesional de la aplicación de Android NFC Tools. Vale apenas unos 3€, y compensa tenerla. La manera de hacerlo es muy sencilla, basta con agregar una Tarea, de tipo Redes, UDP, y grabar el tag. Y lo bueno es que cualquier otro teléfono con NFC, aunque no tenga la aplicación, será capaz de enviar el datagrama.
Datagrama UDP con NFC Tools Professional

Datagrama UDP con NFC Tools Professional

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , , , , , , , , ,

08 nov 20 Instalación manual del firmware Tasmota en dispositivos Sonoff Mini (versión 2020)

Hace cosa de un año escribí un artículo sobre cómo actualizar de manera manual el firmware de los Sonoff Mini, cambiándolo al firmware Tasmota. Recientemente he adquirido una nueva remesa de Sonoffs Mini, y he comprobado que el manual ya no es válido, debido a un cambio en el firmware de casa que traen los dispositivos. En la práctica, se ha simplificado el proceso, que paso a describir:

  • Sigue siendo necesario pasar los dispositivos a modo DIY. La diferencia es que ya no se hace con jumper ni es necesario abrir el dispositivo. Ahora basta con pulsar, una vez encendido el dispositivo, el botón durante 5 segundos, para entrar en modo OTA. El LED empezará a parpadear, y el Sonoff levantará una WiFi con nombre ITEAD-XXXXXXXX, a la que habrá que conectarse. La contraseña es 12345678.
  • Una vez conectado, habrá que acceder a la URL http://10.10.7.1/, e indicar a qué WiFi queremos que se conecte el Sonoff, introduciendo su nombre y contraseña. El dispositivo se reiniciará, y se conectará a la WiFi indicada.
  • A partir de aquí, el procedimiento de actualización sigue el procedimiento que describí originariamente, con la salvedad de que la versión del firmware Tasmota a cargar es directamente la tasmota-mini, ya que la versión tasmota-wifiman ya no existe, y la mini ocupa menos de los 500 kb que marcan el límite de carga a través de OTA para este dispositivo.

…y como siempre, mucho ojo con no cargar la versión tasmota-minimal, ya que esta versión no carga la interfaz web de administración, y puede dejar el dispositivo inservible.

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , ,

22 dic 19 Instalación manual del firmware Tasmota en dispositivos Sonoff Mini

Editado: Esta versión del artículo se ha quedado obsoleta. En los comentarios se encuentra un enlace a la nueva versión del mismo.

Gran parte de la domótica que tengo instalada en casa está basada en dispositivos Sonoff. Empezando por el Sonoff Basic, y siguiendo con interruptores de pared y sistemas duales, estos aparatos me han proporcionado una gran versatilidad para controlar de manera remota diversos elementos que tengo por casa. Al principio realizaba estos despliegues con montajes basados en NodeMCU y relés convencionales, pero la falta de un buen empaquetamiento de estas soluciones ad-hoc generaba algunos problemas de seguridad en casa. Así que cuando tuve conocimiento de los Sonoff, y vi que desde el punto de vista económico no había mucha diferencia con lo que gastaba en mis sistemas hechos a medida, decidí pasar a emplearlos en mis nuevos montajes.

El principal problema con los Sonoff, sin embargo, es que no me hace mucha gracia utilizar una plataforma de terceros sobre la que no tengo el control. Por otro lado, con el firmware de casa enfocado al uso de esta plataforma propietaria, no tenía capacidad para integrarlos de manera adecuada en mi propia plataforma. Para solucionar este problema tuve la enorme suerte de conocer el firmware libre Tasmota, que permite independizarse de manera completa de la plataforma propietaria del fabricante, e integrar el sistema con soluciones abiertas (como por ejemplo basadas en protocolo MQTT, que es la base de mi sistema domótico).

Hasta ahora había estado enormemente contento con esta solución, pero desde el principio esta solución tenía un lunar: si bien los dispositivos Sonoff funcionaban excepcionalmente bien por sí solos, o controlados mediante el sistema de domótica, no había una solución adecuada para integrarlos con interruptores de pared convencionales: dado que los Sonoff sólo disponen de entrada y salida de fase (y si acaso de neutro), no presentan la tercera conexión que permite integrarlos en un sistema de llaves conmutadas. Y si bien es cierto que existe la serie TX de interruptores de pared, éstos tampoco pueden usarse de manera conmutada, lo cual es un fastidio bastante importante para usarlos en habitaciones grandes, o en dormitorios.

Esquema de montaje de luces conmutadas

Esquema de montaje de luces conmutadas

Pues bien, la nueva serie Sonoff Mini ha venido a solucionar este gran inconveniente. Este dispositivo dispone de dos entradas de control, de tal manera que se puede colocar cualquier interruptor convencional para interactuar con el dispositivo, incluyendo interruptores conmutados. Lo único que hay que tener en cuenta (y desde mi punto de vista es una ventaja) es que estos interruptores pasan a formar un circuito separado, por los que no pasan ni fase ni neutro, y que lo único que hacen es cerrar el circuito de control en el Sonoff. Mejor desde el punto de vista de la seguridad.

Esquema de montaje de un Sonoff Mini con interruptores conmutados

Esquema de montaje de un Sonoff Mini con interruptores conmutados

La segunda característica interesante es que los Sonoff Mini tienen un tamaño bastante reducido, que en teoría permitiría colocarlos dentro del mismo hueco donde tengamos nuestro interruptor. Y digo en teoría porque, si bien es cierto que por ancho y alto entrarían perfectamente (miden 42.6×46.6mm), el problema viene por la profundidad de 20mm, que me temo que en la mayoría de los casos basta para imposibilitar colocarlos detrás del enchufe. En cualquier caso, no es un gran problema: siempre se pueden colocar dentro de la caja de registro de la habitación, y a correr.

Dicho todo esto, no podía menos que hacerme con algunos de ellos para probarlos. Y en efecto, son una pequeña maravilla. El problema, en mi caso, vino a la hora de cambiarles el firmware de fábrica por el Tasmota. Por lo general con los Sonoff no es demasiado complicado: soldar los pines para conectar un conversor serie-TTL en los conectores que los dispositivos traen de fábrica, y cargar el firmware desde el IDE Arduino. La dificultad con el Mini es que todo es mucho más reducido, por lo que la ubicación de estos conectores en muy poco conveniente, encima el fabricante ha dejado soldados estos conectores, lo que fastidia bastante a la hora de querer usarlos (y encima luego tienes que desoldar lo que sea que conectes, porque si no, la caja del dispositivo no cierra):

Conectores 3.3V, GND, RX y TX en el Sonoff Mini

Conectores 3.3V, GND, RX y TX en el Sonoff Mini

En teoría, esto no tendría que ser necesario, ya que el fabricante proporciona unas instrucciones y una aplicación específica para cargar firmware personalizado mediante una actualización OTA (y que el mismo fabricante publicita, indicando que estos dispositivos son DIY): supuestamente es cuestión de descargar dicho software, conectar un jumper (que viene con el mismo Sonoff) para entrar en modo DIY, levantar la WiFi de programación que el dispositivo espera encontrar, y cargar el firmware que queramos. Pero en la práctica no he parado de encontrarme inconvenientes: el software del fabricante sólo funciona en Windows (que, para colmo, lo marca como posible software malicioso), la mitad de las veces el software es incapaz de detectar de manera correcta el Sonoff Mini, y para colmo, a la hora de realizar el cambio de firmware, el software trata de hacer una conexión a un servidor del fabricante para notificar que estás cambiando el firmware, y paraliza la actualización si no es capaz de conectar con dicho servidor (ver punto 17 del este enlace).

Así que tras una mañana enormemente improductiva tratando de reemplazar el firmware, volví al buen y viejo sistema manual, si bien aún On The Air. Este modo manual es el que desde Tasmota se recomienda para dispositivos Mac, pero he podido comprobar que funciona perfectamente para sistemas Linux. El recetario es el siguiente:

  • Preparar un pequeño servidor web donde alojar el binario a cargar: Para esto vale cualquier dispositivo que tengas por casa, y que luego puedas conectar a la WiFi de programación OTA que el Sonoff espera encontrar. Una Raspberry Pi es ideal, y un Apache2 es perfecto. Aquí es conveniente no pasarse de listo y querer montar un servidor web mínimo con NCAT, ya que a la hora de descargar el firmware el Sonoff Mini compone una URL con parámetros, y NCAT no es capaz de procesarlo adecuadamente. Lo dicho, mejor con Apache. El firmware a descargar habrá de ser inferior a 500Kb, y el precompilado tasmota-wifiman.bin es perfecto para ello. Por último, habrá que obtener la SHAsum del fichero (en adelante, <SHAsum>):
    $ shasum -a 256 tasmota-wifiman.bin
  • Levantar una red WiFi con los siguientes parámetros: SSID: sonoffDiy; Password: 20170618sn . Una vez levantada, se ha de conectar el servidor web anterior a dicha red WiFi. Anotar su IP como <werserver>
  • Poner el Sonoff Mini en modo OTA: Hay que abrir el Sonoff y conectar el jumper para pasarlo al modo OTA. Cerrar y conectar fase y neutro (¡ojo con no invertirlos!)

    Colocación del jumper para modo OTA

    Colocación del jumper para modo OTA

  • Obtener la IP del dispositivo (en adelante <deviceIP>): Bien mediante un escaneo de IPs, mirando en el dispositivo que levante la red, etc…
  • Obtener el identificador del dispositivo (en adelante <deviceID>): Con linux puede realizarse con el comando avahi-browse. Esto puede ejecutarse desde el mismo dispositivo donde se haya levantado el servidor web, o bien desde un tercer dispositivo.

    En este ejemplo, el <deviceID> es 1000988699

    $ avahi-browse -t _ewelink._tcp --resolve

    + wlp3s0 IPv4 eWeLink_1000988699 _ewelink._tcp local
    = wlp3s0 IPv4 eWeLink_1000988699 _ewelink._tcp local hostname = [eWeLink_1000988699.local] address = [192.168.1.109] port = [8081] txt = ["data1={"switch":"off","startup":"off","pulse":"off","pulseWidth":500,"rssi":-47}" "seq=1" "apivers=1" "type=diy_plug" "id=1000988699" "txtvers=1"]

  • Verificar la conectividad con el Sonoff: Lanzar un POST a /zeroconf/info

    $ curl http://<deviceIP>:8081/zeroconf/info -XPOST --data '{"deviceid":"<deviceID>","data":{} }'

    {"seq":2,"error":0,"data":"{"switch":"off","startup":"off","pulse":"off","pulseWidth":500,"ssid":"sonoffDiy","otaUnlock":false}"}

  • Desbloquear las actualizaciones OTA en caso de que estén bloqueadas en el paso anterior):
    $ curl http://<deviceIP>:8081/zeroconf/ota_unlock -XPOST --data '{"deviceid":"<deviceID>","data":{} }'

    {"seq":2,"error":0}

  • Cargar el firmware tasmota desde el servidor web creado anteriormente:

    $ curl http://<deviceIP>:8081/zeroconf/ota_flash -XPOST --data '{"deviceid":"<deviceID>","data":{"downloadUrl": "http://<webServer>/tasmota-wifiman.bin", "sha256sum": "<SHAsum>"} }'

    {"seq":2,"error":0}

  • Verificar en los logs del servidor web que el Sonoff está descargando adecuadamente el fichero: Debería aparecer algo como lo siguiente repetido múltiples veces:
    192.168.4x.xx - - [21/Dec/2019:12:52:33 +0100] "GET /tasmota-wifiman.bin?deviceid=xxxxxxxxxxx&ts=1481765933&sign=95300ceae2fb9cd19f09283e54169cfa7f998d38bf33463ad613e24e76098b20 HTTP/1.1" 206 4394 "-" "itead-device"
    192.168.4x.xx - - [21/Dec/2019:12:52:33 +0100] "GET /tasmota-wifiman.bin?deviceid=xxxxxxxxxxx&ts=1085377743&sign=c96e52cf3e9b7680003df7f3d17a5d266de35d486bf25a62b03d6737a1cc6083 HTTP/1.1" 206 4397 "-" "itead-device"
  • Esperar unos 30 segundos. El Sonoff debería desconectarse de la red WiFi, y levantar una red con SSID tasmota-xxxx. Conectar a dicha red y configurar el dispositivo para conectar a tu red WiFi normal.
  • Configurar el firmware con los siguientes parámetros:
    GPIO Tasmota Component Device Function
    0 Button1 (17) Button
    4 Switch1 (9) S1/S2
    12 Relay1 (21) L Out
    13 LED1 (56) Link/Power Indicator

¡Y listos! Con esto el Sonoff Mini pasa a estar configurado como un nuevo dispositivo con firmware Tasmota. A continuación he dejado un vídeo en el que se ve cómo se puede interactuar con el Sonoff Mini, una vez ya configurado con el software Tasmota, y un interruptor físico:

Editado:

Estas Navidades he estado haciendo algunas pruebas de campo con Sonoff Mini, ya con el firmware Tasmota, y han sido sumamente interesantes. El principal aspecto que he notado es que con el firmware tasmota-wifiman, en el caso de realizar múltiples encendidos y apagados consecutivos pueden perderse algunos de los encendidos y apagados. Para evitar este inconveniente, es recomendable hacer una actualización del firmware a una versión convencional. Para ello, se habrán de realizar los siguientes pasos:

  • Realizar un “Reset 5″ en la ventana de comandos del portal web que levanta el firmware Tasmota ANTES de intentar realizar cualquier actualización OTA del dispositivo. La función de este comando es eliminar cualquier remantente del flasheo realizado para instalar el firmware Tasmota.
  • Actualizar vía OTA el firmware tasmota-wifiman a una versión específica para la variante Sonoff Mini. Esta actualización deberá realizarse utilizando la opción “local File upload OTA”. Está desaconsejado realizar la actualización mediante web OTA, dado el grave riesgo de dejar la unidad inoperativa. El otro requisito es que la versión del firmware ha de tener menos de 500 kB, por lo que se recomienda el uso de la variante tasmota-lite del repositorio de firmare de Tasmota. El binario escogido se descargará al PC local, y desde ahí se subirá al Sonoff Mini vía OTA.
VN:F [1.9.20_1166]
Rating: 7.7/10 (3 votes cast)

Etiquetas: , , , , ,

06 oct 19 Impresora 3D controlada de manera remota

Y seguimos a vueltas con la impresora 3D. En este caso, en el ámbito de la usabilidad. Mi impresora es una Creality Ender 3 Pro, que en su configuración de fábrica se utiliza mediante una tarjeta micro SD y un control en base a una botonera. Sin embargo, la impresora viene con una interfaz mini USB que permite el control remoto de la impresora. Tras un rato de investigar, he encontrado una aplicación llamada OctoPrint que facilita enormemente el control remoto de la impresora. En líneas generales, habilita una interfaz web que permite subir los ficheros .gcode y cargarlos en línea, sin tener que grabarlos previamente en la micro SD de la impresora.

Interfaz gráfica de OctoPrint

Interfaz gráfica de OctoPrint

No sólo eso, sino que permite controlar todos los aspectos de la impresora, desde la ubicación del cabezal de impresión hasta la temperatura de la cama caliente y extrusor, además del progreso de la impresión. Incluso permite configurar una webcam (bien conectada localmente al servidor donde se encuentre OctoPrint o una cámara IP) para visualizar de manera remota cómo progresa la impresión.

Interfaz gráfica de OctoPrint

Interfaz gráfica de OctoPrint

En mi caso, he utilizado para albergar OctoPrint un miniservidor Orange Pi Zero+ que había comprado hace algún tiempo (y cuya carcasa había creado con la impresora) con una Armbian recién descargada. Si bien por el momento la alimentación de ambos dispositivos es independiente (existe una manera de obtener la alimentación para la Orange Pi desde la impresora), en mi caso he optado -para optimizar el consumo energético del sistema- por utilizar por delante de la impresora un interruptor general Sonoff Basic con el firmware Tasmota instalado, a fin de poder controlar el sistema desde mi plataforma de domótica de casa, pudiendo encender todo el conjunto cuando vaya a imprimir, y tenerlo apagado cuando no se encuentre en uso. Y así cerramos el círculo: impresora 3D controlada por mi sistema de domótica. :mrgreen:

VN:F [1.9.20_1166]
Rating: 10.0/10 (1 vote cast)

Etiquetas: , , , , , , ,