### The problem
Hi,
I wanted to update a reTerminal E1002 and I get this error …during compilation. I can't compile the firmware. In version 2025.8.3, I have no problem.
### Which version of ESPHome has the issue?
2025.9.x
### What type of installation are you using?
pip
### What platform are you using?
ESP32
### Component causing the issue
Waveshare_epaper
### YAML Config
```yaml
substitutions:
name: reterminal-e1002
friendly_name: reTerminal E1002
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
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
- delay: 15s
- component.update: sun_sunrise
- component.update: sun_sunset
- delay: 45s
- component.update: epaper_display
- delay: 30s
- lambda: |-
auto time = id(ha_time).now();
if (!time.is_valid()) {
ESP_LOGI("custom", "Heure invalide (pas de synchro NTP). Deep sleep 60 min par défaut.");
id(deep_sleep_1).set_sleep_duration(60 * 60 * 1000ULL);
id(deep_sleep_1).begin_sleep(true);
return;
}
int now_seconds = time.hour * 3600 + time.minute * 60 + time.second;
int h = time.hour;
int m = time.minute;
int interval = id(sleep_interval_hours);
int target_min = id(target_minute);
//Calcul de la prochaine heure cible
int next_target_hour = (h / interval) * interval;
if (m >= target_min) {
next_target_hour += interval;
}
if (next_target_hour >= 24) next_target_hour -= 24;
int target_seconds = next_target_hour * 3600 + target_min * 60;
if (target_seconds <= now_seconds) {
target_seconds += 24 * 3600; // bascule au jour suivant
}
int sleep_seconds = target_seconds - now_seconds;
ESP_LOGI("custom", "Il est %02d:%02d:%02d", h, m, time.second);
ESP_LOGI("custom", "Prochain réveil prévu à %02d:%02d (dans %d sec)",
next_target_hour, target_min, sleep_seconds);
id(deep_sleep_1).set_sleep_duration((uint64_t)sleep_seconds * 1000ULL);
id(deep_sleep_1).begin_sleep(true);
external_components:
# - source:
# type: git
# url: https://github.com/lublak/esphome
# ref: dev
# components: [ waveshare_epaper ]
- source: github://pr#8416
components: [waveshare_epaper]
refresh: 1h
esp32:
#board: esp32-s3-devkitc-1
variant: esp32s3
framework:
type: esp-idf
flash_size: 32MB
psram:
mode: octal
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "LYgjtfzoelYYwciqzqr1Z6dsZjwccpxxxxxxxxxxx"
ota:
- platform: esphome
password: "ce1cbb03ba47ca50d022xxxxxxxxx"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
manual_ip:
static_ip: 192.168.1.110
gateway: !secret wifi_gtw
subnet: !secret wifi_sub
dns1: !secret wifi_dns1
deep_sleep:
id: deep_sleep_1
run_duration: 2min
#sleep_duration: 58min
wakeup_pin: GPIO3 # Bouton vert
wakeup_pin_mode: INVERT_WAKEUP
# SPI / I²C
spi:
clk_pin: GPIO7
mosi_pin: GPIO9
i2c:
scl: GPIO20
sda: GPIO19
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
- id: sleep_interval_hours
type: int
restore_value: no
initial_value: '1' # Toutes les 1 heure
- id: target_minute
type: int
restore_value: no
initial_value: '2' # À la minute 02
script:
- id: buzzer_cycle
mode: single
then:
- light.turn_on:
id: buzzer
brightness: "50%"
- delay: 400ms
- light.turn_off: buzzer
- delay: 400ms
- light.turn_on:
id: buzzer
brightness: "60%"
- delay: 400ms
- light.turn_off: buzzer
- delay: 400ms
- light.turn_on:
id: buzzer
brightness: "70%"
- delay: 400ms
- light.turn_off: buzzer
- delay: 400ms
- light.turn_on:
id: buzzer
brightness: "80%"
- delay: 400ms
- light.turn_off: buzzer
- delay: 400ms
- light.turn_on:
id: buzzer
brightness: "80%"
- delay: 400ms
- light.turn_off: buzzer
sensor:
- platform: sht4x
temperature:
name: Température
id: temp_sensor
humidity:
name: Humidité
id: hum_sensor
- platform: adc
pin: GPIO1
name: Tension Batterie
id: battery_voltage
update_interval: 60s
attenuation: 12db
filters:
- multiply: 2.0
on_value_range:
- below: 3.41
then:
- script.execute: buzzer_cycle
- platform: template
name: Niveau Batterie
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
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "temperaturea"
id: today_temperaturea
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "templowa"
id: today_templowa
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "humiditea"
id: today_humiditea
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "precipitationa"
id: today_precipitationa
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "temperatured"
id: tomorrow_temperatured
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "templowd"
id: tomorrow_templowd
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "humidited"
id: tomorrow_humidited
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "precipitationd"
id: tomorrow_precipitationd
- platform: homeassistant
entity_id: weather.ma_ville
attribute: "temperature"
id: now_weather_temperature
- platform: homeassistant
entity_id: weather.ma_ville
attribute: "humidity"
id: now_weather_humidity
- platform: homeassistant
entity_id: weather.ma_ville
attribute: "wind_speed"
id: now_weather_wind_speed
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "heure0"
id: h1_weather_heure
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "temperature0"
id: h1_weather_temperature
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "humidite0"
id: h1_weather_humidite
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "wind0"
id: h1_weather_wind
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "precipitation0"
id: h1_weather_precipitation
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "heure1"
id: h2_weather_heure
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "temperature1"
id: h2_weather_temperature
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "humidite1"
id: h2_weather_humidite
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "wind1"
id: h2_weather_wind
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "precipitation1"
id: h2_weather_precipitation
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "heure2"
id: h3_weather_heure
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "temperature2"
id: h3_weather_temperature
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "humidite2"
id: h3_weather_humidite
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "wind2"
id: h3_weather_wind
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "precipitation2"
id: h3_weather_precipitation
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
- 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
# Onboard LED verte
light:
- platform: binary
name: Onboard LED
output: bsp_led
id: onboard_led
- 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
binary_sensor:
- platform: gpio # Bouton page suivante
pin:
number: GPIO4
mode: INPUT_PULLUP
inverted: true
id: key1
name: "Bouton suivant"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) + 1) % 2;
id(epaper_display).update();
- platform: gpio # Bouton page précédente
pin:
number: GPIO5
mode: INPUT_PULLUP
inverted: true
id: key2
name: "Bouton précédent"
on_press:
then:
- lambda: |-
id(page_index) = (id(page_index) - 1 + 2) % 2;
id(epaper_display).update();
# - platform: gpio # Bouton vert
# pin:
# number: GPIO3
# mode: INPUT_PULLUP
# inverted: true
# id: key_green
# name: "Bouton vert"
# on_multi_click:
# - timing:
# - ON for 40ms to 400ms
# - OFF for 40ms to 300ms
# - ON for 40ms to 400ms
# - OFF for at least 330ms
# then:
# - component.update: epaper_display
# Home Assistant time
time:
- platform: homeassistant
id: ha_time
sun:
latitude: !secret latitude
longitude: !secret longitude
text_sensor:
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "conditiona"
id: today_weather
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_jour_epaper
attribute: "conditiond"
id: tomorrow_weather
- platform: homeassistant
entity_id: weather.ma_ville
id: now_weather
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "condition0"
id: h1_weather_condition
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "condition1"
id: h2_weather_condition
- platform: homeassistant
entity_id: sensor.meteo_ma_ville_heure_epaper
attribute: "condition2"
id: h3_weather_condition
- platform: sun
name: Sun Next Sunrise
type: sunrise
format: "%H:%M"
id: sun_sunrise
internal: true
- platform: sun
name: Sun Next Sunset
type: sunset
format: "%H:%M"
id: sun_sunset
internal: true
- platform: homeassistant
entity_id: sensor.direction_vent_ma_ville
id: now_weather_wind_bearing
# Fonts
font:
- file: "gfonts://Inter@700"
id: small_font
size: 24
- file: "gfonts://Inter@700"
id: mid_font
size: 36
glyphs: "<>!'%()/+,-_.:;*=°?#0123456789AÀBCDEÉÈÊFGHIJKLMNOPQRSTUVWXYZ aàbcdeéèêfghijklmnopqrstuvwxyzôöç"
- file: "gfonts://Inter@700"
id: title_font
size: 42
glyphs: "<>!'%()/+,-_.:;*=°?#0123456789AÀBCDEÉÈÊFGHIJKLMNOPQRSTUVWXYZ aàbcdeéèêfghijklmnopqrstuvwxyzôöç"
- file: "gfonts://Inter@700"
id: big_font
size: 180
- 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
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_today
size: 110
glyphs: &mdi-weather-glyphs
- "\U000F0590" # mdi-weather-cloudy
- "\U000F0F2F" # mdi-weather-cloudy-alert
- "\U000F0593" # mdi-weather-lightning
- "\U000F067E" # mdi-weather-lightning-rainy
- "\U000F0594" # mdi-weather-night
- "\U000F0F31" # mdi-weather-night-partly-cloudy
- "\U000F0595" # mdi-weather-partly-cloudy
- "\U000F0F32" # mdi-weather-partly-lightning
- "\U000F0F33" # mdi-weather-partly-rainy
- "\U000F0596" # mdi-weather-pouring
- "\U000F0597" # mdi-weather-rainy
- "\U000F0598" # mdi-weather-snowy
- "\U000F067F" # mdi-weather-snowy-rainy
- "\U000F0599" # mdi-weather-sunny
- "\U000F059B" # mdi-weather-sunset-down
- "\U000F059C" # mdi-weather-sunset-up
- "\U000F0F37" # mdi-weather-sunny-alert
- "\U000F14E4" # mdi-weather-sunny-off
- "\U000F059A" # mdi-weather-sunset
- "\U000F059D" # mdi-weather-windy
- "\U000F059E" # mdi-weather-windy-variant
- "\U000F0591" # mdi-weather-fog
- "\U000F0592" # mdi-weather-hail
- "\U000F0F30" # mdi-weather-hazy
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_weather_icon
size: 24
glyphs:
- "\U000F10C2" # mdi-thermometer-high
- "\U000F10C3" # mdi-thermometer-low
- "\U000F058E" # mdi-water-percent
- "\U000F058C" # mdi-water
- "\U000F059D" # mdi-weather-windy
- "\U000F15FA" # mdi-windsock
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_sun
size: 36
glyphs:
- "\U000F059B" # mdi-weather-sunset-down
- "\U000F059C" # mdi-weather-sunset-up
# e-paper
display:
- platform: waveshare_epaper
id: epaper_display
model: 7.30in-e
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: never
lambda: |-
const auto BLACK = Color(0, 0, 0, 0);
const auto RED = Color(255, 0, 0, 0);
const auto GREEN = Color(0, 255, 0, 0);
const auto BLUE = Color(0, 0, 255, 0);
const auto YELLOW = Color(255, 255, 0, 0);
const auto WHITE = Color(255, 255, 255, 0);
// Map weather states to MDI characters.
std::map<std::string, std::string> weather_icon_map
{
{"cloudy", "\U000F0590"},
{"cloudy-alert", "\U000F0F2F"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"hazy", "\U000F0F30"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"clear-night", "\U000F0594"},
{"night-partly-cloudy", "\U000F0F31"},
{"partlycloudy", "\U000F0595"},
{"partly-lightning", "\U000F0F32"},
{"partly-rainy", "\U000F0F33"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snowy", "\U000F0598"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"sunny-alert", "\U000F0F37"},
{"sunny-off", "\U000F14E4"},
{"sunset", "\U000F059A"},
{"sunset-down", "\U000F059B"},
{"sunset-up", "\U000F059C"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
// ---------- PAGE 0 ----------
if (id(page_index) == 0) {
const int scr_w = 800;
const int scr_h = 480;
// Batterie dans le coin supérieur droit
it.printf(700, 7, id(font_bat_icon), BLACK, "%s", id(battery_glyph).c_str());
it.printf(730, 5, id(small_font), BLUE, "%.0f%%", id(battery_level).state);
//ligne verticale
it.filled_rectangle(400, 100, 2, 280, BLACK);
// ---------------------------------------------------------
// 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
// --- colonne gauche : Température -----------------------------
const int left_mid = col_w / 2 - 30; // 200 px
// Icon
it.printf(left_mid, icon_y, id(font_mdi_large), BLACK, TextAlign::CENTER, "\U000F050F");
// Value
it.printf(left_mid, value_y, id(big_font), GREEN, TextAlign::CENTER, "%.0f", id(temp_sensor).state);
// Unit
it.printf(left_mid + 150, unit_y, id(mid_font), GREEN, TextAlign::CENTER, "°C");
// Label
it.printf(left_mid, label_y, id(mid_font), RED, TextAlign::CENTER, "Température");
// --- colonne droite : Humidité -------------------------------
const int right_mid = col_w + col_w / 2; // 600 px
// Icon
it.printf(right_mid, icon_y, id(font_mdi_large), BLACK, TextAlign::CENTER, "\U000F058E");
// Value
it.printf(right_mid, value_y, id(big_font), BLUE, TextAlign::CENTER, "%.0f", id(hum_sensor).state);
// Unit
it.printf(right_mid + 150, unit_y, id(mid_font), BLUE, TextAlign::CENTER, "%%");
// Label
it.printf(right_mid, label_y, id(mid_font), RED, TextAlign::CENTER, "Humidité");
}
// ---------- PAGE 1 ----------
else{
// Batterie dans le coin supérieur droit
it.printf(700, 7, id(font_bat_icon), BLACK, "%s", id(battery_glyph).c_str());
it.printf(730, 5, id(small_font), BLUE, "%.0f%%", id(battery_level).state);
// heure date
const char* jours[] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
const char* mois[] = {"Janv", "Févr", "Mars", "Avr", "Mai", "Juin", "Juill", "Août", "Sept", "Oct", "Nov", "Déc"};
auto t = id(ha_time).now();
if (t.is_valid()) {
// Heure
it.strftime(10, 5, id(mid_font), BLUE, "%H:%M", t);
// Affiche la date en français "Jeu 04 sept 2025"
it.printf(10, 40, id(mid_font), BLUE, "%s %d %s %d",
jours[t.day_of_week -1],
t.day_of_month,
mois[t.month - 1],
t.year);
}
// Soleil lever/coucher
it.printf(379, 8, id(icon_sun), BLUE, TextAlign::TOP_CENTER, "\U000F059C");
it.printf(404, 5, id(mid_font), BLUE, TextAlign::TOP_LEFT, "à %s", id(sun_sunrise).state.c_str());
it.printf(379, 43, id(icon_sun), BLUE, TextAlign::TOP_CENTER, "\U000F059B");
it.printf(404, 40, id(mid_font), BLUE, TextAlign::TOP_LEFT, "à %s", id(sun_sunset).state.c_str());
//ligne verticale
it.filled_rectangle(280, 90, 4, 375, BLACK);
// --- colonne gauche : Météo -----------------------------
// Titre météo
it.printf(135, 90, id(title_font), BLACK, TextAlign::TOP_CENTER, "MÉTÉO");
// Titre aujourd'hui
it.printf(135, 150, id(small_font), RED, TextAlign::TOP_CENTER, "Aujourd'hui");
// icône aujourd'hui
it.printf(70, 190, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(today_weather).state.c_str()].c_str());
// températurea
it.printf(145, 192, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(160, 190, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(today_temperaturea).state);
// templowa
it.printf(145, 222, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F10C3");
it.printf(160, 220, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.1f°C", id(today_templowa).state);
// humiditéa
it.printf(145, 252, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(160, 250, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(today_humiditea).state);
// précipitationa
it.printf(145, 282, id(font_weather_icon), BLACK, TextAlign::TOP_CENTER, "\U000F058C");
it.printf(160, 280, id(small_font), BLACK, TextAlign::TOP_LEFT, "%.1fmm", id(today_precipitationa).state);
// Titre demain
it.printf(130, 310, id(small_font), RED, TextAlign::TOP_CENTER, "Demain");
// icône demain
it.printf(70, 350, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(tomorrow_weather).state.c_str()].c_str());
// températured
it.printf(145, 352, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(160, 350, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(tomorrow_temperatured).state);
// templowd
it.printf(145, 382, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F10C3");
it.printf(160, 380, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.1f°C", id(tomorrow_templowd).state);
// humiditéd
it.printf(145, 412, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(160, 410, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(tomorrow_humidited).state);
// précipitationd
it.printf(145, 442, id(font_weather_icon), BLACK, TextAlign::TOP_CENTER, "\U000F058C");
it.printf(160, 440, id(small_font), BLACK, TextAlign::TOP_LEFT, "%.1fmm", id(tomorrow_precipitationd).state);
// --- colonne droite : Prévision -----------------------------
// Titre prévision
it.printf(540, 90, id(title_font), BLACK, TextAlign::TOP_CENTER, "PRÉVISION");
// Titre maintenant
it.printf(430, 150, id(small_font), RED, TextAlign::TOP_CENTER, "Maintenant");
// icône maintenant
it.printf(360, 190, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(now_weather).state.c_str()].c_str());
// now_weather_temperature
it.printf(435, 192, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(450, 190, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(now_weather_temperature).state);
// now_weather_humidity
it.printf(435, 222, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(450, 220, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(now_weather_humidity).state);
// now_weather_wind_speed
it.printf(435, 252, id(font_weather_icon), GREEN, TextAlign::TOP_CENTER, "\U000F059D");
it.printf(450, 250, id(small_font), GREEN, TextAlign::TOP_LEFT, "%.0fkm/h", id(now_weather_wind_speed).state);
// now_weather_wind_bearing
it.printf(435, 282, id(font_weather_icon), GREEN, TextAlign::TOP_CENTER, "\U000F15FA");
it.printf(450, 280, id(small_font), GREEN, TextAlign::TOP_LEFT, "%s", id(now_weather_wind_bearing).state.c_str());
// Titre heure +1
it.printf(670, 150, id(small_font), RED, TextAlign::TOP_CENTER, "%.0f:00", id(h1_weather_heure).state);
// icône heure +1
it.printf(600, 190, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(h1_weather_condition).state.c_str()].c_str());
// h1_weather_temperature
it.printf(675, 192, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(690, 190, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(h1_weather_temperature).state);
// h1_weather_humidite
it.printf(675, 222, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(690, 220, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(h1_weather_humidite).state);
// h1_weather_wind
it.printf(675, 252, id(font_weather_icon), GREEN, TextAlign::TOP_CENTER, "\U000F059D");
it.printf(690, 250, id(small_font), GREEN, TextAlign::TOP_LEFT, "%.0fkm/h", id(h1_weather_wind).state);
// h1_weather_precipitation
it.printf(675, 282, id(font_weather_icon), BLACK, TextAlign::TOP_CENTER, "\U000F058C");
it.printf(690, 280, id(small_font), BLACK, TextAlign::TOP_LEFT, "%.1fmm", id(h1_weather_precipitation).state);
// Titre heure +2
it.printf(430, 310, id(small_font), RED, TextAlign::TOP_CENTER, "%.0f:00", id(h2_weather_heure).state);
// icône heure +2
it.printf(360, 350, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(h2_weather_condition).state.c_str()].c_str());
// h2_weather_temperature
it.printf(435, 352, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(450, 350, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(h2_weather_temperature).state);
// h2_weather_humidite
it.printf(435, 382, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(450, 380, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(h2_weather_humidite).state);
// h2_weather_wind
it.printf(435, 412, id(font_weather_icon), GREEN, TextAlign::TOP_CENTER, "\U000F059D");
it.printf(450, 410, id(small_font), GREEN, TextAlign::TOP_LEFT, "%.0fkm/h", id(h2_weather_wind).state);
// h2_weather_precipitation
it.printf(435, 442, id(font_weather_icon), BLACK, TextAlign::TOP_CENTER, "\U000F058C");
it.printf(450, 440, id(small_font), BLACK, TextAlign::TOP_LEFT, "%.1fmm", id(h2_weather_precipitation).state);
// Titre heure +3
it.printf(670, 310, id(small_font), RED, TextAlign::TOP_CENTER, "%.0f:00", id(h3_weather_heure).state);
// icône heure +3
it.printf(600, 350, id(icon_today), BLACK, TextAlign::TOP_CENTER, "%s", weather_icon_map[id(h3_weather_condition).state.c_str()].c_str());
// h3_weather_temperature
it.printf(675, 352, id(font_weather_icon), RED, TextAlign::TOP_CENTER, "\U000F10C2");
it.printf(690, 350, id(small_font), RED, TextAlign::TOP_LEFT, "%.1f°C", id(h3_weather_temperature).state);
// h3_weather_humidite
it.printf(675, 382, id(font_weather_icon), BLUE, TextAlign::TOP_CENTER, "\U000F058E");
it.printf(690, 380, id(small_font), BLUE, TextAlign::TOP_LEFT, "%.0f%%", id(h3_weather_humidite).state);
// h3_weather_wind
it.printf(675, 412, id(font_weather_icon), GREEN, TextAlign::TOP_CENTER, "\U000F059D");
it.printf(690, 410, id(small_font), GREEN, TextAlign::TOP_LEFT, "%.0fkm/h", id(h3_weather_wind).state);
// h3_weather_precipitation
it.printf(675, 442, id(font_weather_icon), BLACK, TextAlign::TOP_CENTER, "\U000F058C");
it.printf(690, 440, id(small_font), BLACK, TextAlign::TOP_LEFT, "%.1fmm", id(h3_weather_precipitation).state);
}
```
### Anything in the logs that might be useful for us?
```txt
Compiling .pioenvs\reterminal-e1002\src\esphome\components\waveshare_epaper\waveshare_213v3.cpp.o
Compiling .pioenvs\reterminal-e1002\src\esphome\components\waveshare_epaper\waveshare_epaper.cpp.o
Compiling .pioenvs\reterminal-e1002\src\esphome\components\wifi\wifi_component.cpp.o
src/esphome/components/waveshare_epaper/waveshare_213v3.cpp: In member function 'virtual void esphome::waveshare_epaper::WaveshareEPaper2P13InV3::dump_config()':
src/esphome/components/waveshare_epaper/waveshare_213v3.cpp:185:1: error: expected ';' before '}' token
185 | }
| ^
Compiling .pioenvs\reterminal-e1002\src\esphome\components\wifi\wifi_component_esp_idf.cpp.o
*** [.pioenvs\reterminal-e1002\src\esphome\components\waveshare_epaper\waveshare_213v3.cpp.o] Error 1
============================================= [FAILED] Took 129.20 seconds =============================================
```
### Additional information
It seems to come from this commit
https://github.com/esphome/esphome/pull/10636/commits/0f2a8300b290b5513336d26068e7964fa35de012#diff-967f4727cde2afa27e81f14211edbbec1219f23efee46b0e5e2365dcf43e897c