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
Requisitos
Creando un UbiFunction
Codificando un UbiFunction
Verificando la Recepción de Datos
Depuración y Registros
Resumen
1. Requisitos:
Cuenta de Sensoterra para acceder a tus sondas a través de la API.
Sonda de humedad del suelo registrada y enviando datos a tu cuenta de Sensoterra.
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: