El TRB140 es un dispositivo IoT ultrapequeño, ligero y eficiente en energía con opciones de conectividad LTE Cat 4 y Ethernet Gigabit de misión crítica. Su entorno Linux ofrece un alto grado de personalización.
Este gateway es perfecto para proyectos y aplicaciones donde un solo dispositivo debe actualizarse con conectividad a Internet confiable y segura.
En esta guía, el TRB recopila datos de humedad y temperatura de un servidor Modbus y luego envía los datos a Ubidots a través de MQTT.
Esta guía también debería funcionar para otros routers y gateways Teltonika que soporten el protocolo Modbus, tales como:
Serie RUT1, RUT2 y RUT3
Serie RUT9
Serie RUTX
RUTM50
Serie TRB1 y TRB2
TRB500
Requisitos
Un Teltonika TRB140 4G IoT gateway o cualquier otro gateway/router Teltonika que soporte Modbus TCP.
Una cuenta activa de Ubidots con UbiFunctions habilitadas.
Un servidor Modbus para leer datos.
1. Configurar el hardware
Si deseas utilizar una tarjeta SIM para proporcionar conectividad móvil, comienza quitando el panel frontal del dispositivo e insertando la SIM como se muestra a continuación. Si estás utilizando Ethernet para la conectividad, puedes pasar al siguiente paso.
Después de eso, procede a alimentar el TRB140 usando el cable de alimentación incluido y luego conéctalo a tu router usando el cable Ethernet incluido.
2. Acceder a la interfaz de configuración web del TRB140
Desde tu PC, abre una terminal y ejecuta el siguiente comando para obtener la dirección IP asignada a tu PC en tu LAN:
ifconfig
La dirección IP de tu PC se mostrará como se muestra a continuación:
Usando esta dirección IP, escanea toda tu LAN para obtener la dirección IP del TRB140 ejecutando el siguiente comando:
sudo nmap -sn <ip-address>/24 | grep 'TRB140'
Asegúrate de reemplazar el <ip-address>
con la dirección IP que obtuviste antes. Por ejemplo, si la dirección IP de tu PC es 192.168.22.34, el comando que debes ejecutar es:
sudo nmap -sn 192.168.22.34/24 | grep 'TRB140'
La salida de este comando mostrará la dirección IP del TRB:
Ahora, abre un navegador web y escribe la dirección IP del TRB140. Una vez allí, se te pedirá credenciales:
Puedes encontrar las credenciales del dispositivo en su placa trasera. Úsalas para iniciar sesión:
3. Configuración de Modbus
Esta sección configura el servicio Modbus dentro del TRB140 para permitirle sondear datos del servidor Modbus. Como se mencionó al principio del artículo, antes de continuar, necesitarás tener una fuente de datos o simularla. Pymodbus de Python es una buena opción para lo último.
Una vez que hayas iniciado sesión en la interfaz de configuración web del dispositivo, ve a Services → Modbus → Modbus TCP Client:
Una vez allí, habilita la casilla de verificación Modbus Client y luego haz clic en el botón ADD :
En la ventana de configuración que aparecerá, en la sección SERVER DEVICE CONFIGURATION , asegúrate de:
Marcar la opción Enable.
Configurar el campo Name con un nombre que consideres apropiado. En esta guía, usamos Modbus_server_hq.
Rellenar la opción Server ID con el ID del servidor Modbus.
Rellenar el campo Address con la dirección de tu servidor Modbus. Para este artículo, se configuró un servidor Modbus en la dirección 192.168.22.191.
Rellenar el campo Port con el puerto en el que está funcionando tu servidor Modbus. Para este artículo, el servidor Modbus se configuró para funcionar en el puerto 5020.
En cuanto al resto de parámetros en esta sección, como Timeout, Always reconnect, Frequency, etc., configúralos según tus necesidades.
Desplázate hacia abajo hasta la sección ADD NEW REQUEST . Una solicitud en este contexto es la configuración necesaria para leer uno o varios registros/bits del servidor Modbus. En este ejemplo, se creará una solicitud para cada variable, es decir, humedad y temperatura.
Escribe el nombre de la variable en el campo NEW CONFIGURATION NAME y luego haz clic en el botón ADD :
Notarás que después de hacer clic en el botón ADD , aparecerá una nueva REQUEST CONFIGURATION con algunas configuraciones preseleccionadas. Debes cambiar estas configuraciones preseleccionadas según los ajustes de tu servidor Modbus.
Como muestra la captura de pantalla anterior, ambos botones de alternancia deben estar habilitados.
El que está dentro del cuadro amarillo es para asegurarse de que los datos recuperados no contengan caracteres adicionales (
[<data>]
).El que está dentro del cuadro rojo es el más importante ya que habilita la configuración.
Según el enfoque tomado para este artículo, se creará una REQUEST CONFIGURATION para cada variable. En el caso de la humedad y la temperatura, se verá así:
Name | Data type | Function | First register number | Register count/values | Brackets |
temperature | 16bit INT, high byte first | Read holding register (3) | 40202 | 1 | ON, ON |
3.1. Explicación de la configuración de Modbus
DATA TYPE: 16bit INT, high byte first. Esta es la configuración más común para sensores analógicos y debes asegurarte de seleccionar el endianness según el tuyo. Para este artículo se utiliza el sensor de temperatura y humedad XY-MD02.
FUNCTION: Dado que este artículo utiliza un sensor analógico, dichos datos se leen usando la función Read holding registers (3) . Sin embargo, si no estás midiendo datos analógicos, es posible que desees usar la función "read coils (1)" .
FIRST REGISTER NUMBER: Esta es la primera dirección Modbus desde la cual comenzar a leer los registros. Selecciona esto según la dirección de tus datos.
REGISTER COUNT VALUES: Esta es la cantidad de registros a leer comenzando desde FIRST REGISTER NUMBER. Ajusta esto según tus necesidades. Para leer solo una variable, como en el enfoque tomado para este ejemplo, este valor debe ser
4. Probar la configuración de Modbus
Desplázate hacia abajo hasta encontrar la sección REQUEST CONFIGURATION TESTING, selecciona la REQUEST CONFIGURATION recientemente creada en el menú desplegable y haz clic en el botón TEST. Si todo está correctamente configurado, se mostrará la lectura del servidor Modbus:
Ahora que la configuración está probada, puedes guardarla haciendo clic en el botón SAVE & APPLY :
Ahora, la ventana emergente colapsará y se mostrará nuevamente la pantalla de configuración de Modbus TCP Client. La configuración resultante de la sección 2 de la guía sería esta:
Haz clic en el botón SAVE & APPLY para guardar esta configuración.
5. Configurar el servicio Data to Server
El siguiente paso es configurar el envío de los datos recuperados del servidor Modbus a Ubidots.
Ve a Ubidots → Devices → Functions y crea una nueva UbiFunction.
Dale cualquier Nombre que consideres apropiado.
Configura el Method a POST.
Configura el Runtime a Python 3.11 Lite.
Configura el Token de Ubidots.
En la sección de código, pega lo siguiente:
import requestsimport timeimport json# Base url to perform request to Ubidots APIBASE_URL = "https://industrial.api.ubidots.com"REQUESTS_FUNCTIONS = {"get": requests.get, "post": requests.post}# If you changed the data configuration name to other # than the one used in the article, set this variable to that name DATA_CONFIGURATION_NAME: str = 'ModbusServerData'def main(args): # Print args for debug print(args) # Get the payload containing the data of our interest data: dict = args['payload'][DATA_CONFIGURATION_NAME] # Build the device label using the server name and its ip address device_label: str = data['server_name'].replace('_', '-') + '-' + data['ip'].replace('.', '-') # Get the variable's name variable_label: str = data['name'] # Divide the value by 10 according to the device's datasheet. Adjust this accordingly value: int = int(data['data']) / 10 # Get the Ubidots token token: str = args.get('_auth_token', None) if token is None: print("[ERROR] Please configure you Ubidots token for this Ubifunction or define it within it.") return {"status": "error"} if not data: print("No data") return {"error" : "No data present in the payload"} payload: dict = {variable_label : value} req = update_device(device_label, payload, token) print("[INFO] Request result:") print(req.text) return {"status": "Ok", "result": req.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
Haz clic en el botón Make it live para guardar la UbiFunction. Después de esto, asegúrate de copiar la URL del endpoint HTTPS de la función:
Vuelve a la interfaz de configuración web del TRB140 y luego ve a Services → Data to Server y, en la sección ADD NEW INSTANCE , escribe un NEW COLLECTION NAME, y luego haz clic en el botón ADD :
Las colecciones son solo entidades que te permiten configurar una fuente de datos para ser enviada a la nube. Nuestro nombre de colección se configuró como sendDataToUbidots.
Una vez que lo hagas, aparecerá la pantalla de configuración de DATA CONFIGURATION con una configuración vacía. Edítala para configurar lo siguiente:
Rellena el campo Name con cualquier nombre que te ayude a identificar esta configuración. Una cosa a tener en cuenta es que la carga útil que recibirás en Ubidots está bajo la clave payload/<data-configuration-name> . Por ejemplo, si nombras esta configuración como ModbusServerData, entonces los datos que lleguen a Ubidots estarán bajo Payload → modbusserverdata.
En el campo Type , elige Modbus. Esto seleccionará la fuente de datos como los datos del servidor Modbus.
En Format type, selecciona JSON. Esto es para que los datos recibidos en Ubidots sean un JSON y no una cadena con formato JSON.
Asegúrate de habilitar la opción Send as object .
Deja los demás ajustes sin cambios.
Desplázate hacia abajo hasta encontrar el botón para continuar con la configuración y haz clic en él:
En la siguiente página de configuración, asegúrate de activar el botón Enable junto a GENERAL SETTINGS y deja el Format type configurado en JSON.
Puedes configurar el periodo de publicación de datos yendo a la pestaña ADVANCED SETTINGS . Aquí, la opción Period te permite seleccionar el intervalo de envío de datos en segundos. Una vez hecho, haz clic en el botón Next .
Una vez que se muestre la SERVER CONFIGURATION , configura lo siguiente:
Selecciona el Type como MQTT.
En el campo Server address , configura
functions.ubidots.com
Configura el Port en 1883 si estás usando MQTT simple o 8883 para MQTT sobre TLS.
Genera una cadena aleatoria de 15 caracteres para configurar el campo Client ID.
Configura el campo Topic utilizando la URL del Endpoint HTTPS de tu Ubifunction de la siguiente manera:
/prv/<username>/<function-label>
. En otras palabras, elimina todo hasta que llegues a "/prv".Asegúrate de marcar la casilla Use Credentials.
Configura el campo Username con tu nombre de usuario de Ubidots.
Configura el campo Password con tu token de Ubidots.
Rellena los otros campos según tus necesidades.
Deja los demás ajustes sin cambios y haz clic en el botón SAVE & APPLY :
Después de guardar esta configuración, la ventana emergente se colapsará y mostrará tu colección creada. Asegúrate de que esté habilitada:
6. Verificación de los datos recibidos en Ubidots
Ve a tu cuenta de Ubidots → Devices → Devices y, si seguiste todas las convenciones de nomenclatura en la guía, podrás ver un dispositivo cuyo etiqueta es algo así como "modbuser-server-hq-<server-ip-address>" que contiene las variables de humedad y temperatura: