Protocolo BTHome con XIAO nRF52840 Sense (CircuitPython)
Resumen del Proyecto
En este tutorial, mostraremos cómo usar las capacidades BLE de Bluetooth 5.0 del Seeed Studio XIAO nRF52840 junto con el sensor de temperatura y humedad Grove (DHT20) para transmitir las mediciones de temperatura y humedad a Home Assistant utilizando el protocolo BTHome.
Utilizaremos CircuitPython para el código.
Comenzando
Para seguir este tutorial, necesitas el siguiente hardware:
Seeed Studio XIAO nRF52840-Sense | Seeed Studio Grove Sensor de temperatura y humedad v2.0 (DHT20) |
---|---|
![]() | ![]() |
Preparación del Hardware
El sensor Grove DHT20 utiliza I2C para la comunicación. Necesitamos conectarlo a los pines I2C del XIAO nRF52840 Sense:
- Podemos usar un XIAO Grove Shield con un cable universal de 4 pines sin bloqueos.
- Conectar el sensor DHT20 directamente al XIAO nRF52840 Sense usando un cable de conversión de 4 pines hembra a Grove de 4 pines.
Aquí está el pinout para el XIAO nRF52840 Sense y el XIAO Grove Shield:
Configuración del Hardware
El cableado es sencillo. Ya sea usando el Shield o no, el siguiente esquema de Fritzing muestra cómo conectar los componentes entre sí.
Preparación del Software
Vamos a usar el software Thonny IDE (Linux) y algunas bibliotecas y archivos relacionados. Estos son los pasos que vamos a seguir:
- Instalar CircuitPython en el XIAO nRF52840 Sense
- Instalar las bibliotecas necesarias
- Programar nuestro sensor utilizando el protocolo BTHome
- Configurar Home Assistant
Paso 1 - Instalar CircuitPython
Comencemos con la instalación de CircuitPython.
Ve a CircuitPython y descargar una versión para el XIAO nRF52840 Sense. Elige Downloads y en el campo de búsqueda empieza a escribir XIAO nRF52840 hasta que aparezcan los resultados correspondientes al sensor.
Luego, presiona el botón de descarga para obtener el archivo para nuestro dispositivo.
Deberías obtener un archivo .uf2. Para instalarlo, necesitamos entrar en el modo de arranque. Conecta el XIAO nRF52840 Sense a tu computadora y presiona el botón de reset dos veces.
Un nuevo disco debería haber aparecido en tu computadora llamado XIAO-SENSE.
A continuación, copia el archivo descargado en ese disco.
Después de un momento, aparecerá un nuevo disco llamado CIRCUITPY. Esto indica que CircuitPython se ha instalado correctamente en tu microcontrolador.
Paso 2 - Instalar bibliotecas
Para utilizar nuestro sensor Grove de temperatura y humedad V2.0 (DHT20), necesitamos la librería AHT20 de Adafruit.
El sitio web anterior tiene instrucciones sobre cómo instalar las bibliotecas.
Después de instalar, deberíamos tener los siguientes archivos (estos son los necesarios para nuestro sensor DHT20):
Paso 3 - Subir el Código
Antes de ir al código, necesitamos entender qué es BTHome.
BTHome
BTHome es un estándar abierto para transmitir datos de sensores y presiones de botones a través de Bluetooth de Baja Energía (BLE). Está diseñado para ser eficiente en el consumo de energía, flexible y seguro. BTHome es compatible con plataformas populares de automatización del hogar, como Home Assistant, de forma nativa.
Algunos beneficios de BTHome:
- Es un estándar abierto, por lo que los dispositivos de diferentes fabricantes pueden trabajar juntos.
- Los dispositivos están diseñados para ser eficientes en el consumo de energía, por lo que pueden funcionar durante mucho tiempo con una sola batería.
- Los datos están cifrados, por lo que son seguros contra el acceso no autorizado.
- Es un formato flexible, por lo que puede utilizarse para transmitir una variedad de datos de sensores y presiones de botones.
BTHome es un estándar versátil y potente para transmitir datos de sensores y presiones de botones a través de BLE. Es una buena opción para cualquiera que quiera agregar datos de sensores y presiones de botones a su hogar inteligente.
Puedes leer más sobre ello y aprender sobre el formato de datos en el sitio oficial.
Código
Aquí está el código de CircuitPython.
Haz click para copiar el código CircuitPython
/*
BTHome con DHT20
Este código está basado en el excelente código de Koen Vervloesem
https://github.com/koenvervloesem/BTHome-Inertial-Sensor-in-CircuitPython
No usamos el modo de sueño profundo porque simplemente no funciona
en el XIAO nRF52840 Sense. Es una pena.
*/
from _bleio import adapter
from time import sleep
import board
# para el sensor Grove
import adafruit_ahtx0
# El tamaño del nombre es importante.
DEVICE_NAME = "XIAO nRF52840 Sense"
INTERVAL = 0.1
# Debido a que esto solo demora 0.1 segundos - 100 milisegundos, no necesitamos leer los
# valores del sensor cada vez. Sería excesivo, leemos solo cada 5 minutos.
# Creamos un temporizador que sumará cada INTERVALO
# cuando llegue a 30, serán 5 minutos pasados
# entonces leemos el sensor
# INTERVALO * 60 segundos * 5 minutos
# CONVERTIR 0.1ms a segundos * 60s * minutos = 300
MINUTES_PER_READING = 5
readTimer = INTERVAL * 10 * 60 * MINUTES_PER_READING
# Convertir el valor de la medición al formato BTHome
def value_to_little_endian (measurement):
# Calcular el valor entero dividiendo la temperatura por el factor
integer_value = int(measurement / 0.01)
# Extraer los bytes inferior y superior para la representación little-endian
lower_byte = integer_value & 0xFF
upper_byte = (integer_value >> 8) & 0xFF
# Invertir el orden de los bytes
little_endian_bytes = bytes([upper_byte, lower_byte])
return little_endian_bytes
class BTHomeAdvertisement:
_ADV_FLAGS = [0x02, 0x01, 0x06]
_ADV_SVC_DATA = [0x0a, 0x16, 0xd2, 0xfc, 0x40, 0x02, 0x00, 0x00, 0x03, 0xbf, 0x13]
def _name2adv(self, local_name):
adv_element = bytearray([len(local_name) + 1, 0x09])
adv_element.extend(bytes(local_name, "utf-8"))
return adv_element
def __init__(self, local_name=None):
if local_name:
self.adv_local_name = self._name2adv(local_name)
else:
self.adv_local_name = self._name2adv(adapter.name)
def adv_data(self, temperature, humidity):
adv_data = bytearray(self._ADV_FLAGS)
adv_svc_data = bytearray(self._ADV_SVC_DATA)
# temperatura
# cambiar valores según corresponda -
temp = value_to_little_endian (temperature)
# el valor devuelto es una lista
adv_svc_data[6] = temp[1]
adv_svc_data[7] = temp[0]
# humedad
# cambiar valores según corresponda -
hum = value_to_little_endian (humidity)
# el valor devuelto es una lista
adv_svc_data[9] = hum[1]
adv_svc_data[10] = hum[0]
adv_data.extend(adv_svc_data)
adv_data.extend(self.adv_local_name)
return adv_data
# BTHome
bthome = BTHomeAdvertisement(DEVICE_NAME)
# Crear el objeto del sensor
sensor = adafruit_ahtx0.AHTx0(board.I2C())
# porque queremos una lectura inicial
# inicializamos con la variable readTimer
# así forzamos que el script lea los valores
currentTimer = 0
# lectura inicial
temp = sensor.temperature
hum = sensor.relative_humidity
#DEBUG
#print("\nTemperatura: %0.1f C" % temp)
#print("Humedad: %0.1f %%" % hum)
while True:
adv_data = bthome.adv_data(temp, hum)
adapter.start_advertising(
adv_data, scan_response=None, connectable=False, interval=INTERVAL * 2
)
sleep(INTERVAL)
adapter.stop_advertising()
# aumentar currentTimer
currentTimer += INTERVAL
#print (f"Temporizador actual: {currentTimer}")
if (currentTimer >= readTimer):
#print (f'Releer nuevos valores')
# Leer nuevos valores
temp = sensor.temperature
hum = sensor.relative_humidity
# reiniciar contador
currentTimer = 0
Recuerda guardarlo como code.py
para que se ejecute al iniciar.
Un poco de explicación del código
- El código está lleno de comentarios para explicarlo un poco.
- Básicamente, cada 0.2 segundos está transmitiendo la temperatura y humedad provenientes del sensor DHT20.
- Debido a que no queremos sobrecargar el sensor y leer valores cada 0.2 segundos, hemos colocado un temporizador. Solo leerá los valores cada 5 minutos. Este tiempo está controlado por la variable
MINUTES_PER_READING
.
Paso 4 - Mostrar los datos en Home Assistant
Paso 4.1 - Agregar XIAO nRF52840 Sense en Home Assistant
Home Assistant is a free and open-source software for home automation. It is designed to be a central control system for smart home devices with a focus on local control and privacy.
Home Assistant acts as a central smart home controller hub by combining different devices and services in a single place and integrating them as entities. The provided rule-based system for automation allows creating custom routines based on a trigger event, conditions and actions, including scripts. These enable building automation, alarm management of security alarms and video surveillance for home security system as well as monitoring of energy measuring devices.
Puedes leer más sobre eso en el sitio oficial.
Requisitos
Un requisito crucial es que HA (Home Assistant) tenga Bluetooth. Si estás ejecutando HA en una Raspberry Pi, es probable que lo tengas. Todo depende de la versión del RPi.
Configuración
En el "Paso 3 - Subir Código", programamos el XIAO nRF52840 y para el siguiente paso, debe estar en funcionamiento, para que HA pueda detectarlo.
Abre tu instalación de HA. Ve a Configuración -> Dispositivos y Servicios
Y la Integración debería aparecer.
Al ingresar a la página de Integraciones, si el XIAO nRF52840 Sense está conectado, ya debería haber sido detectado y aparecerá en la página.
Presiona "Configurar" para configurar esta nueva Integración. Presiona Enviar.
Ahora solo necesitas seleccionar el área donde colocar este nuevo sensor y listo.
A continuación, ve nuevamente a Configuración -> Integraciones y selecciona la nueva integración BTHome
Se nos llevará a la página de la integración. Podemos ver que tenemos 1 dispositivo y 3 entidades.
Las entidades son la temperatura, humedad y la intensidad de la señal.
Si hacemos clic en las entidades, llegamos a una nueva página donde podemos verlas todas.
Si en lugar de eso, presionamos en el dispositivo, llegamos a la página del dispositivo con todas las opciones, así como los valores actuales. Usando esta página, podemos agregarlo al tablero.
Al presionar "AGREGAR al TABLERO", podemos elegir la vista donde ponerlo.
Después de eso, veremos la vista de la tarjeta. Solo presiona "AGREGAR AL TABLERO" para agregarla al tablero.
Si vamos al tablero, nuestra tarjeta recién agregada con la temperatura y humedad transmitida por el XIAO nRF52840 Sense aparecerá.
Más - Función de Sueño Profundo
No pude hacerlo funcionar. Si alguien tiene una solución, por favor deje un comentario. Puedes compartir tus pensamientos en GitHub
✨ Proyecto del Contribuidor
- Este proyecto está respaldado por el Proyecto de Contribuidores de Seeed Studio.
- Gracias a los esfuerzos de Bruno, tu trabajo será exhibido.
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para ofrecerte soporte para asegurarnos de que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.