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.
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.
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.