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);