UbiFunctions es un entorno de computación sin servidor diseñado para aplicaciones IoT, eliminando la necesidad de servidores adicionales. Esta guía lo llevará a través del uso de UbiFunctions para mejorar su experiencia con Ubidots, ya sea extrayendo datos de APIs de terceros, personalizando gateways de API HTTP o transformando y analizando datos de sensores.
Requisitos
Una cuenta de Ubidots con plan Industrial.
Se requiere un plan Enterprise para usar Propiedades Globales en UbiFunctions.
1. ¿Qué es una UbiFunction?
Una UbiFunction es un código definido por el usuario que se ejecuta bajo demanda. Puede desencadenarse de dos maneras:
Haciendo una solicitud HTTP GET o POST a la URL generada automáticamente de UbiFunction.
Basado en un intervalo de repetición predefinido.
2. ¿Cuándo usar UbiFunctions?
Puede usar UbiFunctions para extender las capacidades de Ubidots con su lógica personalizada. La mayoría de los casos de uso se dividen en las siguientes tres categorías:
Extrayendo datos de APIs de terceros
Personalizando su propio gateway de API HTTP
Transformando y analizando datos de sensores
2.1. Extrayendo datos de APIs de terceros
La mayoría de las aplicaciones web tienen una API y en la mayoría de los casos, podrá acceder a sus datos programáticamente sin mucha dificultad.
Puede usar UbiFunctions para encender o apagar un clúster de Bitcoin basado en la relación precio de Bitcoin/energía o analizar la relación entre los precios de las materias primas y las condiciones meteorológicas.
Ejemplo de extracción de datos meteorológicos:
Dispositivos AmbientWeather → Nube de AmbientWeather → Ubidots (ver ejemplo)
2.2. Personalizando su propio gateway de API HTTP
En casos donde la comunicación HTTP con Ubidots es problemática o cambiar métodos HTTP, cargas útiles o URLs es difícil, UbiFunctions le permite crear APIs HTTP personalizadas para ingerir y transformar datos para que se ajusten a los formatos esperados de Ubidots.
Dispositivos LoRaWAN --> Plataforma Comcast machineQ --> Ubidots (muéstrame cómo)
Dispositivos LoRaWAN --> The Things Network --> Ubidots (muéstrame cómo)
Dispositivos Sigfox -->Sigfox Cloud --> Ubidots (muéstrame cómo)
2.3. Transformando y analizando datos de sensores
Con UbiFunctions, tiene acceso a muchas bibliotecas de Python y Node.js para la transformación y análisis de datos.
Aquí algunos posibles casos de uso para la transformación y análisis de datos:
Asignar una ubicación GPS a sus dispositivos, basado en los enrutadores WiFi o IDs de torres de celular cercanas. Ver ejemplo.
Evaluar la probabilidad de un accidente en la planta de producción, basado en las propiedades de un trabajador (es decir, ciudad, proceso de producción, turno) y las variables de una máquina (es decir, velocidad, temperatura, presión, vibración).
3. Entendiendo el módulo de funciones
Después de acceder a la página de funciones, desde “dispositivos” → “funciones”, verá una tabla con todas sus funciones (en caso de que ya haya creado alguna) y el botón para crearlas.
La tabla de funciones tiene las siguientes características:
Una barra de búsqueda para encontrar funciones específicas basadas en su nombre.
El nombre de sus funciones.
La fecha en la que se crearon las funciones.
La URL de las funciones.
Un botón (representado con tres puntos) junto a cada función con las siguientes opciones:
Registro: Información detallada sobre las ejecuciones de su función. Los registros se explican a continuación en esta guía.
Editar: Las funciones pueden modificarse utilizando esta opción.
Desactivar: Utilizado en caso de que necesite desactivar temporalmente su función, pero desee conservarla para uso posterior.
Eliminar: Utilizado para eliminar permanentemente su función.
Al hacer clic en el botón “+” o en los botones de edición, accederá a la función y su configuración. Cada función se divide en tres pestañas principales que se explican a continuación:
3.1. Editor de código de la función
Esta pestaña contiene las siguientes características:
Editor de código: Donde escribe el código de su función.
Pánel de archivos: Donde encuentras todos los archivos de tu función y creas más usando el botón "+".
Menú desplegable de método HTTP: Elija entre realizar solicitudes GET o POST. Esta opción también se encuentra en la configuración de la función.
URL de la función: Siempre disponible para ser copiada fácilmente.
Runtime: Elija entre las opciones disponibles de runtime de Python o Node. Esta opción también se encuentra en la configuración de la función.
Consola: Aquí se muestran los resultados y la salida de las pruebas de su función.
Botón de guardar y ejecutar prueba: Pruebe su función con un JSON de prueba.
Botón de guardar y desplegar: Una vez que su función esté lista, guarde sus últimos cambios y despliegue la función.
Botón dark mode: Cambia el color de fondo del editor de código entre el modo claro y oscuro.
Botón de visibilidad de archivos: Expande o colapsa el pánel de archivos.
3.2. Configuración de la función
Las siguientes son las configuraciones disponibles para definir cómo funciona una función:
Nombre: El identificador de su función. Tenga en cuenta que este nombre luego se convertirá en parte de la URL de la función. La URL no se puede cambiar después, incluso si se modifica el nombre de la función.
Runtime: La versión de Python o Node que elija para ejecutar su función definirá, en gran medida, lo que su función podrá hacer. Consulte los runtimes disponibles y las bibliotecas que se admiten para cada uno de ellos en esta guía.
Método HTTP: Se puede elegir entre GET o POST como método. Un método GET se usa para solicitar datos de un recurso especificado, mientras que POST se usa para enviar datos a un servidor para crear/actualizar un recurso.
URL de punto final HTTPS: Aquí va la URL de la plataforma de terceros a la que realizará las solicitudes.
Host MQTT: Enviar datos a esta función usando MQTT
Nombre de usuario MQTT: Logre la autenticación MQTT utilizando el nombre de usuario que se muestra en este campo y uno de sus tokens como contraseña.
Tema MQTT: Las cargas útiles recibidas en este tema se enviarán a esta función
Token: Puede usar el menú desplegable para seleccionar el token que autenticar sus solicitudes. Puede llamar a su función con el token key; esto le ahorra tener que copiar-pegar tokens de API directamente en el código.
Variables de entorno: Seleccione cualquier número de variables de entorno que haya creado previamente a través del módulo de Propiedades Globales. Con estas propiedades, puede almacenar fácilmente variables globales para acelerar el desarrollo y mantener los recursos organizados. Siga la guía de Propiedades Globales para aprender a usarlas.
Tiempo máximo de ejecución: Si una función no se ejecuta dentro de este tiempo, se termina y se genera una respuesta 502. Por defecto, este tiempo es de 10 segundos y puede aumentarse dependiendo de su plan, de la siguiente manera:
Emprendedor: Hasta 30 segundos.
Profesional: Hasta 30 segundos.
Industrial: Hasta 60 segundos.
Todos los niveles Enterprise: Hasta 60 segundos.
Notas:
- Las funciones pueden tener "tiempos máximos de ejecución" superiores a 60 segundos si se acuerda entre el usuario y Ubidots. Sin embargo, si una de estas "funciones especiales" tarda más de 60 segundos en ejecutarse (incluso con su "tiempo máximo de ejecución" más alto), se vuelve asíncrona. Esto significa que la función se ejecutará, pero Ubidots no esperará su respuesta; la respuesta de una función asíncrona estará disponible en sus registros.
- Si necesita tiempos de ejecución más altos, comuníquese con nosotros en sales@ubidots.com
Desencadenador basado en tiempo: Si necesita que su función se ejecute en intervalos de tiempo periódicos, defina un desencadenador basado en tiempo, expresado en minutos. El valor mínimo es 1 y el máximo es 60.
Expresión Crontab: Especificar, basado en la fecha/hora, la frecuencia con la que se ejecutarán las funciones.
Función en bruto: Utilice funciones en bruto para lograr un nivel avanzado de personalización. Las funciones en bruto le permiten:
Usar una ruta de punto final personalizada.
Recibir y responder encabezados personalizados.
Establecer códigos de respuesta personalizados.
Recibir y responder encabezados de tipo de contenido personalizados para el cuerpo de la solicitud y la respuesta.
Recibir cualquier tipo de estructura de datos (objeto, cadena, array, imágenes, etc.). Tenga en cuenta, sin embargo, que se convertirá en una cadena. Las funciones normales (las que no usan en bruto) solo pueden recibir JSON en sus cuerpos.
Política de CORS: Se utiliza para permitir que la función se llame desde URLs del navegador web diferentes de parse.ubidots.com.
3.3. Registros de la función
La página de registros está dividida en dos secciones, el panel izquierdo y el área de contenido. En ellos, encontrará la siguiente información.
Lista de registros: Ubicada en el panel izquierdo, encontrará la lista de registros de todas las ejecuciones de su función. Cada elemento de la lista contiene la fecha y hora de la ejecución, el ID de la ejecución y el tiempo de ejecución de la función. Cada elemento de la lista se puede hacer clic para acceder a más información.
Resultados: Ubicados en el área de contenido, los resultados de la declaración de retorno de la función se mostrarán en este campo. Si su función no tiene una declaración de retorno, se mostrará un mensaje “null”.
Salida: Ubicada debajo del campo de resultados, lo que su función imprime se mostrará aquí. Además, los mensajes del servidor también se mostrarán aquí cuando ocurra un error en el lado del servidor o se agote el tiempo de la función.
4. Codificación de una UbiFunction
UbiFunctions acepta NodeJS LTS o Python3, lo que significa que puede usar código Javascript o Python para extraer, transformar y analizar datos. Su función recibe "args" como un diccionario, al que luego puede acceder en su código para realizar la transformación de datos deseada. El código se ejecuta cada vez que se solicita la URL del punto final.
Ejemplo de función:
Por defecto, cada nueva UbiFunction está poblada con un código de muestra que usa datos de entrada (token, dispositivo y valor de temperatura) para hacer una solicitud a la API de Ubidots. Este código de muestra demuestra un simple endpoint HTTP GET que recibe un token de Ubidots, una etiqueta de dispositivo y un valor de temperatura como parámetros de URL, luego usa estos datos para hacer una solicitud HTTP POST a la API de Ubidots.
Puede probar la función de muestra haciendo clic en el botón “guardar y desplegar”, luego pegue la siguiente URL en su navegador web (actualizando el nombre de usuario y token de su cuenta.
Nota: El identificador de cualquier función dentro de UbiFunctions es su nombre. Aquí, la función de prueba se llama "new-function" y, en consecuencia, al probar la función de muestra proporcionada, el motor de UbiFunctions identificará esta función particular en su cuenta (de nadie más) y reportará un valor de temperatura y un token.
Ahora puede comenzar a codificar su función. Tenga en cuenta que la carga de retorno siempre debe estar en formato de diccionario. Enviar una sola variable no se puede entender y debe devolverse en formato de diccionario.
SÍ |
|
NO |
|
Para saber qué bibliotecas soporta actualmente el módulo de UbiFunctions, consulte este artículo UbiFunctions & Plugins: Bibliotecas soportadas.
Más ejemplos:
5. Ejecutando la función
Durante el proceso de desarrollo, querrá probar su función para ver si está en el camino correcto hacia el resultado deseado. Para hacerlo, haga clic en el botón "guardar y ejecutar prueba". Esto traerá una pantalla modal que solicita algunos datos de entrada para probarla. Ingrese un diccionario JSON de entradas de muestra si es necesario. La consola mostrará la salida y los registros de la función. Puede dejar esto en blanco si su función no requiere una entrada.
En el caso de la función de muestra predeterminada de Ubidots, ingrese la carga JSON a continuación que contiene los parámetros que desea pasar a través de la solicitud HTTP GET:
{"token":"your-token","Device":"sample-function","Temperature":"45"}
Después de hacer clic en el botón "guardar", aparecerá una ventana de consola con tanto la salida de la función como los registros de los resultados:
Salida de la función: Esto es lo que devuelve su función. Debe estar en formato de diccionario JSON. En su código, asegúrese de usar "return" para salir de la función y devolver el diccionario.
Registros: Esto se usa para fines de depuración. Use console.log("hello") para dejar rastros en esta consola.
Nota: Para que su función esté completamente desplegada después de hacer clic en el botón “guardar y desplegar”, espere un tiempo (alrededor de 10 segundos suelen ser suficientes).
6. Facturación de UbiFunctions
Las UbiFunctions están incluidas en planes Industriales y superiores.
Las ejecuciones se agotan después de 30 o 60 segundos, según su plan. Si desea extender este tiempo, comuníquese con nuestro equipo de soporte.
Si alguna ejecución supera los 2 segundos; se cuenta como 2 ejecuciones (o más, según la duración de la ejecución).
Las ejecuciones se facturan en incrementos de $5 por millón de ejecuciones.