Ir al contenido principal
Todas las coleccionesGuías de desarrollador
UbiFunctions: Integra datos de la plataforma Sensoterra a Ubidots
UbiFunctions: Integra datos de la plataforma Sensoterra a Ubidots

Aprende a configurar y analizar datos de la plataforma Sensoterra a la plataforma de desarrollo de aplicaciones IoT de Ubidots.

David Sepúlveda avatar
Escrito por David Sepúlveda
Actualizado hace más de 3 meses

Sensoterra es la solución robusta, de bajo costo y completamente inalámbrica para la medición en tiempo real de la humedad del suelo para la agricultura, la horticultura, la restauración de la naturaleza y el paisajismo.

En este tutorial, demostraremos cómo integrar las sondas de humedad del suelo de Sensoterra con Ubidots utilizando el complemento UbiFunction.

Paso a Paso

  1. Requisitos

  2. Creando un UbiFunction

  3. Codificando un UbiFunction

  4. Verificando la Recepción de Datos

  5. Depuración y Registros

  6. Resumen

1. Requisitos:

2. Creando un UbiFunctions

Para crear una función sin servidor que analice datos de Sensoterra a Ubidots, necesitas tener una suscripción activa de Ubidots. Ve a la pestaña "Datos" y selecciona "Función" y crea una nueva función.

Crea una nueva función (haz clic en el ícono "+") y dale a la nueva función un nombre descriptivo que se asemeje a la función de análisis que se va a ejecutar. En este caso la llamamos "Sensoterra". En la URL del Endpoint HTTPS, selecciona "POST" como el método para activar la función y establece el disparador basado en el tiempo a 60 minutos, luego haz clic en el botón ‘Hacerlo en vivo’:

NOTA: si tu cuenta no tiene ‘disparador basado en el tiempo’ como en la imagen de abajo, por favor contacta a support@ubidots.com, el equipo de soporte de Ubidots para habilitar esta función en tu cuenta. Esta función de disparador ejecutará la función automáticamente cada X minutos para recuperar los últimos datos de los servidores de Sensoterra a través de la API.

3. Codificando un UbiFunction

El código de muestra a continuación tiene 5 funciones:

  • Una función main que gestiona las otras 4 funciones que manejan la autenticación con Sensoterra, la obtención de la API Key, la obtención de las sondas de humedad del suelo disponibles y construye una carga útil JSON adecuada para la API REST de Ubidots. Luego, la función completa haciendo una solicitud POST a Ubidots, actualizando cualquier información de dispositivo o variable en el proceso. Además, main también analizará los datos provenientes de la lista de sondas disponibles de Sensoterra para que sean entendidos por Ubidots.

  • Una función getApiKey: autentica con la API de Sensoterra utilizando las credenciales de la cuenta y recupera una API Key válida por 30 minutos.

  • Una función getProbes que utiliza la API Key de Sensoterra mencionada anteriormente para recuperar una lista de las sondas de humedad del suelo disponibles dentro de la cuenta.

  • Una función buildJson que estructura los datos analizados en la función principal de acuerdo con la API REST de Ubidots.

  • Una función ubidotsPost, que utiliza el TOKEN especificado, device_label y una carga útil JSON como entrada para hacer una solicitud HTTP POST a la API de Ubidots.

Usando la lógica anterior, obtenemos la capacidad de recuperar datos de humedad del suelo de una cuenta de Sensoterra con sondas registradas, analizar los datos recuperados y luego publicar dichos datos en Ubidots.

/* MÓDULOS */var request = require('request-promise');/* VARIABLES */var lat, lng, status, signal_strength, post_response, payload;/* CONSTANTES */const URL_SENSOTERRA = 'https://monitor.sensoterra.com/api/v3';const EMAIL_SENSOTERRA = 'PUT-SENSOTERRA-EMAIL-HERE'; // Nombre de usuarioconst PASSWORD_SENSOTERRA = 'PUT-SENSOTERRA-PASSWORD-HERE'; // Contraseñaconst LIMIT = 50; // Número de sondas a recuperar de Sensoterraconst SKIP = 0; // Número de sondas a omitir de Sensoterraconst TOKEN_UBIDOTS = 'PUT-YOUR-UBIDOTS-TOKEN-HERE';const UBIDOTS_VARIABLE_LABEL_SOIL_MOISTURE= 'soil-moisture';const UBIDOTS_VARLABEL_GPS = 'location';/* Obtener una API Key para usar más adelante la API de Sensoterra. Expira después de 30 minutos */async function getApiKey(endpoint, username, password){    var url_auth = endpoint + '/customer/auth';    var options = {        method: 'POST',        url: url_auth,        body: {"email": username, "password": password},        json: true,        headers: {            'accept': 'application/json',            'language': 'en',            'Content-Type': 'application/json'        }    };    return await request.post(options);}/*Obtener*/async function getProbes(endpoint, key, limit, skip){    var url_probes = endpoint + '/probe?limit=' + limit + '&skip=' + skip;    var options_probes = {        method: 'GET',        url: url_probes,        json: true,        headers: {            'accept': 'application/json',            'language': 'en',            'api_key': key        }    };    return await request.get(options_probes);}/* Publicar datos en Ubidots */async function ubidotsPost(data, device_label, token){    token = token || TOKEN_UBIDOTS;    var options = {        method: 'POST',        url: 'https://industrial.api.ubidots.com/api/v1.6/devices/sensoterra' + device_label,        body: data,        json: true,        headers: {            'Content-Type': 'application/json',            'X-Auth-Token': token        }    };    return await request.post(options);}/* Construir JSON con humedad del suelo, ubicación GPS, variables de fuerza de señal */function buildJson(variable_lb, reading, datetime){    var payload = {        [variable_lb]: {            value: reading,            timestamp: datetime,            context: {                status: status            }        },        location: {            value: 1,            timestamp: datetime,            context: {                lat: lat,                lng: lng            }        },        signal_strength: {            value: signal_strength,            timestamp: datetime        }    };    return payload;}async function main(params) {    /* Obtener una API Key para autenticación */    var response = await getApiKey(URL_SENSOTERRA, EMAIL_SENSOTERRA, PASSWORD_SENSOTERRA);    var apiKey = response['api_key']; // Obtener API key de la respuesta.    /* Obtener el último valor de las sondas registradas en Sensoterra */    var probes = await getProbes(URL_SENSOTERRA, apiKey, LIMIT, SKIP);    //console.log(probes); // Imprimir sondas    var size = Object.keys(probes).length; // Tamaño del archivo JSON recuperado    for(var i = 0; i < size; i++){        var device_label = probes[i]['id'];        var value = probes[i]['status']['last_reading']; //último valor        var timestamp = new Date(probes[i]['status']['last_update']).valueOf(); //en milisegundos        lat = probes[i]['latitude'];        lng = probes[i]['longitude'];        status = probes[i]['status']['code'];        signal_strength = probes[i]['status']['signal_strength'];        /* Construir JSON */        payload = buildJson(UBIDOTS_VARIABLE_LABEL_SOIL_MOISTURE, value, timestamp);        /* Publicar en Ubidots */        post_response = await ubidotsPost(payload, device_label);    }    return post_response;}

3. Verificando la Recepción de Datos

Después de que tu función se ejecute por primera vez, los datos del dispositivo Sensoterra se publicarán en Ubidots y se mostrarán de manera similar a la de abajo:
Nota: recuerda que con Ubidots, cada vez que se identifica una nueva etiqueta de dispositivo, se creará automáticamente un nuevo dispositivo.

Y así es como se ve una vez dentro de un dispositivo, es decir, la ventana de variable:

5. Depuración y Registros

Además, un gran recurso de depuración es la capacidad de ver los registros de tu función. Para hacerlo, consulta la barra de control y selecciona el ícono "registros" como se muestra a continuación para ver el historial de las ejecuciones de tu función:

En los registros de la función, puedes confirmar que los datos se publicaron correctamente en Ubidots con el código de respuesta 201:

6. Resumen

En solo un par de minutos, integraste con éxito tu sensor Sensoterra para transmitir datos en vivo a Ubidots, donde los datos pueden comenzar a trabajar en tu aplicación impulsada por Ubidots. Ahora es el momento de ensamblar tableros y agregar usuarios que puedan ver e interactuar con los datos de tu aplicación. :)

¿Quieres compartir un UbiFunction útil para enseñar a otros cómo conectar los puntos? Siéntete libre de publicarlo en community.ubidots.com y ayudar a otro innovador de IoT a alcanzar sus objetivos.

Otros desarrolladores también encontraron útil:

¿Ha quedado contestada tu pregunta?