Skip to main content

reTerminal E1004

Overview

The reTerminal E1004 is a 13.3" 6-colour (Spectra 6) e-paper display mounted in the kuchyň (kitchen). It is the household's central family dashboard: a colour calendar/agenda on the left, and a stacked column of live information on the right (weather, home & outdoor climate, upcoming family celebrations, waste-collection schedule, solar/car batteries, and a weekly temperature chart).

It is the colour companion to the E1001 (mono weather display in the living room) and shares the same icon language, footer style, and refresh philosophy.

Property Value Model Seeed reTerminal E1004 (13.3" Spectra 6 colour e-paper) Resolution 1200 × 1600, portrait Colours Black, white, red, green, blue, yellow (6-colour palette) Panel model (ESPHome) Seeed-reTerminal-E1004 MCU ESP32-S3 with 8 MB PSRAM (octal, 80 MHz) Power Permanently powered (deep sleep disabled) Location Kuchyň (kitchen) Firmware ESPHome Flashing Wireless (OTA)

Data flow

flowchart LR
    subgraph Sources["Data sources"]
        CAL["Google Calendars<br/>(family + Naďa a Pavel)"]
        ECO["Ecowitt weather station"]
        MET["Met.no forecast"]
        SOLAX["Solax inverter (FVE)"]
        TESLA["Tesla Model Y"]
    end

    subgraph HA["Home Assistant"]
        SV["sensor.svatek_dnes<br/>(name-day table)"]
        FAM["sensor.rodina_oslavy<br/>(birthdays + name-days)"]
        WASTE["sensor.svoz_odpadu<br/>(waste keywords from calendar)"]
        FC["forecast_day_0..5<br/>+ forecast_week"]
        EVT["e1004_event_1..10<br/>(agenda events)"]
        CLIMATE["indoor / outdoor<br/>climate sensors"]
        BATT["battery sensors"]
    end

    subgraph E1004["reTerminal E1004 (ESPHome)"]
        DISP["Display lambda<br/>(2-column layout)"]
    end

    CAL --> EVT
    CAL --> WASTE
    ECO --> CLIMATE
    MET --> FC
    SOLAX --> BATT
    TESLA --> BATT

    SV --> DISP
    FAM --> DISP
    WASTE --> DISP
    FC --> DISP
    EVT --> DISP
    CLIMATE --> DISP
    BATT --> DISP

    DISP --> SCREEN["13.3in colour e-paper"]

What it displays

Header

    Full Czech day name + date (e.g. "Pondělí 17.08.2026") Today's Czech name-day (svátek) on the right

    Left column – Agenda

      Upcoming calendar events grouped by day (Czech day labels: Po, Út, St…) Event titles colour-coded by calendar: green = Family, red = Naďa a Pavel Time or "Celý den" (all-day) below each event Multi-day events show "· do DD.MM" Long titles are truncated with "…" so they don't overflow into the right column

      Right column (top to bottom)

        Blíží se – next 3 upcoming family celebrations (birthdays with age, and name-days). Red = birthday, green = name-day. Twins Daniel & Dominik are combined onto one birthday line. Svoz odpadu – next collection date per waste type: BIO (leaf), Papír (newspaper), Plast (bottle), Směsný (bin) — each with a coloured icon. Baterie – FVE (home solar) % with a house icon, Tesla % with a car icon. Doma / Venku – indoor and outdoor temperature + humidity, with thermometer and droplet icons. Počasí – 6-day forecast with colour weather icons (red sun, blue rain, clouds) and high/low temps. Týden – a 6-day high-temperature bar chart, bars colour-coded (red ≥ 28°, blue ≤ 18°, black otherwise).
          Aktualizováno HH:MM – last refresh time WiFi signal strength bars

          Home Assistant sensors that power it

          These are custom template sensors built in configuration.yaml:

          Sensor Purpose sensor.svatek_dnes Today's Czech name-day, from an embedded 366-day table sensor.rodina_oslavy Family birthdays + name-days; state = today's celebrations, upcoming attribute = next celebrations (JSON) sensor.svoz_odpadu Scans both calendars for BIO/PAPÍR/PLAST/SMĚSNÝ keywords; attributes bio,papir,plast,smesny hold the next date per type sensor.forecast_day_0..5_* Per-day condition / temp / templow sensor.forecast_week Weekly highs as a pipe-separated string (`Po:26 sensor.e1004_event_1..10 Per-event agenda data (title, day label, time, colour) Ecowitt climate sensors Indoor/outdoor temperature & humidity sensor.solax_battery_capacity_2 FVE battery % sensor.tesla_model_y_battery Tesla battery %

          Refresh behaviour

          flowchart TD
              A["Calendar event changes"] -->|instant, debounced 8s| R["request_redraw script"]
              B["5-minute interval"] --> D["Display refresh"]
              C["Manual button in HA"] --> D
              R --> D
              D --> S["Redraw e-paper"]
          
            Every 5 minutes – scheduled refresh (keeps weather, climate, batteries current) Calendar event change – triggers the debounced redraw (new events appear promptly) Manual button – button.reterminal_e1004_e1004_refresh_display Temperature/weather changes do not trigger refreshes directly (they ride the 5-minute interval), to avoid constant flashing.

            Key lessons learned (build history)

              String vs float sensors: several HA-attribute sensors return strings (e.g. "17.8.", family lines). These must be defined as text_sensor in ESPHome, not numeric sensor. Mixing them up caused compile errors (.c_str() on a float) and a firmware that never built — so the device kept running old firmware. to_json spacing: an early approach passed data as JSON attributes and parsed it on-device; HA's to_json adds spaces after colons ("d": 17), which broke a strict parser. Solved by switching to simple pre-formatted string attributes (bio, papir, …) instead of JSON. Entity name typos: forecast_dayN vs forecast_day_N (missing underscore) and run__state (double underscore, unrelated washer bug) both caused silent failures. Lesson: verify entity IDs against Developer Tools → States. MDI codepoints: several icon glyphs were initially wrong (cake, party-popper, night) and rendered as empty boxes — codepoints must be verified against the actual font. Yellow on white is unreadable on e-paper: the "sunny" icon was switched from yellow to red for contrast. Refresh discipline: the display only redraws on meaningful changes + a 5-minute interval, because colour e-paper refresh is slow and visually distracting.

              Configuration reference

              Sanitised. The real config contains an API encryption key, an OTA password, and WiFi credentials. These secrets are NOT included here — see the password manager. Full config stored at [link to your config location].

              # ── reTerminal E1004 (excerpt, secrets removed) ──
              esphome:
                name: reterminal-e1004
              
              esp32:
                board: esp32-s3-devkitc-1
                framework:
                  type: esp-idf
              
              psram:
                mode: octal
                speed: 80MHz
              
              spi:
                clk_pin: GPIO7
                mosi_pin: GPIO9
              
              # Secrets removed – see password manager:
              #   api / ota / wifi
              
              display:
                - platform: epaper_spi
                  model: Seeed-reTerminal-E1004
                  update_interval: never       # driven by interval + triggers instead
                  rotation: 0
                  # lambda: two-column layout (agenda left, info column right)
              
              interval:
                - interval: 5min
                  then:
                    - component.update: epaper_display
              
              button:
                - platform: template
                  name: "E1004 Refresh Display"
                  on_press:
                    then:
                      - component.update: epaper_display