Descripción del Proyecto
En esta wiki, mostraremos cómo usar las capacidades Bluetooth 5.0 BLE del Seeed Studio XIAO nRF52840 con el Sensor de Temperatura y Humedad Seeed Studio Grove (DHT20) para transmitir mediciones de temperatura y humedad a Home Assistant usando el protocolo BTHome.
Usaremos CircuitPython para el código.
Primeros Pasos
Para seguir este tutorial, necesitas el siguiente hardware
Seeed Studio XIAO nRF52840-Sense | Sensor de Temperatura y Humedad Seeed Studio Grove 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 hebilla
- Conectar el sensor DHT20 directamente al XIAO nRF52840 Sense usando un cable de conversión de 4 pines hembra Jumper a Grove de 4 pines
Aquí está el pinout para XIAO nRF52840 Sense y XIAO Grove Shield
Configuración del Hardware
El cableado es directo. Ya sea usando el Shield o no, el siguiente esquema de Fritzing muestra cómo cablear los componentes juntos.
Preparación del Software
Vamos a usar el software Thonny IDE (Linux) y algunas librerías y archivos relacionados. Estos son los pasos que vamos a seguir:
- Instalar CircuitPython en el XIAO nRF52840 Sense
- Instalar las librerías necesarias
- Programar nuestro sensor usando el protocolo BTHome
- Configurar Home Assistant
Paso 1 - Instalar CircuitPython
Vamos a instalar CircuitPython.
Ve a CircuitPython y descarga una versión para el XIAO nRF52840 Sense. Elige Downloads y en el campo de búsqueda comienza a escribir XIAO nRF52840 hasta que los resultados muestren el sensor.
A continuación, presiona el botón de descarga para obtener el archivo para nuestro dispositivo.
Deberías tener un archivo .uf2. Para instalarlo necesitamos entrar en modo bootloader. Conecta el XIAO nRF52840 Sense a tu computadora y presiona el botón de reset dos veces.
Una nueva unidad debería haber aparecido en tu computadora llamada XIAO-SENSE.
A continuación, copia el archivo descargado a la unidad.
Después de un tiempo, aparece una nueva unidad llamada CIRCUITPY. Tenemos CircuitPython instalado en nuestro microcontrolador.
Paso 2 - Instalar librerías
Para usar nuestro sensor Grove Temperature & Humidity V2.0 (DHT20), necesitamos la librería AHT20 de Adafruit.
El sitio web anterior tiene instrucciones sobre cómo instalar librerías.
Después de instalado, deberíamos tener los siguientes archivos (estos son los requeridos para nuestro sensor DHT20):
Paso 3 - Subir 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 pulsaciones de botones a través de Bluetooth Low Energy (BLE). Está diseñado para ser eficiente energéticamente, 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 dispositivos de diferentes fabricantes pueden trabajar juntos.
- Los dispositivos están diseñados para ser eficientes energéticamente, por lo que pueden funcionar durante mucho tiempo con una sola batería.
- Los datos están encriptados, por lo que son seguros contra acceso no autorizado.
- Es un formato flexible, por lo que puede usarse para transmitir una variedad de datos de sensores y pulsaciones de botones.
BTHome es un estándar versátil y poderoso para transmitir datos de sensores y pulsaciones de botones a través de BLE. Es una buena opción para cualquiera que quiera agregar datos de sensores y pulsaciones de botones a su hogar inteligente.
Puedes leer más sobre él y aprender sobre el formato de datos en el sitio oficial.
Código
Aquí está el código de CircuitPython.
Haz clic para copiar el código de CircuitPython
# BTHome with DHT20
# This code is based on the excelent code by Koen Vervloesem
# https://github.com/koenvervloesem/BTHome-Inertial-Sensor-in-CircuitPython
# We don't use deep sleep because it just doesn't work
# on the XIAO nRF52840 Sense. It's a pitty.
from _bleio import adapter
from time import sleep
import board
# for the Grove sensor
import adafruit_ahtx0
# The size of the name is important.
DEVICE_NAME = "XIAO nRF52840 Sense"
INTERVAL = 0.1
# Because this is delaying just 0.1s - 100 milliseconds, we don't need to read the sensor
# values everytime. It's overkill - let's just read every 5 minutes.
# Let's create a timer that will add every INTERVAL
# when it reaches 30 - it will be 5 minutes passed
# then we read the sensor
# INTERVAL * 60 seconds * 5 minutes
# CONVERTING 0.1ms to seconds * 60s * minutes = 300
MINUTES_PER_READING = 5
readTimer = INTERVAL * 10 * 60 * MINUTES_PER_READING
# convert the measurement value to the BTHome format
def value_to_little_endian (measurement):
# Calculate the integer value by dividing the temperature by the factor
integer_value = int(measurement / 0.01)
# Extract the lower and upper bytes for little-endian representation
lower_byte = integer_value & 0xFF
upper_byte = (integer_value >> 8) & 0xFF
# Reverse the order of the 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)
# temperature
# change values according -
temp = value_to_little_endian (temperature)
# returned value is list
adv_svc_data[6] = temp[1]
adv_svc_data[7]= temp[0]
# humidity
# change values according -
hum = value_to_little_endian (humidity)
# returned value is list
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)
# Create sensor object
sensor = adafruit_ahtx0.AHTx0(board.I2C())
# because we want a initial reading
# let's initialize with the readTimer variable
# so we force the script to read the values
currentTimer = 0
# inital reading
temp = sensor.temperature
hum = sensor.relative_humidity
#DEBUG
#print("\nTemperature: %0.1f C" % temp)
#print("Humidity: %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()
# increase currentTimer
currentTimer += INTERVAL
#print (f"Current timer: {currentTimer}")
if (currentTimer >= readTimer):
#print (f'Read new values')
# Read new values
temp = sensor.temperature
hum = sensor.relative_humidity
#reset counter
currentTimer = 0
Recuerda guardarlo como code.py
para que se ejecute al arrancar.
Un poco de explicación del código
- El código está lleno de comentarios para explicarlo un poco.
- Básicamente, cada 0.2s está transmitiendo la temperatura y humedad provenientes del sensor DHT20.
- Como no queremos sobrecargar el sensor y leer valores cada 0.2s, hemos colocado un temporizador. Solo leerá los valores cada 5 minutos. Este tiempo está controlado por la variable
MINUTES_PER_READING
.
Paso 4 - Mostrar datos en Home Assistant
Paso 4.1 - Agregar XIAO nRF52840 Sense en Home Assistant
Home Assistant es un software gratuito y de código abierto para automatización del hogar. Está diseñado para ser un sistema de control central para dispositivos domésticos inteligentes con un enfoque en el control local y la privacidad.
Home Assistant actúa como un hub controlador central de hogar inteligente combinando diferentes dispositivos y servicios en un solo lugar e integrándolos como entidades. El sistema basado en reglas proporcionado para automatización permite crear rutinas personalizadas basadas en un evento disparador, condiciones y acciones, incluyendo scripts. Estos permiten construir automatización, gestión de alarmas de alarmas de seguridad y videovigilancia para sistemas de seguridad del hogar, así como monitoreo de dispositivos de medición de energía.
Puedes leer más sobre esto 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 de RPi.
Configuración
En el "Paso 3 - Subir Código", programamos el XIAO nRF52840 y para el siguiente paso, debe estar ejecutándose, para que HA pueda detectarlo.
Abre tu instalación de HA. Ve a Configuración -> Dispositivos y Servicios
Ahora, aparece tu página de Integraciones. Selecciona Bluetooth
Y la Integración debería aparecer.
NOTA: Si algo no está funcionando, verifica que el escaneo pasivo no esté seleccionado
Al entrar a la página de Integraciones, si tienes el XIAO nRF52840 Sense 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 poner este nuevo sensor y hemos terminado.
A continuación, ve nuevamente a Configuración -> Integraciones y selecciona la nueva integración BTHome
Luego somos llevados a la página de integración. Podemos ver que tenemos 1 dispositivo y 3 entidades. Las entidades son la temperatura, humedad y fuerza de la señal
Si hacemos clic en las entidades, obtenemos una nueva página donde podemos tener una vista de todas ellas.
Si en su lugar, presionamos en dispositivo, obtenemos la página del dispositivo con todas las opciones así como los valores actuales. Usando esta página, podemos agregarlo al panel de control.
Al presionar "AGREGAR AL PANEL DE CONTROL", llegamos a elegir la vista donde ponerlo.
Después de eso, obtenemos una vista de la tarjeta. Solo presiona "AGREGAR AL PANEL DE CONTROL" para agregarla al panel de control.
Si vamos al panel de control, nuestra tarjeta recién agregada con la temperatura y humedad transmitidas por el XIAO nRF52840 Sense.
Qué Más - Función de Suspensión Profunda
No pude hacer que funcionara. Si alguien tiene una solución, por favor deje un comentario. Puedes compartir tus ideas en GitHub
✨ Proyecto de Colaborador
- Este proyecto está respaldado por el Proyecto de Colaborador de Seeed Studio.
- Gracias a los esfuerzos de Bruno y tu trabajo será exhibido.
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.