Con un claro ejemplo de Over-engineering esta es la guía para la fabricación de un pequeño dispositivo que recibirá en tiempo real los indicadores más críticos de nuestro negocio. Y poder interactuar con un backend atendiendo a nuestras peticiones.
Trabajo para una empresa de distribución global de alojamientos hoteleros. Lo que significa que tiene una infraestructura descentralizada para poder resolver las peticiones de los clientes en su propia región geográfica. Esto lo permite un sistema de sincronismos y cachés que tienen la contrapartida de generar algunos errores de valoración y disponibilidad de reservas.
Este y otros indicadores, aunque son críticos, su accesibilidad está reducida a la consulta a través de un sistema de monitorización como DataDog. A fin de poder monitorizar de una forma efectiva estas alertas, he ideado un gadget en forma de tarjeta de identificación que, conectado por wifi, traduce en tiempo real las cifras de KPIs a códigos de color y destellos de luz.
Este dispositivo representa el front de la aplicación. Tiene un pulsador y tres indicadores luminosos (NeoPixel) que de izquierda a derecha, son para:
- Error en las confirmaciones de reserva: 0% verde al 5% rojo.
- Ventas por el canal B2B2C:
- Se reducen: de blanco a negro
- Se incrementan: de negro a blanco
- Alertas planetarias indicadas con destellos azules y rojos:
- Nuevos terremotos en cualquier parte del mundo de cualquier intensidad en la última hora.
- Post de un nuevo Twitter de Donald Trump (@realDonaldTrump).
Este proyecto representa un ejemplo de cómo la tecnología open-hardware/software puede incorporarse en una gran organización y del bajo coste con el que se puede prototipar hardware.
El componente principal que he utilizado en esta arquitectura es un Broker (Mosquitto) de mensajería tipo MQTT. En el backend hay un orquestador extremadamente sencillo de programar, Node-RED. Como dispositivos periféricos tenemos la tarjeta con los indicadores LED, el teléfono móvil con la pulsera inteligente asociada y un robot modelo OTTO. Todo interconectado con una red Wifi.
Las tecnologías y herramientas utilizadas son bien conocidas en el mundo maker para IOT:
- Backend: Node-RED
- Broker de colas MQTT: Eclipse Mosquitto
- Micro-controlador: ESP-8266 formato WEMOS D1 mini
- Servidor: Raspberry Pi Zero Wifi
- Robot: Otto basado en una versión Wifi no oficial del Arduino Nano.
La operativa de toda la aplicación parte de las consultas que se hacen desde el backend (Node-RED):
- Se lanza una petición REST la los web-services:
var TimeTo = Math.floor((new Date).getTime()/1000);
var TimeFrom = TimeTo-1800;
var URLstr1 = "https://app.datadoghq.com/api/v1/query?api_key=";
var URLstr2 = flow.get('api_key');
var URLstr3 = "&application_key="
var URLstr4 = flow.get('application_key');
var URLstr5 = "&from=";
var URLstr6 = TimeFrom.toString();
var URLstr7 = "&to=";
var URLstr8 = TimeTo.toString();
var URLstr9 = "&query=sum:evolution.com.evo.servlets.NewShoppingCartConfirmation.processRequest.count{*,env:live,building-block:evolution}.as_count()"
msg.payload = URLstr1.concat(URLstr2,URLstr3,URLstr4,URLstr5,URLstr6,URLstr7,URLstr8,URLstr9);
return [msg];
Así mismo, la respuesta del webservice, aunque se nos entrega parseada por el nodo. Tendremos que interpretar el mensaje JSON para lo que utilizaremos otro nódo de función con el siguiente código:
p=msg.payload;
node.log(typeof P);
var Bookings = 0;
var t = p.series[0].length;
var i;
for (i=0; i<t; i++) {
Bookings = Bookings + p.series[0].pointlist[i][1];
}
Bookings = Bookings * 2;
msg.payload=Bookings;
msg.topic = "bookings";
return msg;
- Se componen los mensajes para los topics de MQTT que la tarjeta está escuchando. Su estructura es gerárquica y podremos usar cualquier nivel:
`-- hbg
|-- kpi
| `-- panic
| `-- operation
Por ejemplo, si en Node-RED se detecta a través del endpoint REST del Datadog que las ventas del B2B2C suben. Montará este mensaje MQTT:
/hbg/kpi/operation/evolutionUP
Pero cuando el encendemos la tarjeta, el programa de inicio del ESP8266 emite un I´m alive con este mensaje:
/hbg/kpi/starting
Otros ejemplos de comandos que se pueden generar son: "bookerror21" (2.5% de errores) y "warnings" para un nuevo twitt de Trump.
- El servidor MQTT (Mosquitto) recibe el mensaje y lo replica a todos los clientes subscritos al topic "/hbg/kpi/operation"
- El microcontrolador de la tarjeta es uno de esos clientes, por lo que recibe el mensaje e interpreta su payload. Por ejemplo "bookerror21" que lo transformará en una instrucción al puerto digital D4 del ESP8266 con un valor RGB (Rojo,verde,azul) de 210,255,0 encendiendo el primer led en un color casi amarillo.
Para el caso del pulsar el botón "Panic" de la tarjeta. Hay que describir un proceso inverso al anterior:
- El microcontrolador generará este mensaje MQTT:
/hbg/kpi/panic/on
- Y en este caso, el backend actúa como un cliente suscrito a este topic. A partir de aquí, con Node-RED podemos hace casi cualquier cosa. En mi caso me envía un mail con un formato que activa las alertas de mi reloj Xiaomi MiBand y activa un icono en el dashboard de la página web servida por Node-RED.
- Adicionalmente he añadido la librería del cliente MQTT al programa del robot OTTO de manera que cuando recibe este mensaje ejecuta la rutina del "Cruzaito":
Node-RED también tiene una serie de nodos con los que se puede montar una página web responsiva. Es fácil utilizar controles y gráficas, así como cajas de texto, formularios, etc... En este proyecto he incluido las gráficas historicas de los indicadores más un botón de actualización manual y un icono de alarma que se pone en rojo cuando se pulsa el botón de Panic de la tarjeta.
El uso es tan simple como dirigir los mensajes a estas 'cajas' y colocarlas en el orden conveniente dentro del layaut del dashboard:
Tanto el Broker MQTT de mensajería (Mosquitto) como el backend (Node-RED) están instalados en un One Single Computer que es la conocida Raspberry Pi Zero. Este mini-ordenador se puso a la venta en 2015. Con un coste de cinco dólares. llegándose a regalar en el número #40 de la revista The MagPi. Sus características principales son:
- Procesar ARM 1GHz, single-core CP
- Sistema operativo: Raspbian es un distribución de Debian
- 512MB de RAM
Sin entrar en los detalles de la instalación de este servidor para no hacer demasiado largo este documento y para no repetir lo que se puede encontrar perfectamente explicado. Estas son las páginas donde se pueden encontrar las instrucciones adecuadas para:
Está construida bajo los principios del Do It Yourselft (DIY). Con las herramientas básicas para soldar y para trabajar con plásticos y estos materiales, es posible que cualquier persona pueda construir este gadget por si misma.
El dispositivo está basado en el microcontrolador SP8266. Cuyo origen está en Shanghai de manos de la empresa Espressif en el 2014. Pero no nació para usarse como microcontrolador. Si no como controlador Wifi de bajo coste. Este microchip tiene todo el stack TCP/IP que la comunidad Maker adoptó como un dispositivo independiente.
El código fuente en C++ se puede encontrar en este sketch de este mismo repositorio. Y este el circuito que puede construirse en muchos formatos. El esquemático de conexión es el siguiente:
Yo he utilizado una tarjeta de fidelización de BP a la que le he hecho los agujeros y cortes necesarios para montar el WEMOS, la bateria, el pulsador, un interruptor de encendido y una tira con tres LEDs del tipo WS2812B que permite el encendido direccionado. Siendo 0 el primer LED y 2 el último en este proyecto.
Tuve la oportunidad de hacer una presentación a miembros de la Asociación de Makers de Mallorca en su reunión mensual. Es un grupo abierto al que te puedes añadir sin ningún tipo de compromiso: Makespace Mallorca
Existe una tecnologia y técnica de fabricación de componentes en superficie llamada SMD (Surface Mount Device) que permite la minituarización de los circuitos impresos (PCB). Y en esta linea estoy trabajando para tener unos dispositivos más robustos que puedan tener un uso diario.
- MQTT.org
- IBM Developers MQTT: Enabling the Internet of Things