Edit esp-astroclockstepper1.yaml

This commit is contained in:
ESPHome Device Builder
2026-06-28 19:12:53 +12:00
parent 8b389fcdc0
commit 0510b96349
+41 -10
View File
@@ -6,6 +6,7 @@
# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-astroclockstepper.yaml # https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-astroclockstepper.yaml
#:########################################################################################:# #:########################################################################################:#
# VERSIONS: # VERSIONS:
# V1.6 2026-06-22 Fixed auto-position cycle calculation to use rotation_days / solar-year cycle
# V1.5 2026-06-22 Changed Motor Stop to OFF on boot and added shortest-path auto-positioning # V1.5 2026-06-22 Changed Motor Stop to OFF on boot and added shortest-path auto-positioning
# V1.4 2026-06-22 Added Motor Stop switch, swapped reverse buttons 3/4, and separated auto-position motor direction # V1.4 2026-06-22 Added Motor Stop switch, swapped reverse buttons 3/4, and separated auto-position motor direction
# V1.3 2026-06-22 Added SNTP year auto-positioning button and restored boot auto-position switch # V1.3 2026-06-22 Added SNTP year auto-positioning button and restored boot auto-position switch
@@ -53,6 +54,8 @@
# - No holding torque is used. # - No holding torque is used.
# - Web template switches mimic held physical buttons. # - Web template switches mimic held physical buttons.
# - Manual movement only applies while a physical button or web switch is held/on. # - Manual movement only applies while a physical button or web switch is held/on.
# - Manual forward increases the remembered year position.
# - Manual reverse decreases the remembered year position.
# - Position counter wraps back to zero after one full rotation. # - Position counter wraps back to zero after one full rotation.
# - Onboard D1 Mini LED flashes briefly every time a motor step is issued. # - Onboard D1 Mini LED flashes briefly every time a motor step is issued.
# - After WiFi connects, the onboard LED flashes the DHCP IPv4 address. # - After WiFi connects, the onboard LED flashes the DHCP IPv4 address.
@@ -60,6 +63,7 @@
# - A digit of 0 is represented as 10 flashes. # - A digit of 0 is represented as 10 flashes.
# - SNTP is used for current year-position calculation. # - SNTP is used for current year-position calculation.
# - User should manually align the dial to year-zero, then press Zero Position Counter. # - User should manually align the dial to year-zero, then press Zero Position Counter.
# - Auto Position Now calculates the target using the configured 365.2422-day rotation cycle.
# - Auto Position Now moves to the current calculated year position by the shortest path. # - Auto Position Now moves to the current calculated year position by the shortest path.
# - Auto Position can move clockwise or anti-clockwise, whichever is quicker. # - Auto Position can move clockwise or anti-clockwise, whichever is quicker.
# - Auto-position motor direction is separately adjustable from normal/manual movement. # - Auto-position motor direction is separately adjustable from normal/manual movement.
@@ -98,7 +102,7 @@ substitutions:
# Project Naming # Project Naming
project_name: "zorruno.Astronomical Clock Stepper" project_name: "zorruno.Astronomical Clock Stepper"
project_version: "v1.5" project_version: "v1.6"
# Passwords & Secrets (Unfortunately, you cannot use substitutions inside secret names) # Passwords & Secrets (Unfortunately, you cannot use substitutions inside secret names)
api_key: !secret esp-api_key api_key: !secret esp-api_key
@@ -528,6 +532,11 @@ globals:
restore_value: no restore_value: no
initial_value: "1" initial_value: "1"
- id: auto_position_cycle_seconds
type: double
restore_value: no
initial_value: "0.0"
#:########################################################################################:# #:########################################################################################:#
# OUTPUT: # OUTPUT:
@@ -622,6 +631,9 @@ script:
const int STEPS_PER_ROTATION = ${steps_per_rotation}; const int STEPS_PER_ROTATION = ${steps_per_rotation};
const bool AUTO_POSITION_USE_SHORTEST_PATH = ${auto_position_use_shortest_path}; const bool AUTO_POSITION_USE_SHORTEST_PATH = ${auto_position_use_shortest_path};
const double ROTATION_SECONDS =
${rotation_days} * 24.0 * 60.0 * 60.0;
auto now = id(sntp_time).now(); auto now = id(sntp_time).now();
if (!now.is_valid()) { if (!now.is_valid()) {
@@ -642,8 +654,6 @@ script:
((year % 4 == 0) && (year % 100 != 0)) || ((year % 4 == 0) && (year % 100 != 0)) ||
(year % 400 == 0); (year % 400 == 0);
const int days_in_year = is_leap_year ? 366 : 365;
const int days_before_month_common[12] = { const int days_before_month_common[12] = {
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
}; };
@@ -676,17 +686,23 @@ script:
(is_leap_year ? days_before_month_leap[safe_month - 1] : days_before_month_common[safe_month - 1]) + (is_leap_year ? days_before_month_leap[safe_month - 1] : days_before_month_common[safe_month - 1]) +
safe_day_of_month; safe_day_of_month;
const uint32_t seconds_elapsed_this_year = const uint32_t seconds_elapsed_this_calendar_year =
((uint32_t) (day_of_year - 1) * 86400UL) + ((uint32_t) (day_of_year - 1) * 86400UL) +
((uint32_t) now.hour * 3600UL) + ((uint32_t) now.hour * 3600UL) +
((uint32_t) now.minute * 60UL) + ((uint32_t) now.minute * 60UL) +
((uint32_t) now.second); ((uint32_t) now.second);
const double seconds_in_year = (double) days_in_year * 86400.0; // The date/time gives seconds since the local year-zero mark.
// The dial cycle itself is the configured solar-year length, not 365 or 366 days.
double cycle_seconds =
fmod((double) seconds_elapsed_this_calendar_year, ROTATION_SECONDS);
if (cycle_seconds < 0.0) {
cycle_seconds += ROTATION_SECONDS;
}
int target_step = int target_step =
(int) (((double) seconds_elapsed_this_year / seconds_in_year) * (int) ((cycle_seconds / ROTATION_SECONDS) * (double) STEPS_PER_ROTATION);
(double) STEPS_PER_ROTATION);
target_step = target_step % STEPS_PER_ROTATION; target_step = target_step % STEPS_PER_ROTATION;
@@ -713,12 +729,13 @@ script:
id(auto_position_target_step) = target_step; id(auto_position_target_step) = target_step;
id(auto_position_steps_remaining) = chosen_steps; id(auto_position_steps_remaining) = chosen_steps;
id(auto_position_logical_direction) = chosen_logical_direction; id(auto_position_logical_direction) = chosen_logical_direction;
id(auto_position_cycle_seconds) = cycle_seconds;
if (chosen_steps == 0) { if (chosen_steps == 0) {
id(auto_position_active) = false; id(auto_position_active) = false;
ESP_LOGI( ESP_LOGI(
"auto_position", "auto_position",
"Already at correct year position. Year: %d, target step: %d.", "Already at correct solar-year position. Year: %d, target step: %d.",
year, year,
target_step target_step
); );
@@ -729,10 +746,11 @@ script:
ESP_LOGI( ESP_LOGI(
"auto_position", "auto_position",
"Auto positioning started. Year: %d, day_of_year: %d/%d, target step: %d, current step: %d, forward steps: %d, reverse steps: %d, chosen direction: %s, moving %d logical steps.", "Auto positioning started. Year: %d, day_of_year: %d, cycle_seconds: %.2f / %.2f, target step: %d, current step: %d, forward steps: %d, reverse steps: %d, chosen direction: %s, moving %d logical steps.",
year, year,
day_of_year, day_of_year,
days_in_year, cycle_seconds,
ROTATION_SECONDS,
target_step, target_step,
current_step, current_step,
forward_steps, forward_steps,
@@ -997,6 +1015,9 @@ button:
- globals.set: - globals.set:
id: auto_position_logical_direction id: auto_position_logical_direction
value: "1" value: "1"
- globals.set:
id: auto_position_cycle_seconds
value: "0.0"
- logger.log: - logger.log:
level: INFO level: INFO
format: "Position counter zeroed." format: "Position counter zeroed."
@@ -1099,6 +1120,16 @@ sensor:
lambda: |- lambda: |-
return ((double) id(auto_position_target_step) * ${rotation_days}) / ${steps_per_rotation}; return ((double) id(auto_position_target_step) * ${rotation_days}) / ${steps_per_rotation};
- platform: template
name: "Auto Position Cycle Days"
id: auto_position_cycle_days_sensor
icon: mdi:calendar-today
unit_of_measurement: "days"
accuracy_decimals: 4
update_interval: "${sensor_update_interval}"
lambda: |-
return id(auto_position_cycle_seconds) / 86400.0;
#:########################################################################################:# #:########################################################################################:#
# TEXT SENSOR: # TEXT SENSOR: