An ESPHome configuration for the Seeed reTerminal E1003 10.3-inch e-ink display, showing stylish solar production data from Home Assistant.
This project builds on the ESPHome driver by koosoli, which provides the custom it8951_reterminal_e1003 display component. The driver handles low-level communication with the IT8951 e-ink controller. This repository adds a complete solar dashboard layout with Home Assistant sensor integration. Please note that the display is using Swedish language. I have kept this through the yaml, in order to compare code with image. Will translate relevant terms below. Full disclaimer: this project was only made possible through extensive help from the AI Claude.
- Section 1 — Energy today (Solenergi idag): Four boxes showing produced solar energy (Producerad solenergi), total household consumption (Husets energiförbrukning), grid energy imported (Varav köpt energi), and self-consumed solar energy (Använd solel idag)
- Section 2 — Last 6 days (Solenergi senaste veckan): Rolling display with yesterday rightmost, updates daily
- Section 3 — Monthly overview (Solenergi per månad): All 12 months in two rows; current month updated live from utility meter; months without data show
--- - Section 4 — Per year (Solenergi per år) + Lifetime totals (Solenergi totalt): Current year auto-summed from yearly utility meter + offset; lifetime produced (Producerrad solenergi totalt), self-consumed (Direktanvänd solenergi totalt), imported (Köpt nätenergi totalt) and exported (Såld solenergi totalt) totals
- Battery and WiFi status icons in the top-right corner, updated every 15 minutes
- Physical refresh button (KEY0/GPIO3) triggers an immediate display update
- HA button entity for remote refresh from the Home Assistant dashboard
- Night mode: No display updates between 23:00 and 06:00 to save battery
- Updates every 5 minutes during daytime (06:00–23:00)
- WiFi power save mode enabled
- Seeed reTerminal E1003 (ESP32-S3, IT8951E/DX, 10.3" e-ink ED103TC2)
- Built-in 3000mAh Li-ion battery
- USB-C charging
Clone or download the custom component from koosoli's repository and place the custom_components folder in your ESPHome configuration directory.
The following sensors must exist in your Home Assistant instance. These are typically provided by your inverter integration (e.g. Solis, SolarEdge, Huawei):
| Sensor | Description |
|---|---|
sensor.daily_pv_generation |
Solar energy produced today |
sensor.daily_imported_energy |
Grid energy imported today |
sensor.daily_consumed_energy |
Total energy consumed today |
sensor.daily_direct_energy_consumption |
Self-consumed solar energy today |
sensor.total_pv_generation |
Lifetime solar production |
sensor.total_imported_energy |
Lifetime grid import |
sensor.total_direct_energy_consumption |
Lifetime self-consumed solar |
sensor.total_exported_energy |
Lifetime solar export |
sensor.monthly_pv_generation_2 |
Current month solar production (utility meter based on total_pv_generation) |
sensor.yearly_pv_generation |
Current year solar production (utility meter based on total_pv_generation) |
Create the following input_number helpers in HA under Settings → Devices & Services → Helpers → Number.
Set minimum = -1 (used as "no data" sentinel displayed as ---), maximum = 99999, step = 0.1, unit = kWh.
Weekdays (updated nightly by automation):
| Entity ID |
|---|
input_number.solar_mandag |
input_number.solar_tisdag |
input_number.solar_onsdag |
input_number.solar_torsdag |
input_number.solar_fredag |
input_number.solar_lordag |
input_number.solar_sondag |
Months (updated nightly by automation):
| Entity ID |
|---|
input_number.solar_januari |
input_number.solar_februari |
input_number.solar_mars |
input_number.solar_april |
input_number.solar_maj |
input_number.solar_juni |
input_number.solar_juli |
input_number.solar_augusti |
input_number.solar_september |
input_number.solar_oktober |
input_number.solar_november |
input_number.solar_december |
Years (enter manually):
| Entity ID |
|---|
input_number.solar_2023 |
input_number.solar_2024 |
input_number.solar_2025 |
Set helpers for days/months not yet started to
-1so the display shows---instead of0.
Runs at 23:59 each night and writes sensor.daily_pv_generation to the correct weekday helper.
alias: Spara daglig solenergi per veckodag
description: Saves today's solar production to the correct weekday helper at midnight
triggers:
- at: "23:59:00"
trigger: time
actions:
- choose:
- conditions:
- condition: template
value_template: "{{ now().weekday() == 0 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_mandag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 1 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_tisdag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 2 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_onsdag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 3 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_torsdag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 4 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_fredag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 5 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_lordag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().weekday() == 6 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_sondag
data:
value: "{{ states('sensor.daily_pv_generation') | float(0) }}"
mode: singleRuns at 23:50 each night and writes sensor.monthly_pv_generation to the current month helper.
alias: Uppdatera pågående månads solenergi
description: Updates the current month helper nightly with the running monthly total
triggers:
- at: "23:50:00"
trigger: time
actions:
- choose:
- conditions:
- condition: template
value_template: "{{ now().month == 1 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_januari
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 2 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_februari
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 3 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_mars
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 4 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_april
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 5 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_maj
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 6 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_juni
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 7 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_juli
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 8 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_augusti
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 9 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_september
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 10 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_oktober
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 11 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_november
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
- conditions:
- condition: template
value_template: "{{ now().month == 12 }}"
sequence:
- action: input_number.set_value
target:
entity_id: input_number.solar_december
data:
value: "{{ states('sensor.monthly_pv_generation') | float(0) }}"
mode: single- Install the koosoli ESPHome driver by placing
custom_componentsin your ESPHome config directory - Copy
seeed-e1003-solar-dashboard.yamlto your ESPHome config directory - Create all required
input_numberhelpers in Home Assistant - Add the two automations in Home Assistant
- Add your credentials to
secrets.yaml:wifi_ssid,wifi_password,ota_password - Flash the device via the ESPHome dashboard
- Enter historical yearly production values manually in
input_number.solar_2023etc.
| Setting | Location | Default |
|---|---|---|
| Timezone | time block |
Europe/Stockholm |
| Sensor entity IDs | sensor block |
See table above |
| Update interval | interval block |
300s (every 5 min) |
| Active hours | now.hour >= 6 && now.hour < 23 |
06:00–23:00 |
| VCOM value | vcom in display block |
1400 |
VCOM: The value
1400is specific to this unit. Check the label on your display's FPC cable if results look washed out or ghosted.
MIT
MIT
