Motor on a roller blind - ESPHome version?

Hey all!

My shade is 60 inches long. What is the current recommendation?

Thanks!

I have a problem with this ESPhome cover.
Installed the code from:

My cover is working when i visit the ESPhome webpage, and i can control my stepper motor.

In home assistant the ESPhome is autodiscovered, but all the entities are switched off.
It says: Switched off by configuration item. I can’t enable the entities.

I tried removing the API key in the .common_blind config, since all my other ESPhome devices are working without API key. Without succes.

Someone know how i can fix this or what i did wrong ?

Does it work now?

Does anyone have a code, where you can control 2 blinds with only one esp32?

Or maybe a dual stepper driver?

Where can I find this STL/model? This looks exactly what I want to use.

I’ve sinced been working on a 3 motor version - I haven’t printed and tested it myself yet but you’re welcome to try!
https://www.printables.com/model/397730-triple-28byj-48-motors-motorized-blind-driver

Don’t know if you’re still interested, but I’ve posted my work in progress design for a 3 motor version - Printables

2 Likes

Thanks for the link, I checked it out this morning. But by chance, can you post the 2 motor version too? I am hoping I can use this for my horizontal blinds without putting a motor on each end.

Also, are you using just one stepper driver, or are you using two?

Thanks for the help.

Ok, I’ve posted the dual motor version as well now - Printables

Just one stepper driver, the motors are wired in parallel to it.

2 Likes

i have the same issue. roller shade too heavy. must use a bigger motor like the Nema 17 as seen here. Printables
sadly his instruction is very vague. i cant seem to make his code work.

I am very interested.
What controller do you use for 3 motors in parallel?
Do you think this version would tighten a blind with a length of 170 cm and a height of 150 cm?
Thank you very much.

I use a NodeMCU connected to an a4988 stepper motor driver like this

You adjust the POT on the a4988 to supply enough current to run the motors in parallel.

And in order to do this, the 28BYJ-48 stepper motors are modified from unipolar to bi-polar like this

1 Like

Hi.
Please add your actual code. Some changes in HA code I think because in logs I have blinking message “Connection closed / Connection succesfully” in loop.

I think the problem is in code. Something with API.
[edit]
All is ok . I confused GND with CMD. 10 hours lost … God damn it Frank. :rofl:

I need help. I use code from zuberio to open the window in the greenhouse. I need to move 0 point and endstop to “Close”. Just replace words “close” to “open” and “open” to “close”. Opening and closing works fine but some mishmash with reporting position. Can u help me with this?

Hi,
I built a motorized blind a while ago and it took several versions to prefect it. I wanted to use the same motor as tung256 with a built-in encoder.


I wanted to use the encoder so it knew its position without switched or physical endstops but it also shows if the blind is opening or closing. is not the cleanest code but it was written about 2 years ago and it works for my blind.
The blind stops once it has hit the required encoder number (opening or closing). i also put a delay/timer on the open/close in case the blind got stuck so it didn’t burn out the hardware.
I also had a manual blind control to override/ignore the encoder counter.
I used a L298N to control the motor.

  - platform: rotary_encoder
    name: "Rotary Encoder"
    id: 'encoder1'
    pin_a: 14 #D5 yellow
    pin_b: 12 #D6 
    publish_initial_value: True
    restore_mode: RESTORE_DEFAULT_ZERO
    on_value_range:
        - above: 28600
          then:
            - switch.turn_off: positive
            - lambda: !lambda |-
               id(zaras_blind).current_operation = COVER_OPERATION_IDLE ;
            - cover.template.publish:
                id: zaras_blind 
                state: CLOSED
            
            
        - below: 0
          then:
           - switch.turn_off: negative
           - lambda: !lambda |-
              id(zaras_blind).current_operation = COVER_OPERATION_IDLE ;
           - cover.template.publish:
                id: zaras_blind 
                state: OPEN
           
  - platform: dht
    pin: 13 #D7 
    model: DHT22
    temperature:
      name: "Zara's Blind Temperature"
      accuracy_decimals: 1
    humidity:
      name: "Zara's Blind Humidity"
      accuracy_decimals: 1
    update_interval: 50s
   
  - platform: uptime
    name: Zara's Blind sensor Uptime
    
  - platform: wifi_signal
    name: Zara's Blind sensor Signal
    update_interval: 120s   

           

# Exposed switches.
switch:
  - platform: template
    id: resetc
    name: Zara's Reset count
    turn_on_action:
      then:
      - sensor.rotary_encoder.set_value:
          id: encoder1
          value: 0
      - switch.turn_off: resetc
  # Switch to restart the Zara's Outside Blind.
  - platform: restart
    name: Zara's Outside Blind Restart
  - platform: output
    name: "shade1"
    output: 'shade1'
    internal: true
    id: negative
  - platform: output
    name: "shade2"
    output: 'shade2'
    internal: true
    id: positive



output:
  - platform: gpio
    id: 'shade1'
    pin: 5 #D1 PURPLE
  - platform: gpio
    id: 'shade2'
    pin: 4 #D2 BLUE

cover:
  - platform: template
    device_class: blind
    name: "Zara's outside blind"
    optimistic: TRUE
 #   has_position: true
 #   position_action:
#      - stepper.set_target:
##          id: encoder1 
  #        target: !lambda "return (pos*1000);"
    id: zaras_blind
    
    open_action:
    
     if:
       condition:
         lambda: 'return id(zaras_blind).is_fully_closed();'
      
       then:
           - switch.turn_off: positive
           - switch.turn_on: negative
           - lambda: !lambda |-
               id(zaras_blind).current_operation = COVER_OPERATION_OPENING ;
           - delay: 38s
           - switch.turn_off: negative
          
    
    
    close_action:
      if:
       condition:
         lambda: 'return id(zaras_blind).is_fully_open();'
      
       then:
           - switch.turn_off: negative
           - switch.turn_on: positive
           - lambda: !lambda |-
               id(zaras_blind).current_operation = COVER_OPERATION_CLOSING ;
           - delay: 35s
           - switch.turn_off: positive
          
          
               
    
    stop_action:
      - switch.turn_off: negative
      - switch.turn_off: positive
      
  - platform: template
    device_class: blind
    name: "Zara's outside blind manual"
    id: zaras_blind_man
    assumed_state: true

    open_action:
      - switch.turn_off: positive
      - switch.turn_on: negative
    close_action:
      - switch.turn_off: negative
      - switch.turn_on: positive
    stop_action:
      - switch.turn_off: negative
      - switch.turn_off: positive

this is my first post , so I’m sorry about the formatting.

3 Likes

Could you please provide a wiring diagram?Thank you very much

Thank you very much.

Hi,
Is there any fundamental reason why Home Assistant does not support TB6600 stepper motor drivers, aside from the effort involved?
It seems like a common generic driver like that would be useful for motors like the Nema 17. I bought this combination a while ago for another project before finding this thread, but it seems that the only other person here that I noticed was attempting to use this driver was unable to get it operating correctly.

Hello. I’m trying to use this code https://github.com/RoadkillUK/Motor-on-a-Roller-Blind-for-ESPHOME/blob/1941b2f2ae5df4d7d8e34114680f743264764509/myblind.yaml, which was found in the current topic, for the stepper motor based on ULN2003. There is using “template cover platform” inside Template Cover — ESPHome, which has “position_action” with “pos” variable inside. While I was trying to install it, I got the following error:

error: 'pos' was not declared in this scope

As I understood, the “pos” variable is a part of “template cover platform” and should be predefined under the hood. But something was going wrong…

Many thanks for any help or ideas! Much appreciate!

1 Like

To fix this, you should define the pos variable before using it. For example, you can add it as a new global variable. Update your globals section like this:
Make sure to adjust the initial value or other properties of pos based on your specific use case.

globals:
  # ... other global variables

  - id: pos
    type: float
    restore_value: True
    initial_value: '0.0'