¿Cómo modelar una SenseHat como un Digital Twin?

Introducción

Un Gemelo Digital o Digital Twin puede definirse como un modelo virtual de activos físicos o procesos industriales que aprende continuamente, proporciona datos y responde a los cambios realizados en su entorno. El concepto de Digital Twin se utilizó originalmente en entornos CAD y de simulación, pero ahora se utiliza comúnmente en las tecnologías IoT. Según Gartner, la tecnología Digital Twin será una de las 10 principales tecnologías estratégicas y disruptivas en 2018.

Como se ha dicho antes, un Digital Twin es la representación virtual de un sistema o dispositivo físico. Esta representación está definida por tres elementos:

  • Estado: valor de cada una de sus propiedades, que representa en tiempo real lo que el dispositivo está "haciendo"; por ejemplo, un motor girando a 1800 rpm a una temperatura óptima de trabajo.

  • Acciones: acciones u órdenes externas que se pueden aplicar al dispositivo o a las que éste puede responder; por ejemplo, un motor se puede apagar.

  • Eventos: notificaciones que puede enviar un dispositivo por determinados eventos; por ejemplo, un motor puede enviar un evento de apagado si su temperatura de trabajo supera un valor umbral.

Para crear una representación estándar de Digital Twin, utilizamos la "Web Thing API" de Mozilla (https://iot.mozilla.org/api). Este estándar está considerado como uno de los líderes del mercado debido a su facilidad para adoptar estándares tecnológicos: estructuras de datos JSON fáciles y legibles, independencia del protocolo de intercambio de datos y proporciona una implementación para dos de los estándares de interfaces más extendidos: REST y WebSockets.

Estas representaciones virtuales (Digital Twins) modeladas dentro de la plataforma permiten:

  • Gestionar dispositivos físicos, obteniendo en tiempo real su estado.

  • Realizar operaciones enviando comandos o acciones.

  • Enriquecer su comportamiento mediante la ingesta continua de datos y el procesamiento de eventos.

  • Crear sistemas complejos a través de la orquestación de diferentes Digital Twins.

  • Facilitar la depuración y simulación. La plataforma realiza las mismas acciones que un Digital Twin o que un sistema real: son mutables.

Ejemplo: Sense Hat como Digital Twin

Este post te guiará a través de un escenario de demostración completo de las funcionalidades del Digital Twin. Su objetivo es mostrar las grandes capacidades de esta innovadora funcionalidad desde diferentes puntos de vista:

  • Como desarrollador: mostrará cómo modelar tanto el tipo de Digital Twin como el propio Digital Twin. Además, se explicará cómo un desarrollador puede monitorizar y gestionar cada Digital Twin modelado desde el Panel de Control de la Onesait Platform.

  • Como usuario final: explicará cómo acceder al escenario de demostración y describirá un ejemplo de cómo utilizar un Digital Twin.

Vamos a modelar el siguiente sistema:

Se modelará la placa add-on RaspberryPi SenseHat (https://www.raspberrypi.org/products/sense-hat/). Este dispositivo es muy popular entre los desarrolladores de Hardware Abierto, que suelen ampliar la placa original con múltiples dispositivos como joysticks y matrices de LEDs.

El objetivo es modelar la placa SenseHat (desde el Panel de Control de la Onesait Platform) y generar un código para que, cada vez que se ejecute un dispositivo, éste se conecte a la plataforma y comience a enviar eventos de temperatura, humedad y presión atmosférica. En el caso del joystick, se enviarán eventos cada vez que el usuario lo pulse, de forma que se actualizará la matriz de LEDs (con una flecha). Al mismo tiempo, esta información se envía a la plataforma para actualizar el estado del Digital Twin, basándose en el estado de la placa física SenseHat.

Un desarrollador debe ser capaz de seguir el siguiente flujo al desarrollar un Digital Twin:

  • Definir el tipo de Gemelo Digital: tras el análisis del sistema a definir, el desarrollador ha identificado una o varias entidades relevantes en el sistema, sus propiedades, los eventos que generan en su entorno y las acciones externas a las que responderán. Con todo esto, es posible definir un tipo de Gemelo Digital por entidad.

  • Definir instancias (Digital Twins) específicas para cada tipo. Un Digital Twin asume una clasificación de un determinado tipo de entidad. El sistema real serán instancias en ejecución de estos tipos, cada una con su propio estado en función del entorno donde se despliegue.

  • Monitorizar y controlar los Digital Twins.

Toda esta información sobre eventos permite a la plataforma gestionar la "sombra" del dispositivo, y a los desarrolladores construir aplicaciones (usando APIs de representación digital) en tiempo real que puedan actuar recibiendo eventos del dispositivo. En el caso de esta historia de usuario del demostrador, una simple aplicación web (que consumirá una API de representación digital) mostrará en tiempo real información y eventos, y simulará eventos del joystick que, al ser recibidos por el dispositivo físico, actualizarán la matriz de LEDs.

En esta prueba, estamos modelando una placa add-on RaspberryPi Sensehat como Digital Twin.

 1)    Ve al Panel de Control de la Onesait Platform (https://lab.onesaitplatform.com/controlpanel/) y entra como desarrollador. Primero, crea el tipo de Digital Twin definiendo sus propiedades, acciones y eventos de acuerdo con las definiciones proporcionadas por la “Web Thing Description” (https://iot.mozilla.org/api/#web-thing-description).

2)    Para crear el tipo de Digital Twin, ve al siguiente menú: Clientes & Digital Twin > Definiciones de Digital Twin.

Una vez allí, podrás empezar a crear tu tipo de Digital Twin pulsando el botón Crear.

Para acelerar la prueba, el tipo de Digital Twin ya ha sido creado con el nombre de "Sensehat" por lo que, a partir de este momento, cada paso proporcionará información sobre cómo se creó el Digital Twin "Sensehat".

Para entender mejor los siguientes pasos, puede ser útil hacer clic en el botón de Ver del Digital Twin "Sensehat" (botón azul a la derecha, justo en la columna de opciones).

 

Al crear el Tipo de Digital Twin "Sensehat", debes rellenar los campos de nombre, tipo y descripción, así como toda la información requerida en las siguientes pestañas:

  • Propiedades Tipo: representan el estado del Digital Twin. Son las variables que serán ingestadas y procesadas en la plataforma como una sombra del dispositivo. En el caso de la placa SenseHat, se ha definido lo siguiente:

 

  • Acciones: notificaciones y acciones que un Digital Twin recibe de la plataforma. En este caso, modelamos las notificaciones de acciones para el movimiento del joystick. Por ello, tenemos que modelar una acción para cada una de las posibles direcciones del joystick:

 

  • Eventos: notificaciones y acciones que el Digital Twin envía a la plataforma. Hay diferentes tipos de eventos:

    • Register (registro): Registro del Digital Twin en la plataforma. Es necesaria una clave de autenticación.

    • Ping: Realiza pings activos periódicos para comprobar el estado del Digital Twin (activo o no activo).

    • Update_Shadow (actualizar sombra): actualiza los valores de las propiedades (estado) del Digital Twin en la plataforma. Es importante saber que la plataforma almacena los valores históricos de las propiedades para poder realizar algunas acciones de analítica.

    • Notebook, Rule (regla), Flow (flujo), Pipeline: el Digital Twin envía una notificación a la plataforma para ejecutar un notebook, una regla, un flujo o un pipeline.

    • Log: el Digital Twin puede enviar logs a las plataformas. Estos registros pueden ser almacenados para ser visualizados.

    • Other (Otros): eventos personalizados.

En este caso, también utilizamos el joystick para definir los eventos que el Digital Twin puede enviar a la plataforma. Añadiremos un evento por cada movimiento del joystick, un evento Update_Shadow que actualizará el valor de las diferentes propiedades del Digital Twin y finalmente un evento log que nos permitirá almacenar trazas.

 

  • Lógica: la plataforma permite definir qué tipo de lógica ejecutará el Digital Twin. Para este ejemplo, la lógica está programada en JavaScript. Por defecto, al crear un Digital Twin, se añaden las siguientes funciones:

    • Init: se ejecuta sólo al registrar el Digital Twin en la plataforma.

    • Main: ejecuta periódicamente el Digital Twin.

    • onActionXXX: se creará un método para cada acción definida en la sección Acciones, donde puedes definir la lógica que quieres ejecutar cuando el Digital Twin reciba una acción de la plataforma.

Nota: Aunque este demostrador usa JavaScript, la lógica del Digital Twin no está limitada exclusivamente a este lenguaje. Cualquier dispositivo o sistema que soporte los estándares REST o WebSocket puede utilizar los servicios del broker de Digital Twin.

Después analizamos en detalle la lógica que hemos programado en JavaScript para el tipo de DigitalTwin "Sensehat".

Primero, se importan dos API de Java. La primera importa la API de Java para comunicarse con la plataforma de una manera muy sencilla. La segunda importa la API para comunicarse con la placa SenseHat. En la función init, registramos los listeners para notificar al SenseHat de las acciones recibidas desde la plataforma; esta operación se realiza a través de la API SenseHat. Además, inicializamos la sombra de Digital Twin para agregar valor a las propiedades que la definen, que en este caso son temperatura, humedad y presión. En la función main que se ejecuta periódicamente, simplemente actualizamos la sombra del dispositivo.

Finalmente, tenemos dos tipos de funciones:

  • Funciones de eventos: estas funciones se ejecutan cada vez que se produce el evento que las define, es decir, cuando el joystick del Sensehat se mueve físicamente hacia la derecha, se ejecutaría la función joystickEventRight. Entonces enviaríamos la notificación a la plataforma. Por tanto, se ha hecho un evento personalizado y enviamos la orden al Sensehat para que muestre una flecha hacia la derecha en su matriz de LEDs.

  • Funciones onActionXXX: estas funciones se ejecutan cada vez que el Digital Twin recibe una acción de la plataforma. Por ejemplo, cuando envías al Digital Twin la acción de empujar el joystick hacia la derecha, se ejecutaría la función onActionJoystickRight, que enviaría la orden de pintar una flecha hacia la derecha en su matriz de LEDs.

    JSON: una vez definidos todos los elementos anteriores del Digital Twin, podemos generar la representación del Digital Twin siguiendo el estándar “Web Thing API” para la “Web Thing Description”. En este caso, podemos ver el siguiente esquema JSON:

Una vez creado el Tipo de Digital Twin “Sensehat”, el siguiente paso es crear una instancia concreta del Digital Twin.

3)    Para crear una instancia del Digital Twin, ve al siguiente menú: Digital Twin > Mis Digital Twins.

 

Ten en cuenta que, como antes, la instancia de Digital Twin ya ha sido creada, por lo que no es necesario crearla. Puedes simplemente ver las propiedades de la instancia de Digital Twin haciendo clic en el botón de opción (en la columna de opciones).

Un Digital Twin, al ser una instancia de un tipo de Digital Twin, estará definido por su "Web Thing Description" y tendrá propiedades de configuración específicas. Para este ejemplo, crearemos un Digital Twin Sensehat ubicado en Helsinki.

Podemos elegir la ubicación del Digital Twin gracias a una interfaz de mapa que proporciona la plataforma:

Además, estableceremos la configuración específica de este Digital Twin con los siguientes campos:

Donde:

  • Tipo de Digital Twin corresponde al Tipo de Digital Twin que se ha creado previamente y, por tanto, define la "Web Thing Description". Además, al seleccionar el tipo de Digital Twin, asignamos también la lógica definida para este tipo.

  • Esquema URL, interfaz, puerto, ContextPath e IPV6: Proporcionan al Digital Twin la información necesaria para inferir su URL y que ésta sea enviada a la plataforma en el mensaje de Registro. De este modo, la plataforma puede notificar las acciones. 

  • Broker endpoint es la URL donde hay que notificar los eventos de Digital Twin en una plataforma.

  • DigitalTwinKey es la clave con la que el Digital Twin se puede autenticar frente a la plataforma.

Una vez hemos definido nuestro Digital Twin, la plataforma permite generar el código correspondiente. En la versión actual de la plataforma, el código se genera en Java.

4)    Para ver el código generado del Digital Twin, ve otra vez a Digital Twin > Mis Digital Twins y selecciona la instancia ya creada de Digital Twin "SenseHatHelsinki".

Para generar el código, debes seleccionar las siguientes opciones:

 

Después, haz clic en Generar y el proyecto Maven se compilará (Java) y se descargará, listo para ser ejecutado. Además, incluirá la dependencia de la API y los drivers para un proyecto de dispositivo SenseHat.

Ten en cuenta que este proyecto, junto con el correspondiente JAR de Java, estará disponible en el Platform Market Place, junto con el Digital Twin Demonstrator.

Monitorizar y controlar el Digital Twin

1)    Una vez desplegado el Digital Twin "SenseHatHelsinki", podrás monitorizar su estado ejecutando una consulta desde la siguiente opción del menú Digital Twin -> Estado Digital Twins.

 

Una vez allí, verás la siguiente pantalla:

 

Aquí podrás configurar la consulta mediante:

  • Type (Tipo): Tipo de Digital Twin. En este caso, selecciona "Sensehat".

  • Device (Dispositivo): Instancia de Digital Twin que implementa el tipo de Digital Twin seleccionado. En este caso, selecciona "SensehatHelsinki".

  • Operation (Operación): Tipo de operación que quieres consultar. Es posible filtrar por las siguientes operaciones:

    • Shadow (Sombra): Estado histórico de los valores de las propiedades definidas para el Digital Twin.

    • Register (Registro): Histórico de eventos enviados desde el Digital Twin y registrados en la plataforma.

    • Ping: Histórico de pings.

    • Log: Histórico de trazas de log enviadas desde el Digital Twin.

    • Notebook, Pipeline, Rule (Regla), Flow (Flujo), Other (Otro): Eventos históricos enviados por el Digital Twin a la plataforma. Si eliges la opción Other, puedes filtrar por el nombre del evento personalizado.

    • Action name (Nombre de la acción): disponible para consultar las acciones realizadas.

  • Number of results per device (Número de resultados por dispositivo).

Como ejemplos útiles, puedes ver cómo realizar diferentes tipos de consultas y sus resultados:

2)    Selecciona la operación ”Registro” y el número de resultados para esta consulta; por ejemplo, ”1”. A continuación, haz clic en ”Ejecutar consulta” y comprueba el resultado:

[

    {

        "_id": {

            "$oid": "5b07dd6ce732b200013e7bf8"

        },

        "type": "Sensehat",

        "event": "REGISTER",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "content": {

            "endpoint": "http://192.168.1.5:10000//sensehat"

        },

        "timestamp": {

            "$date": "2018-05-25T09:54:52.069Z"

        }

    }

]

 3)    Vuelve a seleccionar la operación Logs y el número deseado de resultados para esta consulta; por ejemplo, “2”. Después, haz clic en “Ejecutar consulta” y comprueba el resultado:

[

    {

        "trace": "Send Update Shadow",

        "_id": {

            "$oid": "5b07dde9e732b200013e7c31"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:56:57.542Z"

        }

    },

    {

        "trace": "New main execution",

        "_id": {

            "$oid": "5b07dde7e732b200013e7c2f"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:56:55.220Z"

        }

    }

]

4)    Vuelve a seleccionar la operación Pings y el número deseado de resultados para esta consulta; por ejemplo, “1”. Después, haz clic en “Ejecutar consulta” y comprueba el resultado:

[

    {

        "_id": {

            "$oid": "5b07de20e732b200013e7c47"

        },

        "type": "Sensehat",

        "event": "PING",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:57:52.818Z"

        }

    }

]

5)    Vuelve a seleccionar la operación Sombra y el número deseado de resultados para esta consulta; por ejemplo, “3”. Después, haz clic en “Ejecutar consulta” y comprueba el resultado:

[

    {

        "_id": {

            "$oid": "5b07de53e732b200013e7c5b"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:58:43.030Z"

        },

        "status": {

            "temperature": 30.949012756347656,

            "humidity": 41.51370620727539,

            "pressure": 940.17236328125

        }

    },

    {

        "_id": {

            "$oid": "5b07de4be732b200013e7c58"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:58:35.403Z"

        },

        "status": {

            "temperature": 30.98516845703125,

            "humidity": 41.278560638427734,

            "pressure": 940.181884765625

        }

    },

    {

        "_id": {

            "$oid": "5b07de43e732b200013e7c55"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T09:58:27.988Z"

        },

        "status": {

            "temperature": 30.713998794555664,

            "humidity": 41.96133041381836,

            "pressure": 940.17529296875

        }

    }

]

6)    Vuelve a seleccionar la operación Otros (que te mostrará los eventos de las operaciones de joystick definidas previamente al crear y modelar el tipo de Digital Twin, en la pestaña de acciones). A continuación, selecciona el Nombre Personalizado de Evento “JoystickEventup” y el número deseado de resultados para esta consulta; por ejemplo, “3”. Después, haz clic en “Ejecutar consulta” y comprueba el resultado:

[

    {

        "eventName": "joystickEventUp",

        "_id": {

            "$oid": "5b07deb9e732b200013e7c83"

        },

        "type": "Sensehat",

        "event": "CUSTOM",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T10:00:25.550Z"

        }

    }

]

7)    Vuelve a seleccionar la operación Acción. A continuación, selecciona el número deseado de resultados para esta consulta; por ejemplo, “3”. Después, haz clic en “Ejecutar consulta” y comprueba el resultado:

[

    {

        "action": "joystickUp",

        "_id": {

            "$oid": "5b07df4ae732b200013e7cc1"

        },

        "type": "Sensehat",

        "deviceId": "555c9564-048c-424b-ae92-19b3ce73e6b8",

        "timestamp": {

            "$date": "2018-05-25T10:02:50.043Z"

        }

    }

]