From 2bbb8f4e114d4bfe78aa3d6841072f53b363791e Mon Sep 17 00:00:00 2001 From: Max Gramser Date: Wed, 16 Sep 2026 23:20:51 +0200 Subject: [PATCH] Give the history card axes, ranges and a finger readout (0.2.59) A sensor, number, binary sensor, person or held switch opens a history card: a line with round axis steps, clock times and the highest and lowest moment for numbers, a timeline with the time in each state for on/off, zones and statuses. The screen asks with esphome.screen_history for 1 hour, 24 hours or a week; the app answers with one compact history message from the recorder's statistics or the state changes. A finger on the graph reads the value and time of that moment at the top while the graph stays as it is. The Guition weather card starts below its round back button, and the README shows the new cards and the light and weather cards as they look now. Co-Authored-By: Claude Opus 5 --- README.md | 23 +- components/smart_display/history_view.h | 184 ++++++++ components/smart_display/runtime_tiles.h | 578 +++++++++++++++++++++-- docs/EASY_SETUP.md | 6 +- docs/RELEASING.md | 37 ++ docs/TEST_RESULTS_0259.md | 90 ++++ docs/images/cyd-history-door.png | Bin 0 -> 14232 bytes docs/images/cyd-history-touch.png | Bin 0 -> 20069 bytes docs/images/cyd-history.png | Bin 0 -> 20954 bytes docs/images/cyd-weather.png | Bin 19020 -> 18821 bytes docs/images/guition-history-door.png | Bin 0 -> 24899 bytes docs/images/guition-history-person.png | Bin 0 -> 24614 bytes docs/images/guition-history-touch.png | Bin 0 -> 47893 bytes docs/images/guition-history.png | Bin 12910 -> 48395 bytes docs/images/guition-light.png | Bin 17769 -> 23222 bytes docs/images/guition-weather.png | Bin 36603 -> 36397 bytes guition-4848s040.yaml | 3 +- home-like-2432s028.yaml | 3 +- packages/cyd.yaml | 3 +- packages/guition.yaml | 3 +- screen_manager/CHANGELOG.md | 12 + screen_manager/app/core.py | 2 +- screen_manager/app/history_card.py | 358 ++++++++++++++ screen_manager/app/server.py | 109 ++++- screen_manager/config.yaml | 2 +- tests/test_history_card.py | 405 ++++++++++++++++ tests/test_history_view.cpp | 99 ++++ 27 files changed, 1857 insertions(+), 60 deletions(-) create mode 100644 components/smart_display/history_view.h create mode 100644 docs/TEST_RESULTS_0259.md create mode 100644 docs/images/cyd-history-door.png create mode 100644 docs/images/cyd-history-touch.png create mode 100644 docs/images/cyd-history.png create mode 100644 docs/images/guition-history-door.png create mode 100644 docs/images/guition-history-person.png create mode 100644 docs/images/guition-history-touch.png create mode 100644 screen_manager/app/history_card.py create mode 100644 tests/test_history_card.py create mode 100644 tests/test_history_view.cpp diff --git a/README.md b/README.md index e08ade0..0050618 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ The firmware and built-in CLI are tested with **ESPHome 2026.6.2**. the light's capabilities. Open the detailed control with a long touch. - **More cards:** climate, vacuum, fan, cover, media player, sensors, select/input_select, number/input_number, switches, scenes, scripts, and - buttons. A sensor can open a history card for 1, 6, or 24 hours. + buttons. - **Special cards (firmware 0.2.14+):** a **clock** (digital or analog) as a built-in tile, a **weather forecast** with five days on a double-width card, a **graph** of the sensor history in the tile, @@ -89,6 +89,11 @@ The firmware and built-in CLI are tested with **ESPHome 2026.6.2**. a tall position slider on which the blind hangs from the top, a tilt slider over slats for venetian blinds, open, stop, and close, and the battery of a battery-powered blind (such as Motionblinds). A cover shows only what it supports (app 0.2.58 / firmware 0.2.50). +- **History card** for sensors, numbers, binary sensors, people, and switches, the way Home + Assistant shows history: a line with an axis in round steps and clock times for numbers, + with the highest and lowest moment, and a timeline with the time in each state for on/off, + home and away, and a status. Choose **1 hour**, **24 hours**, or **1 week**; hold a finger on + the graph to read the value and time of that moment at the top (app 0.2.59 / firmware 0.2.51). - **Top bar per screen** (firmware 0.2.32+): the name on the left, up to six items of your choice on the right: the time, an analog clock, the date, or an entity from Home Assistant with an icon, such as temperature, humidity, power usage, a door @@ -120,7 +125,7 @@ The firmware and built-in CLI are tested with **ESPHome 2026.6.2**.

Vacuum card: docked and charging, start and dock, the cleaning mode vacuum, vac and mop or mop, suction and water - Sensor history of the last 24 hours + History card for a temperature: the value now, the highest and lowest moment with their times, a line over 24 hours with an axis in degrees and clock times, and keys for 1 hour, 24 hours and 1 week Curtains with open, stop and close, a kitchen timer counting down, a scene and the sun path

@@ -128,17 +133,27 @@ The firmware and built-in CLI are tested with **ESPHome 2026.6.2**. Cover card for curtains: the position slider and the sideways open, stop and close keys Cover card for a garage door that only opens and closes: its icon and the open, stop and close keys, close disabled while it is closed

+

+ A finger on the history graph: the top of the card shows the average of that hour and its time, the graph stays as it is + History card for a door: closed now, opened 6 times for 22 minutes in all, a timeline over 24 hours and the time in each state + History card for a person over a week: home, away and the zones they were in, with the time in each +

The vacuum card on the CYD: state, battery and charging, clean and dock, the cleaning mode, suction and water The climate card on the CYD: the target temperature with big minus and plus keys and one row of mode keys The cover card on the CYD: the position and tilt sliders with their values beside them, the battery, and open, stop and close

+

+ The history card on the CYD: power over 24 hours with its highest and lowest moment, an axis in watts and clock times + A finger on the CYD's history graph: the average of that hour and its time at the top + The door's history on the CYD: a timeline over 24 hours with the time open and closed +

Features depend on the capabilities Home Assistant reports for an entity. The app must keep running to keep the screens supplied with current data. -From firmware **0.2.12**, a long press on a switch shows a large -toggle. A short tap switches immediately; the off state gets a gray icon. +A short tap on a switch switches immediately; the off state gets a gray icon. A long press +opens its history card with the toggle at the top right (firmware 0.2.51+). The feedback stops as soon as Home Assistant reports the changed state, with a minimum of 150 ms for switches. Tiles with a mini-slider keep their icon; on the CYD, the icon and text block are vertically centered. diff --git a/components/smart_display/history_view.h b/components/smart_display/history_view.h new file mode 100644 index 0000000..619dc09 --- /dev/null +++ b/components/smart_display/history_view.h @@ -0,0 +1,184 @@ +#pragma once +// History on a detail card (firmware 0.2.51+): the pure parts. What a time, a duration or a value reads as, the +// smooth line through the averages, and which part of the line or which run of the timeline lies under a finger. +// The drawing is in runtime_tiles.h; tests/test_history_view.cpp covers this. +#include +#include +#include +#include +#include +#include +#include + +namespace history_view { +constexpr int PARTS = 24; + +// A run of the timeline: from `slot` to the next run's slot it shows `state` (an index into the legend, -1 without +// data). `begin`, `end` (seconds after the start of the range) and `seconds` are the real times of that state in it. +struct Run { + uint16_t slot = 0; + int8_t state = -1; + uint32_t begin = 0, end = 0, seconds = 0; +}; + +// A clock time of a unix time in the screen's time zone (`offset` seconds east of UTC), as the screen's 12- or +// 24-hour setting writes it; `weekday` puts the day in front ("Tue 14:05") for a week. +inline std::string clock(int64_t epoch, int32_t offset, bool h24, bool weekday) { + int64_t local = epoch + offset; + int64_t days = local >= 0 ? local / 86400 : (local - 86399) / 86400; + int seconds = static_cast(local - days * 86400); + int hour = seconds / 3600, minute = seconds % 3600 / 60; + static const char *const names[] = {"Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed"}; + char b[24]; + if (h24) snprintf(b, sizeof(b), "%02d:%02d", hour, minute); + else snprintf(b, sizeof(b), "%d:%02d %s", hour % 12 ? hour % 12 : 12, minute, hour < 12 ? "AM" : "PM"); + if (!weekday) return b; + return std::string(names[((days % 7) + 7) % 7]) + " " + b; +} + +// A time under a graph: "06:00" on a 24-hour clock, "6 AM" or "6:15 AM" on a 12-hour one. +inline std::string axis_clock(int64_t epoch, int32_t offset, bool h24) { + std::string text = clock(epoch, offset, h24, false); + if (h24) return text; + auto colon = text.find(':'); + if (colon != std::string::npos && text.compare(colon, 3, ":00") == 0) text.erase(colon, 3); + return text; +} + +// "45 s", "12 min", "3 h 20 min", "2 d 4 h": the time spent in a state. +inline std::string duration(uint32_t seconds) { + char b[32]; + if (seconds < 60) snprintf(b, sizeof(b), "%u s", static_cast(seconds)); + else if (seconds < 3600) snprintf(b, sizeof(b), "%u min", static_cast(seconds / 60)); + else if (seconds < 86400) { + unsigned minutes = seconds / 60 % 60; + if (minutes) snprintf(b, sizeof(b), "%u h %u min", static_cast(seconds / 3600), minutes); + else snprintf(b, sizeof(b), "%u h", static_cast(seconds / 3600)); + } else { + unsigned hours = seconds / 3600 % 24; + if (hours) snprintf(b, sizeof(b), "%u d %u h", static_cast(seconds / 86400), hours); + else snprintf(b, sizeof(b), "%u d", static_cast(seconds / 86400)); + } + return b; +} + +// A value as Home Assistant writes it: fixed decimals, commas between thousands, "%" and "°" on the number and +// any other unit after a space. +inline std::string number(float value, int decimals, const std::string &unit) { + if (!std::isfinite(value)) return "--"; + char b[40]; + snprintf(b, sizeof(b), "%.*f", std::clamp(decimals, 0, 4), value); + std::string text = b, sign; + if (text[0] == '-') { sign = "-"; text.erase(0, 1); } + auto dot = text.find('.'); + std::string whole = text.substr(0, dot), rest = dot == std::string::npos ? "" : text.substr(dot); + for (int i = static_cast(whole.size()) - 3; i > 0; i -= 3) whole.insert(static_cast(i), ","); + bool zero = whole.find_first_not_of("0,") == std::string::npos && rest.find_first_not_of(".0") == std::string::npos; + text = (zero ? "" : sign) + whole + rest; + if (unit.empty()) return text; + if (unit == "%" || unit == "°") return text + unit; + return text + " " + unit; +} + +// Where part `i` of 24 is drawn and read: the middle of its stretch of the range, as a fraction of the width. +inline float part_middle(int i) { return (static_cast(i) + 0.5f) / PARTS; } + +// The part under a finger at `fraction` of the width. It can be a part without a value (a sensor that did not +// exist yet, a time it was unavailable): the card then says so instead of reading a value from another hour. +inline int part_at(float fraction) { + return std::clamp(static_cast(std::floor(std::clamp(fraction, 0.0f, 1.0f) * PARTS)), 0, PARTS - 1); +} + +// The run of the timeline under a finger: its index into `runs`, or -1. +inline int run_at(const std::vector &runs, uint16_t slots, float fraction) { + if (runs.empty() || !slots) return -1; + int slot = std::clamp(static_cast(std::floor(std::clamp(fraction, 0.0f, 1.0f) * slots)), 0, slots - 1); + int found = -1; + for (size_t i = 0; i < runs.size(); ++i) { + if (runs[i].slot <= slot) found = static_cast(i); + else break; + } + return found; +} + +// The slot where run `i` ends (the next run's start, or the end of the timeline). +inline uint16_t run_end(const std::vector &runs, uint16_t slots, size_t i) { + return i + 1 < runs.size() ? runs[i + 1].slot : slots; +} + +// Puts a moment (x, y) on a line through points with rising x: the nearest point within `snap` (the same part of +// the range) takes its y, unless it is `keep` (a point that already holds a moment); otherwise the moment is added +// in its place. Returns the moment's index, or -1 when the points are full. +inline int through(float *xs, float *ys, unsigned &n, unsigned capacity, float x, float y, float snap, int keep = -1) { + int nearest = -1; + for (unsigned i = 0; i < n; ++i) { + const float distance = std::fabs(xs[i] - x); + if (static_cast(i) != keep && distance <= snap && (nearest < 0 || distance < std::fabs(xs[nearest] - x))) nearest = static_cast(i); + } + if (nearest >= 0) { + ys[nearest] = y; + return nearest; + } + if (n >= capacity) return -1; + unsigned at = n; + while (at > 0 && xs[at - 1] > x) { + xs[at] = xs[at - 1]; + ys[at] = ys[at - 1]; + --at; + } + xs[at] = x; + ys[at] = y; + ++n; + return static_cast(at); +} + +// A smooth line through points with rising x that never overshoots them (monotone cubic, Fritsch-Carlson): between +// two points it stays between their values, so a step in a setpoint does not dip below its lowest value and the +// highest and lowest moment stay on the line. Writes `steps` points per stretch and the last point into `out` +// (anything with x and y), at most `capacity`; returns how many. +template +inline unsigned monotone(const float *xs, const float *ys, unsigned n, unsigned steps, Point *out, unsigned capacity) { + using Value = decltype(out[0].x); + auto put = [&](unsigned at, float x, float y) { + out[at].x = static_cast(std::lround(x)); + out[at].y = static_cast(std::lround(y)); + }; + if (!capacity) return 0; + if (n < 2 || steps == 0) { + unsigned count = std::min(n, capacity); + for (unsigned i = 0; i < count; ++i) put(i, xs[i], ys[i]); + return count; + } + constexpr unsigned MOST = 64; + n = std::min(n, MOST); + float slope[MOST], tangent[MOST]; + for (unsigned i = 0; i + 1 < n; ++i) { + const float dx = xs[i + 1] - xs[i]; + slope[i] = dx > 0 ? (ys[i + 1] - ys[i]) / dx : 0.0f; + } + tangent[0] = slope[0]; + tangent[n - 1] = slope[n - 2]; + for (unsigned i = 1; i + 1 < n; ++i) + tangent[i] = slope[i - 1] * slope[i] <= 0 ? 0.0f : (slope[i - 1] + slope[i]) / 2; + for (unsigned i = 0; i + 1 < n; ++i) { + if (slope[i] == 0) { tangent[i] = tangent[i + 1] = 0; continue; } + const float a = tangent[i] / slope[i], b = tangent[i + 1] / slope[i], sum = a * a + b * b; + if (sum > 9) { + const float scale = 3 / std::sqrt(sum); + tangent[i] = scale * a * slope[i]; + tangent[i + 1] = scale * b * slope[i]; + } + } + unsigned count = 0; + for (unsigned i = 0; i + 1 < n && count + 1 < capacity; ++i) { + const float h = xs[i + 1] - xs[i]; + for (unsigned s = 0; s < steps && count + 1 < capacity; ++s) { + const float t = static_cast(s) / steps, t2 = t * t, t3 = t2 * t; + const float y = (2 * t3 - 3 * t2 + 1) * ys[i] + (t3 - 2 * t2 + t) * h * tangent[i] + (-2 * t3 + 3 * t2) * ys[i + 1] + (t3 - t2) * h * tangent[i + 1]; + put(count++, xs[i] + t * h, y); + } + } + put(count++, xs[n - 1], ys[n - 1]); + return count; +} +} // namespace history_view diff --git a/components/smart_display/runtime_tiles.h b/components/smart_display/runtime_tiles.h index a84eb7e..e998971 100644 --- a/components/smart_display/runtime_tiles.h +++ b/components/smart_display/runtime_tiles.h @@ -9,6 +9,7 @@ #include "cyd_ui.h" #include "light_controls.h" #include "tile_controls.h" +#include "history_view.h" #include "swipe_profile.h" #include "esphome/components/json/json_util.h" #include "esphome/components/api/api_server.h" @@ -40,6 +41,8 @@ inline const lv_font_t *watch_value_font = nullptr, *watch_icon_font = nullptr; inline const lv_font_t *clock_font = nullptr; // Text in the -/+ pill and the run key of direct controls; the board profile sets it. inline const lv_font_t *control_font = nullptr; +// The smallest regular text (sublabel): axis labels and the legend of the history card. +inline const lv_font_t *small_font = nullptr; inline lv_obj_t *room_label = nullptr; // remembered by render() so page switches can render synchronously // Top bar (0.2.32+): the profile's clock label only lends its place and margin; values use the // profile's text font, icons its small icon font. Set by the board profile at boot. @@ -65,6 +68,8 @@ inline const char *weather_icon(const std::string &condition); inline const char *weather_text(const std::string &condition); inline std::string timer_text(const Tile &t); inline std::string last_run_text(uint32_t epoch); +inline void history_received(); +inline uint32_t domain_accent(const Tile &t); inline const char *icon_for(const Tile &tile); inline void label(lv_obj_t *obj, const std::string &text); inline int active_index = -1; @@ -75,6 +80,32 @@ inline uint32_t keepalive_seconds = 120; // Revision of the layout the manager sent last (app 0.2.39+). A keepalive ping carries the // manager's revision; a mismatch (a restart, a demo layout) asks for the whole layout again. inline std::string layout_rev; +// History on a detail card (firmware 0.2.51+): the last history the manager sent (app 0.2.59+ answers +// history_request with op "history"), for the card that asked. +struct HistoryState { std::string label; uint32_t color = 0; uint32_t seconds = 0; }; +struct History { + std::string entity, unit; + uint32_t hours = 0, start = 0, end = 0, began = 0; + int32_t offset = 0; + bool line = true, has_high = false, has_low = false; + float values[history_view::PARTS]{}; + bool has[history_view::PARTS]{}; + float bottom = 0, top = 1, high = 0, low = 0; + uint32_t high_at = 0, low_at = 0; + int decimals = 1, active = -1; + std::vector> ticks; + std::vector times; + uint16_t slots = 0; + std::vector runs; + std::vector states; + // Home Assistant's words for the states (raw state, words), so the heading follows a state that changes. + std::vector> words; +}; +inline History history; +// The range the open card shows (1, 24 or 168 hours); what it asked for last and when; whether that answer came. +inline uint32_t history_hours = 24, history_asked_at = 0, history_asked_hours = 0, history_received_at = 0; +inline std::string history_asked_entity; +inline bool history_answered = false; inline std::function layout_changed, refresh, dismiss, settings_changed; inline esphome::ESPPreferenceObject settings_preference; // The two extra values of 0.2.44+ in one record: going back to page 1 by itself, and after how long. @@ -302,6 +333,90 @@ inline std::string receive(const std::string &payload) { result = model.ready() ? "Synced" : "Loading tiles"; return true; } + if (op == "history") { + // A detail card's history (app 0.2.59+), the answer to history_request. Checked whole before it replaces + // the one the screen holds. + History next; + next.entity = string(root["entity"], 120); + next.hours = root["hours"] | 0u; + if (!valid_entity(next.entity) || (next.hours != 1 && next.hours != 24 && next.hours != 168)) return false; + // An answer to an earlier question (another card, another range) would push out the one the card waits for. + if (next.entity != history_asked_entity || next.hours != history_asked_hours) { + result = model.ready() ? "Synced" : "Loading tiles"; + return true; + } + next.start = root["start"] | 0u; + next.end = root["end"] | 0u; + next.offset = std::clamp(root["off"] | 0, -14 * 3600, 14 * 3600); + if (next.end <= next.start) return false; + next.line = string(root["kind"], 12) != "timeline"; + if (root["xt"].is()) for (JsonVariant moment : root["xt"].as()) { + if (next.times.size() == 8) break; + if (moment.is()) next.times.push_back(moment.as()); + } + if (next.line) { + unsigned i = 0; + if (root["values"].is()) for (JsonVariant value : root["values"].as()) { + if (i == history_view::PARTS) break; + float v = number(value); + next.has[i] = std::isfinite(v); + next.values[i] = next.has[i] ? v : 0; + ++i; + } + next.bottom = number(root["dom"][0], 0); + next.top = number(root["dom"][1], 1); + if (!(next.top > next.bottom)) next.top = next.bottom + 1; + if (root["yt"].is()) for (JsonVariant tick : root["yt"].as()) { + if (next.ticks.size() == 6) break; + float v = number(tick[0]); + if (std::isfinite(v)) next.ticks.emplace_back(v, string(tick[1], 16)); + } + next.high = number(root["hi"][0]); + next.has_high = std::isfinite(next.high); + next.high_at = root["hi"][1] | 0u; + next.low = number(root["lo"][0]); + next.has_low = std::isfinite(next.low); + next.low_at = root["lo"][1] | 0u; + next.decimals = std::clamp(root["dec"] | 1, 0, 4); + next.unit = string(root["unit"], 16); + } else { + next.slots = static_cast(std::clamp(root["slots"] | 96u, 1u, 96u)); + if (root["states"].is()) for (JsonVariant state : root["states"].as()) { + if (next.states.size() == 7) break; + HistoryState s; + s.label = string(state[0], 24); + s.color = std::strtoul(string(state[1], 8).c_str(), nullptr, 16); + s.seconds = state[2] | 0u; + next.states.push_back(std::move(s)); + } + if (root["seg"].is()) for (JsonVariant item : root["seg"].as()) { + if (next.runs.size() == 96) break; + const unsigned slot = item[0] | 0u; + const int state = item[1] | -1; + if (slot >= next.slots || state >= static_cast(next.states.size()) || state < -1) return false; + history_view::Run run; + run.slot = static_cast(slot); + run.state = static_cast(state); + run.begin = item[2] | 0u; + run.end = std::max(run.begin, item[3] | 0u); + run.seconds = item[4] | 0u; + next.runs.push_back(run); + } + if (root["words"].is()) for (JsonVariant pair : root["words"].as()) { + if (next.words.size() == 12) break; + next.words.emplace_back(string(pair[0], 32), string(pair[1], 24)); + } + next.began = root["began"] | 0u; + next.active = root["active"] | -1; + if (next.active >= static_cast(next.states.size())) next.active = -1; + } + history = std::move(next); + history_received_at = esphome::millis(); + history_answered = true; + history_received(); + result = model.ready() ? "Synced" : "Loading tiles"; + return true; + } #ifdef SWIPE_PROFILE if (op == "swipe_test") { // Diagnostic builds only: page switches without a finger, `n` of them `ms` apart; `back` @@ -465,6 +580,29 @@ inline void action(const std::string &service, const std::string &entity, const esphome::api::global_api_server->send_homeassistant_action(request); ESP_LOGI("runtime_action","Sent service=%s entity=%s",service.c_str(),entity.c_str()); } +// A detail card asks the manager for its history (app 0.2.59+ answers with op "history"). An event, like +// setting_event: it needs no permission to call Home Assistant actions. +inline void history_request(const std::string &entity, uint32_t hours) { + if (inbox.empty()) return; + esphome::api::HomeassistantActionRequest request; + request.service = esphome::StringRef("esphome.screen_history"); + request.is_event = true; + const std::string span = std::to_string(hours); + const std::string keys[] = {"inbox", "entity", "hours"}, values[] = {inbox, entity, span}; + request.data.init(3); + for (int i = 0; i < 3; ++i) { + esphome::api::HomeassistantServiceMap entry; + entry.key = esphome::StringRef(keys[i]); + entry.value = esphome::StringRef(values[i]); + request.data.push_back(entry); + } + esphome::api::global_api_server->send_homeassistant_action(request); + history_asked_at = esphome::millis(); + history_answered = false; + history_asked_entity = entity; + history_asked_hours = hours; + ESP_LOGI("history", "asked for %u h of %s", static_cast(hours), entity.c_str()); +} inline void setting_event(const std::string &key, int value) { if(inbox.empty())return; esphome::api::HomeassistantActionRequest request;request.service=esphome::StringRef("esphome.screen_setting");request.is_event=true; @@ -573,6 +711,15 @@ inline lv_obj_t *detail_button(const char *text,int x,int y,int width,int height auto *label=detail_label(button,text,6,0,width-12);lv_obj_center(label);lv_obj_set_style_text_align(label,LV_TEXT_ALIGN_CENTER,0);if(command==0)lv_obj_set_style_text_color(label,lv_color_hex(0xFFFFFF),0);lv_obj_remove_flag(label,LV_OBJ_FLAG_CLICKABLE); lv_obj_add_event_cb(button,[](lv_event_t *e){ int cmd=(intptr_t)lv_event_get_user_data(e);if(cmd==-1){hide_detail();return;} + // History ranges (firmware 0.2.51+): redraw after this event, which belongs to a key the redraw deletes. + if(cmd>=160&&cmd<163){ + static const uint32_t hours[]={1,24,168}; + if(detail_index=model.count || !allowed(esphome::millis(),300+cmd,"card button "+model.tiles[detail_index].entity))return; auto &t=model.tiles[detail_index];if(!t.available()||t.loading(esphome::millis()))return; if(cmd<4){const char *services[]={"vacuum.start","vacuum.pause","vacuum.return_to_base","vacuum.locate"};action(services[cmd],t.entity);} @@ -646,7 +793,9 @@ inline void render_weather_detail(const Tile &t,bool large,int width,int height, unsigned columns=std::min(weather.hours.size(),6); int hours_h=columns?small_h+mini_h+text_h+small_h+(large?16:6):0; int card_a_h=card_pad+hero+(columns?(large?14:8)+hours_h:0)+card_pad; - int y=large?62:38; + // The Guition starts below the round back button of the top bar (60 px at 16); the CYD needs every pixel for the + // coming days and starts where it did. + int y=large?84:38; auto *now=detail_card(pad,y,width-2*pad,card_a_h); // Now: icon, temperature, condition, then feels-like / humidity / wind in one muted line. int cy=card_pad;char b[48]; @@ -1038,32 +1187,320 @@ inline void render_cover_detail(Tile &t,bool large,int width,int height,int pad) if(key_count){cover_key_row(keys,key_count,pad,y,inner,key_h,gap,key_icons);y+=key_h+gap;} if(tilt_count)cover_key_row(tilt_keys,tilt_count,pad,y,inner,key_h,gap,key_icons); } -inline void show_detail(unsigned index){ - if(index>=model.count)return;detail_index=index;auto &t=model.tiles[index]; - if(!detail_font)detail_font=lv_obj_get_style_text_font(widgets[0].title,LV_PART_MAIN); - if(!detail_root){detail_root=lv_obj_create(lv_screen_active());lv_obj_remove_style_all(detail_root);lv_obj_set_size(detail_root,lv_pct(100),lv_pct(100));lv_obj_remove_flag(detail_root,LV_OBJ_FLAG_SCROLLABLE);} - detail_action_count=0;detail_status=nullptr;detail_badge_status=nullptr;detail_switch=nullptr;lv_obj_clean(detail_root);lv_obj_remove_flag(detail_root,LV_OBJ_FLAG_HIDDEN);lv_obj_move_foreground(detail_root); - lv_obj_set_style_bg_color(detail_root,lv_color_hex(0xE7E7E7),0);lv_obj_set_style_bg_opa(detail_root,LV_OPA_COVER,0); - int width=lv_display_get_horizontal_resolution(lv_display_get_default()), height=lv_display_get_vertical_resolution(lv_display_get_default()); - bool large=width>=480;int pad=large?20:10, top=large?100:62, gap=large?12:6,bh=large?58:34,cw=(width-pad*2-gap)/2; - // The same top bar as the board's own cards: a round back arrow at the left, the name centred. - int bar=large?60:40,bar_x=large?16:10,bar_y=large?16:8; - auto *back=detail_button("",bar_x,bar_y,bar,bar,-1);lv_obj_set_style_radius(back,LV_RADIUS_CIRCLE,0);lv_obj_set_style_bg_color(back,lv_color_hex(0xEEEEEE),0); - auto *arrow=lv_obj_get_child(back,0);if(mini_icon_font)lv_obj_set_style_text_font(arrow,mini_icon_font,0);lv_label_set_text(arrow,"\U000F004D");lv_obj_set_size(arrow,LV_SIZE_CONTENT,LV_SIZE_CONTENT);lv_obj_center(arrow); - const lv_font_t *title_font=watch_font?watch_font:detail_font; - auto *heading=detail_label(detail_root,t.name,bar_x+bar+8,bar_y+(bar-lv_font_get_line_height(title_font))/2,width-2*(bar_x+bar+8)); - lv_obj_set_style_text_font(heading,title_font,0);lv_obj_set_height(heading,lv_font_get_line_height(title_font));lv_obj_set_style_text_align(heading,LV_TEXT_ALIGN_CENTER,0); +// ---- History card (firmware 0.2.51+): numbers as a line with axes, states as a timeline ---- +// Sensors, numbers, switches, binary sensors and people. The card asks the manager for the chosen range when it +// opens (an hour, a day or a week; always 24 averages or 96 slots) and draws what comes back. A finger on the +// graph shows the value or state and its time at the top, until it lifts. +inline bool history_card(const Tile &t){ auto d=t.domain(); - std::string state=d=="cover"?cover_status_line(t):detail_state(t); - // The vacuum card draws its own state (hero or status row) with the battery beside it. - if(d!="vacuum"){detail_status=detail_label(detail_root,state+(t.unit.empty()?"":" "+t.unit),pad,large?80:50,width-2*pad);lv_obj_set_style_text_align(detail_status,LV_TEXT_ALIGN_CENTER,0);lv_obj_set_style_text_color(detail_status,lv_color_hex(0x616161),0);} + return d=="sensor"||d=="binary_sensor"||d=="switch"||d=="input_boolean"||d=="person"||d=="number"||d=="input_number"; +} +// Before the history arrives: a line for numbers, a timeline for the rest. +inline bool history_line_guess(const Tile &t){ + auto d=t.domain(); + if(d=="number"||d=="input_number")return true; + if(d!="sensor"||t.device_class=="enum"||t.device_class=="timestamp"||t.device_class=="date")return false; + if(!t.unit.empty())return true; + char *end=nullptr;std::strtof(t.state.c_str(),&end);return end!=t.state.c_str(); +} +// The open card's parts that a finger changes, and the plot: x, y, w, h on the screen. +struct HistoryChart { + lv_obj_t *value=nullptr,*first=nullptr,*second=nullptr,*area=nullptr,*status=nullptr; + int x=0,y=0,w=0,h=0; + float bottom=0,top=1; + // The highest and lowest moment the card shows: the history's, or the value now when it goes beyond them. + float high=NAN,low=NAN; + uint32_t high_at=0,low_at=0; + bool line=true,ready=false; + uint32_t accent=0x2196F3; + std::string value_text,first_text,second_text; + lv_point_precise_t *points=nullptr;unsigned count=0; +}; +inline HistoryChart history_chart; +inline void history_forget(){ + auto &c=history_chart;c.value=c.first=c.second=c.area=c.status=nullptr;c.count=0;c.ready=false;c.high=c.low=NAN; +} +inline float history_y(float value){ + const auto &c=history_chart; + return c.y+c.h-(std::clamp(value,c.bottom,c.top)-c.bottom)/(c.top-c.bottom)*c.h; +} +// Where a moment of the range lies across the plot, from its left edge. +inline float history_x(uint32_t at){ + const auto &h=history;const auto &c=history_chart; + return float(std::clamp(at,h.start,h.end)-h.start)/float(std::max(1,h.end-h.start))*(c.w-1); +} +// The history holds the open card's entity and range, and is new: the answer to this opening, or less than a +// minute old (a card opened again shows it at once while it asks). +inline bool history_fits(const Tile &t){ + return history.entity==t.entity&&history.hours==history_hours&& + (history_answered||esphome::millis()-history_received_at<60000); +} +// Home Assistant's word for the state now: from the history's words, else the card's own. +inline std::string history_words(const Tile &t){ + if(!t.available())return "Unavailable"; + for(const auto &pair:history.words)if(pair.first==t.state)return pair.second; + return detail_state(t); +} +inline std::string history_clock(uint32_t epoch,bool weekday){ + return history_view::clock(epoch,history.offset,screen_settings::current.clock_24h!=0,weekday); +} +// The soft area under the line: two triangles per segment down to the plot's bottom, no layer buffer. +inline void history_fill(lv_event_t *e){ + const auto &c=history_chart;if(!c.line||c.count<2||!c.area)return; + auto *layer=lv_event_get_layer(e);lv_area_t area;lv_obj_get_coords(c.area,&area); + lv_draw_triangle_dsc_t dsc;lv_draw_triangle_dsc_init(&dsc);dsc.color=lv_color_hex(c.accent);dsc.opa=LV_OPA_20; + const lv_value_precise_t ox=area.x1,oy=area.y1,base=area.y2+1; + for(unsigned i=0;i+1=static_cast(h.states.size())?0xF1F1F1:h.states[state].color); + lv_area_t piece{x1,area.y1,std::max(x1,x2),area.y2};lv_draw_rect(layer,&dsc,&piece); + } +} +inline void history_restore(){ + auto &c=history_chart; + if(c.value){label(c.value,c.value_text);lv_obj_set_style_text_color(c.value,lv_color_hex(0x1B1B1B),0);} + if(c.first)label(c.first,c.first_text); + if(c.second)label(c.second,c.second_text); +} +// A finger on the graph: the value (or state) of the moment under it, and when, at the top of the card. The graph +// itself stays as it is. +inline void history_scrub(lv_event_t *e){ + auto &c=history_chart;const auto &h=history;auto code=lv_event_get_code(e); + if(code==LV_EVENT_RELEASED||code==LV_EVENT_PRESS_LOST){history_restore();return;} + if((code!=LV_EVENT_PRESSED&&code!=LV_EVENT_PRESSING)||!c.ready||!c.value||!lv_indev_active())return; + lv_point_t point;lv_indev_get_point(lv_indev_active(),&point); + const float fraction=std::clamp(float(point.x-c.x)/float(std::max(1,c.w)),0.0f,1.0f); + const bool week=h.hours==168; + if(c.line){ + // A part without a value (before the sensor existed, while it was unavailable) says so. + const int i=history_view::part_at(fraction); + const uint64_t span=h.end-h.start; + const uint32_t begin=h.start+static_cast(span*i/history_view::PARTS),finish=h.start+static_cast(span*(i+1)/history_view::PARTS); + label(c.value,h.has[i]?history_view::number(h.values[i],h.decimals,h.unit):"No data"); + lv_obj_set_style_text_color(c.value,lv_color_hex(h.has[i]?c.accent:0x6B6B6B),0); + if(c.first)label(c.first,history_clock(begin,week)+" \u2013 "+history_clock(finish,false)); + if(c.second)label(c.second,!h.has[i]?"":h.hours==1?"average":"average of "+history_view::duration(finish-begin)); + }else{ + // A run reads the real times of its state, not the slots it covers: a door open for 5 minutes says 5 min. + const int r=history_view::run_at(h.runs,h.slots,fraction);if(r<0)return; + const auto &run=h.runs[r]; + const uint32_t begin=h.start+run.begin,finish=h.start+run.end; + label(c.value,run.state<0||run.state>=static_cast(h.states.size())?"No data":h.states[run.state].label); + if(c.first)label(c.first,history_clock(begin,week)+" \u2013 "+history_clock(finish,week&&finish-begin>=43200)); + if(c.second)label(c.second,history_view::duration(run.seconds)); + } +} +// The transparent area a finger scrubs, over the graph and a little around it; it keeps the finger while it drags. +inline void history_touch(int x,int y,int w,int h){ + auto *area=lv_obj_create(detail_root);lv_obj_remove_style_all(area);lv_obj_set_pos(area,x,y);lv_obj_set_size(area,w,h); + lv_obj_add_flag(area,LV_OBJ_FLAG_CLICKABLE);lv_obj_add_flag(area,LV_OBJ_FLAG_PRESS_LOCK); + lv_obj_remove_flag(area,LV_OBJ_FLAG_SCROLLABLE);lv_obj_remove_flag(area,LV_OBJ_FLAG_GESTURE_BUBBLE); + lv_obj_add_event_cb(area,history_scrub,LV_EVENT_ALL,nullptr); +} +// Times below the graph: round clock times (weekdays for a week) where they fit, and "Now" at the end. +inline void history_times(int x,int w,int y,const lv_font_t *font,bool large){ + const auto &h=history; + const lv_font_t *bold=detail_font?detail_font:font; + const int now_w=text_width("Now",bold),gap=large?10:6; + detail_text(detail_root,"Now",x+w-now_w,y,now_w+2,bold,LV_TEXT_ALIGN_LEFT,0x1B1B1B); + int last=x-1000; + for(uint32_t at:h.times){ + if(at<=h.start||at>=h.end)continue; + const std::string words=h.hours==168?history_view::clock(at,h.offset,true,true).substr(0,3) + :history_view::axis_clock(at,h.offset,screen_settings::current.clock_24h!=0); + const int tw=text_width(words,font),cx=x+static_cast(std::lround(float(at-h.start)/float(h.end-h.start)*w)); + const int left=std::max(x-(large?8:4),cx-tw/2); + if(left<=last+gap||left+tw>x+w-now_w-gap)continue; + detail_shape(detail_root,cx,y-(large?7:4),1,large?5:3,0xCCCCCC,0); + detail_text(detail_root,words,left,y,tw+2,font,LV_TEXT_ALIGN_LEFT,0x6B6B6B); + last=left+tw; + } +} +inline void render_history_line(bool large,int card_x,int card_y,int card_w,int card_h,const lv_font_t *small,float current){ + auto &c=history_chart;const auto &h=history; + // The value now can lie outside the history (the last hour is not in the statistics yet): the plot makes room. + c.bottom=h.bottom;c.top=h.top; + if(std::isfinite(current)&&(currentc.top)){ + const float margin=(std::max(c.top,current)-std::min(c.bottom,current))*0.06f; + if(current(std::lround(history_y(tick.first))); + detail_shape(detail_root,c.x,ty,c.w,1,0xEEEEEE,0); + detail_text(detail_root,tick.second,card_x+edge,ty-label_h/2,label_w+2,small,LV_TEXT_ALIGN_RIGHT,0x6B6B6B); + } + // Through the middle of each part, from the left edge when the range begins with a value, to "Now" at the right + // (the value now); a curve that never overshoots them, so the axis and the highest and lowest moment stay true. + // The averages only reach the highest and lowest moment in their hour, so the line also runs through those two + // moments: its peak and its valley are where the rings are. + float xs[history_view::PARTS+4],ys[history_view::PARTS+4];unsigned n=0; + for(int i=0;i=0)high_x=xs[kept]; + if(std::isfinite(c.low)){ + const int at=history_view::through(xs,ys,n,history_view::PARTS+4,low_x,history_y(c.low)-c.y,snap,kept); + if(at>=0)low_x=xs[at]; + } + } + if(!c.points)c.points=new lv_point_precise_t[POINT_BUFFER]; + c.count=n>=2?history_view::monotone(xs,ys,n,4,c.points,POINT_BUFFER):0; + c.area=lv_obj_create(detail_root);lv_obj_remove_style_all(c.area);lv_obj_set_pos(c.area,c.x,c.y);lv_obj_set_size(c.area,c.w,c.h); + lv_obj_remove_flag(c.area,LV_OBJ_FLAG_CLICKABLE);lv_obj_remove_flag(c.area,LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(c.area,history_fill,LV_EVENT_DRAW_MAIN,nullptr); + if(c.count>=2){ + auto *stroke=lv_line_create(detail_root);lv_obj_remove_flag(stroke,LV_OBJ_FLAG_CLICKABLE); + lv_obj_set_style_line_rounded(stroke,true,0);lv_obj_set_style_line_width(stroke,large?3:2,0); + lv_obj_set_style_line_color(stroke,lv_color_hex(c.accent),0); + lv_line_set_points(stroke,c.points,c.count);lv_obj_set_pos(stroke,c.x,c.y); + } + // The highest and lowest moment as rings; the Guition writes their values beside them. + const int ring=large?12:8; + auto marker=[&](float value,float at_x,bool high){ + const int mx=c.x+static_cast(std::lround(at_x)); + const int my=static_cast(std::lround(history_y(value))); + auto *o=detail_shape(detail_root,mx-ring/2,my-ring/2,ring,ring,0xFFFFFF,ring/2); + lv_obj_set_style_border_width(o,large?3:2,0);lv_obj_set_style_border_color(o,lv_color_hex(c.accent),0); + if(!large)return; + const std::string words=history_view::number(value,h.decimals,""); + const int lh=lv_font_get_line_height(detail_font),tw=text_width(words,detail_font)+2; + int ly=high?my-ring/2-lh-2:my+ring/2+2; + if(lyc.y+c.h+6)ly=my-ring/2-lh-2; + const int lx=std::max(c.x,std::min(mx-tw/2,c.x+c.w-tw)); + detail_text(detail_root,words,lx,ly,tw,detail_font,LV_TEXT_ALIGN_CENTER,0x1B1B1B); + }; + if(std::isfinite(c.high))marker(c.high,high_x,true); + if(std::isfinite(c.low)&&c.low!=c.high)marker(c.low,low_x,false); + if(std::isfinite(current)){ + const int size=large?12:8; + auto *o=detail_shape(detail_root,c.x+c.w-1-size/2,static_cast(std::lround(history_y(current)))-size/2,size,size,c.accent,size/2); + lv_obj_set_style_border_width(o,2,0);lv_obj_set_style_border_color(o,lv_color_hex(0xFFFFFF),0); + } + history_times(c.x,c.w,c.y+c.h+(large?8:4),small,large); + history_touch(c.x-(large?14:8),card_y,c.w+(large?28:16),card_h); +} +inline void render_history_timeline(bool large,int card_x,int card_y,int card_w,int card_h,const lv_font_t *small){ + auto &c=history_chart;const auto &h=history; + const int edge=large?16:8,label_h=lv_font_get_line_height(small),times_gap=large?8:4,legend_gap=large?16:6; + const int row_h=label_h+(large?10:3),square=large?14:8; + c.x=card_x+edge;c.w=card_w-2*edge;c.h=large?56:24; + // Bar, times and legend as one block in the middle of the card; a legend that does not fit loses its last rows. + const int above=c.h+times_gap+label_h+legend_gap; + const int rows=std::max(1,std::min(static_cast((h.states.size()+1)/2),(card_h-2*edge-above+row_h-label_h)/row_h)); + const int block=above+rows*row_h-(row_h-label_h); + c.y=card_y+std::max(edge,(card_h-block)/2); + auto *bar=lv_obj_create(detail_root);lv_obj_remove_style_all(bar);lv_obj_set_pos(bar,c.x,c.y);lv_obj_set_size(bar,c.w,c.h); + lv_obj_remove_flag(bar,LV_OBJ_FLAG_CLICKABLE);lv_obj_remove_flag(bar,LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(bar,history_bar,LV_EVENT_DRAW_MAIN,nullptr); + history_times(c.x,c.w,c.y+c.h+times_gap,small,large); + // Every state with its colour and its time, in two columns. + const int top=c.y+above,col_w=c.w/2; + const size_t shown=std::min(h.states.size(),static_cast(rows)*2); + for(size_t i=0;i(i%2)*col_w,ly=top+static_cast(i/2)*row_h; + detail_shape(detail_root,lx,ly+(label_h-square)/2,square,square,h.states[i].color,large?4:2); + const std::string time=history_view::duration(h.states[i].seconds); + const int tw=text_width(time,small)+2,words_x=lx+square+(large?10:5),time_x=lx+col_w-(large?14:8)-tw; + detail_text(detail_root,h.states[i].label,words_x,ly,std::max(8,time_x-words_x-6),small,LV_TEXT_ALIGN_LEFT,0x1B1B1B); + detail_text(detail_root,time,time_x,ly,tw,small,LV_TEXT_ALIGN_LEFT,0x6B6B6B); + } + history_touch(c.x-(large?14:8),card_y,c.w+(large?28:16),c.y+c.h+(large?24:12)-card_y); +} +// The range: an hour, a day or a week, as one segmented row. It asks the manager, not Home Assistant, so +// waiting for a command does not lock it. +inline void history_ranges(int x,int y,int w,int h){ + static const uint32_t hours[]={1,24,168}; + static const char *const words[]={"1 hour","24 hours","1 week"}; + const lv_font_t *font=control_font?control_font:detail_font; + auto *track=detail_shape(detail_root,x,y,w,h,0xFFFFFF,h/2); + lv_obj_set_style_border_width(track,1,0);lv_obj_set_style_border_color(track,lv_color_hex(0xDDDDDD),0); + const int inset=std::max(3,h/10),sw=(w-2*inset)/3; + for(int i=0;i<3;++i){ + const bool selected=history_hours==hours[i]; + const int segment_w=i==2?w-2*inset-2*sw:sw; + auto *segment=detail_button(words[i],x+inset+i*sw,y+inset,segment_w,h-2*inset,160+i); + lv_obj_set_style_radius(segment,(h-2*inset)/2,0); + lv_obj_set_style_bg_color(segment,lv_color_hex(0x009FE3),0); + lv_obj_set_style_bg_opa(segment,selected?LV_OPA_COVER:LV_OPA_TRANSP,0); + lv_obj_set_style_bg_opa(segment,LV_OPA_COVER,LV_STATE_PRESSED); + if(!selected)lv_obj_set_style_bg_color(segment,lv_color_hex(0xD5EEFC),LV_STATE_PRESSED); + button_words(segment,font,selected?0xFFFFFF:0x1B1B1B,segment_w-6); + if(detail_action_count&&detail_actions[detail_action_count-1]==segment)--detail_action_count; + } +} +inline void render_history_detail(const Tile &t,bool large,int width,int height,int pad){ + auto &c=history_chart;const auto &h=history;auto d=t.domain(); + history_forget(); + // Asked once per opening and range; again after 30 s without an answer (see tick). + if(history_asked_entity!=t.entity||history_asked_hours!=history_hours||(!history_fits(t)&&esphome::millis()-history_asked_at>30000)) + history_request(t.entity,history_hours); + c.ready=history_fits(t); + const bool line=c.ready?h.line:history_line_guess(t); + c.line=line;c.accent=domain_accent(t); + const lv_font_t *big=watch_value_font?watch_value_font:(watch_font?watch_font:detail_font); + const lv_font_t *text=control_font?control_font:detail_font; + const lv_font_t *small=small_font?small_font:detail_font; + // The header: the value now (or the state), and at the right what the history says about it. + char *end=nullptr;const float parsed=std::strtof(t.state.c_str(),&end); + const bool numeric=end!=t.state.c_str()&&std::isfinite(parsed)&&t.available(); + const float current=numeric?parsed:NAN; + c.first_text.clear();c.second_text.clear(); + if(line){ + int decimals=0;const auto dot=t.state.find('.');if(dot!=std::string::npos)decimals=static_cast(std::min(4,t.state.size()-dot-1)); + if(c.ready)decimals=h.decimals; + c.value_text=!t.available()?"Unavailable":numeric?history_view::number(current,decimals,t.unit):t.state; + if(c.ready){ + // The value now counts too: it can lie beyond the history (the running hour is not in the statistics yet). + if(h.has_high){c.high=h.high;c.high_at=h.high_at;} + if(h.has_low){c.low=h.low;c.low_at=h.low_at;} + if(std::isfinite(current)&&std::isfinite(c.high)&¤t>c.high){c.high=current;c.high_at=h.end;} + if(std::isfinite(current)&&std::isfinite(c.low)&¤t=0){ + c.first_text=h.states[h.active].label+" \u00B7 "+history_view::duration(h.states[h.active].seconds); + c.second_text=h.began==1?"once":h.began?std::to_string(h.began)+" times":""; + } + } + const int row=large?84:50,row_h=lv_font_get_line_height(big),text_h=lv_font_get_line_height(text); + int right=width-pad-(large?8:4); if(t.is_switch()){ - detail_label(detail_root,"Tap to toggle",pad,top,width-2*pad); + const int sw=large?84:52,sh=large?46:28; detail_switch=lv_switch_create(detail_root); - lv_obj_set_size(detail_switch,large?240:140,large?112:64); - lv_obj_set_pos(detail_switch,(width-(large?240:140))/2,top+(large?65:30)); + lv_obj_set_size(detail_switch,sw,sh);lv_obj_set_pos(detail_switch,right-sw,row+(row_h-sh)/2); lv_obj_set_style_bg_color(detail_switch,lv_color_hex(0xB0B0B0),LV_PART_MAIN); - lv_obj_set_style_bg_color(detail_switch,lv_color_hex(0xFFB900),LV_PART_INDICATOR|LV_STATE_CHECKED); + lv_obj_set_style_bg_color(detail_switch,lv_color_hex(0xFFB900),static_cast(LV_PART_INDICATOR)|LV_STATE_CHECKED); lv_obj_set_style_bg_color(detail_switch,lv_color_hex(0xFFFFFF),LV_PART_KNOB); lv_obj_set_style_opa(detail_switch,LV_OPA_50,LV_STATE_DISABLED); if(t.state=="on")lv_obj_add_state(detail_switch,LV_STATE_CHECKED); @@ -1077,31 +1514,80 @@ inline void show_detail(unsigned index){ if(tile.state=="on")lv_obj_add_state(control,LV_STATE_CHECKED);else lv_obj_remove_state(control,LV_STATE_CHECKED); if(allowed)action(tile.domain()+(requested_on?".turn_on":".turn_off"),tile.entity); },LV_EVENT_VALUE_CHANGED,nullptr); - detail_actions[detail_action_count++]=detail_switch; + if(detail_action_count<32)detail_actions[detail_action_count++]=detail_switch; + right-=sw+(large?14:8); + } + // The value column fits the widest text a finger can show there, so a readout never runs into the texts beside it. + int widest=text_width(c.value_text,big); + if(c.ready)widest=std::max(widest,text_width("No data",big)); + if(c.ready&&line){for(int i=0;i=model.count)return; + // A card that opens starts on a day (an hour for a tile whose graph shows one); switching ranges keeps it open. + if(!detail_root||lv_obj_has_flag(detail_root,LV_OBJ_FLAG_HIDDEN)||detail_index!=index){ + history_hours=model.tiles[index].history_hours==1?1:24;history_asked_entity.clear(); + } + detail_index=index;auto &t=model.tiles[index]; + if(!detail_font)detail_font=lv_obj_get_style_text_font(widgets[0].title,LV_PART_MAIN); + if(!detail_root){detail_root=lv_obj_create(lv_screen_active());lv_obj_remove_style_all(detail_root);lv_obj_set_size(detail_root,lv_pct(100),lv_pct(100));lv_obj_remove_flag(detail_root,LV_OBJ_FLAG_SCROLLABLE);} + detail_action_count=0;detail_status=nullptr;detail_badge_status=nullptr;detail_switch=nullptr;history_forget();lv_obj_clean(detail_root);lv_obj_remove_flag(detail_root,LV_OBJ_FLAG_HIDDEN);lv_obj_move_foreground(detail_root); + lv_obj_set_style_bg_color(detail_root,lv_color_hex(0xE7E7E7),0);lv_obj_set_style_bg_opa(detail_root,LV_OPA_COVER,0); + int width=lv_display_get_horizontal_resolution(lv_display_get_default()), height=lv_display_get_vertical_resolution(lv_display_get_default()); + bool large=width>=480;int pad=large?20:10, top=large?100:62, gap=large?12:6,bh=large?58:34,cw=(width-pad*2-gap)/2; + // The same top bar as the board's own cards: a round back arrow at the left, the name centred. + int bar=large?60:40,bar_x=large?16:10,bar_y=large?16:8; + auto *back=detail_button("",bar_x,bar_y,bar,bar,-1);lv_obj_set_style_radius(back,LV_RADIUS_CIRCLE,0);lv_obj_set_style_bg_color(back,lv_color_hex(0xEEEEEE),0); + auto *arrow=lv_obj_get_child(back,0);if(mini_icon_font)lv_obj_set_style_text_font(arrow,mini_icon_font,0);lv_label_set_text(arrow,"\U000F004D");lv_obj_set_size(arrow,LV_SIZE_CONTENT,LV_SIZE_CONTENT);lv_obj_center(arrow); + const lv_font_t *title_font=watch_font?watch_font:detail_font; + auto *heading=detail_label(detail_root,t.name,bar_x+bar+8,bar_y+(bar-lv_font_get_line_height(title_font))/2,width-2*(bar_x+bar+8)); + lv_obj_set_style_text_font(heading,title_font,0);lv_obj_set_height(heading,lv_font_get_line_height(title_font));lv_obj_set_style_text_align(heading,LV_TEXT_ALIGN_CENTER,0); + auto d=t.domain(); + std::string state=d=="cover"?cover_status_line(t):detail_state(t); + // The vacuum and history cards draw their own state. + const bool with_history=history_card(t); + if(d!="vacuum"&&!with_history){detail_status=detail_label(detail_root,state+(t.unit.empty()?"":" "+t.unit),pad,large?80:50,width-2*pad);lv_obj_set_style_text_align(detail_status,LV_TEXT_ALIGN_CENTER,0);lv_obj_set_style_text_color(detail_status,lv_color_hex(0x616161),0);} + if(with_history){ + render_history_detail(t,large,width,height,pad); }else if(d=="vacuum"){ render_vacuum_detail(t,large,width,height,pad); }else if(d=="cover"){ if(detail_status && control_font){lv_obj_set_style_text_font(detail_status,control_font,0);lv_obj_set_height(detail_status,lv_font_get_line_height(control_font));} render_cover_detail(t,large,width,height,pad); - }else if(d=="sensor"){ - float minimum=INFINITY,maximum=-INFINITY;for(float value:t.history)if(t.has_history&&std::isfinite(value)){minimum=std::min(minimum,value);maximum=std::max(maximum,value);} - if(!std::isfinite(minimum)){detail_label(detail_root,"No numeric HA history",pad,top,width-2*pad);return;} - char text[100];snprintf(text,sizeof(text),"%u hours / %.2f - %.2f %s",t.history_hours,minimum,maximum,t.unit.c_str());detail_label(detail_root,text,pad,top,width-2*pad); - int chart_y=top+(large?46:28),chart_h=height-chart_y-30,bar_w=(width-pad*2)/24; - for(unsigned i=0;iminimum?8+(chart_h-8)*(t.history[i]-minimum)/(maximum-minimum):chart_h/2; - auto *bar=lv_obj_create(detail_root);lv_obj_remove_style_all(bar);lv_obj_set_pos(bar,pad+i*bar_w,chart_y+chart_h-h);lv_obj_set_size(bar,std::max(2,bar_w-2),h);lv_obj_set_style_bg_color(bar,lv_color_hex(0x16A5E6),0);lv_obj_set_style_bg_opa(bar,LV_OPA_COVER,0);} - detail_label(detail_root,std::to_string(t.history_hours)+" hours ago",pad,height-24,(width-2*pad)/2); - auto *now=detail_label(detail_root,"Now",width/2,height-24,width/2-pad);lv_obj_set_style_text_align(now,LV_TEXT_ALIGN_RIGHT,0); }else if(d=="select"||d=="input_select"){ const auto &options=t.extra().options; for(unsigned i=0;i30000)history_request(t.entity,history_hours); + else if(now-history_asked_at>8000)label(history_chart.status,"No history available"); + } for(unsigned i=0;is;4sc|M=7*TG&f(%ZFNbUOe5 zyAb-?rT_rN003lo8xMF!v8{g$0F-SJ+UL#uNaO+k*JjI!s|&t`%4$WrM_%xpIikIH zRYWIxe_fmjuJ)wvsZsZ46^!9{GnNo{X4=b+Tb=l}HcVwPg!dF-`DwEflDEzbW@w+Rg zGEp$Zw9&3W>aeEIIt&q&VKg)NfQR0@5Di0QU|W$FKdWJUHo!j|Q;+oiXibJ8Oj}SI z{b{@3C&Cd?siHI7D+N?(M3k9rBEiOo30^pzDe(8gU~g#PFB*HGTqC4>-^D1{=bEL{ z4Ddusj;WS_79t8ZeFk!tb3*f<6Qw*?z$tmZ=Tlry@L&dMZ{_dN{3zZ?r(*E27ceH)@J?|OtblW~Ff7VKf&6mw?Z4wYizaPdyGa+>!*(oPxXt?>&mK?#Z>qiz7BF;$ue}A`ykiH< zDVV;J-9+0;U#0MkMQcs$1@AeE0SEoc{VHgeb+Tr#W6Jp>U;4|vq+dx$okT=EVb3Tk z{S$XycNAVjRB5^55>$%)81SAHaejh`qE%+2?R9<;nFJM8i+>*Fcn*?P;?Fc-RFt|6 z&D{W(baQr!(SR=5DvNAIk>uSNe#{3rI5^~)aHh>3&ryI7N0HZMbq7aOW{ag*9~1;< za0!q?L}_0;iZP)JBVrwt_lF5y$l3zVI}R|2f?*vEfNVyg(3K4H1SJ>faOjy<{eD)a zEu*PE@;2wS9pxcr9^~85^qjKUf**iIiSvzEakzc`PM~HnCbu{4?<<~y%$kNJI7@ru zFY;*=rIU5TM6Y#_=R<5apcuEH(F0hY^3iZLbp-4!`?0(N1WUuBaLx6}T2^x4T=~mO z(CjUpgK zznSb(z;CHd4q7n@`tai{MXJf}x6#N7!HETf(|hi9P< zC2!Lu+jm~jy%1{z9i3=0!gQQuG~Tq>wtOh!!o*|HIN5s^ z48v$tL-kc@xTfpezskKn-Ak)D$)9^KIk@B-S(0|br)XYdwV#VH*@l}swzo<2>AR!| zdH$mG-#;?M)K+@!A!Sn^6ZltI!&~71^7q%Lz(xalLvO?%_fdZQ+$ADcZ^xBp?lZrkMOf&{mD^#e+Ku&to z)0~d{SVrAW{9lW?glria?Bg9rZIh*_Nr_jbKE3vQ=UKi}&ku3r4g%?=oGfRH^H9kf=7TjOH5>sc}y zyrDkP8Rsj6vU*L*rpWbS2h2NiODjpagM)m3{UGTwU}a_Xxi+3)U;Xf?t z{}ML!#>y2^V4kE;yecdceC4;ISN>_;_2v4Pu>3{+7c}0=Oh!R?Zu`*Rfp`V9np9Lp z1hnqw)-~c+^lZs>K(N<^Iq9HkC~2+2Yh zoqp8E7ow@Frzmcme4zQCw)Xn5XUiJXl z(wIp1Is;(_eKmK6C&K3xJ2z~GBujmuQJ-L!jhsHoKDjxGPEV)^4(U7B|5gnHM%jvo zqu%v1Z~o(7eMb}lE}o#!VJG!Fr)16PguR~|@;U~N0)>a(5bVEE#!!4qEO zf~1L|wCh0PHX(zJOaF1}t0?J5Q~oQGyqBcCBKMh&sXy^ZP>e{%f*JE43vIW@c{N%@ zn{&(+9Fmh`QZLxtT;K=L9^Wkhp4|suaFPc*^nZqC*;Mmjk_T9O05?VaE&>L^1;n|p zH2`bPQ=gz+v9k|Ky=S_mNmM==R-6MdLVR&A@G+Pca>qZ&*ncVCc8uu}Fn4$4$u|Xd znlr6)bZ~WbE#4196wl#NtgV31K)wj(>e0k)guO1

CHxFr*HlcWW8;vF@=t1eI*I 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 U@Avc@fLKbd&K@Vr94}=258qI~x&QzG literal 0 HcmV?d00001 diff --git a/docs/images/cyd-history.png b/docs/images/cyd-history.png new file mode 100644 index 0000000000000000000000000000000000000000..491d91f1c608148ecbbc99a1b1635c65d2d2058f GIT binary patch literal 20954 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

4za#}W(q}a=QLHNHb{j}#T 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 BOAY`4 diff --git a/docs/images/guition-history-door.png b/docs/images/guition-history-door.png new file mode 100644 index 0000000000000000000000000000000000000000..13a978315931201a4b2a4046ee0b44a3066a26d3 GIT binary patch literal 24899 zcmdqJX;hPE*EWnJH+7)Jwu%bW8lY+w6cHH$wp#FFtfHa>f>sm}NtlNO5~pgd40=&S z=4w=Aj538OL`20DA!Q5@NKj@%h!BzxGJR))w64DQ^E~&v*82_X`vE_4P3O4xv5$T1 z^Tv;^4y!&{|A~f%#wzIGfx{XaOP;Cz{r~5;+cyVOou^-$GtA8F zcbs}&|NG_o7oRQ?nl4&-`({JXXP+f^lCC;gpb}bLuFS;OX4pm0a&uo674=ZqWnx8) zBA4xbH2+v(+4yu3mP+HqUAlD1`S-#_8X709Qg@6FJqaV}Q76a~D=Yq5(aaNrC*#vYW_Qby!hi4aSXqf7K@;38x8u-b%wXP)M+@gY6 z)q{sWuPgbyR`u)k>;wD<>ffv$)LCyKfH&P;{lk0LUwy#UNBcjkNqVn}VBCi;&M+Rj=CBarmT``j-T) zCo`&7I=}q<_~Mls8v7oh7Jn-Tt@_H{eAyk1B^nyH#;iWst@=Xu;x0zE>Jvv4x}{6k zfrn!Gnh0}RZ?TnzVH*2%Dl9)HsV**j0ax|I?hYm6$tpxe6! zMOhtvf(c&SZ~P~C@#6;~WjZmTP7JW+Bs-sy60zDxQZLx02i@Dn%8zzsSl!N0E; zolQ?Q^Gk4QwLWWIP>(yht0r1-*7`Hh&JWkKvNoJV-S?#PeTn+vC!iq1dhpn7RR{JV zo~8aova(2Ob)G^GR}~;CcEqn=rJ->^)n9On+p*B$H@Yn~)$WDN$}DB032kCjQ}s!( z1TP-EXzXx?wtXxEi7%(xyogA(j>N#nbZX8tez^hMbnC+hcK#ti9Mh^ibbpcR5ilNK z>GaP)(#!R=k~`8=Qk0YC#SB&gNGJ6=C@lQ zZ%#F9U^^-ibsH=&&OZ@Oe)QBV=~Lz?;{n-|LwgZQ0TvRD-kdA}2x) z=(2yC(FQP_zo@1jG)%wsO{y6$6Z&10r21vy=Y&BE_bpm`wt|)Msd|YWSX>j%Jw~!~ zyVvr&-rI>pA$>2gT?c{0CoVe{$aL*nRE4 zn?@gWy%@iI)n+k6DX}wP4*B4DWe~h%_1(sr+b{kwUu{N|0creFK?$6?Jrx<$&;t-i@#A2FK9?0d;y(9aQ2a^TX;;Oz~e;mqH zPVyBypy@YejFsI^Xhvv3oS2aHxS{V5dCgx7Z?hzR>AH3JWUoxzcrN6r_0y|!gkIM~ z5Bdr3V~3?bo5XB_ii6%hKZR8Mk-RMlVVoTk0(%(Mx`fLO6mJcT{0;FAdf`WW_+;~d z&Y4o$d25ed-YFzKy_owV!2tuG(?Y97^E>#LrF&t{!Hbus+O}_L`X;Gz{ADjuDNjO} z)V%*5KK6C@mfO_HD(@vt5MU>6oHFlWYJHf+H%m6su|^D=XU_&bsP{&)@L)d|cjkJ8y!`bG z$jUf$BqP)nZYJ?N&((Igr`oq3Bkk3WZ0|qQc*hWGwh_EJg~S+Eh07OdZoD;^Oxkba zQycSoM9vo1TF_^OpE7agNt0+wWKK(bb?RezFS&skPo3%D)VqvY8Pb{>3K8V) zH7FvJH}~=!CDO31-sPh4c{?$8%Dnfl&Vfy^(*$dkcq~JIIqOC2;xmm8GAzp7b-ajf zVnl^#n`uPt`=3n^(L=Hl-4O}V>^XX9rVEv>j}J+2i(wU}Uuo zp(2`MZe_>mIU$*dghn0|;mp#-CXIKt-)y<-Q%T*nC=kQP5~VB%CM8&%e=TJSKYn2= zN9+9&<`%8xck@&>06`zi$<9Jlj_2j~6wxM%8{tx&#__R&Loxg+ZqcR`=_3p37O>n( z&&J_`)AeKC*CFVBwt`edq2!F+)D1TTw0dv<#Y0F;pYlol>HvI=+V((jI=0plDrTbb zhR_`opDf>5V3ubHSw(+MpAl*?u=9`VzDP3KfN|Z4FAn%y$H%nT%Nhb zcCKU)prVC6up`|9dq>0V`!bH&^UdRewoQjJEJGhrKc@qX2QUV>bc>#@!F>E&r{DS4 z78O!j@ZN2wpPxH&?xXv1Z)@;N+gt-voa45m%1e1Ex@Kp)zFBw;KnHGHPsK=vQj!p% zBh6(@qaS&is;3tmYQ|2-ulyKUfqa)|5defNG_!ec{P!0K{S&tiRRmN6Prcy2{W4(s z`uM2fH>slGbv-rFB@zHE|JpImFJ#Yt(8<^d5t_sRy8ZRg<)r>X6lJ}h)nr@~H^ziS-PO-ZjFB_v0g9?d; zDj=ny08jvX(S$|T>Wz4lk>3llat^}KdPYK#l&TwxGmjWXk^c9l`I!#7Bz47Y8+-PXTrE--GK86rsW}u-*L1a86 zL-3nyJ3DCGXSGr`-v~4)$aIS>Z}1ERQ^oAYR~ZKs(>*4}5MgT84tRVSfA0hjg2TC; zWqNCs14Q<3h!bV!P3vO${EfEv8nZ79GqRbp_}VL`YUsZ1j(UFvg3+>)(3DI)$nyrq zur?=i`UWBsk58w@bu>mdDOq^jfiicBq6Yt?=K?g#fkE|TNIzCKb?UGr)d?B zcuM8Kh^_UYLZ3ghU%ev_sN$Z|0`KZQ&^AfoQVMDs#TGW#!w3-DVNlH+POOg(sYg`3 zKE5($aKAzCBrl&*4fl?Bdp|8Sj-gr9p1QunK)sEDkuXY1$E@Edp9Fx7J;|$;^XjsG z{dvXOo^unXOz%i<(1u16&Lj_*N*;l`%jqp3X6RI7E zvZPI7pQcdnhG6+m@5))4G@{)cDSKsfjiUK8zQ6S61NM8h-ycCvE|{uC8tV+UWk)~a z@hxhDIiGFMfvJwaZ@r!OqQHGRk{8Z2_BXr=zKSjL_Cfw`{%cSnHs{dQwoOy{Ly>8b z<@S0-R|`?(F%PVaizpl<z{>p7N%gXoevvF^WWosNR*nkJ){CRN3wEu-@(H z(r=)E+INoVfY>zdQ89{wiDk*RcDs-~2&Iqy2wwXkhOl8DD>!}|Q3+sf5<<)&5?M;S zw!LOmjXSClkfmN&;LQkni-SQXB3h8nxjo%DWlF+k?qapip*fac7|Iz;I284{azNf95g#8%Unanv%>rK3d}&MDoJ&2V|XRXP+M%7iAWa8}eT~vCp0?@15D3CsfX6Ta*Xx*Q+pq6^%>LNxzr+DLRw3g-y5KeJuoFDj)8^sZyXgrgI>oTxAAJWaEJ9GjnQpQ0KNXp@3$Kv7B|=OJKK1Q z?(&uhr6?hgw3Hlk_BHG1WfY-e`<9|cG!y@_eCJ6k!?T*yp{4=&7wyRCn`=$hGY3d; zeZYE>QFg?%vC+$EYyX5j?0hOEzP#53nK<69w{1;$uR2ZzjwQz}iQ`5HiK2ei)RNVx zLVn3#Wrug30KnzB{S7dB7Ft2l$BY1n)Z>K#y|mOH6Lz1{_isHRs7Me;uny%lggp>& zMS1pXidrb!=r&wV<{jS|>VpBQY$uBmf2hgW>O|&8{pVyvvZIlGMfTXD7v-qKD8W+V z)J>lW|J`Gri6|_!oaNiyWAASGJ#{^p1 z%qZiB?k+jLqV}W|LtS}I{Qx!Q;JoEpZ1Yeq$yP?ggQ}wVi*Bji>|NiHOjiGU*H5zw+q{$N~lqND>dF6^=R55v* z-#sa-bRiPOvAXngW%3q&zF-tr0D=J!G;*(2U4*xS?oGsr^mmlAUWDqY`ao zeUK-~$m4Ki&z9^ijE)Sro(t7JLWRCmLBio=j#(V3^>shI;00kMOLSF2(Z)+}QHUef zt6e@gC}L=%1s6&?T}$LxSNUM6)oPW;p%{)BZ&Y4F(Caj*XAXb6V5j?Y zd5_XD<6{xok~e;@hNcp2=SG1ixs+n!!%krZHl>*da$}Wpu`#5NpLkk+pnBM$sF9=K zaa`ez;qCpY>_{rtJGL@Qb7RmxmO_`mlu*hl!L>C6ut&K?)jJ^W+7(Tb!hqQGVKbiD zQ*4@sa~x5Ezmk13{}>sw;fpyplerQ^A-iY&%Swy~HDjnWkR%cHSbHhjMoa>^dPS1U z0mwg4t8GqJBdL7c$SDAN0ZuPg+UyNz*uZ&@3S^Kl9t_eQyTDotjw~KQH_=x%lrJR? znJo!qipNRD8!7u!v=^pg=0^x+F_5e=NmDA2eUl)HL&G=R+P7-e$fg_dRk4Ow!%t}W zd3Oqwy(6|Mz7slc)^}8+u#q{!0ss?hhtp`4ouLJy`r}xJ<4Kd+*>?!~^Pg8Zl%nk< zbT=5`mlb`soJnGPk$ceLC%En@8qV7rZAF?8?4U1i=@;i|)^hH26>>W3E6=rHAUN^@ z_hn%g2P}(@6`qZN@UZhwHz?O1$-J&t)rWrT${^u>;}iSuA;`|Z1xP?N|CQU?Z64)} zJBL~FOM#?I+8$>2^cK9gvxnL8<;%-mbBtqTQw_#rHcD)~B8FQ?IlF6Sm&Y^{G7PPE zS*~U|sK&#ak8_w;ke7BxkPVFR4`Cg zK9cN#?rs~%1U94I%J#hc{O6-!UJ8cx%VS>D%P%|-V;M2bnpbLHGsUMbUx3wZ){Ba+{(4VnMVt(B z&@FmUiaTMAY@Qx!Oq#J(2KUt_sbb=KoWlH*aKlEGZwa6*tr-4HpUaD`TecQ}8L*9b zMSjRcClhMeYp!w_t2kSo=#H%IgE@zp%mF>XrJ;}f-PfcW(5veBcPPP&)sePuLqy$v z#$#E#J+P|RT7D92g(&M7VC6GnCqn_@6yP4;-0MQo?{a+XP=(|wGKVismfGc8RHFF& zb4;@R%{^ATHR`8Y)+7W}FI|X)&PL%}Miaok-x*y4!tJfl$kkH!>9o~ar*nqdmD%{o zN(gp~9e0PU5`Xm?pTkhN5A1y=AHjoYtesbKoX2w?2t#H?mP%2;mVHd9X;bBw5o`~$*9^Sd?b;A z9>IG*{pkm|neO-MTvqSXNz0<8C8;YdvYBgXvoEs}ZdUa@OhKpJMvVKvq1BMqbP{~* zG)}%#sPU!mdZT9!2C-rAB(frTCO&+z7wMCn#&0^Tw?^k5s7bfx*O);e({$s+@u@Vy z`1nD1lz!kLC+ zwx5J;xAV3?GufVx0=Dr%6)R%2TtUS!tR}}L3A_CZ^@jnTHi1IuhAD`#-h6M+VB3k7 zNh}x?-`2SMz0L%;y^1Bks#66|YQ6YZv~f->!+DdH%GL_9RuET%kO=ryWo0Sg&Dg&iiH6Cu# zvQEJWEvkkm=?KxrHKw!fpjhS~p#EOCf9D};K_AYi%KW>F>&&7- zoMONf+KfLY^$f4jFG8>3#-04SP8=xe_Wi;^FfZ9X9tmyb(sl# zv_su;(Bb55tTj#5d^zTtqb+ClT5M7&4$X}K0MQlxR@!9{H-V4btSfIuipvaBnqEW} z$aCzhELiDlB@9L5S{B@gLAKgSB_=R}iAi^pC^YrgPe&h{M$@s|#ij1HJAD^d|MarI z>-!YtOYbN`Kq6}u7bvsYPHJrk7CWRolc5NMxF47;3tR481 z$0kc;`3>b`3e6t;ZM*4v+D2o&c$D;>j>Pf7w%j6N;3PvL7zvDw4Iu77m!3oQ74Npc zG*8UtBs;#cXXRUUra|wb@~=MCdD|j-aW-R(jNrq#(UWL>o;n`2^A9tPne6pv_Qv~` zw%L><|EOS>4?eL^EMoW5VGR&**DDB>epoI4_`F_!!ocvk7Q5bZ`FJr?UiK5qWZAYw zioQUBwuc)wKEYd{;b9`SV?~@0Z{VZ3AF{tEH8f7jngDCI8L}6%_q=if6qvBR*OmqM zcIcHekNYRoA`d5z5=3?@n@6N#mVHOj)mqE!AmLt*`^5L(VQ+lMvVtz{s$A17b59(b zi~GT3XMHGrL>c9r;sL#PaNAqND;{2>AQGn%0|h%gOd?ZvKu=T;s`=83TZZDXy_7=D zGTaXwKzfzqY3pMvCd!yudxlLXDrd|gPr*`;T`d0@9=b0~V9^5*vPHb)Dt9_NkSnQ` znG`{-Y1wL3z&vxC^kWkXMOws^l_uKEkpO~U%q;RwM@W1q#A=?Bh-b;_bcK)Gd4iG7 zfeu-{`%7z1@Hv2IsH!k7387;2c($DC+E6UqSyQVVZg(s9riBcd1=6R#!$u1tM*Ps# z1bL~g!tmJwGIoZH-e(5LznW6OX2Qp>;`0oPEX_oCxQd3I*piiJ?e?E6pkR>$Kz|=t>m(1uifp-dHU#%ZNHamYXts0oWk-Ea zVCm@Fyrso}PY5HtBTyzz6K^3TY`M0IB?VDV;em=Hi6X5A;>l_jl|?AvSz=i-Ml!+x zM8HX<>Gx*OK=Kl=_T7BzB4E8@6>VNyHj~MKKdwre^$C)=8jW&TC zT@oUFPvH7#ELeWQCjDnu-3c-~`)1uVR*hmbw1Vn^Yyn1anPfNkO{TR4w2P>aA?Q1* zCt4#OodI0+p7k0UPxc?lJWM;#R}p*~_U)?*hu~Ek_LO#PvF0HJaUWK8PD+Xo!4mMf z-W5ToVBbWf=pg(i!?NwrVhupLU}*dLYNA8o!Ix`&oZ*5KB}Nd)Cm`_=YF5ScWz)KK z>$=kX+gYfT@Uy-x_kVz3kQVP~0Tb;EsgupV!toBslNMI!8&x&)iPJ@p$N?IQPfk=v z1j4?Qz6dAyTXanq8>A&3Jp>vdLnw==01N8!vK8}qZQU~5;m49EA`plohIv3r^VsLb zv1w~l(_4sCJ0d~d4iIXNHMC?gReXLofc+rRGyLW$1$^q-li-0@2)ZhqDH!tRycouYgk;*#?D4?1tjo;Hzq7+T4FM8yez3Em<=%(Am!WXG7|9Bx zAPUVs10Rcv&nwBB%sUY|-+HZ}R{?~)mp9k4Zi0&gkH?GF`osi3xs_q=^kK^+#;Yf( z_*~1^c%a}oshMYW0WdER++E_gu&w;QwI{N}nch4kSTcH#$DefMdpM|tN(UBaJUvKQ zyTj`o84QW@?|F?zteR(PMDq2b$<69DH1V`SUj&xSv!y*}QoPlSz9anY@h9`yJTPO& zhnq9g5vi&i9q6g)rMw;aR@)bx1ilR9ClGX*M8Mk)zHWOsyhoL?LVzW^5Ja+z)Iy~A zUEt|`#JgsGuJ9m;J{;jUSxD;zbVQxeV5FHhvcYJN=3EXzWgZJh#VrQvA`Kt_>RDog zW!vCE9_shRBdROHrSpCNuMCVZ`b)f_+MYw_~)no^W4?{hnn&qrP2PEjNE@S zDg)R%E>B|ZX6v*sTs;-V`gMOf4Jjr>9kv11r0cZv9l=Bi!|IzyZ-Z^m^6ioag}b^% zH+i3!mepFgCiAmTmwR(Wdo(@No8iAPjsLa*|Mytozd!Z==V|-rVpjM1e`5kZISKNr z|2z5H|HlV27W?YivuB+IbX{2h(+CpvMf#}ihc;3%3xd97E54i$X+JqR*S%jG`P+4U z-0N!^h@w}rwX;92tY1`eJr z$U@M8z>h#)Yg9;&kVR8Xzd)NbF>*cGZp67Z1bx%>jW9wo+h8{-T)dFoc7LN9G(@Ga z6O~ljT#+mnvB)_?UIfVy1p6rGm=L_i&1NT5ES;V=HqggFrLn3TK4;u?0d$pT%Uy ziv004c#QP(z{w_ zJuS-dH(o-GNI?&?7UbF?r|az3V6h^i&wTF%g$kV`ij@kfar7DOq2nfCz-|l*zqjL3 z1{mC*$KK;|eY%d4Ck`h0fRU7RQfiYCm0$vrfIcDm!IkuduQ*fm|9CV$buKHoAnVRy z!SnFLVmFfUBmW1D-O(eNJZJj?TydU5esd|4dmn9VC+%hcZi-7q-(5K;RF6Lmoz@U7 ze>a&HP^3GZ5^2te$+_CaH9XzALZ%vi=R4xpn-dYx4pkDQFgnR8erxP2T|WerU_Dt; z&b5<|xq&s&9xi2Jstb7$Dm^J{p#9w2rjg)g%Mk=rJJ&(RL`JLkC*X{o1CxU~YI4nS zn6_@eY@|`52h~Jgym6M(F`681U+eDX-elJ0U+M$~`LbTPYWeD+O@zq&9RUhXNwZZz zb+&aAqKkVb>dPHocM(7v?E-gxyE^%C7JzD-K^9Rba>JDe!v?nUnKqU_O<(-W=7fW- zju*Ki7jbW>8;c{1u|lGCCku8gtQThtaBj!p&eT`xH9kG=LF;*Sswa<~Ii8zqR;o^S zaUV5rqY#n}iYXO3{lmO8t@kL-+%e7X)Nb<@Ai#&@ zpbda)R>^ohsd1+}Hb24iRUPuS>ukLAwqocG3NE$30;JRJoN&3y8u$)sJz=g`<6o>t zM4LGO%ybeeA`X|VKC;-0!@4G2fh4Cytn~`|4nFohO6$B~@kln2aIHMIb1IO{*kXy z)XL<45#L`im>5%J>U5`JDY>ctN&yPlUHc8ol2%ppkUC3_D--F&?{TTX4rAKGUhJSF0P$hIRcQMJ@?4(8Wm|U@Fq%oFI)lTh57kCHfY7ei z6>{T7)J9#>%^=)CSPuQ>el4c=spsmr1M!nyBy8stniSHRDygc)a6a1oGq~KPvkaw- z!BWs_b2>&Ery30SLU@Y5tcb@9EFId73rOGkG*Bc1Jc5fkKh$dGQwxVk4BCh5jeHZH zYJcBZJzhVaUAc1Q1>VRP1uetCX>$B4uk4`Cw5kz)QW$>-38-q|M~t(geu6u7AK`j2 zBnPH$ewu->awN;Cb-nya^EVM(mv#9=rqoqpA^b{LWaZAWQ2;L^2GsbPA>ni1KTR64 znJe1HgokO*s;6FU0QwxxTt?o|Y>aMdBuxsE-9WgM10qD$EeZ{=;YkP&@9>UWOs0qm zB%D18<+CN)&aLAug$@2jPtAM6%vuUxR9HF+fZ#Ke7q9T54Hig#vF0gV8#yidz?C2d zEasxsy;IBBOv6`MEONbmz`|RnAER}_xCvpQN4V7O92XEadPUoIFUu(oL`-)PlBq;u z?^@}8btJY^RlBjz==_n<@owHQuy4+-j%U?r-b@Fq?LeFvTspkTHAQkUz0u!@)->e7 zAV2*O$BwEB0=~kj0KiuSbx8AX;nzP|g8vAFd=!@a^ZEYq6$AHrXuF@91&9@OH`p)x3T2=;0{g!D!z2-7iH{8lvb-Kcw_kQ~!3nJ< z%+?ziLFE^^cNsP2FO62mw3J$5q4kW!OO-Q*v9Vl`b;`-YZB;Ad5%dN-#T0_RY^|5+ zpj;JRAn07QxC%k<@bEzvCMJe9Tjm7f6#%D*?n^i|Gp$Y#jKWkJLeuZ-f#3rWD=CN* z#l8?cc=vPyC`=&CzGZo{RjD>aB{0?YWf`uvz}Fc;>ZJ;~?tOc8;)(#Kf)JJB|>VNSprS+U?*#zcAf=(vNxd=M&5qA;Yz(xTu_Kihi z$#CjmKvAU;G~Jf1*bM;=FZLT~8X$^@*F!VX)INZ>zJWs2=}l0WQCZFvv#>NCTX}2$ zYJa?wSy)_KI>0H9RUj^Fk_Pf|6z>Rkzfq2SGScnWfe{dhX0?(NTM|Sz z6AijKOJ_ks!mZUY%sRGqWAxzdKr(B5S&PY8EK;?RAaq)8u! zwVu7X%0>5xW|L2vmRgy4ArJH&F$u_oTsMzRgj+tu;qCM6PZi10R9F9*{!SCaYXJ|$ zjo+-fH6p`XsYbSb|xGL3GUH;-pireE*k12BFk)N{N z;&>xY-aZtv)M8El5^b9&fwT^3MC|GrtAM(5cA9D2LwseK{zF@Bz!&b)T$ZE=jV!n` zAoy9mF9GHA$}MwDAM=xCtK;YO)!P>Jqns%aIcDvZq}*&7BLX@?INbypvwwgHoUlogV&_uVf*y;oC27JhxYbq%YDOc3S+ zF6?Ev($Om4BkDn|w2yD(FMM+>#52*Iw8i6cI~nN~*&FNtcRp@a-Rw|SgJXj*DhAB= z^l(IOBZbNf3}lh*tBbM*9mgGT%c=T)#rzz49y^jNf9fGzk%d!EJdh|*wAbfqm3PkS z*z_Qzu*??DFBV~ZZ)W3dDvvr`K%LUL&QWKN+XEA6q_hc z!h;=(3!-BWry75|EsAqVmhbkq^GPE!(pKGL)6)4lnQS6=Z=P>Obae}1^=>AqdjQ2f zBvuYv&{7X9e$y`N)gynj-|i}eDj4pcxs#m5am|aQ==57%K||O~DBnz)yslkI1DFyt z*4-y7>fMcU;bUosGH1VuXXefeY#K}On4MTh zU#$Do`8uQTDLR3%cAn%tcu|+CG9g|moQdS|2>TkHURN>MmoogekX3ZF4wmw$BS*Gn4&yL{%Nxy%5(cT_*YL!x@vnkd2^X(2w^Ju4xpnI15 zBkghYXAV6{=B>QLl>9?E4UI>--P(kLhr>BLI;7UUV&>UhC_bl2JoOfgr*bm<%Vnp( zGflROY~X%ul~?*?ZX!$8ayp+=X%meoFo8bnZN1nHCKO>Cj2ub7O>sML$K3-bc z&fAuHaP!l1ww(1tCAfH%F0Gu)jouji;xh;a{>s??%A_jzgkT#Gv;{Vt4*k3qF zdRhL+WBcraXiaW}ww){p9`v)5o?s35rZw@83-q%<<=yI9+wyQS;8e~Q$fgsbGlD${ z@^_EgMx2DRohD)DC$7yYtB6%`e-MGptCY%M4s@7Y1X>k)FePnMp%jAU?qiLYKG@2B zLNUWu3O3j!Ri)P59YjFRoX2NOMF9V2=--r&@~h!Wjuw0Ry$43BW_ZBmwBlucQB@u< zcWJM!qaTFY~bHqvheU45i&Om>1#Hmkl-A?xQ7VUMenBz*DUB?^Ia2^4B z)N}Rx^0V$#i$3HvmjjqZF7O0c!m&?nI|QaZS^eX|$$x6xLIAASes^Z63LmU?Bs4T$ z($v4}J3~9T_+&#A5F93z+OJ4dC+I+Ym{eeVJY>bbSNDwflAJMqUB7*(E%_T0@0$S? zB5{=l%GriJA4*0)!k*v!4@BBOVetPM7`+B_$Hmkp-vj6l3VdjUBaNvRSTw9kd+pf@ z;(`xeH@^Jo>&E})_dkQtjjU1^U;%+%?^d)M{H ze_!-hWtG{NNSgI{@XS&-3`aI>krd{7@hveDR8E0v6gk%iz%ZMs7YI6FBC~*!o)a|? zA1Dqms?bKx{K(>|1cD1R;g}n-CqnKE9Ra1X^T<(E54~U<%a1Bg<5U zsVq4`HeisGa;T67*d`+=!DjmP&J&4oQ;+E+@5IB>Apo4iSkrk9(WRsVDcG2S4WP`~ zq&DickP5)~wO)4HQN!YnCB01nKGGhb+^@)m2L}@E2-S_<>S|lyF}c5VN=vfk7vMo8 zKiUmG#-G+EyuShj&F`ve;Zb#@zpZYE8n%Kob{BB7z~+XsgrFGEACxe3s;OS4AFoHn z>9jq>-Qz}S{xy)N&Y9Z<8EzAb0Ss*ui9we^5)N3QV(L-~{M>Ohw&LwIb@3xxqy*K` zz!a+SsbiP{z`EsJCo{tMm_j)WwaZfOrLoC3>BItm5O?zN& z7c6|k#KrHvSJ)6OuIBWK_BIJ~nT@`wn!0~g*`0OBWw*9YOch=gg23ISHO+vM3KSr| zhA*3Z%RwJ@1Vjs!;V0-Aq^sGf0wp~*aSZ1hhu`l|txuiIULRj^$D()XED+5D zE!w22sCW~T(kb|38`*i+G<$SxSPjPh)(Jdg-a{!8&!LU)+g=YZS^l2tWwa%K%C^*>L}}~ZP3Sm z3k8%8|3x8InRJqw=mE!z4*2SpBF4ES?1y?vzzgRV>AZGDmW{QVd2PK{*z!xhM_2`P z$}qLV8U^`oC%26)v06Mg)3x7AFdk9eN09O?idgwfp>F<&_Fp?H$=2xt-eoq8vVlBUWO+Wou%hWu zyf&x|6F)S9yxagKa)0^5N2nA^*{psYeYGD7*u>rHzpxe$OoUc zmSRcdg9HWzFC7-vXDZkJ-8aRLr1!_%{4LC}7=c1}0L@&VDS@4KK&{c}K6Db-5f>m2 zkR<;&`B*rb!fPpvtSEOktm?BTx^51}Hq&|w8*sn~qvQ5J9;Dd+0L(|p^>F2QnRjhW zH0;sLK#k8i-u>Im<)nkMRYO(zA8o(BUroD=VxFeTf2SiX)f5g~GoD(=ZfkS1L(;p9 zBSGlVyNz5E@)|v)ivQ{%TQ{q*2jxPOOqf39nRtV(-z3chyaTAtIKw0q`PPU82NUx_ z=!tzT|4}O}ezmt&Y*U*}pLb{z$k^v(6RZFmI;yJeuNJe^(K;?lwKfs-FFd?}s8ceW z4t%8pU?#37A=Jb>A}1r{*Z99D#my=C&8n3vCvG+9nsl&EAfF|7b(}H$xr2*BJ_a?? z8<;{MqUj{Tuh%zK!Y^jJ+Il8V6%I{|ss`_nn9S;U{5<(nrf{>1FL(Cw(9u>DgVc$d zwl4jEFD|p1R8+zP;mrgUufbFD)#_&;xKCAcCoCbL4j%v29{2VIXkd;V0+^Jwmg`RH zPAE67z!Bnq1?hU{h(tR@6x>X(eQ(XOF{i7&~1SH;Xi%#N0ij(&-MVm>?3;X zBM9(sAN!xK|1Yol&lC9n$Ft^tW1Wv${r?WI`L|6`5Aa8mp~g`Al&Kx!ZF>WPzEG=e z007ET=|TR~%yZ4J+P*;Yq=O1<1hglx$5)*Iy`9&Vhf!%)Ra*PWGR>%gSMefH6}-w@%LJtyaEeQksvH)GXH>E#Pzk+G^JwHzy*(!&6=VfM8lAZ1a!~c6=F@6moY}gO+Tbmo=#m2?2~_ zwhlx65WviCUx(ZOq&j;81`Mn*ebC?`kSU#XP>mhR`{?QIE?=kzPAbmlPZucNEN{B;DX4f|jxga7Q=J~-E`XFjp=;+sF+ zJu>T}RC*^wHLn~6`%b-kDY69}+Fs~c2FgNJT}{Q2kZP%ps)4cQR$<;ibanH~?T+vS zIDjDmte=yPI8YJPQ3d%sKZQF9+BbfLR9dkrC3bIRillGPXC{z_9p! zJ>GT!Fp7eSQ|oMrTuv<$2o<~UWo7B_Ed!juu|^~tBxxeC?wplI{hkclhQ~% zj(5+jnR(Rwc(;Q~e%48FT@7*n$(es-bpEZ;`sn&cmf+uRzxnG%&EKZ~ZUGK}g5ZhL zwtmYi;AjCO)ppxGsA?o>M;FiwUQp`=`DZid*{!b@HH(ti@f$3_jaYVuYT<#xn@d35)bzxD5#k>n&J|C$7 zrvlE<0L&qxkkbrSnDZXdawqRE-zyqI!3Mp>0OE#RO!r=Xg@s&!YvI3h={xn@pPGvb<*5=wCO{WSwhq45=xC0Z<~%gW3__xv=l zFB{j_d?occ9lLR(`yhuF9VGhYhfu$sz59GT%g!H#2SH@vwksAKO!W-R0a&ujj!ahr zfQJ~f!G5`K4lyMs+v#S|_&=uvZn#?zk(n6?z2Bj8>UVOXs-AutFw+2d*DYYpv9?3a zXh9ki0kqYB5+~QMi^;ZALck+R1{w|}$A3Dl0pynV@{ObN z-mLjnmDf7ydDpx<``IIx^m!|wLpS-9Zer?R%3hn5v~)@A!|}Yl5^%f;sGgeWF4?Sl z1nf<-EGo^KxBGa#iP}`QCX$d&giAAbm(mnR1L9V%nn}(pIsfKiUcFI($-EGI-Lfj} z!0uv0PzRi+s@1w7AzV@fGoSTK+oTE+bI)?quZd!l2sgMUGM8_$Z|*#yACz1^Dpch8 z3@%uCzc?IG+;v(T|Jmq@e2WXNa1E~$l!v%cOJCYAvL6h$)+R6{byJ`a;LD~=f09P* zTOc?Hl%ARN<<1}B28teXh022jK{uw{O3N}@zQgLU|*FL zHuCw<^3g@EN|A<%cU3!kNvj)`Mpkk`sqG3AmeI4Wu5eNR&>9-;h>7W+9-u^1#e8T0 zQ<>Nd4)#bwfa>jX=A+x{%H)uaqaJ16`hXhWvwDoe_M!9J!=_k~5S$_ItkZu(3}^Ps znu+p3+=lDH9{g>%OLgMsgp$S`SF#h;P6@atW3}M|2SnBD$^j0p)35fRjvp0y8qB`3 zs0Hxz?KL3Wbl4aS=m}5~R2qCYqDU%n+Vede%HB1rkYU9va8ky#z^0q|o!YfTJH@+4 z2>L@i+)jFz;p6H+?rpEw!_o;22PIi)0!{OLFr}e)ckzKM=Y;<5bHrPe?<3DE#Bjwe zzkk>#z1m;Qm7D#`oc6hO=jKEk_(Ayc8F171ElR!_$u!eO)_V;xET_uvs$@-~v}}ar zW%;9*`6;xD!1kUx@s!fywM-&@36C!X>J4JidOz57KuOK8!eFg9Rlv z+6qM_I4>o(Ey0DLY_db$0`vE~cTc&4VQZwV*S zL-)M?h|_Al8f6QkdX@7(%dB;Kuu~ZvOUvVLO1{e+V9u$IiqdVa`QtRT7h|guG(jMBjRmJI z%2kT4wcouWbY|tT<^{~)Pz9#`Nr47X?`0Ff=^5ch|vB20%W!m zL5jNIL|eJcGttrWdirkuW1c%>zqWj~LfReQHYZ_JU|#+*>4BvA&n%A=pvXPB+x-jB z?;LkU9$73a6Hl^1`KW{ND+6j68Z~{Q%CN5KK{?DAj`^buys?T<0SOX%Y=t&y5IFCL zHapr1N-C5I$y}gGnXy8jua@OAwT%X`75-n*XPhqQNTtn34$+Qm6UN?mU)-C!wi15( z!_6-P#RTDsN>@6T%(;>Vou~Me$1_8!a~ldl{l^{ISugy>d`vpfcP}K>R-$tB@0?9^ z&iroTw?B`$IrbGb-|Ez@AJ*;gBnVaxede(7_5-}z`-H<>yJN`Rw{}i|;Jew0u(#&L zG@0NBT{9b>iQ=}eLD7fDlSCM&9oB}WG@2X!CoklS>#+mfpmJt!fJ9rL;=qzmZtVKg z9lR=Jw2dImsq&kC6Cu#kTKMf&lU@=nf7Kt6i=8MfQY#t_7&iW}ZnyX|;OhAR@Ae?$N zV{j!=&12a!PfIRinuDd3OCW$UR}u1OM<7K))~Hz+Be7 zs3Bfe2Qvkq=I&914PgkEKCwlY4DajqIE*Xi>w7bE8)be@W01Xbq;Us1^?1^4n$x5G z=k1}`_V7Wit8R`2#nH;`;ZrMI8x> zxBXJ-Gyr9VG*S(#UH2Yjk});jG%&FNlmj;tG77Q#Dn~@Yp(mCOc04bhD;_Ht7;kr%GM=>w>t2vtk{5#Oxlrr*M!Nw~i#C_Wd&BY5lL*>0eYnUmD4a0h*qL~y zqYdnI5pLHY(fF7~?qvp^d_iK|HlAczj%}>!C0AF{b-P1|0dTe}v+Piy3tveX4|vV*VALHt~j9&eQZAg zsDC?uqS&*(&2eY0$*-Y8bQ|D$#9wm;YL50H{;@aSriT|ZnbN9HKgWVEjr2% z9V`NS^0p|bTCw(^evMc{NZ|(Y=41CO7O@uEjq4ql(NR&7@Ta5^X9()KNy1IOHI5&- zSybrU&@cD5?yyheJCHsCZ_|NXTqTkP2d(92`fg&Iuhj4@gv}LfacLYJL=naeNCyqT zrCT2=y7nQTkxdQiP|Yo~i2+C>@5I8-bA4&(b8^$068@d3XnVflM7Qp6{e0 z^E|Fcje+BwwV|l0wJNaL`V8bd796{yWpa?lPFX(t-rK^R);nK)RdBa?hMvPp=Msn6 z`>)zrBtFqdXsSYq=08}}3lA&aQ{3`Un6zJTBRfXbaLv7mkn*=@eCo2&IeyxBwd8fX zq7nJH7sZ(%QJfiL^{379WxGLh<4rE8=$d~e4gOl3U#OGZR3#>*a)QID$Da;6uxqc< z11v|GV8x8IXbg&POOU4um?<}SX>OImuW27d4`&p$9kdS^rDp7l{SB?(6+Ggr-g8J= zmW6>93Q<{6qgn$^KjE-nhIH?8?3WdBv_x5;@})f%>sx{J&ND<-dWv6A%0;4|Xkvgg zJa4#kd%Ysoh2EX+t8PBZyIrh7#N?ri-L>WS6uS5)>Yn$PK zNXW6QkDZ!uyaYS!^e$=oTz>-*1pE6R>*?z|3tIpVlKe0j%wuWa9B~G2EhWJVXkLRn z_) z@Zp@=gzWgtlQ9;{iB~NEUIWRWIEsqV&wL{y24IRYpTyIHmVJjcju9M_V+LlO?JwNVQT>#kZ{`R1px4&Ja7r%B%ONM^e%M{6szET6 zS8`aUZ}m*uQr_DENQ;rbKK!+sejh-;Bh4%4rx$erCXHe01E^i6ZK5_+U zSdO40tRDkn@*U$SX0>m-TfL0eh$5c*hV~;qfWJdU77SW>xI`9kJXF3CDBnwfC$S%M zwgw8k%>$dPudiLYq;H70)_YIYvStmhp{{NsOox;Q2S~E4SRiE&J)Z&mW!q6jW5l`T zjQQy_jT3(9^X2BYTTgm{wR#}FVQIN-*mRsRAl5B)=2c?k9}B#j@EiBiT;2&(;S-_N zAZ6x+F6G!}8CLi^6HQb|@;H%LDBQU%}x z!~aUbSNaYi zYCB{fmurtEj?HM97=h!Z5m#_^A1T5}m83;+bOw!WG|@ajop8n$@PJ`|tSjL@%!b$k z+p;>?*3b2HKlmY=2wOvA6Tl0W*Vmo{NTLA1p&;ZaIO!XF3dr%=ez%Yu$0En~OEyGzhpA8Nd7@aYIl2Wpal)>Uk`Wn4#LpUB< z2$PH{F6G?~z$*#7;mqA&O`kkP{$9K#`FAFmO6yL$mvftxiw0gg|97utw(QH)&H|6! zddfzrU_QFO1(-ZlDneBkuy9`d1ylL@86_C5;CYsox5AemmP5+LWJ%U&BZ9;Mm0Q%? za#whj{FP9mj@}AG=L%N|+g#Nb=7bLz-{1t{H`T)bF>tO=4^m2;|4QJi-q{#SlyBSn z&o{%eIg|1&{@dX#scawqMBnC`jZt4gMuuD5Hm;lE^DeNy-5pwu+Ximrtk+^d3A(;`DCKKR&OS%)_e&bq156F&WdT~S1;fJ7mF5a x3_(OsF!*2+8A&~}V?Ar=te}q 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ⅈKE21QD~Sg@9g~lyVpe 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 literal 0 HcmV?d00001 diff --git a/docs/images/guition-history-touch.png b/docs/images/guition-history-touch.png new file mode 100644 index 0000000000000000000000000000000000000000..89014853cfe30c6a9a0de891ece2bf90dfacbca0 GIT binary patch literal 47893 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

uZF0yq$)Q0Srpmt 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 ADF6Tf literal 12910 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⪚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 EKLjX%+5i9m literal 36603 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 On4jEt(6=4@_5T1UehXLt diff --git a/guition-4848s040.yaml b/guition-4848s040.yaml index 4cc64da..a944e94 100644 --- a/guition-4848s040.yaml +++ b/guition-4848s040.yaml @@ -2,7 +2,7 @@ # Source profile for packages/guition.yaml (tools/generate_packages.py); see docs/GUITION.md. # A screen gets its tiles from the ESP Screen Manager add-on while it runs. The CYD is its own profile. substitutions: - SCREEN_FIRMWARE_VERSION: "0.2.50" + SCREEN_FIRMWARE_VERSION: "0.2.51" # 0: no drift limit; LVGL decides, releasing inside the tile is a tap, leaving it is not # (like iOS). The CYD keeps a limit because its resistive panel jumps. TOUCH_MOVE_LIMIT_PX: "0" @@ -182,6 +182,7 @@ esphome: runtime_tiles::screen_awake = []() { return !id(display_dimmed); }; runtime_tiles::mini_icon_font = id(materialdesign_icons_mini)->get_lv_font(); runtime_tiles::control_font = id(sublabel_big)->get_lv_font(); + runtime_tiles::small_font = id(sublabel)->get_lv_font(); // Top bar (0.2.32+): values in the text font, icons in the small icon font; the clock // label lends its margin and drawing order and stays hidden in runtime mode. runtime_tiles::header_text_font = id(sublabel_big)->get_lv_font(); diff --git a/home-like-2432s028.yaml b/home-like-2432s028.yaml index 93459b4..3f8f9ab 100644 --- a/home-like-2432s028.yaml +++ b/home-like-2432s028.yaml @@ -17,7 +17,7 @@ ############################################################ substitutions: - SCREEN_FIRMWARE_VERSION: "0.2.50" + SCREEN_FIRMWARE_VERSION: "0.2.51" # A tap survives a finger that drifts up to this far (320 px over 58 mm: 1 cm); further is a swipe. TOUCH_MOVE_LIMIT_PX: "56" # Shortest contact that counts as a tap; a resistive panel bounces, a capacitive one does not. @@ -294,6 +294,7 @@ esphome: runtime_tiles::screen_awake = []() { return !id(display_dimmed); }; runtime_tiles::mini_icon_font = id(materialdesign_icons_mini)->get_lv_font(); runtime_tiles::control_font = id(sublabel_big)->get_lv_font(); + runtime_tiles::small_font = id(sublabel)->get_lv_font(); // Top bar (0.2.32+): values in the text font, icons in the small icon font; the clock // label lends its margin and drawing order and stays hidden in runtime mode. runtime_tiles::header_text_font = id(sublabel_big)->get_lv_font(); diff --git a/packages/cyd.yaml b/packages/cyd.yaml index 9f208ba..e4da43f 100644 --- a/packages/cyd.yaml +++ b/packages/cyd.yaml @@ -18,7 +18,7 @@ ############################################################ substitutions: - SCREEN_FIRMWARE_VERSION: "0.2.50" + SCREEN_FIRMWARE_VERSION: "0.2.51" # A tap survives a finger that drifts up to this far (320 px over 58 mm: 1 cm); further is a swipe. TOUCH_MOVE_LIMIT_PX: "56" # Shortest contact that counts as a tap; a resistive panel bounces, a capacitive one does not. @@ -298,6 +298,7 @@ esphome: runtime_tiles::screen_awake = []() { return !id(display_dimmed); }; runtime_tiles::mini_icon_font = id(materialdesign_icons_mini)->get_lv_font(); runtime_tiles::control_font = id(sublabel_big)->get_lv_font(); + runtime_tiles::small_font = id(sublabel)->get_lv_font(); // Top bar (0.2.32+): values in the text font, icons in the small icon font; the clock // label lends its margin and drawing order and stays hidden in runtime mode. runtime_tiles::header_text_font = id(sublabel_big)->get_lv_font(); diff --git a/packages/guition.yaml b/packages/guition.yaml index 9cebde8..be85b42 100644 --- a/packages/guition.yaml +++ b/packages/guition.yaml @@ -3,7 +3,7 @@ # Source profile for packages/guition.yaml (tools/generate_packages.py); see docs/GUITION.md. # A screen gets its tiles from the ESP Screen Manager add-on while it runs. The CYD is its own profile. substitutions: - SCREEN_FIRMWARE_VERSION: "0.2.50" + SCREEN_FIRMWARE_VERSION: "0.2.51" # 0: no drift limit; LVGL decides, releasing inside the tile is a tap, leaving it is not # (like iOS). The CYD keeps a limit because its resistive panel jumps. TOUCH_MOVE_LIMIT_PX: "0" @@ -186,6 +186,7 @@ esphome: runtime_tiles::screen_awake = []() { return !id(display_dimmed); }; runtime_tiles::mini_icon_font = id(materialdesign_icons_mini)->get_lv_font(); runtime_tiles::control_font = id(sublabel_big)->get_lv_font(); + runtime_tiles::small_font = id(sublabel)->get_lv_font(); // Top bar (0.2.32+): values in the text font, icons in the small icon font; the clock // label lends its margin and drawing order and stays hidden in runtime mode. runtime_tiles::header_text_font = id(sublabel_big)->get_lv_font(); diff --git a/screen_manager/CHANGELOG.md b/screen_manager/CHANGELOG.md index a3dfcc3..4c6a16d 100644 --- a/screen_manager/CHANGELOG.md +++ b/screen_manager/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.2.59 (firmware 0.2.51) + +A history card you can read: axes, an hour, a day or a week, and the value under your finger. + +- **History with axes.** Tapping a sensor, a number, a binary sensor or a person, or holding a switch, opens its history the way Home Assistant shows it. Numbers get a line with round values along the side and clock times along the bottom, and their highest and lowest moment as rings with their values. On/off, home and away, zones and a status like a washing machine's get a timeline with the time spent in each state. The value now stays big at the top, with the highest and lowest moment and their times beside it, or how long the state lasted and how often it began: "Open · 22 min, 6 times". +- **An hour, a day or a week.** Three keys below the graph. Every range has the same number of points, just further apart: 24 averages on a line, 96 steps on a timeline. ESP Screens fetches the range when the card opens, from Home Assistant's statistics where the entity has them. +- **Your finger reads the graph.** Hold a finger on the graph and slide: the top of the card shows the value and the time of that moment. On a timeline it shows the state, when it began and ended, and how long it lasted, so a door that stood open for five minutes says 5 min. The graph itself stays as it is, and letting go shows the value now again. +- **Every unit.** Temperatures, percentages, watts, kilowatt-hours, lux and any other unit get an axis in round steps with the decimals the entity shows in Home Assistant. Times follow the screen's 12- or 24-hour clock. +- A switch's card keeps its toggle, top right, and a number's card its slider. +- **The weather card's back button is whole again on the Guition.** Since 0.2.43 the round back button sat half under the card with the current weather. +- Needs firmware 0.2.51: press **Update** on the screen. Screens with older firmware keep their old card. + ## 0.2.58 (firmware 0.2.50) A card for blinds, curtains and garage doors, and three fixes found right after updating to 0.2.57. diff --git a/screen_manager/app/core.py b/screen_manager/app/core.py index 4c8038f..0554a88 100644 --- a/screen_manager/app/core.py +++ b/screen_manager/app/core.py @@ -17,7 +17,7 @@ WEEKDAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] REPO = 'https://github.com/MaxGramser/homeassistant_espscreen' REFS = {'cyd': 'main', 'guition': 'main'} # Firmware shipped with this app release; screens below it get an update offer. -FIRMWARE_VERSION = '0.2.50' +FIRMWARE_VERSION = '0.2.51' # The Auto standby switch a screen offers Home Assistant automations. AUTO_STANDBY_MIN_FIRMWARE = '0.2.41' # The settings page the screen opens itself, and the screen.settings tile that opens it. diff --git a/screen_manager/app/history_card.py b/screen_manager/app/history_card.py new file mode 100644 index 0000000..be649c2 --- /dev/null +++ b/screen_manager/app/history_card.py @@ -0,0 +1,358 @@ +"""History on a screen's detail card (app 0.2.59 / firmware 0.2.51). + +A card asks for it when it opens or when its range changes: the screen fires `esphome.screen_history` with its +inbox, the entity and the hours (1, 24 or 168), and the manager answers with one `history` message. Numbers get a +line of 24 points, averaged over equal parts of the range, with their highest and lowest moment and an axis in +round steps; states (on/off, home/away, a status sensor) get a timeline of at most 96 slots with the time spent +in each state, as Home Assistant's own history does. The screen draws it and formats the times itself, so its +12- or 24-hour clock applies. +""" +import math +from datetime import datetime, timedelta, timezone + +import header_bar + +RANGES = (1, 24, 168) +POINTS = 24 +SLOTS = 96 +STATES_SHOWN = 6 +# Entities whose card shows history, by what they show. +LINE_DOMAINS = frozenset(('number', 'input_number')) +TIMELINE_DOMAINS = frozenset(('binary_sensor', 'switch', 'input_boolean', 'person')) +# Sensors whose state is not a measurement. +TEXT_SENSOR_CLASSES = frozenset(('timestamp', 'date', 'enum')) +# The state that counts as "on" for the count of times it began. +ACTIVE = {'binary_sensor': 'on', 'switch': 'on', 'input_boolean': 'on', 'person': 'home'} +OFF_GREY, NO_DATA = 'CFCFCF', 'E6E6E6' +PALETTE = ('2196F3', '009688', 'FF6F22', '8E24AA', '43A047', 'E53935') +# How long an answer stays good: a card reopened within this time gets it without asking Home Assistant again. +CACHE_SECONDS = {1: 30, 24: 120, 168: 600} + + +def kind(entity, state): + """'line', 'timeline', or None for an entity whose card has no history.""" + domain = entity.split('.')[0] + if domain in LINE_DOMAINS: + return 'line' + if domain in TIMELINE_DOMAINS: + return 'timeline' + if domain != 'sensor': + return None + attrs = (state or {}).get('attributes') or {} + if attrs.get('device_class') in TEXT_SENSOR_CLASSES: + return 'timeline' + if attrs.get('unit_of_measurement') or attrs.get('state_class'): + return 'line' + return 'line' if header_bar.numeric((state or {}).get('state')) is not None else 'timeline' + + +def window(hours, now=None): + """(start, end) unix times of the range that ends now, on whole seconds.""" + end = int((now or datetime.now(timezone.utc)).timestamp()) + return end - hours * 3600, end + + +def bucket_means(changes, start, end, points=POINTS): + """Time-weighted mean per equal part of [start, end) of a value that holds from each change to the next. + + `changes` are (unix time, value or None); None marks a time without a value (unavailable, a gap between + statistics). A part without any known value is None.""" + changes = sorted(changes, key=lambda change: change[0]) + span = (end - start) / points + out, index, current = [], 0, None + while index < len(changes) and changes[index][0] <= start: + current = changes[index][1] + index += 1 + for part in range(points): + begin, finish = start + part * span, start + (part + 1) * span + moment, area, known = begin, 0.0, 0.0 + while index < len(changes) and changes[index][0] < finish: + at, value = changes[index] + if current is not None: + area += current * (at - moment) + known += at - moment + moment, current = max(at, begin), value + index += 1 + if current is not None: + area += current * (finish - moment) + known += finish - moment + out.append(area / known if known > 0 else None) + return out + + +def extremes(changes, start, end): + """((highest, when), (lowest, when)) of the values in the range, a value from before it counting at `start`.""" + changes = sorted(changes, key=lambda change: change[0]) + seen, current = [], None + for at, value in changes: + if at <= start: + current = value + continue + if at >= end: + break + if current is not None and not seen: + seen.append((current, start)) + if value is not None: + seen.append((value, at)) + current = value + if not seen and current is not None: + seen.append((current, start)) + if not seen: + return None, None + return max(seen, key=lambda item: item[0]), min(seen, key=lambda item: item[0]) + + +def nice_step(span, target=3): + """A round step (1, 2, 2.5 or 5 times a power of ten) that divides `span` into about `target` parts.""" + raw = span / target + magnitude = 10 ** math.floor(math.log10(raw)) + for multiple in (1, 2, 2.5, 5, 10): + if multiple * magnitude >= raw * 0.999: + return multiple * magnitude + return 10 * magnitude + + +def axis(low, high): + """(domain, ticks): the drawn range and the round values labelled on it. A flat line gets room around it.""" + if high - low < 1e-9: + pad = abs(high) * 0.05 or 1.0 + low, high = low - pad, high + pad + step = nice_step(high - low) + ticks = [] + value = math.ceil(low / step - 1e-9) * step + while value <= high + step * 1e-9: + ticks.append(round(value, 10)) + value += step + if len(ticks) < 2: + ticks = [math.floor(low / step) * step, math.ceil(high / step) * step] + low, high = min(low, ticks[0]), max(high, ticks[-1]) + margin = (high - low) * 0.06 + return (low - margin, high + margin), ticks + + +def step_decimals(step): + """The decimals a step needs to be written exactly: 0.5 needs one, 0.25 two, 2.5 one, 20 none.""" + for places in range(4): + if abs(round(step, places) - step) <= abs(step) * 1e-6: + return places + return 3 + + +def tick_text(value, step, unit): + """An axis label: as few decimals as the step needs; degrees and percent stay on the number.""" + text = header_bar.number_text(value, step_decimals(step)) + if unit in ('°C', '°F', '°'): + return text + '°' + return text + '%' if unit == '%' else text + + +def decimals(entry, values): + """Decimals for a value read from the line: the entity's display precision, else one for averages.""" + precision = header_bar.precision_of(entry) + if precision is not None: + return precision + return 0 if all(value is None or float(value).is_integer() for value in values) else 1 + + +def time_ticks(start, end, hours, tz): + """Unix times of round moments in the range: every quarter hour, every six hours, or every midnight.""" + tz = tz or timezone.utc + step = {1: timedelta(minutes=15), 24: timedelta(hours=6), 168: timedelta(days=1)}[hours] + moment = datetime.fromtimestamp(start, tz) + if hours == 1: + moment = moment.replace(minute=moment.minute - moment.minute % 15, second=0, microsecond=0) + elif hours == 24: + moment = moment.replace(hour=moment.hour - moment.hour % 6, minute=0, second=0, microsecond=0) + else: + moment = moment.replace(hour=0, minute=0, second=0, microsecond=0) + ticks = [] + # A tick right at either end would sit on the start of the line or on "Now"; the screen drops a label that + # still collides. + margin = (end - start) * 0.03 + while moment.timestamp() < end: + at = moment.timestamp() + if start + margin <= at <= end - margin: + ticks.append(int(at)) + # Adding in local time keeps midnight on midnight across a daylight saving change. + moment = (moment.replace(tzinfo=None) + step).replace(tzinfo=tz) + return ticks + + +def utc_offset(end, tz): + return int(((tz or timezone.utc).utcoffset(datetime.fromtimestamp(end, tz or timezone.utc)) or timedelta()).total_seconds()) + + +def line(entity, hours, changes, start, end, tz, entry=None, unit='', extreme_changes=None): + """The `history` message for a number: 24 averages, the highest and lowest moment, the axis and the times. + + `changes` feed the averages; `extreme_changes` (statistics' own highs and lows, or the same changes) the + highest and lowest moment.""" + values = bucket_means(changes, start, end) + high, low = extremes(extreme_changes if extreme_changes is not None else changes, start, end) + known = [value for value in values if value is not None] + [item[0] for item in (high, low) if item] + message = {'v': 1, 'op': 'history', 'entity': entity, 'hours': hours, 'kind': 'line', 'start': start, 'end': end, + 'off': utc_offset(end, tz), 'xt': time_ticks(start, end, hours, tz), 'unit': header_bar.clean_text(unit or '')[:12]} + if not known: + message['values'] = [None] * POINTS + return message + (bottom, top), ticks = axis(min(known), max(known)) + step = ticks[1] - ticks[0] if len(ticks) > 1 else 1 + places = decimals(entry, known) + message.update({ + 'values': [None if value is None else round(value, max(places, 2)) for value in values], + 'dom': [round(bottom, 6), round(top, 6)], + 'yt': [[round(tick, 6), tick_text(tick, step, unit)] for tick in ticks], + 'dec': places, + }) + if high: + message['hi'] = [round(high[0], max(places, 2)), int(high[1])] + if low: + message['lo'] = [round(low[0], max(places, 2)), int(low[1])] + return message + + +def state_label(domain, state, attrs): + """Home Assistant's words for a state, as the screen shows them elsewhere.""" + if state in (None, 'unavailable'): + return 'Unavailable' + if state == 'unknown': + return 'Unknown' + if domain == 'binary_sensor': + pair = header_bar.BINARY_STATES.get((attrs or {}).get('device_class'), ('On', 'Off')) + return pair[0] if state == 'on' else pair[1] if state == 'off' else state + if domain == 'person' and state not in header_bar.STATES: + return state.replace('_', ' ')[:1].upper() + state.replace('_', ' ')[1:] + return header_bar.STATES.get(state) or (state[:1].upper() + state[1:]).replace('_', ' ') + + +def state_color(domain, state, others): + """A state's colour: Home Assistant's amber for on and green for home, grey for off and away; every other state + (a zone, a status) the next colour of the palette, `others` being how many such states came before it.""" + if state in (None, 'unavailable', 'unknown'): + return NO_DATA + if domain in ('binary_sensor', 'switch', 'input_boolean'): + return header_bar.AMBER if state == 'on' else OFF_GREY + if domain == 'person' and state in ('home', 'not_home'): + return header_bar.GREEN if state == 'home' else OFF_GREY + return PALETTE[others % len(PALETTE)] + + +def timeline(entity, hours, changes, start, end, tz, attrs=None, slots=SLOTS): + """The `history` message for states: the timeline as runs of slots, each state's time, and how often the + active state began (a door opened, a person came home).""" + domain = entity.split('.')[0] + changes = sorted(changes, key=lambda change: change[0]) + # The state in force over each stretch of the range. + pieces, current, index = [], None, 0 + while index < len(changes) and changes[index][0] <= start: + current = changes[index][1] + index += 1 + moment, began = start, 0 + active = ACTIVE.get(domain) + for at, state in changes[index:]: + if at >= end: + break + if state == current: + continue + pieces.append((moment, at, current)) + if active and state == active: + began += 1 + moment, current = at, state + pieces.append((moment, end, current)) + totals, order = {}, [] + for begin, finish, state in pieces: + if state is None: + continue + if state not in totals: + order.append(state) + totals[state] = totals.get(state, 0) + finish - begin + # The most time first; a state beyond the sixth joins "Other". + ranked = sorted(order, key=lambda state: -totals[state]) + shown = ranked[:STATES_SHOWN] if len(ranked) <= STATES_SHOWN else ranked[:STATES_SHOWN - 1] + index_of = {state: i for i, state in enumerate(shown)} + others = [state for state in order if state_color(domain, state, 0) == PALETTE[0]] + legend = [[header_bar.clean_text(state_label(domain, state, attrs))[:24], + state_color(domain, state, others.index(state) if state in others else 0), int(totals[state])] for state in shown] + rest = [state for state in ranked if state not in index_of] + if rest: + index_of.update({state: len(shown) for state in rest}) + legend.append(['Other', '9E9E9E', int(sum(totals[state] for state in rest))]) + # Each slot shows the state that covers most of it, except that the active state always shows: a door that + # stood open for five minutes stays visible on a day's timeline, as it does in Home Assistant. + span = (end - start) / slots + runs, piece = [], 0 + for slot in range(slots): + begin, finish = start + slot * span, start + (slot + 1) * span + cover = {} + while piece < len(pieces) and pieces[piece][1] <= begin: + piece += 1 + look = piece + while look < len(pieces) and pieces[look][0] < finish: + p_begin, p_end, state = pieces[look] + if state is not None: + cover[state] = cover.get(state, 0) + min(p_end, finish) - max(p_begin, begin) + look += 1 + winner = active if active in cover else max(cover, key=cover.get) if cover else None + value = index_of[winner] if winner is not None else -1 + if not runs or runs[-1][1] != value: + runs.append([slot, value]) + # Which legend entry is the active state (the card sums up its time and how often it began), or -1. + shown_active = index_of.get(active, -1) if active in shown else -1 + return {'v': 1, 'op': 'history', 'entity': entity, 'hours': hours, 'kind': 'timeline', 'start': start, 'end': end, + 'off': utc_offset(end, tz), 'xt': time_ticks(start, end, hours, tz), 'slots': slots, 'states': legend, + 'seg': run_times(runs, pieces, index_of, start, span, slots), 'words': words(domain, order + [current], attrs), + 'began': began, 'active': shown_active} + + +def run_times(runs, pieces, index_of, start, span, slots): + """[slot, state, begin, end, seconds] per run: a finger on a run reads the real times of its state, from its first + moment to its last (seconds after `start`), and the time spent in it, not the width of the slots it covers.""" + out, first = [], 0 + for i, (slot, value) in enumerate(runs): + low, high = start + slot * span, start + (runs[i + 1][0] if i + 1 < len(runs) else slots) * span + while first < len(pieces) and pieces[first][1] <= low: + first += 1 + found, look = [], first + while look < len(pieces) and pieces[look][0] < high: + begin, finish, state = pieces[look] + if value >= 0 and state is not None and index_of.get(state) == value: + found.append((begin, finish)) + look += 1 + if found: + begin, finish, seconds = min(b for b, _ in found), max(f for _, f in found), sum(f - b for b, f in found) + else: + begin, finish, seconds = low, high, high - low + out.append([slot, value, round(begin - start), round(finish - start), round(seconds)]) + return out + + +def words(domain, states, attrs): + """[raw state, words] for the states of the range and a binary sensor's on and off: the card's heading shows the + state now in these words, also after it changed while the card is open.""" + found = {} + for state in states + (['on', 'off'] if domain == 'binary_sensor' else []): + if isinstance(state, str) and len(state) <= 32 and state not in found and len(found) < 10: + found[state] = header_bar.clean_text(state_label(domain, state, attrs))[:24] + return [[state, text] for state, text in found.items()] + + +def statistic_changes(rows, period_seconds): + """Statistics rows as changes for `bucket_means` (each mean holds for its period, a gap has no value) and as + changes for `extremes` (each period's own maximum and minimum).""" + means, extreme = [], [] + rows = sorted((row for row in rows if isinstance(row.get('start'), (int, float))), key=lambda row: row['start']) + for i, row in enumerate(rows): + start = row['start'] / 1000 if row['start'] > 1e11 else row['start'] + mean = header_bar.numeric(row.get('mean') if row.get('mean') is not None else row.get('state')) + means.append((start, mean)) + following = rows[i + 1]['start'] if i + 1 < len(rows) else None + following = following / 1000 if following and following > 1e11 else following + if following is None or following - start > period_seconds + 1: + means.append((start + period_seconds, None)) + for key in ('max', 'min'): + value = header_bar.numeric(row.get(key)) + if value is not None: + extreme.append((start, value)) + if mean is not None and header_bar.numeric(row.get('max')) is None: + extreme.append((start, mean)) + return means, extreme diff --git a/screen_manager/app/server.py b/screen_manager/app/server.py index 5ee4516..9ec8f88 100644 --- a/screen_manager/app/server.py +++ b/screen_manager/app/server.py @@ -15,10 +15,11 @@ from firmware import Firmware import tile_icons from updates import Updater -from aiohttp import ClientSession, ClientTimeout, WSMsgType, web +from aiohttp import ClientError, ClientSession, ClientTimeout, WSMsgType, web from core import BROADCAST_EVENTS, BUILTIN, SETTINGS_BESIDE_BLOCK, TILE_EVENTS, TILE_RESULT_EVENT, apply_tile_event, layout_snapshot, match_screen, HEADER_MIN_FIRMWARE, NAME_TILE_SETTINGS, TILE_BACKGROUNDS, TRANSPORT_MIN_FIRMWARE, alert_data, alert_reference, alert_service, alert_targets, controls_catalogue, device_prefixes, discover, discover_screens, encode, extras, forecast_kinds, header_items, inbox_prefix, message_action, min_firmware, pack_slots, packets, revision, screen_items, state_message, validate_header, validate_layout, validate_settings from core import SETTING_ENTITIES, SETTING_RULES, setting_action, setting_entities, setting_from_state import header_bar +import history_card from zoneinfo import ZoneInfo LOG = logging.getLogger('screen_manager') @@ -104,6 +105,8 @@ class HomeAssistant: # Assistant's own list; refreshed when a device registers its actions again. self.responses = set() self.services_changed = asyncio.Event() + # History a detail card asks for when it opens (firmware 0.2.51+): {inbox, entity, hours}, for Manager.card_history_loop. + self.history_requests = asyncio.Queue() async def request(self, kind, **data): if self.ws is None or self.ws.closed: @@ -137,6 +140,8 @@ class HomeAssistant: if event.get('event_type') == 'esphome.screen_setting': self.setting_events.append(body) self.changed.set() + elif event.get('event_type') == 'esphome.screen_history': + self.history_requests.put_nowait(body) elif event.get('event_type') == 'state_changed': eid = body.get('entity_id') if body.get('new_state'): @@ -199,6 +204,7 @@ class HomeAssistant: reader = asyncio.create_task(self.read()) await self.request('subscribe_events', event_type='state_changed') await self.request('subscribe_events', event_type='esphome.screen_setting') + await self.request('subscribe_events', event_type='esphome.screen_history') for event_type in (*REGISTRY_EVENTS, *BROADCAST_EVENTS, *TILE_EVENTS, *SERVICE_EVENTS): await self.request('subscribe_events', event_type=event_type) self.states = {s['entity_id']: s for s in await self.request('get_states')} @@ -324,7 +330,8 @@ class HomeAssistant: found[entity] = samples(events, begin, span) return found - async def history(self, entity, hours): + async def state_changes(self, entity, hours): + """(unix time, state) of every change in the last `hours`, beginning with the state at the start (REST history).""" start = (datetime.now(timezone.utc)-timedelta(hours=hours)).isoformat() async with self.session.get(self.base+'/history/period/'+start, params={'filter_entity_id':entity,'minimal_response':'','no_attributes':''}, @@ -335,14 +342,26 @@ class HomeAssistant: raw.extend(chunk) if len(raw)>2*1024*1024: raise ValueError('History too large.') rows=json.loads(raw) - events=[] - begin=datetime.fromisoformat(start).timestamp(); span=hours*3600 + changes=[] for row in rows[0] if rows else []: try: timestamp=datetime.fromisoformat(row.get('last_changed',row.get('last_updated','')).replace('Z','+00:00')).timestamp() - except (ValueError,TypeError): continue - events.append((timestamp,rounded(row.get('state')))) - return samples(events, begin, span) + except (ValueError,TypeError,AttributeError): continue + changes.append((timestamp,row.get('state'))) + return changes + + async def history(self, entity, hours): + begin=(datetime.now(timezone.utc)-timedelta(hours=hours)).timestamp() + return samples([(timestamp,rounded(state)) for timestamp,state in await self.state_changes(entity,hours)], begin, hours*3600) + + async def statistic_rows(self, entity, hours): + """The recorder's hourly statistics rows of one entity over the last `hours` (mean, min, max, state), from the + hour the range begins in; empty for an entity without statistics.""" + start = datetime.now(timezone.utc) - timedelta(hours=hours + 1) + result = await self.request('recorder/statistics_during_period', start_time=start.isoformat(), statistic_ids=[entity], + period='hour', types=['mean', 'min', 'max', 'state']) + rows = (result or {}).get(entity) if isinstance(result, dict) else None + return rows if isinstance(rows, list) else [] class Manager: def __init__(self, ha, path): @@ -374,6 +393,8 @@ class Manager: # Answers (firmware 0.2.49+): when to send everything again after one said the screen lacks something, # how often that failed in a row, and actions Home Assistant refused to answer for. self.retry_at, self.retries, self.no_answers = {}, {}, set() + # History for detail cards (firmware 0.2.51+): (entity, hours) -> (monotonic, message), and the fetches under way. + self.card_histories, self.card_history_fetches = {}, {} if self.path.exists(): raw = json.loads(self.path.read_text()) # Versioned persistent data. Never silently overwrite an unknown schema. @@ -652,6 +673,78 @@ class Manager: self.retries[inbox] = failures + 1 self.retry_at[inbox] = due + # ----- History on a detail card (firmware 0.2.51+) ----- + async def card_history_loop(self): + """Answer the history a screen asks for when a card opens, a few at a time.""" + limit = asyncio.Semaphore(3) + + async def answer(request): + async with limit: + try: + await self.answer_history(request) + except (ClientError, ConnectionError, TimeoutError, OSError, ValueError) as error: + # Nothing is sent or kept: the card says it has no history and asks again. + LOG.info('No history for %s (%s)', request.get('entity'), type(error).__name__) + except Exception as error: + LOG.warning('History for %s was not sent (%s)', request.get('entity') if isinstance(request, dict) else '?', type(error).__name__) + while True: + request = await self.ha.history_requests.get() + asyncio.ensure_future(answer(request)) + + async def answer_history(self, request): + """One screen's request: an entity on its own layout, a range the card offers, a screen that takes whole messages.""" + if not isinstance(request, dict): + return + inbox = self.aliases.get(request.get('inbox'), request.get('inbox')) + entity = request.get('entity') + try: + hours = int(request.get('hours')) + except (TypeError, ValueError): + return + layout, screen = self.layouts.get(inbox), self.screen(inbox) if isinstance(inbox, str) else None + if hours not in history_card.RANGES or not layout or not screen or not screen.get('online'): + return + if entity not in {tile['entity'] for tile in layout['tiles']}: + return + what = history_card.kind(entity, self.ha.states.get(entity)) + action = self.transport(inbox, screen) + if what is None or not action: + return + await self.ha.send(inbox, await self.card_history(entity, hours, what), action) + + async def card_history(self, entity, hours, what): + """The history message, from a short cache; screens asking at the same time share one fetch.""" + key = (entity, hours) + cached = self.card_histories.get(key) + if cached and time.monotonic() - cached[0] < history_card.CACHE_SECONDS[hours]: + return cached[1] + fetch = self.card_history_fetches.get(key) + if fetch is None: + fetch = asyncio.ensure_future(self.build_card_history(entity, hours, what)) + self.card_history_fetches[key] = fetch + fetch.add_done_callback(lambda _: self.card_history_fetches.pop(key, None)) + message = await asyncio.shield(fetch) + self.card_histories[key] = (time.monotonic(), message) + for old in [k for k, (moment, _) in self.card_histories.items() if time.monotonic() - moment > 3600]: + del self.card_histories[old] + return message + + async def build_card_history(self, entity, hours, what): + """Numbers from the recorder's hourly statistics for a day or a week (the exact changes for an hour, or for an + entity without statistics); states from their changes. A fetch that fails raises, so nothing is kept.""" + start, end = history_card.window(hours) + tz = getattr(self.ha, 'time_zone', None) + attrs = (self.ha.states.get(entity) or {}).get('attributes') or {} + if what == 'timeline': + return history_card.timeline(entity, hours, await self.ha.state_changes(entity, hours), start, end, tz, attrs) + entry, unit = self.registry_index().get(entity), attrs.get('unit_of_measurement') or '' + rows = await self.ha.statistic_rows(entity, hours) if hours > 1 else [] + if rows: + means, extreme = history_card.statistic_changes(rows, 3600) + return history_card.line(entity, hours, means, start, end, tz, entry, unit, extreme) + changes = [(moment, header_bar.numeric(value)) for moment, value in await self.ha.state_changes(entity, hours)] + return history_card.line(entity, hours, changes, start, end, tz, entry, unit) + def registry_index(self): """Entity registry by id (display precision, entity category); rebuilt only when HA delivers a new registry.""" registry = getattr(self.ha, 'registry', []) @@ -1312,7 +1405,7 @@ async def main(): await web.TCPSite(runner, '127.0.0.1' if development else '0.0.0.0', 8099).start() try: await asyncio.gather(ha.run(), manager.run(), manager.history_loop(), manager.updates.run(), - manager.alert_loop(), manager.tile_loop()) + manager.alert_loop(), manager.tile_loop(), manager.card_history_loop()) finally: await runner.cleanup() diff --git a/screen_manager/config.yaml b/screen_manager/config.yaml index 62fcc70..644edd9 100644 --- a/screen_manager/config.yaml +++ b/screen_manager/config.yaml @@ -1,5 +1,5 @@ name: ESP Screen Manager -version: "0.2.58" +version: "0.2.59" slug: esp_screen_manager description: Choose tiles for your CYD and Guition touchscreen, without reflashing. url: https://github.com/MaxGramser/homeassistant_espscreen diff --git a/tests/test_history_card.py b/tests/test_history_card.py new file mode 100644 index 0000000..b6772e0 --- /dev/null +++ b/tests/test_history_card.py @@ -0,0 +1,405 @@ +"""History on a detail card (app 0.2.59 / firmware 0.2.51): what the manager computes for the screen to draw. + +Numbers: 24 time-weighted averages, the highest and lowest moment, an axis in round steps for every kind of unit. +States: a timeline in runs of slots with Home Assistant's words and the time in each state. +""" +import asyncio +import importlib.util +import json +import re +import sys +import tempfile +import unittest +from datetime import datetime, timezone +from pathlib import Path +from zoneinfo import ZoneInfo + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / 'screen_manager/app')) +sys.path.insert(0, str(ROOT / 'tests')) +import history_card as hc # noqa: E402 + +HAS_AIOHTTP = importlib.util.find_spec('aiohttp') is not None +RUNTIME = (ROOT / 'components/smart_display/runtime_tiles.h').read_text() + +AMSTERDAM = ZoneInfo('Europe/Amsterdam') + + +def at(text, tz=AMSTERDAM): + return int(datetime.fromisoformat(text).replace(tzinfo=tz).timestamp()) + + +class Kinds(unittest.TestCase): + def test_numbers_draw_a_line_and_states_a_timeline(self): + self.assertEqual(hc.kind('sensor.t', {'state': '21.4', 'attributes': {'unit_of_measurement': '°C'}}), 'line') + self.assertEqual(hc.kind('sensor.count', {'state': '3', 'attributes': {}}), 'line') + self.assertEqual(hc.kind('sensor.power', {'state': 'unavailable', 'attributes': {'state_class': 'measurement'}}), 'line') + self.assertEqual(hc.kind('sensor.washer', {'state': 'running', 'attributes': {}}), 'timeline') + self.assertEqual(hc.kind('sensor.mode', {'state': '2', 'attributes': {'device_class': 'enum'}}), 'timeline') + self.assertEqual(hc.kind('sensor.last_seen', {'state': '2026-09-16T10:00:00+00:00', 'attributes': {'device_class': 'timestamp'}}), 'timeline') + for entity in ('number.target', 'input_number.volume'): + self.assertEqual(hc.kind(entity, {'state': '5'}), 'line') + for entity in ('binary_sensor.door', 'switch.kettle', 'input_boolean.guests', 'person.sam'): + self.assertEqual(hc.kind(entity, {'state': 'on'}), 'timeline') + for entity in ('light.lamp', 'climate.living', 'cover.blind', 'vacuum.robot'): + self.assertIsNone(hc.kind(entity, {'state': 'on'})) + + +class Averages(unittest.TestCase): + def test_each_part_is_the_time_weighted_mean(self): + start, end = 0, 24 * 3600 + self.assertEqual(hc.bucket_means([(-100, 20.0)], start, end), [20.0] * 24) + # 20 for the first half of the fourth hour, 22 for the rest of the day. + means = hc.bucket_means([(-100, 20.0), (3 * 3600 + 1800, 22.0)], start, end) + self.assertEqual(means[:3], [20.0] * 3) + self.assertAlmostEqual(means[3], 21.0) + self.assertEqual(means[4:], [22.0] * 20) + + def test_unknown_time_does_not_count_and_a_part_without_values_is_none(self): + start, end = 0, 24 * 3600 + means = hc.bucket_means([(3600, 10.0), (3600 + 900, None), (3600 + 2700, 30.0)], start, end) + self.assertIsNone(means[0], 'nothing known before the first value') + self.assertAlmostEqual(means[1], (10 * 900 + 30 * 900) / 1800) + self.assertEqual(means[2], 30.0) + + def test_statistics_rows_hold_for_their_period_and_gaps_stay_empty(self): + base = at('2026-09-16T00:00:00') + # Home Assistant sends milliseconds; the hour from 02:00 has no statistics. + rows = [{'start': base * 1000, 'mean': 10.0, 'min': 9.0, 'max': 12.0}, {'start': (base + 3600) * 1000, 'mean': 20.0, 'min': 18.0, 'max': 25.0}, + {'start': (base + 3 * 3600) * 1000, 'mean': 30.0, 'min': 29.0, 'max': 31.0}] + means, extreme = hc.statistic_changes(rows, 3600) + values = hc.bucket_means(means, base, base + 24 * 3600) + self.assertEqual(values[:5], [10.0, 20.0, None, 30.0, None], 'the missing hour and the time after the last row stay empty') + high, low = hc.extremes(extreme, base, base + 24 * 3600) + self.assertEqual((high, low), ((31.0, base + 10800), (9.0, base))) + + def test_the_highest_and_lowest_moment(self): + high, low = hc.extremes([(-50, 19.5), (100, 21.2), (200, 18.9), (300, None), (400, 20.0)], 0, 1000) + self.assertEqual((high, low), ((21.2, 100), (18.9, 200))) + self.assertEqual(hc.extremes([(-50, 19.5)], 0, 1000), ((19.5, 0), (19.5, 0)), 'a value from before the range counts at its start') + self.assertEqual(hc.extremes([], 0, 1000), (None, None)) + + +class Axes(unittest.TestCase): + def labels(self, low, high, unit): + (bottom, top), ticks = hc.axis(low, high) + self.assertLessEqual(bottom, low) + self.assertGreaterEqual(top, high) + self.assertTrue(all(bottom <= tick <= top for tick in ticks)) + self.assertGreaterEqual(len(ticks), 2) + self.assertLessEqual(len(ticks), 5) + return [hc.tick_text(tick, ticks[1] - ticks[0], unit) for tick in ticks] + + def test_round_steps_for_every_kind_of_unit(self): + self.assertEqual(self.labels(18.97, 21.21, '°C'), ['19°', '20°', '21°']) + self.assertEqual(self.labels(64.2, 71.9, '°F'), ['65°', '70°']) + self.assertEqual(self.labels(20.1, 21.4, '°C'), ['20.5°', '21.0°'], 'one number of decimals on the whole axis') + self.assertEqual(self.labels(35, 62, '%'), ['40%', '50%', '60%']) + self.assertEqual(self.labels(120, 2450, 'W'), ['1,000', '2,000']) + self.assertEqual(self.labels(1520.3, 1534.9, 'kWh'), ['1,525', '1,530']) + self.assertEqual(self.labels(-3.2, 4.1, '°C'), ['-2.5°', '0.0°', '2.5°']) + self.assertEqual(self.labels(0, 65000, 'lx'), ['0', '25,000', '50,000']) + self.assertEqual(self.labels(0.0012, 0.0041, 'm³/h'), ['0.002', '0.003', '0.004']) + self.assertEqual(self.labels(412, 1850, 'ppm'), ['500', '1,000', '1,500']) + self.assertEqual(self.labels(229.1, 233.4, 'V'), ['230', '232']) + + def test_a_flat_line_gets_room_and_labels(self): + self.assertEqual(len(self.labels(21.0, 21.0, '°C')), 3) + self.assertEqual(self.labels(0, 0, ''), ['-1', '0', '1']) + + def test_decimals_follow_the_display_precision(self): + self.assertEqual(hc.decimals({'options': {'sensor': {'display_precision': 2}}}, [1.0]), 2) + self.assertEqual(hc.decimals({'options': {'sensor': {'suggested_display_precision': 0}}}, [1.5]), 0) + self.assertEqual(hc.decimals(None, [3.0, 4.0]), 0) + self.assertEqual(hc.decimals(None, [3.0, 4.25]), 1) + + +class Times(unittest.TestCase): + def test_round_moments_in_the_screen_s_time_zone(self): + end = at('2026-09-16T16:40:00') + ticks = hc.time_ticks(end - 24 * 3600, end, 24, AMSTERDAM) + self.assertEqual([datetime.fromtimestamp(t, AMSTERDAM).strftime('%H:%M') for t in ticks], ['18:00', '00:00', '06:00', '12:00']) + ticks = hc.time_ticks(end - 3600, end, 1, AMSTERDAM) + self.assertEqual([datetime.fromtimestamp(t, AMSTERDAM).strftime('%H:%M') for t in ticks], ['15:45', '16:00', '16:15', '16:30']) + ticks = hc.time_ticks(end - 168 * 3600, end, 168, AMSTERDAM) + self.assertEqual([datetime.fromtimestamp(t, AMSTERDAM).strftime('%a %H:%M') for t in ticks], + ['Thu 00:00', 'Fri 00:00', 'Sat 00:00', 'Sun 00:00', 'Mon 00:00', 'Tue 00:00', 'Wed 00:00']) + self.assertEqual(hc.utc_offset(end, AMSTERDAM), 7200) + + def test_midnight_stays_midnight_across_daylight_saving(self): + end = at('2026-10-28T09:00:00') + ticks = hc.time_ticks(end - 168 * 3600, end, 168, AMSTERDAM) + self.assertTrue(all(datetime.fromtimestamp(t, AMSTERDAM).strftime('%H:%M') == '00:00' for t in ticks)) + self.assertEqual(hc.utc_offset(end, AMSTERDAM), 3600) + + +class Messages(unittest.TestCase): + def test_a_temperature_line(self): + end = at('2026-09-16T16:40:00') + start = end - 24 * 3600 + changes = [(start - 600, 20.05)] + [(start + i * 3600 + 1200, 19.0 + (i % 12) * 0.2) for i in range(24)] + message = hc.line('sensor.living_room_temperature', 24, changes, start, end, AMSTERDAM, None, '°C') + self.assertEqual((message['op'], message['kind'], message['hours'], message['off'], message['unit']), ('history', 'line', 24, 7200, '°C')) + self.assertEqual(len(message['values']), 24) + self.assertEqual(message['yt'][0][1][-1], '°') + self.assertEqual(message['hi'][0], 21.2) + self.assertEqual(message['lo'][0], 19.0) + self.assertLessEqual(message['dom'][0], message['lo'][0]) + self.assertEqual(len(message['xt']), 4) + self.assertLess(len(json.dumps(message, separators=(',', ':'))), 900) + + def test_a_sensor_two_hours_old_fills_only_its_own_hours(self): + # Added two hours ago: Home Assistant's history starts at its first state, nothing before it. + end = at('2026-09-16T16:40:00') + start = end - 24 * 3600 + changes = [(end - 7200, 480.0), (end - 3600, 510.0), (end - 1800, 530.0)] + message = hc.line('sensor.new_plug_power', 24, changes, start, end, AMSTERDAM, None, 'W') + self.assertEqual(message['values'][:22], [None] * 22) + self.assertEqual(message['values'][22:], [480.0, 520.0]) + self.assertEqual((message['hi'], message['lo']), ([530.0, end - 1800], [480.0, end - 7200])) + self.assertEqual([text for _, text in message['yt']], ['480', '500', '520']) + # Statistics with one whole hour compiled so far, and the running hour not yet: that hour and no other. + rows = [{'start': (end - 5400) // 3600 * 3600 * 1000, 'mean': 495.0, 'min': 480.0, 'max': 510.0}] + means, extremes = hc.statistic_changes(rows, 3600) + message = hc.line('sensor.new_plug_power', 24, means, start, end, AMSTERDAM, None, 'W', extremes) + known = [i for i, value in enumerate(message['values']) if value is not None] + self.assertEqual(known, [22, 23]) + # A day of a sensor added a minute ago with one state: one value, a flat axis around it. + message = hc.line('sensor.new_plug_power', 24, [(end - 60, 12.0)], start, end, AMSTERDAM, None, 'W') + self.assertEqual(sum(value is not None for value in message['values']), 1) + self.assertLess(message['dom'][0], 12.0) + self.assertGreater(message['dom'][1], 12.0) + + def test_a_binary_sensor_two_hours_old_shows_no_data_before_it(self): + end = at('2026-09-16T16:40:00') + start = end - 24 * 3600 + changes = [(end - 7200, 'off'), (end - 3000, 'on'), (end - 2700, 'off')] + message = hc.timeline('binary_sensor.new_door', 24, changes, start, end, AMSTERDAM, {'device_class': 'door'}) + self.assertEqual(message['states'], [['Closed', hc.OFF_GREY, 6900], ['Open', 'FFB300', 300]]) + first = message['seg'][0] + self.assertEqual(first, [0, -1, 0, 79200, 79200], 'no data until the sensor existed') + self.assertEqual((message['began'], message['active']), (1, 1)) + + def test_no_values_sends_an_empty_line(self): + message = hc.line('sensor.t', 1, [], 0, 3600, timezone.utc) + self.assertEqual(message['values'], [None] * 24) + self.assertNotIn('yt', message) + + def test_a_door_timeline_with_home_assistant_s_words(self): + end = at('2026-09-16T16:40:00') + start = end - 24 * 3600 + changes = [(start - 3600, 'off'), (start + 3600, 'on'), (start + 3900, 'off'), (start + 7200, 'unavailable'), (start + 7500, 'off'), + (start + 36000, 'on'), (start + 36600, 'off')] + message = hc.timeline('binary_sensor.front_door', 24, changes, start, end, AMSTERDAM, {'device_class': 'door'}) + self.assertEqual([label for label, _, _ in message['states']], ['Closed', 'Open', 'Unavailable']) + self.assertEqual([color for _, color, _ in message['states']], [hc.OFF_GREY, 'FFB300', hc.NO_DATA]) + self.assertEqual({label: seconds for label, _, seconds in message['states']}, {'Closed': 85200, 'Open': 900, 'Unavailable': 300}) + self.assertEqual(message['began'], 2) + # The heading follows the door while the card is open: both states in Home Assistant's words. + self.assertEqual(dict(message['words']), {'off': 'Closed', 'on': 'Open', 'unavailable': 'Unavailable'}) + self.assertEqual(message['seg'][0][:2], [0, 0]) + openings = [run for run in message['seg'] if run[1] == 1] + self.assertEqual(len(openings), 2, 'both openings show as their own run') + # A finger reads the real opening, not the 15 minutes of its slot: 01:00 to 01:05 after the start, 5 minutes. + self.assertEqual(openings[0][2:], [3600, 3900, 300]) + self.assertEqual(openings[1][2:], [36000, 36600, 600]) + + def test_people_and_their_zones(self): + end = 7 * 24 * 3600 + changes = [(-10, 'not_home'), (3600, 'home'), (40000, 'work'), (70000, 'home')] + message = hc.timeline('person.sam', 168, changes, 0, end, timezone.utc) + labels = {label: color for label, color, _ in message['states']} + self.assertEqual(labels, {'Home': '43A047', 'Work': '2196F3', 'Away': hc.OFF_GREY}) + self.assertEqual(message['began'], 2) + self.assertEqual(dict(message['words']), {'not_home': 'Away', 'home': 'Home', 'work': 'Work'}) + + def test_every_zone_gets_its_own_colour(self): + changes = [(-10, 'home'), (3600, 'not_home'), (4000, 'Office'), (9000, 'not_home'), (9500, 'Gym'), (12000, 'home')] + message = hc.timeline('person.sam', 24, changes, 0, 24 * 3600, timezone.utc) + colours = {label: color for label, color, _ in message['states']} + self.assertEqual((colours['Home'], colours['Away']), ('43A047', hc.OFF_GREY)) + self.assertEqual((colours['Office'], colours['Gym']), (hc.PALETTE[0], hc.PALETTE[1])) + + def test_many_states_join_other_and_the_message_stays_small(self): + end = 24 * 3600 + states = ['idle', 'washing', 'rinsing', 'spinning', 'drying', 'paused', 'error', 'done'] + changes = [(i * 900, states[i % len(states)]) for i in range(96)] + message = hc.timeline('sensor.washer', 24, changes, 0, end, timezone.utc, {}) + self.assertEqual(len(message['states']), 6) + self.assertEqual(message['states'][-1][0], 'Other') + # Paused, error and done follow each other in every cycle, and share "Other": one run of three slots. + self.assertEqual(len(message['seg']), 72) + # "Other" runs read the time of every state it stands for: paused, error and done follow each other. + other = next(run for run in message['seg'] if run[1] == 5) + self.assertEqual((other[3] - other[2], other[4]), (2700, 2700)) + self.assertLess(len(json.dumps(message, separators=(',', ':'))), 2500) + + def test_a_busy_motion_sensor_for_a_week_stays_small_and_quick(self): + # Motion every 30 seconds for a week: 20,160 changes from Home Assistant, still one small message for a CYD. + import time + import core + end = 7 * 24 * 3600 + changes = [(i * 30, 'on' if i % 2 == 0 else 'off') for i in range(end // 30)] + began = time.monotonic() + message = hc.timeline('binary_sensor.hallway_motion', 168, changes, 0, end, AMSTERDAM, {'device_class': 'motion'}) + self.assertLess(time.monotonic() - began, 2.0) + self.assertLessEqual(len(message['seg']), 96) + self.assertEqual([(label, seconds) for label, _, seconds in message['states']], [('Motion', end // 2), ('No motion', end // 2)]) + self.assertEqual(message['began'], end // 60 - 1, 'the motion already on at the start did not begin in the range') + self.assertLess(len(core.encode(message).encode()), 1024) + + def test_the_largest_timeline_fits_one_screen_message(self): + # A week in which the state changes in every slot, with the longest words and many states: still under the + # 4096 bytes a screen takes. + import core + end = 7 * 24 * 3600 + states = [(f'state_{i:02d}_' + 'long_name_' * 3)[:32] for i in range(14)] + span = end // 96 + changes = [] + for i in range(96): + # Two states take turns slot by slot; a short third state in each slot fills the legend and the words. + changes += [(i * span, states[i % 2]), (i * span + span * 8 // 10, states[2 + i % 12]), (i * span + span * 9 // 10, states[i % 2])] + message = hc.timeline('sensor.status_of_the_washing_machine_in_the_basement', 168, changes, 0, end, AMSTERDAM, {}) + self.assertEqual((len(message['seg']), len(message['states']), len(message['words'])), (96, 6, 10)) + self.assertLessEqual(len(core.encode(message).encode()), 4096) + + +@unittest.skipUnless(HAS_AIOHTTP, 'Run using .venv-portal/bin/python for server tests') +class Requests(unittest.IsolatedAsyncioTestCase): + """A screen's esphome.screen_history event and the one message the manager answers it with.""" + + def manager(self, tmp, firmware='0.2.51'): + import test_scaling + from server import Manager + ha = test_scaling.fake_ha(firmware=firmware) + ha.states['binary_sensor.door'] = {'state': 'off', 'attributes': {'device_class': 'door'}} + ha.states['light.a']['attributes']['brightness'] = 100 + ha.fetches, ha.fail = [], None + now = datetime.now(timezone.utc).timestamp() + + async def statistic_rows(entity, hours): + ha.fetches.append(('statistics', entity, hours)) + await asyncio.sleep(0.05) + if ha.fail: + raise ha.fail + first = (now - (hours + 1) * 3600) // 3600 * 3600 + return [{'start': int((first + i * 3600) * 1000), 'mean': 20 + i % 3, 'min': 19, 'max': 23 + i % 2} for i in range(hours)] + + async def state_changes(entity, hours): + ha.fetches.append(('changes', entity, hours)) + if ha.fail: + raise ha.fail + return [(now - hours * 3600, 'off'), (now - 1800, 'on'), (now - 1500, 'off')] if entity == 'binary_sensor.door' else \ + [(now - hours * 3600, '21.0'), (now - 600, '22.5')] + ha.statistic_rows, ha.state_changes = statistic_rows, state_changes + m = Manager(ha, Path(tmp) / 'screens.json') + m.save('text.screen', {'title': 'Office 1', 'tiles': [{'entity': 'sensor.t', 'name': ''}, {'entity': 'binary_sensor.door', 'name': ''}, + {'entity': 'light.a', 'name': ''}]}) + return m + + async def test_a_number_and_a_door_each_get_one_history_message(self): + with tempfile.TemporaryDirectory() as tmp: + m = self.manager(tmp) + await m.answer_history({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': '24'}) + await m.answer_history({'inbox': 'text.screen', 'entity': 'binary_sensor.door', 'hours': '1'}) + await m.answer_history({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': '1'}) + sent = [(inbox, message['op'], message['entity'], message['hours'], message['kind'], action) for inbox, message, action in m.ha.messages] + action = 'esphome.office_1_screen_message' + self.assertEqual(sent, [('text.screen', 'history', 'sensor.t', 24, 'line', action), ('text.screen', 'history', 'binary_sensor.door', 1, 'timeline', action), + ('text.screen', 'history', 'sensor.t', 1, 'line', action)]) + # A day comes from the hourly statistics, an hour from the exact changes. + self.assertEqual(m.ha.fetches, [('statistics', 'sensor.t', 24), ('changes', 'binary_sensor.door', 1), ('changes', 'sensor.t', 1)]) + day, door, hour = (message for _, message, _ in m.ha.messages) + self.assertEqual((day['unit'], len(day['values']), day['hi'][0], day['lo'][0]), ('°C', 24, 24, 19)) + self.assertEqual((door['began'], dict(door['words'])['on']), (1, 'Open')) + self.assertEqual(hour['values'][-1], 22.5) + for message in (day, door, hour): + self.assertLessEqual(len(json.dumps(message, separators=(',', ':'))), 4096) + + async def test_screens_asking_together_share_one_fetch_and_a_reopened_card_uses_it(self): + with tempfile.TemporaryDirectory() as tmp: + m = self.manager(tmp) + request = {'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 168} + await asyncio.gather(m.answer_history(request), m.answer_history(dict(request))) + await m.answer_history(dict(request)) + self.assertEqual(m.ha.fetches, [('statistics', 'sensor.t', 168)]) + self.assertEqual(len(m.ha.messages), 3) + + async def test_a_failed_fetch_sends_and_keeps_nothing(self): + from aiohttp import ClientError + with tempfile.TemporaryDirectory() as tmp: + m = self.manager(tmp) + m.ha.fail = ClientError('recorder busy') + with self.assertRaises(ClientError): + await m.answer_history({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 24}) + self.assertEqual((m.ha.messages, m.card_histories), ([], {})) + m.ha.fail = None + await m.answer_history({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 24}) + self.assertEqual(len(m.ha.messages), 1, 'the card asks again and gets it') + + async def test_what_is_not_answered(self): + with tempfile.TemporaryDirectory() as tmp: + m = self.manager(tmp) + for request in ({'inbox': 'text.screen', 'entity': 'sensor.co2', 'hours': 24}, # not on this screen + {'inbox': 'text.other', 'entity': 'sensor.t', 'hours': 24}, + {'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 6}, + {'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 'soon'}, + {'inbox': 'text.screen', 'entity': 'light.a', 'hours': 24}, # a light's card has no history + 'text.screen'): + await m.answer_history(request) + m.ha.states['text.screen'] = {'state': 'unavailable'} + await m.answer_history({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': 24}) + self.assertEqual((m.ha.messages, m.ha.fetches), ([], [])) + + async def test_the_loop_answers_events_and_survives_a_failure(self): + with tempfile.TemporaryDirectory() as tmp: + m = self.manager(tmp) + m.ha.history_requests = asyncio.Queue() + m.ha.fail = OSError('down') + loop = asyncio.ensure_future(m.card_history_loop()) + try: + m.ha.history_requests.put_nowait({'inbox': 'text.screen', 'entity': 'sensor.t', 'hours': '24'}) + await asyncio.sleep(0.2) + m.ha.fail = None + m.ha.history_requests.put_nowait({'inbox': 'text.screen', 'entity': 'binary_sensor.door', 'hours': '24'}) + await asyncio.sleep(0.2) + finally: + loop.cancel() + self.assertEqual([message['entity'] for _, message, _ in m.ha.messages], ['binary_sensor.door']) + + +class Firmware(unittest.TestCase): + def test_the_screen_asks_with_an_event_and_takes_only_the_answer_it_waits_for(self): + request = RUNTIME[RUNTIME.index('inline void history_request('):] + request = request[:request.index('\n}\n')] + self.assertIn('request.service = esphome::StringRef("esphome.screen_history");', request) + self.assertIn('request.is_event = true;', request, 'an event needs no permission to call actions') + self.assertIn('const std::string keys[] = {"inbox", "entity", "hours"}', request) + receive = RUNTIME[RUNTIME.index('if (op == "history") {'):] + receive = receive[:receive.index('#ifdef SWIPE_PROFILE')] + self.assertIn('if (next.entity != history_asked_entity || next.hours != history_asked_hours) {', receive) + self.assertIn('if (!valid_entity(next.entity) || (next.hours != 1 && next.hours != 24 && next.hours != 168)) return false;', receive) + + def test_the_card_opens_for_every_entity_with_history_and_keeps_its_range_keys_enabled(self): + self.assertIn('return d=="sensor"||d=="binary_sensor"||d=="switch"||d=="input_boolean"||d=="person"||d=="number"||d=="input_number";', RUNTIME) + self.assertIn('if(with_history){\n render_history_detail(t,large,width,height,pad);', RUNTIME) + # Range keys ask the manager, not Home Assistant: they are left out of the keys a waiting command disables. + ranges = RUNTIME[RUNTIME.index('inline void history_ranges('):] + ranges = ranges[:ranges.index('\n}\n')] + self.assertIn('if(detail_action_count&&detail_actions[detail_action_count-1]==segment)--detail_action_count;', ranges) + self.assertIn('if(cmd>=160&&cmd<163){', RUNTIME) + self.assertLess(RUNTIME.index('if(cmd>=160&&cmd<163){'), RUNTIME.index('if(!fresh()||detail_index>=model.count || !allowed(esphome::millis(),300+cmd')) + + def test_the_scrub_area_keeps_the_finger_and_the_boards_carry_the_small_font(self): + touch = RUNTIME[RUNTIME.index('inline void history_touch('):] + touch = touch[:touch.index('\n}\n')] + for flag in ('lv_obj_add_flag(area,LV_OBJ_FLAG_PRESS_LOCK);', 'lv_obj_remove_flag(area,LV_OBJ_FLAG_GESTURE_BUBBLE);', + 'lv_obj_add_event_cb(area,history_scrub,LV_EVENT_ALL,nullptr);'): + self.assertIn(flag, touch) + for name in ('guition-4848s040.yaml', 'home-like-2432s028.yaml', 'packages/guition.yaml', 'packages/cyd.yaml'): + text = (ROOT / name).read_text() + self.assertEqual(len(re.findall(r'runtime_tiles::small_font = id\(sublabel\)->get_lv_font\(\);', text)), 1, name) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_history_view.cpp b/tests/test_history_view.cpp new file mode 100644 index 0000000..1a21d75 --- /dev/null +++ b/tests/test_history_view.cpp @@ -0,0 +1,99 @@ +// clang++ -std=c++17 -Wall -Wextra -Werror -I. tests/test_history_view.cpp -o /tmp/test_history_view && /tmp/test_history_view +#include "../components/smart_display/history_view.h" +#include +#include + +using namespace history_view; + +int main() { + // 2026-09-16 14:40 UTC is 16:40 in Amsterdam (UTC+2), a Wednesday. + const int64_t moment = 1789569600; + assert(clock(moment, 7200, true, false) == "16:40"); + assert(clock(moment, 7200, false, false) == "4:40 PM"); + assert(clock(moment, 7200, true, true) == "Wed 16:40"); + assert(clock(moment - 16 * 3600 - 40 * 60, 7200, true, true) == "Wed 00:00"); + assert(clock(moment - 17 * 3600, 7200, false, true) == "Tue 11:40 PM"); + assert(clock(0, 0, true, true) == "Thu 00:00"); + assert(clock(-60, 0, false, true) == "Wed 11:59 PM"); + assert(clock(moment, -18000, true, false) == "09:40"); + assert(axis_clock(moment - 40 * 60, 7200, true) == "16:00"); + assert(axis_clock(moment - 40 * 60, 7200, false) == "4 PM"); + assert(axis_clock(moment - 25 * 60, 7200, false) == "4:15 PM"); + assert(axis_clock(moment - 16 * 3600 - 40 * 60, 7200, false) == "12 AM"); + + assert(duration(42) == "42 s"); + assert(duration(900) == "15 min"); + assert(duration(3600) == "1 h"); + assert(duration(12000) == "3 h 20 min"); + assert(duration(86400 * 2 + 3600 * 4) == "2 d 4 h"); + assert(duration(86400 * 7) == "7 d"); + + assert(number(21.43f, 1, "°C") == "21.4 °C"); + assert(number(40, 0, "%") == "40%"); + assert(number(1234.5f, 1, "W") == "1,234.5 W"); + assert(number(-2.5f, 1, "°") == "-2.5°"); + assert(number(-0.04f, 1, "°C") == "0.0 °C"); + assert(number(1234567, 0, "") == "1,234,567"); + assert(number(NAN, 1, "W") == "--"); + + assert(part_at(0.0f) == 0 && part_at(-0.2f) == 0); + assert(part_at(0.5f) == 12 && part_at(0.49f) == 11); + assert(part_at(0.999f) == 23 && part_at(1.0f) == 23 && part_at(1.5f) == 23); + assert(std::fabs(part_middle(0) - 1.0f / 48) < 1e-6f && std::fabs(part_middle(23) - 47.0f / 48) < 1e-6f); + + std::vector runs; + for (auto [slot, state] : std::vector>{{0, 0}, {4, 1}, {5, 0}, {40, 1}, {41, 0}}) { + Run run; + run.slot = static_cast(slot); + run.state = static_cast(state); + runs.push_back(run); + } + assert(run_at(runs, 96, 0.0f) == 0); + assert(run_at(runs, 96, 4.5f / 96) == 1); + assert(run_at(runs, 96, 0.3f) == 2); + assert(run_at(runs, 96, 1.0f) == 4); + assert(run_end(runs, 96, 1) == 5 && run_end(runs, 96, 4) == 96); + assert(run_at({}, 96, 0.5f) == -1); + + // The line never leaves the values it passes: a setpoint that steps from 55 to 45 and up to 60 stays within. + struct P { int32_t x, y; }; + const float xs[] = {0, 10, 20, 30, 40, 50, 60}, ys[] = {55, 55, 55, 45, 45, 60, 60}; + P line[64]; + const unsigned count = monotone(xs, ys, 7, 4, line, 64); + assert(count == 6 * 4 + 1); + for (unsigned i = 0; i < count; ++i) assert(line[i].y >= 45 && line[i].y <= 60); + for (unsigned i = 0; i + 1 < count; ++i) assert(line[i].x <= line[i + 1].x); + assert(line[0].x == 0 && line[0].y == 55 && line[count - 1].x == 60 && line[count - 1].y == 60); + // Flat stretches stay flat, and every given point is on the line. + for (unsigned i = 0; i <= 4; ++i) assert(line[i].y == 55); + for (unsigned i = 0; i < 7; ++i) assert(line[i * 4 < count ? i * 4 : count - 1].y == static_cast(ys[i])); + // A small buffer is filled, not overrun, and ends on the last point. + P small[5]; + assert(monotone(xs, ys, 7, 4, small, 5) == 5 && small[4].x == 60); + // The highest moment takes the place of the nearest point in its part, so the line's peak is where its ring is. + float px[8] = {0, 10, 20, 30}, py[8] = {5, 6, 7, 6}; + unsigned points = 4; + const int high = through(px, py, points, 8, 22, 9, 5); + assert(high == 2 && points == 4 && px[2] == 20 && py[2] == 9); + // The lowest moment in the same part keeps the highest: it joins the line beside it. + const int low = through(px, py, points, 8, 18, 1, 5, high); + assert(low == 2 && points == 5 && px[2] == 18 && py[2] == 1 && px[3] == 20 && py[3] == 9); + // Far from every point (a part without values) it is added. + float gx[8] = {0, 10, 40}, gy[8] = {5, 5, 5}; + unsigned gaps = 3; + assert(through(gx, gy, gaps, 8, 25, 8, 5) == 2 && gaps == 4 && gx[3] == 40); + P peak[64]; + const unsigned drawn = monotone(px, py, points, 4, peak, 64); + int top = 0, bottom = 100; + for (unsigned i = 0; i < drawn; ++i) { + top = std::max(top, peak[i].y); + bottom = std::min(bottom, peak[i].y); + } + assert(top == 9 && bottom == 1); + float full_x[2] = {0, 1}, full_y[2] = {0, 1}; + unsigned full = 2; + assert(through(full_x, full_y, full, 2, 50, 3, 5) == -1 && full == 2); + // One point, or none. + assert(monotone(xs, ys, 1, 4, line, 64) == 1 && monotone(xs, ys, 0, 4, line, 64) == 0); + return 0; +}