Ir al contenido principal

Conectar Terabee People Counting M a Ubidots

Esta guía describe cómo integrar el sistema de conteo de personas basado en Time-of-Flight 3D de Terabee, modelo M, en Ubidots utilizando Ubifunctions.

Santiago Pachon Robayo avatar
Escrito por Santiago Pachon Robayo
Actualizado hace más de 8 meses
Terabee_M.png

Requisitos

  • Una cuenta activa de Ubidots

  • Un dispositivo de conteo de personas Terabee, modelo M

  • Acceso a Internet por WiFi/Ethernet

Tabla de contenido

1. Configuración de la configuración de push de Terabee

Una Ubifunction es un código definido por el usuario que se ejecuta, bajo demanda, en nuestro caso, cada vez que recibe nuevos datos de su sensor Terabee. Usaremos MQTT + Ubifunctions para permitir que el dispositivo Terabee modelo M publique datos en Ubidots. En la sección 2 de este artículo, verá en detalle cómo crear una Ubifunction. Teniendo ya una Ubifunction, aquí nos centraremos en cómo configurar un dispositivo Terabee utilizando la información relevante sobre él y de su cuenta de Ubidots.

Primero, debe consultar la guía de instalación del conteo de personas M de su Terabee sobre cómo acceder y abrir su interfaz de usuario, luego en la sección 6, explican "Configuraciones de Data Push" donde puede elegir entre HTTP o MQTT. Usaremos este último para este ejemplo. Tenga en cuenta que puede encontrar su nombre de usuario de Ubidots y el token de su cuenta como se indica en este artículo. El nombre de las Ubifunctions se puede verificar como se ve a continuación.

image.png

Con esto en mano, podemos proceder a configurar su modelo M de conteo de personas Terabee de la siguiente manera:

  • Al marcar “push on event” cada vez que se actualicen los valores de los contadores, el dispositivo publicará datos; de lo contrario, debe marcar “push period(seconds)“ para establecer un período de push.

  • Marque push a MQTT broker e ingrese mqtt://functions.ubidots.com

  • Ruta del tema MQTT: /prv/<Su Nombre de Usuario de Ubidots>/<Nombre de la Ubifunction>

  • Usuario: <Su Nombre de Usuario de Ubidots>

  • Contraseña: <Su Token de Ubidots>

  • Autorización: <Su Token de Ubidots>

  • Certificado: Si no desea usarlo, debe marcar la casilla de omitir la verificación del nombre común; de lo contrario, puede descargar y usar uno de los certificados disponibles aquí en la sección 4. Aquí puede encontrar un ejemplo de configuración.

image.png

2. Decodificación de la carga útil de Terabee usando una Ubifunction

Los datos recibidos por la Ubifunction en el diccionario “args” pueden ser impresos, analizados, interpretados y modificados para crear una carga útil JSON compatible con Ubidots que se enviará a su cuenta de Ubidots mediante una solicitud HTTP “POST“ permitiéndole ver los valores de las personas que entran o salen y el número de personas dentro de una habitación (personas dentro - personas fuera). Aquí hay un ejemplo de código de Ubifunction para un dispositivo Terabee modelo M, observe que en este caso, no recibimos ningún valor para la clave “at” dentro del “body”, por lo tanto, establecemos la marca de tiempo utilizando la Ubifunction mediante los módulos datetime y pytz de Python 3.7.

'''This code parses data comming from a terabee model M device and converts it into an Ubidots compatible payload'''from datetime import datetime as dtimport pytzimport requestsimport jsonimport timeTIMEZONE = "Europe/London" # or your corresponding timezoneTOKEN = "<your Ubidots token>"BASE_URL = "https://industrial.api.ubidots.com"REQUESTS_FUNCTIONS = {"get": requests.get, "post": requests.post}def main(args):'''Main function - runs every time the function is executed."args" is a dictionary containing both the URL params and the HTTP body (for POST requests).'''  NOW = dt.now(tz=pytz.timezone(TIMEZONE))  print(args) #Print payload recieved  payload = dict()  timestamp = int(NOW.timestamp()*1000)  data = json.loads(args["body"])  device = data["from_client_id"]  p_in = data["payload"]["value"]["in"]  p_out = data["payload"]["value"]["out"]  diff = p_in - p_out #People inside a room  if diff < 0:  diff = 0  payload["in"] = {"value": p_in, "timestamp": timestamp}  payload["out"] = {"value": p_out, "timestamp": timestamp}  payload["diff"] = {"value": diff, "timestamp": timestamp}# Log the payload to the console, for debugging purposes. You may access the function's logs using  print("[INFO] Payload to send: {}".format(payload))# Use the remaining parameters as payload  res = update_device(device, payload, TOKEN)# Prints the request result  return {"status": "Ok", "result": res.json()}def update_device(device, payload, token):"""updates a variable with a single dot"""  url = "{}/api/v1.6/devices/{}".format(BASE_URL, device)  headers = {"X-Auth-Token": token, "Content-Type": "application/json"}  req = create_request(url, headers, payload, attempts=5,      request_type="post")  return reqdef create_request(url, headers, data, attempts, request_type):"""Function to create a request to the server"""  request_func = REQUESTS_FUNCTIONS.get(request_type)  kwargs = {"url": url, "headers": headers}  if request_type == "post":    kwargs["json"] = data  try:    req = request_func(**kwargs)    print("[INFO] Request result: {}".format(req.text))    status_code = req.status_code    time.sleep(1)    while status_code >= 400 and attempts < 5:      req = request_func(**kwargs)      print("[INFO] Request result: {}".format(req.text))      status_code = req.status_code      attempts += 1      time.sleep(1)    return req  except Exception as e:    print("[ERROR] There was an error with the request, details:")    print(e)    return None


Una vez que haya decodificado su carga útil y la haya enviado a su cuenta mediante la Ubifunction, se mostrará de la siguiente manera.

image.png
¿Ha quedado contestada tu pregunta?