diff --git a/esphome/esp-reterminal-e1001.yaml b/esphome/esp-reterminal-e1001.yaml index 30d5d0e..1792aa0 100644 --- a/esphome/esp-reterminal-e1001.yaml +++ b/esphome/esp-reterminal-e1001.yaml @@ -831,8 +831,8 @@ display: #:########################################################################################:# # DISPLAY CHANGE DETECTION: -# Builds a signature from only the content that is currently visible. The display is not -# physically refreshed when the visible wording, style and eye indicator would remain unchanged. +# Builds a signature from the visible Jobs content. The display is not physically refreshed +# when the visible wording, style and eye indicator would remain unchanged. # https://esphome.io/components/script.html #:########################################################################################:# script: @@ -841,16 +841,14 @@ script: parameters: force: bool then: - # Debounce bursts of Home Assistant state restoration and page changes. + # Debounce bursts of Home Assistant state restoration. - delay: 750ms - lambda: |- const auto now = id(homeassistant_time).now(); const int64_t now_ts = now.is_valid() ? now.timestamp : 0; const int hour_limit = ${job_hours_display_limit}; - const int finished_seconds = ${finished_highlight_seconds}; - - std::string signature = id(current_page) == 0 ? "jobs" : "appliances"; + std::string signature = "jobs-v0.8.0"; auto append_text = [&](const std::string &value) { signature += "|"; @@ -873,186 +871,85 @@ script: append_text("no_time"); } - if (id(current_page) == 0) { - auto append_job = [&](const std::string &state, float due_ts, - const std::string &completed_time) { - append_text(state); + auto append_job = [&](const std::string &state, float due_ts, + const std::string &completed_time) { + append_text(state); - if (state == "Complete") { - append_text(completed_time); - } else if (state == "Not Due" && now_ts > 0 && !isnan(due_ts) && due_ts > now_ts) { - const int64_t remaining = static_cast(due_ts) - now_ts; - const int hours = static_cast((remaining + 3599) / 3600); - if (hours <= hour_limit) { - append_text("hours"); - append_number(hours); - } else { - const int days = static_cast((remaining + 86399) / 86400); - append_text("days"); - append_number(days); - } + if (state == "Complete") { + append_text(completed_time); + } else if (state == "Not Due" && now_ts > 0 && !isnan(due_ts) && due_ts > now_ts) { + const int64_t remaining = static_cast(due_ts) - now_ts; + const int hours = static_cast((remaining + 3599) / 3600); + if (hours <= hour_limit) { + append_text("hours"); + append_number(hours); + } else { + const int days = static_cast((remaining + 86399) / 86400); + append_text("days"); + append_number(days); } - }; + } + }; - append_job( - id(job_dog_feeding_morning_state).state, - id(job_dog_feeding_morning_due_ts).state, - id(job_dog_feeding_morning_completed_time).state - ); - append_job( - id(job_dog_feeding_evening_state).state, - id(job_dog_feeding_evening_due_ts).state, - id(job_dog_feeding_evening_completed_time).state - ); - append_job( - id(job_dog_depooping_state).state, - id(job_dog_depooping_due_ts).state, - id(job_dog_depooping_completed_time).state - ); - append_job( - id(job_dishwasher_unpacked_state).state, - id(job_dishwasher_unpacked_due_ts).state, - id(job_dishwasher_unpacked_completed_time).state - ); - append_job( - id(job_rubbish_removed_state).state, - id(job_rubbish_removed_due_ts).state, - id(job_rubbish_removed_completed_time).state - ); - append_job( - id(job_water_tv_pot_plant_state).state, - id(job_water_tv_pot_plant_due_ts).state, - id(job_water_tv_pot_plant_completed_time).state - ); - append_job( - id(job_water_table_pot_plant_state).state, - id(job_water_table_pot_plant_due_ts).state, - id(job_water_table_pot_plant_completed_time).state - ); - } else { - auto append_appliance = [&](const std::string &state, - float stop_ts, - float duration_seconds, - const std::string &stop_local) { - const bool valid_cycle = - !isnan(stop_ts) && stop_ts > 0 && - !isnan(duration_seconds) && duration_seconds > 0; + append_job( + id(job_dog_feeding_morning_state).state, + id(job_dog_feeding_morning_due_ts).state, + id(job_dog_feeding_morning_completed_time).state + ); + append_job( + id(job_dog_feeding_evening_state).state, + id(job_dog_feeding_evening_due_ts).state, + id(job_dog_feeding_evening_completed_time).state + ); + append_job( + id(job_dog_depooping_state).state, + id(job_dog_depooping_due_ts).state, + id(job_dog_depooping_completed_time).state + ); + append_job( + id(job_dishwasher_unpacked_state).state, + id(job_dishwasher_unpacked_due_ts).state, + id(job_dishwasher_unpacked_completed_time).state + ); + append_job( + id(job_rubbish_removed_state).state, + id(job_rubbish_removed_due_ts).state, + id(job_rubbish_removed_completed_time).state + ); + append_job( + id(job_water_tv_pot_plant_state).state, + id(job_water_tv_pot_plant_due_ts).state, + id(job_water_tv_pot_plant_completed_time).state + ); + append_job( + id(job_water_table_pot_plant_state).state, + id(job_water_table_pot_plant_due_ts).state, + id(job_water_table_pot_plant_completed_time).state + ); - if (state == "Operating") { - append_text("OPERATING"); - return; - } - - if (valid_cycle) { - bool recent_finish = false; - if (now_ts > 0) { - const int64_t age = now_ts - static_cast(stop_ts); - recent_finish = age >= 0 && age < finished_seconds; - } - - append_text(recent_finish ? "FINISHED" : "COMPLETED"); - append_text(stop_local); - return; - } - - append_text(state); - }; - - append_appliance( - id(appliance_washing_state).state, - id(appliance_washing_stop_ts).state, - id(appliance_washing_duration).state, - id(appliance_washing_stop_local).state - ); - append_appliance( - id(appliance_dryer_state).state, - id(appliance_dryer_stop_ts).state, - id(appliance_dryer_duration).state, - id(appliance_dryer_stop_local).state - ); - append_appliance( - id(appliance_main_dishwasher_state).state, - id(appliance_main_dishwasher_stop_ts).state, - id(appliance_main_dishwasher_duration).state, - id(appliance_main_dishwasher_stop_local).state - ); - append_appliance( - id(appliance_downstairs_dishwasher_state).state, - id(appliance_downstairs_dishwasher_stop_ts).state, - id(appliance_downstairs_dishwasher_duration).state, - id(appliance_downstairs_dishwasher_stop_local).state - ); - append_appliance( - id(appliance_evcharger_32a_state).state, - id(appliance_evcharger_32a_stop_ts).state, - id(appliance_evcharger_32a_duration).state, - id(appliance_evcharger_32a_stop_local).state - ); - append_appliance( - id(appliance_evcharger_16a_state).state, - id(appliance_evcharger_16a_stop_ts).state, - id(appliance_evcharger_16a_duration).state, - id(appliance_evcharger_16a_stop_local).state - ); - append_appliance( - id(appliance_ryobi_left_state).state, - id(appliance_ryobi_left_stop_ts).state, - id(appliance_ryobi_left_duration).state, - id(appliance_ryobi_left_stop_local).state - ); - append_appliance( - id(appliance_ryobi_right_state).state, - id(appliance_ryobi_right_stop_ts).state, - id(appliance_ryobi_right_duration).state, - id(appliance_ryobi_right_stop_local).state - ); - append_appliance( - id(appliance_pool_pump_state).state, - id(appliance_pool_pump_stop_ts).state, - id(appliance_pool_pump_duration).state, - id(appliance_pool_pump_stop_local).state - ); - append_appliance( - id(appliance_3d_printer_state).state, - id(appliance_3d_printer_stop_ts).state, - id(appliance_3d_printer_duration).state, - id(appliance_3d_printer_stop_local).state - ); - } - - // Persistent 32-bit FNV-1a hash. A separate value is retained for each page. + // Persistent 32-bit FNV-1a hash for the Jobs page. uint32_t signature_hash = 2166136261UL; for (const unsigned char character : signature) { signature_hash ^= static_cast(character); signature_hash *= 16777619UL; } - const uint32_t previous_hash = - id(current_page) == 0 - ? id(last_jobs_signature_hash) - : id(last_appliances_signature_hash); - id(display_update_required) = - force || previous_hash == 0 || signature_hash != previous_hash; + force || id(last_jobs_signature_hash) == 0 || + signature_hash != id(last_jobs_signature_hash); if (id(display_update_required)) { - if (id(current_page) == 0) { - id(last_jobs_signature_hash) = signature_hash; - } else { - id(last_appliances_signature_hash) = signature_hash; - } + id(last_jobs_signature_hash) = signature_hash; ESP_LOGI( "display", - "Visible content changed or page selected; refreshing page %d (hash 0x%08lX)", - id(current_page) + 1, + "Visible Jobs content changed; refreshing display (hash 0x%08lX)", static_cast(signature_hash) ); } else { ESP_LOGI( "display", - "Page %d content unchanged (hash 0x%08lX); e-paper refresh skipped", - id(current_page) + 1, + "Jobs content unchanged (hash 0x%08lX); e-paper refresh skipped", static_cast(signature_hash) ); }