Anexo 1: rainmaker

Warning

¿Para qué estudiar rainmaker?

Vale la pena estudiar este framework del fabricante porque te permitirá realizar ensayos rápidos o prototipos rápidos para probar en pequeños lotes una idea. SIN EMBARGO, el framework tiene en consideración todos los aspectos de producción que estudiamos en el curso.

Vale la pena estudiarlo como un referente a la hora de que quieras hacer tu propia arquitectura de aplicación IoT.

En este anexo te voy a dejar un framework construido sobre el ESP-IDF llamado RainMaker. Este framework producido por Espressif te permitirá hacer aplicaciones IoT de manera rápida SIN tener que programar una aplicación móvil y sin tener que provisionar una infrastructure en la nube. SOLO te concentras en la programación del sistema embebido.

Ejercicios

Ejercicio 1: ¿Cómo puedes comenzar?

Ya tienes todo lo que necesitas solo te falta descargar RainMaker y descargar la aplicación móvil en un celular.

Para Descargar RainMaker sigue estos pasos:

  • En la carpeta donde tienes los proyectos del curso descarga rainmaker:

  • Descarga la aplicación móvil de aquí:

  • Abre el proyecto switch y realiza las modificaciones según tu hardware. En mi caso tengo el botón en el puerto 19 y su nivel activo es 0. Tengo el LED en el puerto 5 y el valor por defecto DEFAULT_POWER será false (que debes configurar en app_priv.h)

    En app_driver.c :

    /* This is the button that is used for toggling the power */
    #define BUTTON_GPIO          19
    #define BUTTON_ACTIVE_LEVEL  0
    
    /* This is the GPIO on which the power will be set */
    #define OUTPUT_GPIO    5
    static bool g_power_state = DEFAULT_POWER;
    

    Nota que la línea #define BUTTON_GPIO  5 era originalmente #define BUTTON_GPIO CONFIG_EXAMPLE_BOARD_BUTTON_GPIO. Por tanto, ya no podrás configurar el puerto del botón utilizando menuconfig; sin embargo, lo hago así porque el puerto del LED no está disponible para ser configurado por menuconfig y si o si tendré que editar manualmente el archivo app_driver.c

  • Ahora ejecuta menuconfig y modifica la zona horaria. Ingresa por Component config, ESP_RainMaker Common, Default Timezone y escribe America/Bogota.

  • Compila así (recuerda modificar tu puerto serial)

    export ESPPPORT=/dev/TU_PUERTO_SERIAL
    idf.py set-target esp32
    idf.py erase_flash
    idf.py -b 921600 build flash monitor
    

    Nota: la opción set-target esp32 te permite seleccionar el microcontrolador que utilizarás para probar. Ten presente que puedes usar también el esp32-s2 si tuvieras esta tarjeta.

  • Una vez la aplicación se ejecute, el ESP32 quedará en modo provisioning mediante bluetooth low energy. Aquí vas a necesitar usar la aplicación móvil. Ten presente que el esp32 puede quedarse un rato mostrando este mensaje: W (1102) esp_claim: Generating the private key. This may take time.. Finalmente, debes ver algo similar a esto:


QR para provisionar

  • Abre la aplicación móvil:

    • Crea una cuenta.

    • Add Device

    • Escanea el código QR. Si todo sale bien verás el mensaje Claiming un progress

    • Ahora la aplicación te preguntará por la red WiFi a provisionar.

    • Si todo sale bien y tu dispositivo se conecta a Internet verás algo similar a esto:


      rainmaker device Browser

  • Ahora puedes interactuar con el esp32 desde la aplicación móvil. Observa el reporte del esp32 en la terminal. Busca en la terminal un mensaje relacionado con la sincronización del tiempo:

    I (453732) esp_rmaker_time: SNTP Synchronised.
    I (453732) esp_rmaker_time: The current time is: Sun Mar 21 12:18:31 2021 -0500[>], DST: Yes.
    I (538702) esp_rmaker_param: Received params: {"Switch":{"Power":true}}
    I (538702) app_main: Received write request via : Cloud
    I (538702) app_main: Received value = true for Switch - Power
    I (538712) esp_rmaker_param: Reporting params: {"Switch":{"Power":true}}
    I (541882) esp_rmaker_param: Received params: {"Switch":{"Power":false}}
    

    Nota que la zona horaria corresponde a la nuestra: -0500[>],.

Ejercicio 2: ¿Qué es rainmaker?

En este enlace puedes leer al respecto. La siguiente figura tomada del sitio anterior resumen un poco de qué se trata:

esquema de rainmaker

Ejercicio 3: mini-reto

Luego de la lectura del ejercicio anterior, trata de resumir el flujo de desarrollo con rainmaker.

¿Si quieres controlar o leer externamente un actuador o sensor qué debes hacer?

Ejercicio 4: sobre el ejemplo switch

Revisa de nuevo los conceptos fundamentales de rainmaker en este enlace. En el ejemplo solo estamos usando un DEVICE, pero nota que un NODE podría tener varios DEVICES:

nodo con múltiples devices.

En el ejemplo switch, el device tiene dos parámetros standard: nombre y power. Recuerda del ejercicio 2 que tu puedes definir tus propios parámetros.

Además de devices con sus parámetros, a cada NODE le puedes asociar SERVICIOS, por ejemplo OTA.

En este enlace puedes estudiar cómo desarrollar tu propio programa usando rainmaker.

Ejercicio 5: comunicaciones entre el nodo y la nube

En este enlace puedes leer los detalles de comunicación entre el esp32 y la nube.

Ejercicio 6: user-node mapping

¿Cómo se logra asociar un NODE a la aplicación móvil?

Analiza el siguiente enlace.

Ejercicio 7: ¿Cómo se agreda un NODE a la nube

Se realiza mediante un proceso denominado claiming que puedes consultar aquí. En particular, en el ejemplo de este anexo se utiliza la opción Assisted Claiming.

Ejercicio 8: servicio de OTA

Rainmaker permite acceder al dispositivo por medio de un dashboard con el cual puedes hacer OTA. Ten presente que también puedes hacer OTA desde tu computador enviando la nueva imagen del programa a la nube de rainmaker.

Prueba el servicio de OTA con el dashboard así:

  • Modifica el código (app_main.c) así:

 /* Enable OTA */
 esp_rmaker_ota_config_t ota_config = {
     .server_cert = ESP_RMAKER_OTA_DEFAULT_SERVER_CERT,
 };
// esp_rmaker_ota_enable(&ota_config, OTA_USING_PARAMS);
 esp_rmaker_ota_enable(&ota_config, OTA_USING_TOPICS);
  • Realiza un build, flash and monitor para que el esp32 tenga una nueva versión del firmware que soporte esta nueva modalidad de OTA.

  • Realiza una pequeña modificación al código del proyecto de modo que puedas verificar un nuevo comportamiento cuando hagas el OTA.

  • Modifica la versión del proyecto en el CMakeLists.txt del proyecto:

    set(PROJECT_VER "1.1")
    
  • Realiza únicamente un BUILD (ojo, no hagas flash) para generar la nueva versión.

  • Ingresa al dashboard. En Firmware Images selecciona el botón Add Image. Asigna una Image Name cualquiera y un Type cualquiera. No tienes que llenar los campos de las sección Advanced. Ahora selecciona la imagen (el ejecutable) que estará en la carpeta build del proyecto.

  • Una vez el nuevo firmware sube a la nube correctamente selecciona Start OTA. Ingresa un Job Name cualquiera, selecciona Nodes y escoge el node-id del nodo que vas a actualizar. SELECCIONA Force Push para obligar a que la actualización se haga de inmediato. Selecciona el botón Start OTA.

Ejercicio 9: servicio de OTA desde terminal

También puedes hacer OTA desde la terminal utilizando la CLI de rainmaker.

Sigue estos pasos:

  • Modifica el código (app_main.c) así:

 /* Enable OTA */
 esp_rmaker_ota_config_t ota_config = {
     .server_cert = ESP_RMAKER_OTA_DEFAULT_SERVER_CERT,
 };
 esp_rmaker_ota_enable(&ota_config, OTA_USING_PARAMS);
// esp_rmaker_ota_enable(&ota_config, OTA_USING_TOPICS);
  • Realiza un build, flash and monitor para que el esp32 tenga una nueva versión del firmware que soporte esta nueva modalidad de OTA.

  • Realiza una pequeña modificación al código del proyecto de modo que puedas verificar un nuevo comportamiento cuando hagas el OTA.

  • Modifica la versión del proyecto en el CMakeLists.txt del proyecto:

    set(PROJECT_VER "1.2")
    
  • Realiza únicamente un BUILD (ojo, no hagas flash) para generar la nueva versión.

  • Ingresa a la carpeta cli del directorio rainmaker. No olvides que debes lanzar el ESP-IDF previamente desde el acceso directo (si estás en windows).

  • Instala las dependencias

pip3 install -r requirements.txt
  • Realiza la operación de login. Notarás que se abre el Browser

    ./rainmaker.py login
    
  • Averigua el node-id de tu dispositivo en rainmaker:

    ./rainmaker.py getnodes
    
  • Abre el monitor para que puedas ver la salida del esp32.

  • Realiza la operación de OTA:

    ./rainmaker.py otaupgrade 6wntTJZHwU82zSpKuLXKc8 ../examples/switch/build/switch.bin
    

    Ten en cuenta que esto puede tardar un poco y hacer varios reintentos:

    Checking esp.service.ota in node config...
    Uploading OTA Firmware Image...This may take time...
    Could not connect. Please check your Internet connection.
    Retries left: 4
    Could not connect. Please check your Internet connection.
    Retries left: 3
    Could not connect. Please check your Internet connection.
    Retries left: 2
    Setting the OTA URL parameter...
    OTA Upgrade Started. This may take time.
    Getting OTA Status...
    [08:07:50] in-progress : Downloading Firmware Image
    [08:07:58] in-progress : Downloading Firmware Image
    [08:08:07] in-progress : Downloading Firmware Image
    [08:08:15] in-progress : Downloading Firmware Image
    [08:08:25] success : OTA Upgrade finished successfully
    

    Ten paciencia, si no te funciona prueba de nuevo.

Ejercicio 10: servicio de tiempo

Es un servicio que permite al node sincronizar la hora y la fecha utilizando SNTP y ajustarla según la zona horaria.

Ejercicio 11: programación de eventos

El ejemplo switch también permite programar eventos. Para hacerlo deberás utilizar la aplicación móvil (ícono schedules).

Ejercicio 12: que viene de nuevo en rainmaker

RainMaker es una herramienta en evolución, se ven venir cosas interesantes.

Ejercicio 13: arquitectura de la app en la nube

¿Cómo funciona rainmaker?.

Ejercicio 14: alexa de Amazon

El ejemplo que estamos utilizando soporta servicios externos como alexa. Para activar este servicio tendrás que:

  • Instalar en tu celular la aplicación de Amazon alexa.

  • Habilitar en alexa el skill de RainMaker aquí. o directamente en la aplicación móvil seleccionado la opción Más y luego Skills y juegos. Busca esp rainmaker y ACTIVA SKILL.

  • Adicionar el dispositivo en tu app de alexa.

Una vez hagas todo esto ya estás listo. Podrás controlar tu dispositivo con alexa.

captura alexa switch en alexa

Ejercicio 15: google Google Voice Assistant

Puedes hacer lo mismo con el asistente de voz de Google.

  • Instala la aplicación Google Home.

  • Crea un Hogar.

  • Selecciona configuración.

  • En la parte inferior busca FUNCIONA CON GOOGLE.

  • Busca esp RainMaker.

  • Vincula con tu cuenta en RainMaker.

  • Agrega los dispositivos. Te preguntará a qué habitación.

Ya estás listo!

captura gva switch en gva