Saltar al contenido principal

Recetario de ESPHome - Avanzado: reTerminal E Serie

Requisitos previos

Esta página asume que ya has seguido el recetario básico de ESPHome para reTerminal E Serie (dispositivo en Wi‑Fi, integración con Home Assistant en línea, primer panel renderizado). Para el esqueleto YAML a nivel de plataforma y los pasos de integración con Home Assistant, consulta Trabajar con ESPHome.


Este artículo explora configuraciones avanzadas de ESPHome para tu dispositivo reTerminal E Serie con pantalla de tinta electrónica, basándose en los conceptos fundamentales tratados en nuestra guía de uso básico de ESPHome. Si eres nuevo en ESPHome o en la reTerminal E Serie, te recomendamos comenzar con la guía básica antes de profundizar en estas aplicaciones avanzadas.

Capacidades de hardware

La reTerminal E Serie con pantalla de tinta electrónica incluye varios componentes de hardware que se pueden aprovechar en Home Assistant a través de ESPHome:

  • Tres botones programables (GPIO3, GPIO4, GPIO5)

  • Zumbador (GPIO45)

  • Monitorización del nivel de batería (GPIO1 para el voltaje)

  • LED integrado (GPIO6)

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

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

Control de componentes de hardware de la reTerminal E Serie con pantalla de tinta electrónica

Veamos cómo usar cada uno de los componentes de hardware de la reTerminal E Serie con pantalla de tinta electrónica en Home Assistant.

Botones y LED

Este ejemplo muestra cómo usar los tres botones de tu reTerminal E Serie con pantalla de tinta electrónica para controlar funciones y proporcionar retroalimentación visual con el LED integrado.

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.

# 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 con un patrón de doble destello
  • Configura el Botón 3 para conmutar el LED encendido/apagado
  • Hace que el LED esté disponible en Home Assistant como una entidad de luz controlable

Control del zumbador

La reTerminal E Serie con pantalla de tinta electrónica incluye un zumbador en el GPIO45 que se puede usar para proporcionar retroalimentación audible. Aquí se muestra cómo configurarlo:

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.

# 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 pulsa
tip

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

Monitorización de la batería

La reTerminal E Serie con pantalla de tinta electrónica puede monitorizar su nivel de batería a través de la entrada analógica en GPIO1. Aquí se muestra 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 en un porcentaje de batería usando una curva de calibración
  • Hace que tanto el voltaje bruto como el porcentaje estén disponibles en Home Assistant
precaución

Para medir el nivel de 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 el panel de Home Assistant como una captura de pantalla

Este ejemplo muestra cómo capturar capturas de pantalla de tu panel de Home Assistant y mostrarlas en tu reTerminal E Serie.

Instalación del 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 la instalación se complete.

Creación de un token de acceso

Paso 3. Después de la instalación, ve a la página de Configuration del complemento Puppet. Como puedes ver, aquí necesitamos introducir 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 y 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. Vuelve 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.

Comprender la API de captura de pantalla

El complemento Puppet inicia un servidor en el puerto 10000 que genera capturas de pantalla de cualquier página de Home Assistant. Así es como se usa:

Formato básico de la URL de captura de pantalla

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

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

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

Invertir colores

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

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

Capturar 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

Prueba tu URL de captura de pantalla introduciéndola en un navegador web. Deberías ver la captura de pantalla de la página de Home Assistant que hayas seleccionado.

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:


……
psram:
mode: octal
speed: 80MHz

……

captive_portal:

spi:
clk_pin: GPIO7
mosi_pin: GPIO9

http_request:
verify_ssl: false
timeout: 20s
watchdog_timeout: 25s

online_image:
- id: dashboard_image
format: PNG
type: GRAYSCALE
buffer_size: 65536
url: http://homeassistant.local:10000/lovelace/0?viewport=800x480&eink=2&invert
update_interval: 1min
on_download_finished:
- component.update: epaper_display

display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2 # You can use 7.50inv2alt when you draw complex info and it display not good.
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: 300s
lambda: |-
it.image(0, 0, id(dashboard_image));
precaución

Sustituye homeassistant.local por 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 y esté ejecutándose correctamente, tu pantalla de papel electrónico reTerminal E Serie mostrará una captura de pantalla de tu panel de Home Assistant:

Demo 3: Modo de suspensión profunda

tip

Si empiezas a usar el programa de suspensión profunda, te recomendamos que lo utilices preferiblemente con el botón blanco del lado derecho y que configures el botón blanco del lado derecho como botón de activación de suspensión. De este modo, cuando quieras actualizar el programa, no te encontrarás con la situación incómoda de que el dispositivo esté durmiendo y no puedas 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 pantalla de papel electrónico reTerminal E Serie sea adecuada 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: 5min # Then sleeps for 5 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: 5min
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 suspensión
  • Configura el dispositivo para activarse durante 30 segundos y luego dormir durante 3 minutos
  • Actualiza la pantalla con el número actual de activaciones
  • Opcionalmente configura un botón para activar el dispositivo

Cuando se esté ejecutando, verás que un contador se incrementa cada vez que el dispositivo se despierta de la suspensión:

Demo 4: Ejemplo completo

tip

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

Este ejemplo avanzado combina múltiples funciones en una solución de panel completa para la reTerminal E Serie. Demuestra:

  1. Visualización del clima y del ambiente interior
  2. Monitorización de la batería con iconos
  3. Visualización de la hora y la fecha
  4. Cambio de página usando botones
  5. Monitorización de la batería
Haz clic aquí para ver el código completo
esphome:
name: reterminal_e1001
friendly_name: reTerminal_E1001
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 y esté ejecutándose correctamente, tu pantalla de tinta electrónica reTerminal E Serie mostrará un panel de control completo con datos del entorno, hora y estado de la batería:

Comprender el ejemplo completo

Este ejemplo implementa:

  1. Múltiples páginas: La pantalla alterna entre dos páginas: un panel climático y una pantalla de hora/fecha
  2. Navegación con botones: Los botones en GPIO3 y GPIO5 se utilizan para navegar entre las páginas
  3. Supervisión de la 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 monitorización de la batería se habilitan al arrancar
  5. Visualización de temperatura y humedad: Usando el sensor SHT4x integrado a través de I²C
  6. Iconos dinámicos: Los iconos de Material Design cambian según los valores de los sensores

Preguntas frecuentes

P1: ¿Por qué no hay datos?

En este caso, debes ir a Settings -> Devices & Services -> Integrations para RECONFIGURAR el dispositivo. ¿No has encontrado tu panel de tinta electrónica? Intenta reiniciar Home Assistant.

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

En este caso, debes ir a Settings -> Devices & Services -> Integrations para AÑADIR tu dispositivo a Home Assistant.

P3: ¿Falló la carga del programa por Wi‑Fi?

En este caso, tu dispositivo está desconectado o en modo de suspensión profunda. Asegúrate de que esté conectado a tu red o despiértalo del modo de suspensión antes de intentar cargar.

Soporte técnico y debate sobre el producto

¡Gracias por elegir nuestros productos! Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a distintas preferencias y necesidades.

Loading Comments...