Edit esp-reterminal-e1001.yaml

This commit is contained in:
ESPHome Device Builder
2026-07-30 18:10:18 +12:00
parent 26160873f0
commit 9d3bc14d9c
+41 -121
View File
@@ -6,6 +6,8 @@
# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-reterminal-e1001.yaml # https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-reterminal-e1001.yaml
#:########################################################################################:# #:########################################################################################:#
# VERSIONS: # VERSIONS:
# V0.8.0 2026-07-30 Removed the Appliances page and page-selection state; both white
# buttons now show and check the single seven-job Jobs page.
# V0.7.0 2026-07-30 4+3 job layout with plant watering jobs; smaller 190 px tiles # V0.7.0 2026-07-30 4+3 job layout with plant watering jobs; smaller 190 px tiles
# V0.6.2 2026-07-25 Standardized MQTT payloads: "ON"/"OFF" → "On"/"Off" # V0.6.2 2026-07-25 Standardized MQTT payloads: "ON"/"OFF" → "On"/"Off"
# V0.6.1 2026-07-20 Allowed GPIO4/GPIO5 to be shared by the EXT1 deep-sleep # V0.6.1 2026-07-20 Allowed GPIO4/GPIO5 to be shared by the EXT1 deep-sleep
@@ -44,18 +46,14 @@
# - Display busy: GPIO13, inverted # - Display busy: GPIO13, inverted
#:########################################################################################:# #:########################################################################################:#
# OPERATION: # OPERATION:
# - The device sleeps for five minutes, then wakes and checks the currently displayed page. # - The device sleeps for five minutes, then wakes and checks the Jobs page.
# - Either white button can wake the ESP32-S3 through EXT1 ANY_LOW. # - Either white button can wake the ESP32-S3 through EXT1 ANY_LOW.
# - A left-button wake selects View Road Jobs; a right-button wake selects Appliances. # - Either white button shows and checks View Road Jobs and resets the activity timeout.
# - The wake button is identified from the retained ESP32 EXT1 wake-status bitmask, so one # - The Jobs display hash survives deep sleep. The e-paper panel refreshes only when the
# press both wakes the device and selects the intended page. # Jobs content or visible awake/sleep indicator changes.
# - Timer wakeups retain the page that was displayed before sleep.
# - Per-page display hashes survive deep sleep. The e-paper panel refreshes only when the
# selected page content, selected page, or visible awake/sleep indicator changes.
# - Two open eyes indicate an interactive/kept-awake panel. Two closed eyes are written to # - Two open eyes indicate an interactive/kept-awake panel. Two closed eyes are written to
# the e-paper panel before entering deep sleep. # the e-paper panel before entering deep sleep.
# - After a button interaction, the device remains awake briefly so another page can be # - After a button interaction, the device remains awake briefly for further interaction.
# selected without waiting through another complete wake-and-connect cycle.
# - Home Assistant entity data is imported through the encrypted ESPHome native API. # - Home Assistant entity data is imported through the encrypted ESPHome native API.
# - MQTT is used only for retained deep-sleep control and retained awake/sleep status. # - MQTT is used only for retained deep-sleep control and retained awake/sleep status.
# #
@@ -83,12 +81,12 @@ substitutions:
# Device Naming # Device Naming
device_name: "esp-reterminal-e1001" device_name: "esp-reterminal-e1001"
friendly_name: "reTerminal E1001 Dashboard" friendly_name: "reTerminal E1001 Dashboard"
description_comment: "Seeed Studio reTerminal E1001 two-page Home Assistant jobs and appliance status dashboard with five-minute deep sleep, button wake and panel-state eyes. (Layout V2.0)" description_comment: "Seeed Studio reTerminal E1001 Home Assistant Jobs dashboard with five-minute deep sleep, button wake and panel-state eyes. (Layout V2.0)"
device_area: "Lounge" device_area: "Lounge"
# Project Naming # Project Naming
project_name: "SeeedStudio.reTerminal-E1001" project_name: "SeeedStudio.reTerminal-E1001"
project_version: "v0.7.0" project_version: "v0.8.0"
# Passwords and Secrets # Passwords and Secrets
api_key: !secret esp-api_key api_key: !secret esp-api_key
@@ -104,7 +102,6 @@ substitutions:
# Device Settings # Device Settings
log_level: "INFO" log_level: "INFO"
display_check_interval: "30s" display_check_interval: "30s"
finished_highlight_seconds: "3600"
job_hours_display_limit: "48" job_hours_display_limit: "48"
# Deep Sleep Settings # Deep Sleep Settings
@@ -187,29 +184,12 @@ esphome:
// is explicitly kept awake through MQTT. // is explicitly kept awake through MQTT.
id(panel_awake_indicator) = id(woke_by_button); id(panel_awake_indicator) = id(woke_by_button);
const int previous_page = id(current_page); ESP_LOGI(
"wakeup",
if (id(woke_by_button)) { "Wake cause=%d EXT1 mask=0x%llX",
// GPIO5 is the left white button: Jobs. id(wakeup_cause),
if ((id(wakeup_pin_mask) & (1ULL << 5)) != 0) { static_cast<unsigned long long>(id(wakeup_pin_mask))
id(current_page) = 0; );
}
// GPIO4 is the right white button: Appliances.
else if ((id(wakeup_pin_mask) & (1ULL << 4)) != 0) {
id(current_page) = 1;
}
}
id(page_changed_on_wake) = id(current_page) != previous_page;
ESP_LOGI(
"wakeup",
"Wake cause=%d EXT1 mask=0x%llX page=%d changed=%s",
id(wakeup_cause),
static_cast<unsigned long long>(id(wakeup_pin_mask)),
id(current_page) + 1,
id(page_changed_on_wake) ? "yes" : "no"
);
#:####################################################################################:# #:####################################################################################:#
# DEFAULT TO STAYING AWAKE UNTIL MQTT CONTROL IS RECEIVED # # DEFAULT TO STAYING AWAKE UNTIL MQTT CONTROL IS RECEIVED #
@@ -257,63 +237,33 @@ esphome:
lambda: |- lambda: |-
if (!id(homeassistant_time).now().is_valid()) return false; if (!id(homeassistant_time).now().is_valid()) return false;
if (id(current_page) == 0) { return
return id(job_dog_feeding_morning_state).has_state() &&
id(job_dog_feeding_morning_state).has_state() && id(job_dog_feeding_evening_state).has_state() &&
id(job_dog_feeding_evening_state).has_state() && id(job_dog_depooping_state).has_state() &&
id(job_dog_depooping_state).has_state() && id(job_dishwasher_unpacked_state).has_state() &&
id(job_dishwasher_unpacked_state).has_state() && id(job_rubbish_removed_state).has_state() &&
id(job_rubbish_removed_state).has_state() && id(job_water_tv_pot_plant_state).has_state() &&
id(job_water_tv_pot_plant_state).has_state() && id(job_water_table_pot_plant_state).has_state() &&
id(job_water_table_pot_plant_state).has_state() && id(job_dog_feeding_morning_due_ts).has_state() &&
id(job_dog_feeding_morning_due_ts).has_state() && id(job_dog_feeding_evening_due_ts).has_state() &&
id(job_dog_feeding_evening_due_ts).has_state() && id(job_dog_depooping_due_ts).has_state() &&
id(job_dog_depooping_due_ts).has_state() && id(job_dishwasher_unpacked_due_ts).has_state() &&
id(job_dishwasher_unpacked_due_ts).has_state() && id(job_rubbish_removed_due_ts).has_state() &&
id(job_rubbish_removed_due_ts).has_state() && id(job_water_tv_pot_plant_due_ts).has_state() &&
id(job_water_tv_pot_plant_due_ts).has_state() && id(job_water_table_pot_plant_due_ts).has_state();
id(job_water_table_pot_plant_due_ts).has_state(); timeout: "${ha_data_timeout}"
}
return - display.page.show: page_jobs
id(appliance_washing_state).has_state() &&
id(appliance_dryer_state).has_state() &&
id(appliance_main_dishwasher_state).has_state() &&
id(appliance_downstairs_dishwasher_state).has_state() &&
id(appliance_evcharger_32a_state).has_state() &&
id(appliance_evcharger_16a_state).has_state() &&
id(appliance_ryobi_left_state).has_state() &&
id(appliance_ryobi_right_state).has_state() &&
id(appliance_pool_pump_state).has_state() &&
id(appliance_3d_printer_state).has_state();
timeout: "${ha_data_timeout}"
- if:
condition:
lambda: |-
return id(current_page) == 0;
then:
- display.page.show: page_jobs
else:
- display.page.show: page_appliances
- if: - if:
condition: condition:
lambda: |- lambda: |-
return id(homeassistant_time).now().is_valid(); return id(homeassistant_time).now().is_valid();
then: then:
- if: - script.execute:
condition: id: refresh_display_if_changed
lambda: |- force: false
return id(page_changed_on_wake);
then:
- script.execute:
id: refresh_display_if_changed
force: true
else:
- script.execute:
id: refresh_display_if_changed
force: false
- script.wait: refresh_display_if_changed - script.wait: refresh_display_if_changed
else: else:
- logger.log: "Home Assistant time/data were unavailable; preserving the existing e-paper image." - logger.log: "Home Assistant time/data were unavailable; preserving the existing e-paper image."
@@ -383,7 +333,7 @@ spi:
#:########################################################################################:# #:########################################################################################:#
# HOME ASSISTANT TIME: # HOME ASSISTANT TIME:
# Used for the date header, job countdowns and appliance completion age. # Used for the date header and job countdowns.
# https://esphome.io/components/time/homeassistant.html # https://esphome.io/components/time/homeassistant.html
#:########################################################################################:# #:########################################################################################:#
time: time:
@@ -397,28 +347,17 @@ time:
#:########################################################################################:# #:########################################################################################:#
# GLOBALS: # GLOBALS:
# Page, persistent display hashes, wake information and sleep-control state # Persistent display hash, wake information and sleep-control state
# https://esphome.io/components/globals.html # https://esphome.io/components/globals.html
#:########################################################################################:# #:########################################################################################:#
globals: globals:
# The currently visible page survives deep sleep so timer wakes retain it. # The persistent Jobs hash is updated only when the visible content really changes,
- id: current_page # avoiding a flash write on every five-minute wake.
type: int
restore_value: yes
initial_value: "0"
# A separate persistent hash is kept for each page. These are updated only when the
# visible content really changes, avoiding a flash write on every five-minute wake.
- id: last_jobs_signature_hash - id: last_jobs_signature_hash
type: uint32_t type: uint32_t
restore_value: yes restore_value: yes
initial_value: "0" initial_value: "0"
- id: last_appliances_signature_hash
type: uint32_t
restore_value: yes
initial_value: "0"
- id: display_update_required - id: display_update_required
type: bool type: bool
restore_value: no restore_value: no
@@ -439,13 +378,8 @@ globals:
restore_value: no restore_value: no
initial_value: "false" initial_value: "false"
- id: page_changed_on_wake
type: bool
restore_value: no
initial_value: "false"
# Desired icon currently rendered in the display header. This is included in the # Desired icon currently rendered in the display header. This is included in the
# per-page signature, so changing eye state refreshes only when required. # Jobs signature, so changing eye state refreshes only when required.
- id: panel_awake_indicator - id: panel_awake_indicator
type: bool type: bool
restore_value: no restore_value: no
@@ -505,20 +439,6 @@ font:
id: font_job_status id: font_job_status
size: 23 size: 23
- file:
type: gfonts
family: Inter
weight: 700
id: font_appliance_title
size: 16
- file:
type: gfonts
family: Inter
weight: 700
id: font_appliance_status
size: 17
#:########################################################################################:# #:########################################################################################:#
# JOB AND STATUS ICONS: # JOB AND STATUS ICONS:
# Material Design Icons are downloaded and embedded at compile time. # Material Design Icons are downloaded and embedded at compile time.
@@ -605,7 +525,7 @@ image:
#:########################################################################################:# #:########################################################################################:#
# DISPLAY: # DISPLAY:
# Two pages with rounded status tiles. # Single Jobs page with rounded status tiles.
# The display itself never runs on a blind polling interval. All refreshes pass through # The display itself never runs on a blind polling interval. All refreshes pass through
# refresh_display_if_changed before the physical e-paper update occurs. # refresh_display_if_changed before the physical e-paper update occurs.
# https://esphome.io/components/display/waveshare_epaper.html # https://esphome.io/components/display/waveshare_epaper.html