Edit esp-reterminal-e1001.yaml
This commit is contained in:
@@ -829,269 +829,6 @@ display:
|
|||||||
id(job_water_table_pot_plant_completed_time).state
|
id(job_water_table_pot_plant_completed_time).state
|
||||||
);
|
);
|
||||||
|
|
||||||
#:####################################################################################:#
|
|
||||||
# PAGE 2 - VIEW ROAD APPLIANCES #
|
|
||||||
#:####################################################################################:#
|
|
||||||
- id: page_appliances
|
|
||||||
lambda: |-
|
|
||||||
const int screen_width = 800;
|
|
||||||
const int header_y = 58;
|
|
||||||
const int radius = 8;
|
|
||||||
const int normal_border = 2;
|
|
||||||
const int emphasis_border = 4;
|
|
||||||
const int finished_seconds = ${finished_highlight_seconds};
|
|
||||||
|
|
||||||
const auto now = id(homeassistant_time).now();
|
|
||||||
const int64_t now_ts = now.is_valid() ? now.timestamp : 0;
|
|
||||||
|
|
||||||
auto fill_rounded = [&](int x, int y, int w, int h, int r, Color colour) {
|
|
||||||
it.filled_rectangle(x + r, y, w - (2 * r), h, colour);
|
|
||||||
it.filled_rectangle(x, y + r, w, h - (2 * r), colour);
|
|
||||||
it.filled_circle(x + r, y + r, r, colour);
|
|
||||||
it.filled_circle(x + w - r - 1, y + r, r, colour);
|
|
||||||
it.filled_circle(x + r, y + h - r - 1, r, colour);
|
|
||||||
it.filled_circle(x + w - r - 1, y + h - r - 1, r, colour);
|
|
||||||
};
|
|
||||||
|
|
||||||
auto rounded_tile = [&](int x, int y, int w, int h, bool inverse, int border) {
|
|
||||||
fill_rounded(x, y, w, h, radius, COLOR_ON);
|
|
||||||
if (!inverse) {
|
|
||||||
int inner_radius = radius - border;
|
|
||||||
if (inner_radius < 2) inner_radius = 2;
|
|
||||||
fill_rounded(
|
|
||||||
x + border,
|
|
||||||
y + border,
|
|
||||||
w - (2 * border),
|
|
||||||
h - (2 * border),
|
|
||||||
inner_radius,
|
|
||||||
COLOR_OFF
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
auto draw_panel_state_icon = [&](int centre_x, int centre_y) {
|
|
||||||
if (id(panel_awake_indicator)) {
|
|
||||||
// Two open eyes with pupils.
|
|
||||||
it.circle(centre_x - 9, centre_y, 6, COLOR_ON);
|
|
||||||
it.circle(centre_x + 9, centre_y, 6, COLOR_ON);
|
|
||||||
it.filled_circle(centre_x - 9, centre_y, 2, COLOR_ON);
|
|
||||||
it.filled_circle(centre_x + 9, centre_y, 2, COLOR_ON);
|
|
||||||
} else {
|
|
||||||
// Two closed eyelids, each drawn as a shallow downward curve.
|
|
||||||
it.line(centre_x - 16, centre_y - 2, centre_x - 10, centre_y + 2, COLOR_ON);
|
|
||||||
it.line(centre_x - 10, centre_y + 2, centre_x - 4, centre_y - 2, COLOR_ON);
|
|
||||||
it.line(centre_x + 2, centre_y - 2, centre_x + 8, centre_y + 2, COLOR_ON);
|
|
||||||
it.line(centre_x + 8, centre_y + 2, centre_x + 14, centre_y - 2, COLOR_ON);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
auto make_date = [&]() -> std::string {
|
|
||||||
if (!now.is_valid()) return "Waiting for Home Assistant time";
|
|
||||||
|
|
||||||
const char *weekdays[] = {
|
|
||||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
|
||||||
"Thursday", "Friday", "Saturday"
|
|
||||||
};
|
|
||||||
const char *months[] = {
|
|
||||||
"January", "February", "March", "April", "May", "June",
|
|
||||||
"July", "August", "September", "October", "November", "December"
|
|
||||||
};
|
|
||||||
|
|
||||||
const int day = now.day_of_month;
|
|
||||||
const int last_two = day % 100;
|
|
||||||
const char *suffix = "th";
|
|
||||||
if (last_two < 11 || last_two > 13) {
|
|
||||||
if ((day % 10) == 1) suffix = "st";
|
|
||||||
else if ((day % 10) == 2) suffix = "nd";
|
|
||||||
else if ((day % 10) == 3) suffix = "rd";
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[72];
|
|
||||||
snprintf(
|
|
||||||
buffer,
|
|
||||||
sizeof(buffer),
|
|
||||||
"%s, %d%s %s %d",
|
|
||||||
weekdays[now.day_of_week - 1],
|
|
||||||
day,
|
|
||||||
suffix,
|
|
||||||
months[now.month - 1],
|
|
||||||
now.year
|
|
||||||
);
|
|
||||||
return std::string(buffer);
|
|
||||||
};
|
|
||||||
|
|
||||||
auto completed_clock = [&](const std::string &stop_local) -> std::string {
|
|
||||||
if (stop_local.length() >= 16) return stop_local.substr(11, 5);
|
|
||||||
return "unknown";
|
|
||||||
};
|
|
||||||
|
|
||||||
auto draw_appliance = [&](int x, int y,
|
|
||||||
const char *title_line_1,
|
|
||||||
const char *title_line_2,
|
|
||||||
const std::string &state,
|
|
||||||
float stop_ts,
|
|
||||||
float duration_seconds,
|
|
||||||
const std::string &stop_local) {
|
|
||||||
const int w = 190;
|
|
||||||
const int h = 128;
|
|
||||||
|
|
||||||
const bool valid_cycle =
|
|
||||||
!isnan(stop_ts) && stop_ts > 0 &&
|
|
||||||
!isnan(duration_seconds) && duration_seconds > 0;
|
|
||||||
|
|
||||||
bool recent_finish = false;
|
|
||||||
if (valid_cycle && now_ts > 0) {
|
|
||||||
const int64_t age = now_ts - static_cast<int64_t>(stop_ts);
|
|
||||||
recent_finish = age >= 0 && age < finished_seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string status = "Unavailable";
|
|
||||||
bool inverse = false;
|
|
||||||
int border = normal_border;
|
|
||||||
|
|
||||||
if (state == "Operating") {
|
|
||||||
status = "OPERATING";
|
|
||||||
border = emphasis_border;
|
|
||||||
} else if (valid_cycle && recent_finish) {
|
|
||||||
status = "FINISHED";
|
|
||||||
inverse = true;
|
|
||||||
} else if (valid_cycle) {
|
|
||||||
status = "Completed at " + completed_clock(stop_local);
|
|
||||||
} else if (state == "Standby") {
|
|
||||||
status = "STANDBY";
|
|
||||||
} else if (state == "Off") {
|
|
||||||
status = "OFF";
|
|
||||||
} else if (state == "Finished") {
|
|
||||||
status = "FINISHED";
|
|
||||||
inverse = true;
|
|
||||||
} else if (!state.empty()) {
|
|
||||||
status = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
rounded_tile(x, y, w, h, inverse, border);
|
|
||||||
const Color text_colour = inverse ? COLOR_OFF : COLOR_ON;
|
|
||||||
|
|
||||||
if (title_line_2[0] == '\0') {
|
|
||||||
it.printf(
|
|
||||||
x + (w / 2), y + 39,
|
|
||||||
id(font_appliance_title), text_colour, TextAlign::CENTER,
|
|
||||||
"%s", title_line_1
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
it.printf(
|
|
||||||
x + (w / 2), y + 25,
|
|
||||||
id(font_appliance_title), text_colour, TextAlign::CENTER,
|
|
||||||
"%s", title_line_1
|
|
||||||
);
|
|
||||||
it.printf(
|
|
||||||
x + (w / 2), y + 49,
|
|
||||||
id(font_appliance_title), text_colour, TextAlign::CENTER,
|
|
||||||
"%s", title_line_2
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
it.printf(
|
|
||||||
x + (w / 2), y + 91,
|
|
||||||
id(font_appliance_status), text_colour, TextAlign::CENTER,
|
|
||||||
"%s", status.c_str()
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Header.
|
|
||||||
it.print(14, 28, id(font_header), TextAlign::CENTER_LEFT, "View Road Appliances");
|
|
||||||
draw_panel_state_icon(448, 28);
|
|
||||||
const std::string date_text = make_date();
|
|
||||||
it.printf(
|
|
||||||
screen_width - 14,
|
|
||||||
29,
|
|
||||||
id(font_date),
|
|
||||||
TextAlign::CENTER_RIGHT,
|
|
||||||
"%s",
|
|
||||||
date_text.c_str()
|
|
||||||
);
|
|
||||||
it.line(8, header_y, screen_width - 9, header_y);
|
|
||||||
|
|
||||||
// Four tiles on rows one and two; two centred tiles on row three.
|
|
||||||
draw_appliance(
|
|
||||||
8, 70, "Washing", "Machine",
|
|
||||||
id(appliance_washing_state).state,
|
|
||||||
id(appliance_washing_stop_ts).state,
|
|
||||||
id(appliance_washing_duration).state,
|
|
||||||
id(appliance_washing_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
206, 70, "Dryer", "",
|
|
||||||
id(appliance_dryer_state).state,
|
|
||||||
id(appliance_dryer_stop_ts).state,
|
|
||||||
id(appliance_dryer_duration).state,
|
|
||||||
id(appliance_dryer_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
404, 70, "Main", "Dishwasher",
|
|
||||||
id(appliance_main_dishwasher_state).state,
|
|
||||||
id(appliance_main_dishwasher_stop_ts).state,
|
|
||||||
id(appliance_main_dishwasher_duration).state,
|
|
||||||
id(appliance_main_dishwasher_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
602, 70, "Downstairs", "Dishwasher",
|
|
||||||
id(appliance_downstairs_dishwasher_state).state,
|
|
||||||
id(appliance_downstairs_dishwasher_stop_ts).state,
|
|
||||||
id(appliance_downstairs_dishwasher_duration).state,
|
|
||||||
id(appliance_downstairs_dishwasher_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
8, 206, "EV Charger", "32A",
|
|
||||||
id(appliance_evcharger_32a_state).state,
|
|
||||||
id(appliance_evcharger_32a_stop_ts).state,
|
|
||||||
id(appliance_evcharger_32a_duration).state,
|
|
||||||
id(appliance_evcharger_32a_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
206, 206, "EV Charger", "16A",
|
|
||||||
id(appliance_evcharger_16a_state).state,
|
|
||||||
id(appliance_evcharger_16a_stop_ts).state,
|
|
||||||
id(appliance_evcharger_16a_duration).state,
|
|
||||||
id(appliance_evcharger_16a_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
404, 206, "Ryobi Charger", "Left",
|
|
||||||
id(appliance_ryobi_left_state).state,
|
|
||||||
id(appliance_ryobi_left_stop_ts).state,
|
|
||||||
id(appliance_ryobi_left_duration).state,
|
|
||||||
id(appliance_ryobi_left_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
602, 206, "Ryobi Charger", "Right",
|
|
||||||
id(appliance_ryobi_right_state).state,
|
|
||||||
id(appliance_ryobi_right_stop_ts).state,
|
|
||||||
id(appliance_ryobi_right_duration).state,
|
|
||||||
id(appliance_ryobi_right_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
206, 342, "Pool Pump", "",
|
|
||||||
id(appliance_pool_pump_state).state,
|
|
||||||
id(appliance_pool_pump_stop_ts).state,
|
|
||||||
id(appliance_pool_pump_duration).state,
|
|
||||||
id(appliance_pool_pump_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
draw_appliance(
|
|
||||||
404, 342, "3D Printer", "",
|
|
||||||
id(appliance_3d_printer_state).state,
|
|
||||||
id(appliance_3d_printer_stop_ts).state,
|
|
||||||
id(appliance_3d_printer_duration).state,
|
|
||||||
id(appliance_3d_printer_stop_local).state
|
|
||||||
);
|
|
||||||
|
|
||||||
#:########################################################################################:#
|
#:########################################################################################:#
|
||||||
# DISPLAY CHANGE DETECTION:
|
# DISPLAY CHANGE DETECTION:
|
||||||
# Builds a signature from only the content that is currently visible. The display is not
|
# Builds a signature from only the content that is currently visible. The display is not
|
||||||
|
|||||||
Reference in New Issue
Block a user