restore_value: no
initial_value: "false"
+ - id: need_rehome_
+ type: bool
+ restore_value: no
+ initial_value: "true"
+
stepper:
- platform: tmc2209
id: motor
args: [ "id(encoder)->get_state()", "id(motor)->current_direction",
"cover_operation_to_str(id(pd_blinds)->current_operation)" ]
- lambda: |
- if (id(motor).current_direction < 0) {
+ if (id(motor).current_direction == -(${motor_direction})) {
+ id(need_rehome_) = false;
if (id(pd_blinds)->current_operation == COVER_OPERATION_IDLE) {
id(sensored_home_pos) = id(encoder)->get_state();
} else {
on_press:
- lambda: |
id(motor).set_max_speed(${max_speed}/2);
- id(motor).set_target(id(motor)->current_position - 2.5 * ${encoder_closed_pos});
+ id(motor).set_target(id(motor)->current_position - 2.5 * ${encoder_closed_pos} * ${motor_direction});
- platform: template
name: Stop
format: "Blind rehome"
- lambda: |
id(motor).set_max_speed(${max_speed}/2);
- id(motor).set_target(id(motor)->current_position - 2.5 * ${encoder_closed_pos});
+ id(motor).set_target(id(motor)->current_position - 2.5 * ${encoder_closed_pos} * ${motor_direction});
- platform: gpio
name: Button 3
name: Reed Switch
id: reedsw
pin:
- number: 14
+ number: 7
mode:
input: true
- pullup: true
+ pullup: false
inverted: true
filters:
- delayed_on_off: 10ms
"cover_operation_to_str(id(pd_blinds)->current_operation)" ]
- lambda: |
// If we hit the reed switch while travelling upwards, stop the motor and reset the home position.
- if (id(motor).current_direction < 0) {
+ if (id(motor).current_direction == -(${motor_direction})) {
id(motor).stop();
- id(sensored_home_pos) = id(encoder)->get_state();
+ id(need_rehome_) = false;
+ if (id(pd_blinds)->current_operation == COVER_OPERATION_IDLE) {
+ id(sensored_home_pos) = id(encoder)->get_state();
+ } else {
+ // Reset home once the tension is released and the encoder is idle
+ id(home_resetting_) = true;
+ }
}
on_release:
- logger.log:
- stepper.stop: motor
open_action:
- lambda: |-
+ if (id(need_rehome_)) {
+ id(home).press();
+ } else {
int32_t wantpos = id(sensored_home_pos);
int32_t posdelta = wantpos - id(encoder)->get_state();
- int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${encoder_direction}) + 2048) / 4096;
+ int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${motor_direction}) + 2048) / 4096;
ESP_LOGI("cover", "From %f to open (%f to %d) is delta %d, %d steps. Step %d -> %d",
id(pd_blinds)->position, id(encoder)->get_state(), wantpos, posdelta, stepdelta,
id(motor)->current_position, id(motor)->current_position + stepdelta);
id(home_resetting_) = false;
id(motor).set_target(id(motor)->current_position + stepdelta);
+ }
close_action:
- lambda: |-
int32_t wantpos = id(sensored_home_pos) + ${encoder_closed_pos};
int32_t posdelta = wantpos - id(encoder)->get_state();
- int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${encoder_direction}) + 2048) / 4096;
+ int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${motor_direction}) + 2048) / 4096;
ESP_LOGI("cover", "From %f to closed (%f to %d) is delta %d, %d steps. Step %d -> %d",
id(pd_blinds)->position, id(encoder)->get_state(), wantpos, posdelta, stepdelta,
id(motor)->current_position, id(motor)->current_position + stepdelta);
- lambda: |-
int32_t wantpos = id(sensored_home_pos) + (1.0 - pos) * ${encoder_closed_pos};
int32_t posdelta = wantpos - id(encoder)->get_state();
- int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${encoder_direction}) + 2048) / 4096;
+ int32_t stepdelta = ((posdelta * 200 * ${microsteps} * ${motor_direction}) + 2048) / 4096;
ESP_LOGI("cover", "From %f to %f (%f to %d) is delta %d, %d steps. Step %d -> %d",
id(pd_blinds)->position, pos, id(encoder)->get_state(), wantpos, posdelta, stepdelta,
id(motor)->current_position, id(motor)->current_position + stepdelta);