Los grupos de dispositivos son una característica útil que te permite simplificar tu flota de IoT. Al agrupar dispositivos, puedes hacer cosas como:
Escenario | Ejemplo |
En un desplegable de tablero dinámico, muestra solo los dispositivos de un grupo determinado. | |
En un widget de mapa o widget de tabla de dispositivos, muestra solo los dispositivos de un grupo determinado. | |
Usa Eventos Globales para crear un solo evento que puede ser activado por cualquier dispositivo del grupo, ahorrando la necesidad de crear miles de eventos. |
Este artículo explica cómo configurar un proyecto de Google Sheets para:
Obtener todos los dispositivos de un grupo determinado e imprimirlos en una hoja
Obtener todos los dispositivos de la hoja actual y asignarlos a un grupo
Requisitos
Una cuenta activa de Google Apps, con acceso a Google Drive y Google Sheets
Una cuenta activa de Ubidots con acceso a la función de Grupos de Dispositivos
Al menos dos grupos de dispositivos creados en tu cuenta de Ubidots
1. Crear una Google Sheets
Crea un Google Sheets con las siguientes hojas y columnas:
Google Sheets: Una hoja por grupo. Nombra la hoja usando la etiqueta del Grupo de Dispositivos, NO el nombre. Para recuperar la etiqueta, ve a "Dispositivos" --> "Grupos" y verifica la columna "Etiqueta" en la tabla de Grupos de Dispositivos:
Columnas de Google Sheet: En cada hoja, agrega estas columnas:
Nombre | Etiqueta | ID | Enlace |
Como ejemplo, he creado una hoja de cálculo de Google con dos hojas, cada una correspondiente a dos de los grupos en mi cuenta: "weather
" y "group_abcd
":
2. Crear un Script de Google
En la pestaña "Extensiones" de tu hoja de cálculo de Google, ve a "Editor de secuencias de comandos":
Luego dale un nombre al Proyecto y haz clic en "Guardar":
Copia el siguiente código, reemplazando la variable "TOKEN" con tu propio token de cuenta de Ubidots.
2.1. Código de Script de Google
Este código tiene dos funciones principales:
getDevicesOfCurrentGroup
: Usa el nombre de la hoja como etiqueta del grupo de dispositivos y hace una solicitud a este endpoint de la API (/api/v2.0/device_groups/<device_group_key>/devices/
) para recuperar todos los dispositivos en el grupo.setDevicesOfCurrentGroup
: Lee la columna "etiqueta" de la hoja actual para crear un array de etiquetas de dispositivos, luego usa el nombre de la hoja como etiqueta del grupo de dispositivos para enviar ese array a este endpoint de la API (/api/v2.0/device_groups/<device_group_key>/_/assign_devices/
).
NOTA: La función setDevicesOfCurrentGroup
no borra dispositivos de un grupo. Si borras una fila de la hoja, no eliminará el dispositivo del grupo.
TOKEN = '<YOUR-UBIDOTS-TOKEN>'
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Ubidots')
.addItem('Get devices of current group', 'getDevicesOfCurrentGroup')
.addItem('Add devices to current group', 'setDevicesOfCurrentGroup')
.addToUi();
}
function getDevicesOfCurrentGroup() {
var sheet = SpreadsheetApp.getActiveSheet();
var deviceGroupLabel = sheet.getName();
if (deviceGroupLabel) {
var devices = getDevicesInGroup(deviceGroupLabel);
var data = devices.map(function(device) {
return [
device.name,
device.label,
device.id,
device.url
];
});
var range = sheet.getDataRange();
range.offset(1, 0, range.getNumRows()).clearContent();
range.offset(1, 0, data.length, data[0].length).setValues(data);
SpreadsheetApp.getUi().alert("Retrieved " + devices.length + " devices from group " + deviceGroupLabel);
} else {
SpreadsheetApp.getUi().alert("Could not find device group " + deviceGroupLabel);
}
}
function setDevicesOfCurrentGroup() {
var sheet = SpreadsheetApp.getActiveSheet();
var deviceGroupLabel = sheet.getName();
if (deviceGroupLabel) {
var deviceLabels = getDeviceLabels(sheet);
console.log(deviceLabels);
assignDevicesToGroup(deviceGroupLabel, deviceLabels);
SpreadsheetApp.getUi().alert("Synced " + deviceLabels.length + " devices to group " + deviceGroupLabel);
} else {
SpreadsheetApp.getUi().alert("Could not set devices in group " + deviceGroupLabel);
}
}
function getDevicesInGroup(deviceGroupLabel) {
var url = "https://industrial.api.ubidots.com/api/v2.0/device_groups/~" + deviceGroupLabel + "/devices/";
var response = UrlFetchApp.fetch(url, {
"headers": {
"X-Auth-Token": TOKEN
}
});
var data = JSON.parse(response.getContentText());
if (data.results.length > 0) {
return data.results;
} else {
return [];
}
}
function getDeviceLabels(sheet) {
var data = sheet.getDataRange().getValues();
var deviceLabels = [];
for (var i = 1; i < data.length; i++) {
if (data[i][1]) {
deviceLabels.push('~' + data[i][1]);
}
}
return deviceLabels;
}
function assignDevicesToGroup(deviceGroupLabel, deviceLabels) {
var url = "https://industrial.api.ubidots.com/api/v2.0/device_groups/~" + deviceGroupLabel + "/_/assign_devices/";
var payload = JSON.stringify(deviceLabels);
var response = UrlFetchApp.fetch(url, {
"method": "post",
"headers": {
"X-Auth-Token": TOKEN,
"Content-Type": "application/json"
},
"payload": payload
});
}
3. ¡Ejecuta el proyecto!
Regresa a tu archivo de hojas de cálculo y actualiza la página para ver el menú recién creado:
Ahora haz clic en cada opción del menú para ver los resultados:
3.1. Función "Get devices of current group"
En mi ejemplo, se recuperan los 7 dispositivos del grupo:
3.2. Función "Add devices to current group"
Ahora vamos a copiar el dispositivo "Menlo Park" al grupo "group_abcd" y ejecutamos la función "Add devices to current group":
¡Ahora puedo ver el dispositivo "Menlo Park" en el grupo con la etiqueta "group_abdc"!
4. Mejoras
Dependiendo de tu caso de uso y tamaño de la flota, es posible que desees agregar las siguientes mejoras al código:
Incluir un parámetro
page_size
en la llamada a la API de "Get devices of current group
", para solicitar más dispositivos que el tamaño de página predeterminado. Consulta API docs - Pagination.Si la solicitud tarda demasiado, considera agregar un bucle
for
para dividirla en múltiples solicitudes. Por ejemplo, si se recuperan 1,000 dispositivos, haz 10 solicitudes con page_size=100.
Agregar una lógica para detectar filas en blanco y borrar el dispositivo faltante del grupo de dispositivos.
Ejecutar periódicamente la función "
Get devices of current group
" utilizando los activadores basados en tiempo de App Script, para asegurar que tu hoja esté siempre actualizada.