Conecta tu Botón IoT de Seeed Studio a Home Assistant vía Zigbee

En este tutorial te mostraremos cómo conectar el Botón IoT de Seeed Studio a Home Assistant usando Zigbee. El Botón IoT de Seeed Studio cuenta con un chip ESP32-C6 con funcionalidad Zigbee, lo que lo convierte en un dispositivo versátil para tu hogar inteligente. Aprenderás cómo flashear el firmware Zigbee, emparejarlo con Home Assistant e incluso personalizar el comportamiento del botón mediante desarrollo en Arduino.
Materiales necesarios
Seeed Studio IoT Button | Zigbee Coordinator (e.g., Home Assistant Connect ZBT-1) |
---|---|
![]() | ![]() |
El Botón IoT de Seeed Studio es un dispositivo inteligente completo y autónomo con un chip ESP32-C6 integrado. Puede integrarse en Home Assistant vía Zigbee para controlar diversos dispositivos y activar automatizaciones. Gracias a Zigbee, consume poca energía y ofrece conectividad fiable.
Descripción general de Zigbee en el Botón IoT
El microcontrolador ESP32-C6 del Botón IoT incluye funcionalidad Zigbee, lo que permite:
- Conectarse directamente a redes Zigbee sin hardware adicional
- Operar como dispositivo final Zigbee (ZED)
- Enviar comandos distintos según el patrón de pulsación del botón
- Funcionar con batería durante largos periodos gracias al bajo consumo de Zigbee
El botón soporta tres acciones diferentes:
- Clic único: Pulsación rápida y liberación
- Doble clic: Dos pulsaciones rápidas en menos de 400 ms
- Pulsación larga: Mantener pulsado más de 1 s (restablecimiento de fábrica)
Método 1: Usar el firmware Zigbee precompilado
La forma más sencilla de empezar es usar el firmware Zigbee precompilado para el Botón IoT.
Paso 1: Descargar el firmware precompilado
- Visita el repositorio GitHub del Seeed IoT Button
- Navega a la carpeta
Zigbee_Seeed_IoT_Button/build/factory_firmware_zigbee
- Descarga los archivos de firmware:
Zigbee_Seeed_IoT_Button.merged.bin
(para flasheo con un solo archivo)- O los archivos individuales si prefieres flashearlos por separado
Paso 2: Instalar esptool.py
Si no tienes instalado esptool.py, ejecútalo con pip:
pip install esptool
Paso 3: Flashear el firmware
- Conecta el Botón IoT al ordenador por USB
- Pon el dispositivo en modo bootloader (si es necesario)
- Flashea el firmware con uno de estos comandos:
Opción 1: Usando el binario combinado (recomendado):
esptool.py --chip esp32c6 --baud 921600 --before default_reset --after hard_reset write_flash 0x0 "Zigbee_Seeed_IoT_Button.merged.bin"
Opción 2: Usando archivos individuales:
esptool.py --chip esp32c6 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode keep --flash_freq keep --flash_size keep 0x0 "Zigbee_Seeed_IoT_Button.bootloader.bin" 0x8000 "Zigbee_Seeed_IoT_Button.partitions.bin" 0xe000 "boot_app0.bin" 0x10000 "Zigbee_Seeed_IoT_Button.bin"
- Espera a que finalice el proceso de flasheo
- El dispositivo se reiniciará automáticamente
Paso 4: Configurar Zigbee en Home Assistant
Antes de emparejar tu Botón IoT, configura un coordinador Zigbee en Home Assistant:
- Instala un coordinador Zigbee: Conecta un coordinador como el Home Assistant SkyConnect ZBT-1 a tu servidor Home Assistant
- Configura Zigbee Home Automation (ZHA):
- Ve a Ajustes > Dispositivos y servicios
- Haz clic en Añadir integración y busca “Zigbee Home Automation”
- Sigue los pasos para configurar ZHA con tu coordinador

Paso 5: Emparejar el Botón IoT con Home Assistant
- En Home Assistant, ve a Ajustes > Dispositivos y servicios > Zigbee Home Automation
- Haz clic en tu dispositivo coordinador Zigbee
- Haz clic en Añadir dispositivo para poner el coordinador en modo emparejamiento

- Pulsa el botón de tu IoT Button para iniciar el emparejamiento
- Home Assistant debería descubrirlo como “Seeed Studio IoT_Button”
- Sigue los pasos para completar el emparejamiento

Paso 6: Crear automatizaciones en Home Assistant
Una vez emparejado, puedes crear automatizaciones según las acciones del botón:
- Ve a Ajustes > Automatizaciones y escenas > Crear automatización
- Selecciona Dispositivo como tipo de disparador
- Busca tu Botón IoT en la lista de dispositivos
- Elige el tipo de acción:
- "click_1" para clic único
- "click_2" para doble clic
- Configura la acción que quieras al presionar el botón
- Guarda la automatización
Ejemplo de YAML para automatización en Home Assistant:
automation:
- alias: "IoT Button Single Click - Toggle Living Room Light"
trigger:
platform: device
domain: mqtt
device_id: [YOUR_DEVICE_ID]
type: action
subtype: click_1
action:
service: light.toggle
target:
entity_id: light.living_room
Método 2: Desarrollar firmware Zigbee personalizado con Arduino
Si quieres personalizar el comportamiento de tu Botón IoT, puedes crear tu propio firmware Zigbee usando Arduino.
Paso 1: Configurar Arduino IDE para ESP32-C6
- Instala la última versión de Arduino IDE
- Añade soporte para ESP32:
- Ve a Archivo > Preferencias
- Añade
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
en “URLs adicionales del Gestor de Placas” - Ve a Herramientas > Placa > Gestor de Placas, busca “esp32” e instala la versión más reciente (>= 3.1.3)
Paso 2: Instalar librerías necesarias
El Botón IoT usa el SDK Zigbee de Espressif incluido en el paquete Arduino-ESP32. No se requieren librerías adicionales.
Paso 3: Configurar Arduino IDE para desarrollo Zigbee
- Selecciona la placa correcta:
- Tools > Board > ESP32 Arduino > ESP32-C6 Dev Module
- Ajusta las opciones Zigbee:
- Tools > Zigbee mode > Zigbee Endpoint
- Tools > Partition Scheme > Zigbee 4MB with spiffs

Paso 4: Preparar los archivos ZigbeeMultiButton
- Descarga
ZigbeeMultiButton.h
yZigbeeMultiButton.cpp
desde el Seeed IoT Button GitHub repository - Copia estos archivos a la carpeta de endpoints de la librería Zigbee de Arduino:
<Arduino_Installation_Path>/libraries/Zigbee/src/ep/
- Edita
<Arduino_Installation_Path>/libraries/Zigbee/src/Zigbee.h
para incluir el nuevo header:// Add this line with the other endpoint includes
#include "ep/ZigbeeMultiButton.h"
Paso 5: Crear tu firmware personalizado
Crea un nuevo sketch en Arduino y usa el siguiente código como punto de partida:
#ifndef ZIGBEE_MODE_ED
#error "Zigbee end device mode is not selected in Tools->Zigbee mode"
#endif
#include "Zigbee.h"
// Pin definitions
#define BUTTON_PIN 9 // GPIO9 for the button
// Zigbee endpoint configuration
#define BUTTON_ENDPOINT_ID 1
// Create a Zigbee Multi-Button endpoint
ZigbeeMultiButton zbButton = ZigbeeMultiButton(BUTTON_ENDPOINT_ID);
void setup() {
// Initialize serial communication
Serial.begin(115200);
Serial.println("Seeed Studio IoT Button - Zigbee");
// Initialize button pin
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Configure the Zigbee button endpoint
zbButton.setManufacturerAndModel("Seeed Studio", "IoT_Button");
// Add the endpoint to Zigbee
Zigbee.addEndpoint(&zbButton);
// Create Zigbee configuration for End Device
esp_zb_cfg_t zigbeeConfig = ZIGBEE_DEFAULT_ED_CONFIG();
// Start Zigbee
if (!Zigbee.begin(&zigbeeConfig, false)) {
Serial.println("Zigbee failed to start!");
Serial.println("Rebooting...");
ESP.restart();
}
Serial.println("Connecting to Zigbee network");
while (!Zigbee.connected()) {
Serial.print(".");
delay(100);
}
Serial.println("\nSuccessfully connected to Zigbee network");
}
// Variables for button state tracking
bool lastButtonState = HIGH; // Button is pulled up when not pressed
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long pressStartTime = 0;
bool isLongPress = false;
int clickCount = 0;
unsigned long lastClickTime = 0;
const unsigned long doubleClickWindow = 400; // Time window for double click detection
void loop() {
// Read the button state
bool reading = digitalRead(BUTTON_PIN);
// Debounce the button
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// Button state has settled
// Button pressed (LOW)
if (reading == LOW && lastButtonState == HIGH) {
pressStartTime = millis();
isLongPress = false;
}
// Button released (HIGH)
if (reading == HIGH && lastButtonState == LOW) {
unsigned long pressDuration = millis() - pressStartTime;
// Long press detection (for factory reset)
if (pressDuration > 1000) {
isLongPress = true;
Serial.println("Long press detected - Factory Reset");
Zigbee.factoryReset();
}
// Short press detection (for click counting)
else {
clickCount++;
lastClickTime = millis();
}
}
lastButtonState = reading;
}
// Process click count after a delay
if (clickCount > 0 && (millis() - lastClickTime) > doubleClickWindow) {
if (clickCount == 1) {
Serial.println("Single click detected");
zbButton.sendButtonAction(1); // Send single click event
} else if (clickCount == 2) {
Serial.println("Double click detected");
zbButton.sendButtonAction(2); // Send double click event
}
clickCount = 0;
}
// Allow Zigbee stack to process events
delay(10);
}
Paso 6: Cargar y Probar el Firmware
- Conecta tu IoT Button a tu computadora mediante USB
- Selecciona el puerto correcto en el IDE de Arduino
- Haz clic en el botón Upload
- Abre el Monitor Serial para ver información de depuración
- Sigue los pasos de emparejamiento del Método 1 para conectar el botón con Home Assistant
Comprendiendo la Implementación Zigbee
La implementación Zigbee del IoT Button utiliza los siguientes componentes:
Clase ZigbeeMultiButton
Esta clase personalizada extiende la funcionalidad Zigbee para soportar múltiples acciones de botón:
- Implementa un dispositivo tipo interruptor Zigbee On/Off
- Añade clústeres personalizados para reportar acciones del botón
- Proporciona métodos para enviar diferentes eventos de botón a la red Zigbee
Detección de Acciones del Botón
El firmware detecta tres tipos de acciones:
- Clic Único: Presionar y soltar rápidamente
- Doble Clic: Dos pulsaciones rápidas dentro de 400 ms
- Pulsación Larga: Mantener presionado por más de 1 segundo (se usa para restablecimiento de fábrica)
Gestión de la Red Zigbee
El firmware maneja operaciones de red Zigbee:
- Unirse automáticamente a una red Zigbee al iniciar
- Reportar acciones del botón al coordinador
- Restablecer a valores de fábrica cuando se detecta una pulsación larga
Solución de Problemas
Si tienes problemas con la funcionalidad Zigbee de tu IoT Button, prueba estos pasos:
Problemas de Emparejamiento
-
El botón no se une a la red:
- Asegúrate de que tu coordinador Zigbee esté en modo de emparejamiento
- Verifica que el coordinador esté dentro del alcance del botón
- Intenta realizar un restablecimiento de fábrica manteniendo presionado el botón
-
El botón no aparece en Home Assistant:
- Verifica que ZHA esté configurado correctamente
- Asegúrate de que el coordinador funcione correctamente
- Intenta reiniciar la integración ZHA
Problemas con las Acciones del Botón
-
Las acciones del botón no se detectan:
- Revisa la salida serial para información de depuración
- Verifica que el botón esté conectado correctamente al GPIO9
- Asegúrate de que el botón esté emparejado con tu red Zigbee
-
Las automatizaciones no se activan:
- Verifica que la automatización esté correctamente configurada
- Revisa los registros Zigbee en Home Assistant para eventos entrantes
- Asegúrate de que el botón esté dentro del alcance del coordinador
Personalización Avanzada
Puedes personalizar aún más tu IoT Button modificando el firmware:
Cambiar el Comportamiento del Botón
Puedes modificar la función loop()
para detectar distintos patrones:
- Añadir detección de triple clic
- Cambiar los parámetros de tiempo para diferentes tipos de pulsación
- Implementar patrones de mantener y soltar
Añadir Monitoreo de Batería
El ESP32-C6 puede monitorear el voltaje de la batería. Agrega esta funcionalidad para reportar el nivel de batería a Home Assistant:
// Add to setup()
zbButton.setPowerSource(ZB_POWER_SOURCE_BATTERY, 100); // Initial battery level
// Add to loop() periodically
int batteryLevel = readBatteryLevel(); // Implement this function
zbButton.setBatteryLevel(batteryLevel);
Agregando retroalimentación con el LED
Puedes usar un LED para proveer retroalimentación de las acciones del botón:
#define LED_PIN 8 // Example LED pin
// Add to setup()
pinMode(LED_PIN, OUTPUT);
// Add LED feedback when actions are detected
digitalWrite(LED_PIN, HIGH);
delay(100);
digitalWrite(LED_PIN, LOW);
Conclusión
El IoT Button de Seeed Studio con funcionalidad Zigbee ofrece una forma versátil y eficiente en consumo de energía para controlar tu hogar inteligente. Ya sea que utilices el firmware preinstalado o desarrolles tu propia solución personalizada, el botón proporciona una interfaz simple para activar automatizaciones complejas en Home Assistant.
Aprovechando las capacidades Zigbee integradas del ESP32-C6, el IoT Button puede operar durante largos periodos con batería, manteniendo una conectividad confiable con tu ecosistema domótico.
Solución de Problemas
P1: ¿Por qué mi dispositivo pierde conexión constantemente y no puede conectarse a Internet después de cambiar la batería? Confirmo que la batería está cargada.
Después de retirar la batería, debido a la estrategia de protección del chip de la batería 18650, esta necesita ser activada brevemente con un cable de alimentación USB cargado para funcionar correctamente.
Recursos
- [GITHUB] Repositorio de Seeed IoT Button Zigbee en Github
- [GITHUB] Repositorio de Seeed IoT Button ESPHome en Github
- [PDF] Esquemático en PDF del Seeed IoT Button
- [SCH&PCB] Esquemático y PCB del Seeed IoT Button
Soporte Técnico y Discusión del Producto
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte distintos tipos de soporte y asegurarnos de que tu experiencia sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a tus preferencias y necesidades.