Skip to main content

Uso Avanzado de ESPHome del reTerminal E10xx en Home Assistant


Este artículo explora configuraciones avanzadas de ESPHome para tu dispositivo reTerminal E10xx, basándose en los conceptos fundamentales cubiertos en nuestra guía de Uso Básico de ESPHome. Si eres nuevo en ESPHome o el reTerminal E10xx, recomendamos comenzar con la guía básica antes de sumergirte en estas aplicaciones avanzadas.

Capacidades de Hardware

El reTerminal E10xx incluye varios componentes de hardware que pueden ser aprovechados en Home Assistant a través de ESPHome:

  • Tres botones programables (GPIO3, GPIO4, GPIO5)

  • Zumbador (GPIO45)

  • Monitoreo del nivel de batería (GPIO1 para voltaje)

  • LED integrado (GPIO6)

  • Sensor de temperatura y humedad (interfaz I²C)

Exploremos cómo usar cada uno de estos componentes en aplicaciones prácticas.

Control de Componentes de Hardware del reTerminal E10xx

Exploremos cómo usar cada uno de los componentes de hardware en el reTerminal E10xx en Home Assistant.

Botones y LED

Este ejemplo demuestra cómo usar los tres botones en tu reTerminal E10xx para controlar funciones y proporcionar retroalimentación visual con el LED integrado.

Puedes usar este ejemplo copiando el código a continuación y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

# Button configuration
binary_sensor:
- platform: gpio
pin:
number: GPIO3 # Green button
mode: INPUT_PULLUP
inverted: true
id: button_1
name: "Button 1"
on_press:
then:
- light.turn_on: onboard_led
- delay: 500ms
- light.turn_off: onboard_led

- platform: gpio
pin:
number: GPIO4 # Right white button
mode: INPUT_PULLUP
inverted: true
id: button_2
name: "Button 2"
on_press:
then:
- light.turn_on: onboard_led
- delay: 200ms
- light.turn_off: onboard_led
- delay: 200ms
- light.turn_on: onboard_led
- delay: 200ms
- light.turn_off: onboard_led

- platform: gpio
pin:
number: GPIO5 # Left white button
mode: INPUT_PULLUP
inverted: true
id: button_3
name: "Button 3"
on_press:
then:
- light.toggle: onboard_led

# LED configuration
output:
- platform: gpio
pin: GPIO6
id: led_output
inverted: true

light:
- platform: binary
name: "Onboard LED"
output: led_output
id: onboard_led

Esta configuración:

  • Configura los tres botones como entradas con resistencias pull-up

  • Configura el Botón 1 para hacer parpadear brevemente el LED

  • Configura el Botón 2 para hacer parpadear el LED en un patrón de doble parpadeo

  • Configura el Botón 3 para alternar el LED encendido/apagado

  • Hace que el LED esté disponible en Home Assistant como una entidad de luz controlable

Control del Zumbador

El reTerminal E10xx incluye un zumbador en GPIO45 que se puede usar para proporcionar retroalimentación audible. Aquí se explica cómo configurarlo:

Puedes usar este ejemplo copiando el código a continuación y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

# This component creates a raw PWM (Pulse Width Modulation) output signal.
# For ESP32, the correct platform is 'ledc', which uses the dedicated LED Control hardware peripheral.
output:
- platform: ledc # CORRECTED: 'ledc' is the correct platform for ESP32 PWM.
pin: GPIO45
id: buzzer_pwm
# The frequency determines the pitch of the buzzer's sound. 1000Hz is a mid-range tone.
frequency: 1000Hz

# Create a light entity to provide a user-friendly way to control the buzzer.
# The 'brightness' of the light will control the PWM duty cycle, which effectively changes the buzzer's volume.
light:
- platform: monochromatic
output: buzzer_pwm
name: "Buzzer"
id: buzzer
# Setting transition length to 0s makes the buzzer turn on and off instantly.
default_transition_length: 0s

# This section defines the physical button that will trigger the buzzer.
binary_sensor:
- platform: gpio
pin:
number: GPIO3 # The GPIO pin connected to the green button.
mode: INPUT_PULLUP # Use the internal pull-up resistor.
inverted: true # The signal is low when pressed.
id: button_1
# 'on_press' defines the sequence of actions to execute when the button is pressed.
on_press:
then:
# First beep: turn on at 50% volume (brightness) for 200 milliseconds.
- light.turn_on:
id: buzzer
brightness: 50%
- delay: 200ms
- light.turn_off: buzzer
# Pause for 100 milliseconds between beeps.
- delay: 100ms
# Second beep: turn on at 70% volume for 200 milliseconds.
- light.turn_on:
id: buzzer
brightness: 70%
- delay: 200ms
- light.turn_off: buzzer

Esta configuración:

  • Configura el zumbador como una salida PWM

  • Crea una entidad de luz para controlar el zumbador

  • Configura el Botón 1 para reproducir un patrón de pitido corto cuando se presiona

tip

Puedes ajustar el parámetro frequency para cambiar el tono del zumbador. Los valores más altos crean tonos más agudos.

Monitoreo de Batería

El reTerminal E10xx puede monitorear su nivel de batería a través de la entrada analógica en GPIO1. Aquí te mostramos cómo configurarlo:

esphome:
name: reterminal-e10xx
friendly_name: reTerminal_E10xx
on_boot:
priority: 600
then:
- output.turn_on: bsp_battery_enable

esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "m+rOiVDwjdvePoiG1zritvcD0Kl/a2zmsnuG+4IfWlw="

ota:
- platform: esphome
password: "710fecea969062a5775b287a54f3c0f5"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Reterminal-E10Xx"
password: "tRc2fXaYE54Q"

captive_portal:

output:
- platform: gpio
pin: GPIO21
id: bsp_battery_enable

sensor:
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0 # Voltage divider compensation

- platform: template
name: "Battery Level"
id: battery_level
unit_of_measurement: "%"
icon: "mdi:battery"
device_class: battery
state_class: measurement
lambda: 'return id(battery_voltage).state;'
update_interval: 10s
filters:
- calibrate_linear:
- 4.15 -> 100.0
- 3.96 -> 90.0
- 3.91 -> 80.0
- 3.85 -> 70.0
- 3.80 -> 60.0
- 3.75 -> 50.0
- 3.68 -> 40.0
- 3.58 -> 30.0
- 3.49 -> 20.0
- 3.41 -> 10.0
- 3.30 -> 5.0
- 3.27 -> 0.0
- clamp:
min_value: 0
max_value: 100

Esta configuración:

  • Lee el voltaje de la batería a través del ADC

  • Convierte el voltaje a un porcentaje de batería usando una curva de calibración

  • Hace que tanto el voltaje en bruto como el porcentaje estén disponibles en Home Assistant

caution

Para medir el nivel de la batería, necesitas habilitar el pin GPIO21. De lo contrario, no es posible leer el valor de voltaje de la batería desde GPIO1.

Demo 2. Tomar una Captura de Pantalla del Panel de Home Assistant

Este ejemplo demuestra cómo capturar capturas de pantalla de tu panel de Home Assistant y mostrarlas en tu reTerminal E10xx.

Instalando el Complemento Puppet

Paso 1. Primero, necesitas instalar el complemento Puppet. Haz clic en el botón de abajo, que te llevará directamente a la página de instalación del complemento en tu instancia de Home Assistant:

Paso 2. En la página del complemento, haz clic en el botón "INSTALL" y espera a que se complete la instalación.

Creando un Token de Acceso

Paso 3. Después de la instalación, ve a la página de Configuración del complemento Puppet. Como puedes ver, aquí necesitamos ingresar el token. Necesitarás crear un token de acceso para este complemento.

Paso 4. Navega a tu perfil en Home Assistant haciendo clic en tu nombre de usuario en la esquina inferior izquierda, luego selecciona "Long-Lived Access Tokens" en la parte inferior de la página.

Paso 5. Crea un nuevo token con un nombre descriptivo como "Puppet Screenshot" y copia el token generado.

Paso 6. Regresa a la configuración del complemento Puppet y pega el token en el campo "Long-Lived Access Token".

Paso 7. Guarda la configuración y reinicia el complemento Puppet.

Entendiendo la API de Capturas de Pantalla

El complemento Puppet lanza un servidor en el puerto 10000 que genera capturas de pantalla de cualquier página de Home Assistant. Aquí te mostramos cómo usarlo:

Formato Básico de URL de Captura de Pantalla

http://homeassistant.local:10000/lovelace/0?viewport=800x480

Esta URL capturará una captura de pantalla de tu panel de control predeterminado a una resolución de 800x480 (perfecta para reTerminal E10xx).

Optimización para E-Paper

Para pantallas de papel electrónico, añade el parámetro eink para reducir la paleta de colores:

http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2

El valor 2 representa una paleta de 2 colores (blanco y negro).

Invirtiendo Colores

Añade el parámetro invert para invertir el blanco y negro:

http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2&invert

Capturando Diferentes Páginas

Puedes capturar cualquier página de Home Assistant cambiando la ruta de la URL:

http://homeassistant.local:10000/todo?viewport=800x480&eink=2&invert

Paso 10. Prueba tu URL de captura de pantalla ingresándola en un navegador web. Deberías ver la captura de pantalla de tu página de Home Assistant seleccionada.

Configuración de ESPHome

Paso 11. Añade el siguiente código a tu configuración de ESPHome después de la sección captive_portal:

http_request:
verify_ssl: false
timeout: 10s
watchdog_timeout: 15s

online_image:
- id: dashboard_image
format: PNG
type: BINARY
buffer_size: 30000
url: http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2&invert # Replace with your Home Assistant address
update_interval: 30s
on_download_finished:
- delay: 0ms
- component.update: main_display

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: never
lambda: |-
it.image(0, 0, id(dashboard_image));
caution

Reemplaza homeassistant.local con la dirección IP real de tu Home Assistant si la resolución DNS local no funciona en tu red.

Cuando tu configuración se haya subido exitosamente y esté ejecutándose, tu reTerminal E10xx mostrará una captura de pantalla del panel de control de tu Home Assistant:

Demo 3: Modo de Suspensión Profunda

tip

Si comienzas a usar el programa de Suspensión Profunda, recomendamos que lo uses preferiblemente con el botón blanco del lado derecho y configures el botón blanco del lado derecho como el botón de Despertar de Suspensión. De esta manera, cuando quieras actualizar el programa, no te encontrarás con la situación incómoda donde el dispositivo está durmiendo y no puedes subir el programa a través del puerto serie.

Este ejemplo demuestra cómo usar el modo de suspensión profunda para reducir significativamente el consumo de energía, haciendo que tu reTerminal E10xx sea adecuado para aplicaciones alimentadas por batería.

Puedes usar este ejemplo copiando el código de abajo y pegándolo después de la línea de código captive_portal en tu archivo Yaml.

globals:
- id: sleep_counter
type: int
restore_value: yes # Use RTC storage to maintain counter during sleep
initial_value: '0'

# Deep sleep configuration
deep_sleep:
id: deep_sleep_1
run_duration: 30s # Device remains awake for 30 seconds
sleep_duration: 3min # Then sleeps for 3 minutes
# Optional: Use a button to wake from sleep
wakeup_pin: GPIO4
wakeup_pin_mode: INVERT_WAKEUP

interval:
- interval: 29s # Schedule sleep just before run_duration ends
then:
- logger.log: "Entering deep sleep now..."

font:
- file: "gfonts://Inter@700"
id: font1
size: 24

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: 3min
lambda: |-
id(sleep_counter) += 1;
ESP_LOGD("main", "Wakeup count: %d", id(sleep_counter));
it.printf(100, 100, id(font1), "Wakeup count: %d", id(sleep_counter));

Esta configuración:

  • Crea un contador que persiste a través de los ciclos de sueño

  • Configura el dispositivo para despertar durante 30 segundos, luego dormir durante 3 minutos

  • Actualiza la pantalla con el conteo actual de despertares

  • Opcionalmente configura un botón para despertar el dispositivo

Al ejecutarse, verás un contador incrementar cada vez que el dispositivo despierte del sueño:

Demo 4: Ejemplo Integral

tip

Para una mejor comprensión, recomendamos encarecidamente que ejecutes primero los ejemplos básicos anteriores antes de probar este ejemplo integral.

Este ejemplo avanzado combina múltiples características en una solución de panel de control completa para el reTerminal E10xx. Demuestra:

  1. Visualización del clima y clima interior
  2. Monitoreo de batería con iconos
  3. Visualización de hora y fecha
  4. Cambio de páginas usando botones
  5. Monitoreo de batería
Haz clic aquí para ver el código completo
esphome:
name: reterminal
friendly_name: reTerminal
on_boot:
priority: 600
then:
- output.turn_on: bsp_sd_enable
- output.turn_on: bsp_battery_enable
- delay: 200ms
- component.update: battery_voltage
- component.update: battery_level


esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
encryption:
key: "g93yP72UIyVsz9WfffaDMK+JeIQYROIFRK+VIQjkM+g="

ota:
- platform: esphome
password: "1ff187393ee444aa2e892779dc78e488"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "reTerminal-E1001"
password: "yoUkaGlJaDpC"

captive_portal:

# Deep-sleep, wake by GPIO4
deep_sleep:
id: deep_sleep_1
run_duration: 1min
sleep_duration: 60min
wakeup_pin: GPIO4 # Right white button
wakeup_pin_mode: INVERT_WAKEUP

# SPI / I²C
spi:
clk_pin: GPIO7
mosi_pin: GPIO9
i2c:
scl: GPIO20
sda: GPIO19

# Fonts
font:
- file: "gfonts://Inter@700"
id: small_font
size: 24
- file: "gfonts://Inter@700"
id: mid_font
size: 36
- file: "gfonts://Inter@700"
id: big_font
size: 180
- file: "gfonts://Inter@700"
id: time_font
size: 96 # for the big time display
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_mdi_large
size: 70
glyphs:
- "\U000F050F" # thermometer
- "\U000F058E" # humidity
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_bat_icon
size: 24
glyphs:
- "\U000F007A" # mdi-battery-10
- "\U000F007B" # mdi-battery-20
- "\U000F007C" # mdi-battery-30
- "\U000F007D" # mdi-battery-40
- "\U000F007E" # mdi-battery-50
- "\U000F007F" # mdi-battery-60
- "\U000F0080" # mdi-battery-70
- "\U000F0081" # mdi-battery-80
- "\U000F0082" # mdi-battery-90
- "\U000F0079" # mdi-battery

globals:
- id: page_index
type: int
restore_value: true
initial_value: '0'
- id: battery_glyph
type: std::string
restore_value: no
initial_value: "\"\\U000F0079\"" # default full battery

sensor:
- platform: sht4x
temperature:
name: "Temperature"
id: temp_sensor
humidity:
name: "Relative Humidity"
id: hum_sensor
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0
- platform: template
name: "Battery Level"
id: battery_level
unit_of_measurement: "%"
icon: "mdi:battery"
device_class: battery
state_class: measurement
lambda: 'return id(battery_voltage).state;'
update_interval: 60s
on_value:
then:
- lambda: |-
int pct = int(x);
if (pct <= 10) id(battery_glyph) = "\U000F007A";
else if (pct <= 20) id(battery_glyph) = "\U000F007B";
else if (pct <= 30) id(battery_glyph) = "\U000F007C";
else if (pct <= 40) id(battery_glyph) = "\U000F007D";
else if (pct <= 50) id(battery_glyph) = "\U000F007E";
else if (pct <= 60) id(battery_glyph) = "\U000F007F";
else if (pct <= 70) id(battery_glyph) = "\U000F0080";
else if (pct <= 80) id(battery_glyph) = "\U000F0081";
else if (pct <= 90) id(battery_glyph) = "\U000F0082";
else id(battery_glyph) = "\U000F0079";
filters:
- calibrate_linear:
- 4.15 -> 100.0
- 3.96 -> 90.0
- 3.91 -> 80.0
- 3.85 -> 70.0
- 3.80 -> 60.0
- 3.75 -> 50.0
- 3.68 -> 40.0
- 3.58 -> 30.0
- 3.49 -> 20.0
- 3.41 -> 10.0
- 3.30 -> 5.0
- 3.27 -> 0.0
- clamp:
min_value: 0
max_value: 100

output:
- platform: gpio
pin: GPIO6
id: bsp_led
inverted: true
- platform: gpio
pin: GPIO16
id: bsp_sd_enable
- platform: gpio
pin: GPIO21
id: bsp_battery_enable

# Onboard LED
light:
- platform: binary
name: "Onboard LED"
output: bsp_led
id: onboard_led

binary_sensor:
- platform: gpio # Next page
pin:
number: GPIO3
mode: INPUT_PULLUP
inverted: true
id: key1
name: "Key1"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) + 1) % 2;
id(epaper_display).update();

- platform: gpio # Prev page
pin:
number: GPIO5
mode: INPUT_PULLUP
inverted: true
id: key2
name: "Key2"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) - 1 + 2) % 2;
id(epaper_display).update();

# - platform: gpio
# pin:
# number: GPIO4
# mode: INPUT_PULLUP
# inverted: true
# id: key2
# name: "Key2"
# on_press:
# then:
# - lambda: |-
# id(page_index) = (id(page_index) - 1 + 3) % 3;
# id(epaper_display).update();

# Home Assistant time
time:
- platform: homeassistant
id: ha_time

# e-paper
display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: never
lambda: |-
// ---------- PAGE 0 ----------
if (id(page_index) == 0) {
const int scr_w = 800;
const int scr_h = 480;

// Battery in upper-right corner
it.printf(670, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
it.printf(700, 10, id(small_font), "%.0f%%", id(battery_level).state);

//line
it.filled_rectangle(400, 100, 2, 280);

// Convert °C to °F
float temp_f = id(temp_sensor).state * 9.0 / 5.0 + 32.0;

// ---------------------------------------------------------
// Horizontal split: two 400 px columns
const int col_w = scr_w / 2;

const int icon_y = 100; // Icon baseline
const int value_y = 220; // Number baseline
const int unit_y = 300; // Unit baseline
const int label_y = 380; // Text label baseline

const int icon_size = 70; // icon font size
const int val_size = 120; // number font size
const int unit_size = 44; // unit font size
const int label_size= 36; // label font size

// --- Left column : Temperature -----------------------------
const int left_mid = col_w / 2 - 30; // 200 px

// Icon
it.printf(left_mid, icon_y, id(font_mdi_large), TextAlign::CENTER, "\U000F050F");
// Value
it.printf(left_mid, value_y, id(big_font), TextAlign::CENTER, "%.0f", temp_f);
// Unit
it.printf(left_mid + 150, unit_y, id(mid_font), TextAlign::CENTER, "°F");
// Label
it.printf(left_mid, label_y, id(mid_font), TextAlign::CENTER, "Temperature");

// --- Right column : Humidity -------------------------------
const int right_mid = col_w + col_w / 2; // 600 px

// Icon
it.printf(right_mid, icon_y, id(font_mdi_large), TextAlign::CENTER, "\U000F058E");
// Value
it.printf(right_mid, value_y, id(big_font), TextAlign::CENTER, "%.0f", id(hum_sensor).state);
// Unit
it.printf(right_mid + 150, unit_y, id(mid_font), TextAlign::CENTER, "%%");
// Label
it.printf(right_mid, label_y, id(mid_font), TextAlign::CENTER, "Humidity");
}
// ---------- PAGE 1 ----------
else{
// Battery top-right
it.printf(670, 13, id(font_bat_icon), "%s", id(battery_glyph).c_str());
it.printf(700, 10, id(small_font), "%.0f%%", id(battery_level).state);

auto now = id(ha_time).now();
struct tm timeinfo = now.to_c_tm();

// centering time HH:MM
char timeStr[6];
strftime(timeStr, sizeof(timeStr), "%H:%M", &timeinfo);
it.printf(400, 180, id(time_font), TextAlign::CENTER, timeStr);

// Date: Day of week
const char *weekday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
const char *wday = weekday[timeinfo.tm_wday];

// Date: month - day
char dateStr[12];
strftime(dateStr, sizeof(dateStr), "%b %d", &timeinfo); // e.g. Jun 15

// Day of the week + date below the time
it.printf(400, 280, id(mid_font), TextAlign::CENTER, "%s, %s", wday, dateStr);
}

Cuando tu configuración se haya subido exitosamente y esté ejecutándose, tu reTerminal E10xx mostrará un panel completo con datos ambientales, hora y estado de la batería:

Entendiendo el Ejemplo Completo

Este ejemplo implementa:

  1. Múltiples Páginas: La pantalla alterna entre dos páginas - un panel climático y una visualización de hora/fecha

  2. Navegación con Botones: Los botones en GPIO3 y GPIO5 se usan para navegar entre páginas

  3. Monitoreo de Batería: El nivel de batería se muestra con iconos apropiados que cambian según el nivel de carga

  4. Inicialización de Hardware: La tarjeta SD y los circuitos de monitoreo de batería se habilitan al arrancar

  5. Visualización de Temperatura y Humedad: Usando el sensor SHT4x integrado vía I²C

  6. Iconos Dinámicos: Los iconos de Material Design cambian según los valores del sensor

FAQ

P1: ¿Por qué no hay datos?

En este caso, deberías ir a Configuración -> Dispositivos y Servicios -> Integraciones para RECONFIGURAR el dispositivo. ¿No encuentras tu Panel ePaper? Intenta reiniciar Home Assistant.

P2: ¿Por qué no puedo obtener esos datos en Home Assistant?

En este caso, deberías ir a Configuración -> Dispositivos y Servicios -> Integraciones para AÑADIR tu dispositivo a Home Assistant.

P3: ¿Falló la subida del programa por Wi-Fi?

En este caso, tu dispositivo está desconectado o en modo de sueño profundo. Por favor asegúrate de que esté conectado a tu red o despiértalo del modo de sueño antes de intentar subir.

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