Skip to main content

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

pir

pir

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.

Wiring

Wiring

Wiring

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:

  1. Instalar CircuitPython en el XIAO nRF52840 Sense
  2. Instalar las librerías necesarias
  3. Programar nuestro sensor usando el protocolo BTHome
  4. 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.

CircuitPython Download

A continuación, presiona el botón de descarga para obtener el archivo para nuestro dispositivo.

CircuitPython Download

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.

CircuitPython Download

Una nueva unidad debería haber aparecido en tu computadora llamada XIAO-SENSE.

XIAO nRF52840 Sense drive

A continuación, copia el archivo descargado a la unidad.

XIAO nRF52840 Sense drive

Después de un tiempo, aparece una nueva unidad llamada CIRCUITPY. Tenemos CircuitPython instalado en nuestro microcontrolador.

XIAO nRF52840 Sense drive

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):

XIAO nRF52840 Sense drive

Paso 3 - Subir Código

Antes de ir al código, necesitamos entender qué es BTHome.

BTHome logo

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.

Logo BTHome

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

Logo de 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

Home Assistant

Ahora, aparece tu página de Integraciones. Selecciona Bluetooth

Home Assistant

Y la Integración debería aparecer.

Home Assistant

NOTA: Si algo no está funcionando, verifica que el escaneo pasivo no esté seleccionado

Home Assistant

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.

Home Assistant

Presiona "Configurar" para configurar esta nueva Integración. Presiona Enviar.

Home Assistant

Ahora solo necesitas seleccionar el área donde poner este nuevo sensor y hemos terminado.

Home Assistant

A continuación, ve nuevamente a Configuración -> Integraciones y selecciona la nueva integración BTHome

Home Assistant

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

Home Assistant

Si hacemos clic en las entidades, obtenemos una nueva página donde podemos tener una vista de todas ellas.

Home Assistant

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.

Home Assistant

Al presionar "AGREGAR AL PANEL DE CONTROL", llegamos a elegir la vista donde ponerlo.

Home Assistant

Después de eso, obtenemos una vista de la tarjeta. Solo presiona "AGREGAR AL PANEL DE CONTROL" para agregarla al panel de control.

Home Assistant

Si vamos al panel de control, nuestra tarjeta recién agregada con la temperatura y humedad transmitidas por el XIAO nRF52840 Sense.

Home Assistant

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

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.

Loading Comments...