Ir al contenido principal
Todas las coleccionesConecta tus dispositivos
Enviar datos desde una Raspberry Pi a Ubidots usando balena
Enviar datos desde una Raspberry Pi a Ubidots usando balena

Aprende a configurar una Raspberry Pi y enviar datos a la nube de Ubidots a través de balena.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de una semana

En tutoriales anteriores, hemos visto cómo instalar Node-RED en Raspberry Pi, y Sistemas de conteo de personas con OpenCV, Python y Ubidots. Esta vez, aprenderemos cómo aprovisionar dispositivos y usarlos a través de balena para enviar datos a Ubidots.

Balena es un conjunto poderoso de herramientas para construir, desplegar y gestionar flotas de dispositivos IoT. Balena facilita la gestión de dispositivos y sus servicios en ejecución; para ello, puedes hacerlo a través de su panel web o la API mediante la CLI y SDK. Balena te permite elegir las herramientas que deseas usar para tu proyecto, de modo que la plataforma se adapte a tus necesidades.

En este artículo, instalaremos y ejecutaremos un sensor de temperatura en un Raspberry Pi para enviar datos a Ubidots utilizando balena.

Requisitos

1. Configurar Raspberry Pi 4 usando balena

Una vez que hayas creado tu cuenta de balena, tu primer paso será crear una flota, que son los ajustes que se aplicarán a un grupo de dispositivos. En este caso, crearemos una flota que contendrá Raspberry Pi 4.

Paso 1: Haz clic en el botón crear flota en la esquina izquierda

Paso 2: Completa la información solicitada

Paso 3: Después de haber creado la primera flota, puedes agregar un dispositivo. Tendrás que seleccionar:

  • El dispositivo

  • El sistema operativo

  • La versión

  • La conexión a la red. Puede ser solo a través de Ethernet o a través de Ethernet y Wi-Fi.

Paso 3: Descarga balena Etcher

Paso 4: Para flashear el firmware en una tarjeta SD, tienes dos opciones: hacer clic en flashear, lo que abrirá automáticamente balena Etcher, o puedes descargar el balenaOS a un archivo. Para referencia, usamos la primera opción.

Paso 5: Selecciona el destino

Paso 6: Haz clic en ¡Flashear!

NOTA: Asegúrate de cambiar cualquier configuración de firmware antes de montar la tarjeta SD en el Raspberry Pi.

  • Por ejemplo, tuvimos que habilitar el puerto SPI antes de flashear la tarjeta SD, para que el protocolo OneWire funcionara para el sensor de temperatura.

2. Prepara tu computadora local para subir cambios de firmware usando balena CLI

La balena CLI es una Interfaz de Línea de Comandos para balenaCloud o openBalena. Puedes seguir estas instrucciones para instalarla en tu entorno.

Paso 1: Instala la balena CLI, puedes elegir entre macOS, Windows y Linux

Paso 2: Agrega el directorio en el que descargamos la CLI a tu ruta para que puedas ejecutar los mismos comandos desde cualquier directorio.

Paso 3: Inicia sesión en balena desde la terminal. Recomendamos hacer la autorización web, ya que es un proceso muy rápido y directo.

3. Configuración de hardware

Afortunadamente, existe el sensor digital DS18B20, que soporta el protocolo OneWire, lo que hace que sea bastante simple conectarlo a tu Raspberry Pi. Aquí está el diagrama de cableado para tu referencia:

4. Hora de codificar

Abre tu editor de código preferido. Usaremos Visual Studio para editar el archivo Docker y el script de Python que lee los valores de temperatura y los envía a Ubidots.

Paso 1: Especifica qué sistema operativo te gustaría instalar en tu Raspberry Pi. Puedes buscar en el sitio web de balena qué sistemas operativos están disponibles.

Paso 2: Archivo Docker

  • Withermsernsor será para el sensor de temperatura en sí.

  • Requests será para enviar datos a Ubidots.

  • El tercer comando le dice a la Raspberry Pi en qué directorio guardaremos todo el código.

  • El cuarto comando es para copiar el código.

  • El quinto comando habilita el protocolo OneWire en la Raspberry Pi y finalmente ejecuta el script "main.py".

FROM balenalib/raspberrypi4-64-debian-python:3-bullseyeRUN pip3 install w1thermsensor requestsWORKDIR /appCOPY . .CMD modprobe w1-gpio && modprobe w1-therm && python3 main.py

Paso 3: Main.py

En este código tienes dos partes:

  • La primera parte lee la temperatura del sensor.

  • La segunda parte envía los datos a Ubidots.

Copia el siguiente código y guárdalo como main.py

from time import sleepimport osimport requestsfrom w1thermsensor import W1ThermSensor #Importamos el paquete W1ThermSensor​SLEEP = os.getenv("sleep")DEVICE = os.getenv("device")TOKEN = os.getenv("ubi_token")BASE_URL = "https://industrial.api.ubidots.com"REQUESTS_FUNCTIONS = {"get": requests.get, "post": requests.post}def main():   sensor = W1ThermSensor() #Creamos el objeto sensor   while True:      temperature = sensor.get_temperature() #Obtiene la temperatura en Celsius      print(f"La temperatura es {temperature} grados Celsius") #Imprime el resultado
      payload = build_payload("temperature",temperature)      print(f"[INFO] Payload a enviar: {payload}")      req = update_device(DEVICE, payload, TOKEN)      print(f"[INFO] Resultado de la solicitud: {req.text}")      print({"status": "Ok", "result": req.json()})      sleep(int(SLEEP))
def build_payload(variable,value):   payload = {variable:value}   return payloaddef update_device(device, payload, token):   """   actualiza una variable con un solo punto   """   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):   """   Función para crear una solicitud al servidor   """   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] Resultado de la solicitud: {}".format(req.text))      status_code = req.status_code      sleep(1)      ​while status_code >= 400 and attempts < 5:         req = request_func(**kwargs)         print("[INFO] Resultado de la solicitud: {}".format(req.text))         status_code = req.status_code         attempts += 1         sleep(1)      return req
   except Exception as e:      print("[ERROR] Hubo un error con la solicitud, detalles:")      print(e)      return Noneif __name__ == "__main__":   main()

En este caso, utilizaremos la biblioteca OS para obtener las variables de entorno e importarlas en el código; estas variables de entorno se pueden configurar a través de balena.

En este ejemplo, creamos las siguientes variables:

  • Sleep es el intervalo de tiempo entre mediciones.

  • Device es la etiqueta del dispositivo que se creará en Ubidots

  • Token para autenticar las solicitudes HTTP enviadas desde el dispositivo a la nube.

Paso 4: Necesitas agregar una línea de código al archivo de configuración para aceptar el protocolo OneWire. Ve al tutorial de balena y copia la línea y agrégala al archivo config TXT del flasheo de tu tarjeta SD.

Paso 5: Sube el código a balena: ve al directorio donde se guarda el código y ejecuta el comando balena push y el nombre de tu flota. Por ejemplo, dado que el nombre de nuestra flota era "testingfleet", el comando sería:

balena push testingfleet

Sabes que el código se ha subido correctamente una vez que veas un unicornio.

5. Gestionando variables ambientales en balena

Una de las cosas interesantes de balena es la capacidad de establecer parámetros de configuración directamente en la nube, lo que facilita la gestión de una gran flota de dispositivos de forma remota.

Paso 1: Ve a balena y haz clic en el nombre de tu dispositivo

Paso 2: Selecciona Variables del dispositivo

Paso 3: Haz clic en Agregar variable

Paso 4: Como se mencionó anteriormente, creamos 3 variables: token, dispositivo y sleep.

  • Para Sleep, establecimos 10 segundos entre cada ciclo

  • Para el Dispositivo, agregamos su etiqueta: rpi4-balena

Para obtener el Token de Ubidots, necesitas ir a tu cuenta de Ubidots. Haz clic en Credenciales de API, copia el token y pégalo en balena.

Una vez que estas variables han sido configuradas, balena subirá la versión más reciente del contenedor en la Raspberry Pi, incluyendo los cambios de las variables que acabamos de hacer.

6. Resultados

Paso 1: Ve al menú de dispositivos en Ubidots. Allí puedes encontrar el nuevo dispositivo,

ahora puedes ver los datos que se están enviando desde balena a Ubidots.

Otros también encontraron útil:

¿Ha quedado contestada tu pregunta?