El sensor TA120 de CESVA es un sensor de medición de ruido para soluciones inteligentes. El sensor TA120 combina la precisión de un sonómetro Clase 1, la protección de un kit para exteriores y la conectividad completa con CESVA NoisePlatform y plataformas de código abierto.
En este artículo aprenderás cómo configurar tu TA120 y usar una UbiFunction para analizar la respuesta del protocolo de comunicación UltraLight 2.0, de modo que los datos del TA120 puedan ser enviados a un dispositivo Ubidots.
Requisitos
Un sensor TA120
Cuenta activa de Ubidots
Al menos una UbiFunction (si no tienes una aún, sigue este artículo primero)
1. Protocolo de Comunicación Ultralight 2.0
CESVA proporciona varios métodos para conectar el dispositivo a Internet y facilitar las solicitudes HTTP, utilizando protocolos de comunicación optimizados para bajo consumo de energía y ancho de banda limitado. Estos protocolos incluyen UltraLight 2.0 y el Formato JSON de Sentilo.
Ultralight 2.0 es un protocolo ligero basado en texto destinado a dispositivos y comunicaciones donde el ancho de banda y la memoria del dispositivo pueden ser recursos limitados. Dentro del software CESVA Sensor Manager, puedes configurar y seleccionar el protocolo de comunicación para realizar solicitudes HTTP.
En este enlace puedes descargar la estructura del protocolo CESVA TA120, que incluye UltraLight 2.0 y el Formato JSON de Sentilo.
2. Creación de una UbiFunction "raw"
Por defecto, una UbiFunction exclusivamente acomoda el tipo de contenido application/JSON. Sin embargo, es importante tener en cuenta que no todos los protocolos de comunicación dependen de este formato específico para transmitir datos.
En escenarios donde se emplean formatos alternativos, tienes la opción de activar la función raw dentro de tu UbiFunction, como se muestra en la imagen a continuación. Esta acción te permite recibir datos en cualquier formato y convertirlos en uno compatible con Ubidots.
Sigue este artículo para obtener información adicional sobre las funciones raw.
Necesitas seleccionar un Método POST y un Runtime Python 3.7. Después de activar la función, copia la URL del Endpoint HTTPS.
El código completo se proporciona a continuación para tu UbiFunction raw. Simplemente asegúrate de copiarlo y pegarlo en tu UbiFunction para una implementación sin problemas.
import time
import requests
from datetime import datetime
from urllib.parse import urlparse, parse_qs
BASE_URL = "https://industrial.api.ubidots.com"
LABELS_MAP = {
"n": "lat_sound_presure_level",
"o": "lat_overload",
"u": "lat_underrange",
"s": "la1s_registers",
"ef": "extra_functions_name",
"en": "extra_sound_presure_level",
"eo": "extra_overload",
"eu": "extra_underrange",
"es": "extra_1s_registers",
"b": "battery_level",
"p": "power_supply_status",
"w": "wifi_strength",
"m": "modem_strength"
}
def main(args):
print(f"Arguments is: {args}")
# Define the payload
payload = parse_and_build_payload(args["body"])
# Define query parameters
parsed_query_params = parse_path(args["path"])
token = parsed_query_params["k"][0]
device_label = parsed_query_params["i"][0]
dt = parsed_query_params["t"][0]
timestamp = int(datetime.fromisoformat(dt[:-1]).timestamp() * 1000)
# Send data
res = send_data(device_label, payload, token, **{"timestamp": timestamp})
print(res, res.json())
return {"status": "Ok"}
def parse_path(path):
parsed_result = urlparse(path)
dict_result = parse_qs(parsed_result.query)
return dict_result
def parse_and_build_payload(body):
split_data = body.split("|")[1:]
payload = {}
for i in range(0, len(split_data), 2):
label = LABELS_MAP[split_data[i]]
value = float(split_data[i+1])
payload[label] = value
return payload
def send_data(device, payload, token, **params):
url = f"{BASE_URL}/api/v1.6/devices/{device}"
headers = {"X-Auth-Token": token, "Content-Type": "application/json"}
res = make_request("post", url, headers=headers, params=params, json=payload, max_attempts=5)
return res
def make_request(
method,
url,
headers=None,
max_attempts=5,
params=None,
data=None,
json=None,
timeout=10
):
attempts = 1
kwargs = {
"method": method.upper(),
"url": url,
"headers": headers,
"params": params,
"data": data,
"json": json,
"timeout": timeout
}
try:
req = requests.request(**kwargs)
status_code = req.status_code
time.sleep(1)
while status_code >= 400 and attempts < max_attempts:
req = requests.request(**kwargs)
status_code = req.status_code
attempts += 1
time.sleep(1)
return req
except requests.ConnectionError as e:
print(f"Error de conexion: {e}")
return None
except requests.Timeout as e:
print(f"Connection timedout: {e}")
return None
except Exception as e:
print("[ERROR] There was an error with the request, details:")
print(e)
return None
3. Configuración del sensor TA120
Para el paso inicial de configurar el sensor TA120, es necesario descargar el Software CESVA Sensor Manager siguiendo la guía proporcionada. Este software facilita la configuración de todos los sensores CESVA para la transmisión de datos a varias conexiones de servidores.
Con el software CESVA Sensor Manager, puedes configurar los siguientes parámetros para la conexión del servidor:
Protocolo: Protocolo HTTP. Opciones: UL 2.0, Sentilo o CESVA.
Seguridad: seguridad del servidor (HTTP o HTTPS).
Host: servidor para la transmisión de datos. Nombre de tu dominio API.
Puerto: número de puerto del servidor. Por defecto es 80.
LinkData: nombre de tu ruta API.
Token: el valor de tu clave API para establecer una conexión con el servidor.
TLeq: selecciona el tiempo de integración T.
Overload/underrange: Activa o desactiva para enviar Sobrecarga y Subrango.
Función extra: Selecciona una de las siguientes funciones: LCT, LAFmaxT, LASmaxT.
LAeq1s: activa o desactiva para enviar registros de LAeq/función extra de 1s.
La imagen a continuación muestra una configuración básica del CESVA Sensor Manager.
Necesitas configurar los siguientes campos:
Protocolo: UltraLight 2.0.
Token: El token de tu cuenta.
LinkData: /prv/<nombre_de_usuario>/<nombre_de_funcion>
CESVA iniciará una solicitud POST al host designado, siguiendo sus especificaciones correspondientes de encabezado y cuerpo.
4. Recepción de datos en Ubidots
Una vez que hayas activado la función en tu cuenta y la hayas conectado exitosamente a tu sensor CESVA TA120, puedes esperar observar una salida similar a la siguiente dentro de los registros de la función.
Aquí están los datos de entrada recibidos de tu gestor de sensores:
2023-08-30T13:34:52.632667Z stdout: Arguments is: {'body': '|n|034.8|o|0|u|1|b|8|p|0|m|0\r\n', 'headers': {'connection': 'keep-alive', 'content-length': '30', 'content-type': 'text/plain; charset=UTF-8', 'host': 'parse.ubidots.com'}, 'path': '/prv/<nombre_de_usuario>/cesvat120?k=BBFF-DnrBpricV9PizIS3Um3NyYRi5jUt0L&i=TA120-T255615&t=2023-08-30T01:04:51Z&getCmd=1'}
Aquí puedes ver la salida después de analizar los datos y transformarlos en un formato JSON compatible con Ubidots.
2023-08-30T13:34:52.632817Z stdout: <Response [200]> {'battery_level': [{'status_code': 201}], 'lat_overload': [{'status_code': 201}], 'lat_sound_presure_level': [{'status_code': 201}], 'lat_underrange': [{'status_code': 201}], 'modem_strength': [{'status_code': 201}], 'power_supply_status': [{'status_code': 201}]}
En la imagen a continuación, puedes ver el dispositivo creado dentro de la UbiFunction, junto con las variables sin procesar que se han generado después de analizar los datos de entrada.