Best smart blinds and curtains

Anyone else excited about the Ikea smart blind release next month?

1 Like

I’m pretty happy with this now that I’ve got it up an running…

For anyone who’s using the rf vertical blinds such as rollerblinds or somfy, how do you handle partial up/down movement?

E.g what if I only want the blinds down 25%?

Full disclosure, I don’t have mine yet. They’re on their way though.
That said, I’ve done what I can to set it up so I just need to add the RF codes.
I was planning on timing how long it takes to raise lower 25/50/75%. Then my scripts to get to a certain point would be: Raise/Lower code - delay certain number of seconds - stop code.

edit: Now that I have it and have sorted out issues with getting the Broadlink codes… it works!

Could probably have made it simpler, but it works as I want it to. I can change the height manually but changing the input_number.kitten_curtain_new or just leave it and it’ll change during the day depending on temperature. May need to adjust the temps but for now it’s good.

input_number:
   kitten_curtain_cur:
      name: Kitten Curtain
      icon: mdi:blinds
      min: 0
      max: 100
      step: 25
      mode: box
   kitten_curtain_new:
      name: Kitten Curtain
      icon: mdi:blinds
      min: 0
      max: 100
      step: 25
      mode: box
automation:
- alias: Change Kitten Curtain Position
  trigger:
    - platform: template
      value_template: >
        {% set newPos = (states.input_number.kitten_curtain_new.state | int) %}
        {% set curPos = (states.input_number.kitten_curtain_cur.state | int) %}       
        {{ newPos != curPos }}
      for: 00:00:03
  action: 
    - service: script.turn_on
      data_template:
        entity_id: >
          {% set newPos = (states.input_number.kitten_curtain_new.state | int) %}
          {% set curPos = (states.input_number.kitten_curtain_cur.state | int) %}
          {%if (newPos > curPos ) %}  
              script.kitten_curtain_percent_up
          {% elif (newPos < curPos )%} 
              script.kitten_curtain_percent_down
          {%else%}
          {% endif %}
    - delay: >
       {% set newPos = (states.input_number.kitten_curtain_new.state | int) %}
       {% set curPos = (states.input_number.kitten_curtain_cur.state | int) %}
       {%if (newPos > curPos ) %}  
          {% set dif = (newPos - curPos | int) %}
          {{1000 + (24200 * (dif/100) )| int }} 
        {% elif (newPos < curPos )%} 
          {% set dif = (curPos - newPos | int) %}
          {{1000 + (21300 * (dif/100) )| int }}
        {%else%}  
          25000
        {% endif %}
    - service: input_number.set_value
      data_template:
        entity_id: input_number.kitten_curtain_cur
        value: "{{ (states.input_number.kitten_curtain_new.state | int) }}"
    - service: input_number.increment
      entity_id: input_number.kitten_curtain_battery_count

- alias: Kitten Curtain Position during day
  trigger: 
    - platform: sun
      event: sunrise
      offset: '+00:00:00'
    - platform: sun
      event: sunrise
      offset: '+05:00:00'  
    - platform: sun
      event: sunrise
      offset: '+08:00:00'     
  condition:
    - condition: state
      entity_id: input_boolean.foster_kittens
      state: 'on'
  action:
    - service: input_number.set_value
      data_template:
        entity_id: input_number.kitten_curtain_new
        value: >
          {% set curOutTemp = (states.sensor.launceston_current_temp.state | float) %}
          {% set maxOutTemp = (states.sensor.daily_max_temp.state | float) %}
          {% if curOutTemp <= 10 or curOutTemp >= 27 %}
            0
          {% elif maxOutTemp <= 10 or maxOutTemp >= 27 %}
            25
          {% elif maxOutTemp <= 15 %}
            50 
          {% elif maxOutTemp <= 20 %}
            75 
          {% else %}
            100
          {% endif %}

- alias: Kitten Curtain Position during night
  trigger:
    - platform: sun
      event: sunset
      offset: '+00:15:00'
    - platform: sun
      event: sunset
      offset: '+03:00:00'  
    - platform: sun
      event: sunset
      offset: '+05:00:00'          
  condition:
    - condition: state
      entity_id: input_boolean.foster_kittens
      state: 'on'
  action:
    - service: input_number.set_value
      data_template:
        entity_id: input_number.kitten_curtain_new
        value: >
          {% set curOutTemp = (states.sensor.launceston_current_temp.state | float) %}
          {% if (curOutTemp <= 15) %}
            0
          {% elif (curOutTemp <= 20) %}
            25 
          {% elif (curOutTemp <= 25) %}
            75 
          {% else %}
            100
          {% endif %}
script:
  kitten_curtain_up:
   sequence:
     - service: broadlink.send
       data:
         host: 192.168.1.4
         packet: 
          - 'sgGEAwwYDBcZCxgMDBcYCxgMGAwXDAwYDBcMFwwYGAsYDAwXDBgMFwwYDBcYCw0XGAwMFwwYCxgYDAwXDBgMFxgAAQCeMQwXDBgMGAwXGAsNFxgLDRcYDAsYDBcYDBgLDRcYCxgMGAsYCw0XDRcMFwwXGAwYCw0XDBcNFwwXDBgYCwwYFwwMGAwXDBcZCwwYCxgMFxn/njEMFwwXDRcMFxgMDBcYDAwXGQsMGAwXGAsYDAwXGAwXDBgMGAsMGAwXDBgLGBgMFwwMFw0XDBcNFwwXGAwMFxgMDBcMGAwXGAwMFw0XDBcZ/58wDBgMFwwXDRcYCw0XGAsNFxgLDRcMFxkLGAsNFxgLGAwYDBcMDBcNFwwXDBgYCxgMDBcMGAwXDBgMFxgMDBcYDAwXDBgMFxgLDRcMFw0XGAABAJ4xDBcMFw0XDBcYDAwYFwwMGBcMDBcNFxgLGAwMFxgMGAwXDBgMDBcMFwwYDBcYDBgLDRcMFw0XDBcMGBgLDRcYCw0XDBgMFxgMDBcMGAsYGAABAJ8wDBgMFwwYDBcYDAwXGAwMFxgMDBcMGBgLGAwMFxgMGAsYDBcMDBgMFwwYDBcYDBgLDBcNFwwYCxgMGBcMDBcZCwwXDRcMFxgMGAwXDBgLDQABC54xDBcNFwwXDRcXDAwYFwwMGBgLDBcNFxgLGAwMFxgMGAsYDBgLDBcMGAwXDBgYCxgMDBcMGAwXDBcMGBgMCxgXDAwYDBcMGBcMGAsYDBgLDAABDJ4xDBcMFw0XDBcZCwwXGAwMFxgMDBcMGBcMGAwLGBgLGQsYCxkLDBcNFwwXDBgYCxgMDBcMGAwXDBcMGBgLDRcYCwwYDBcMGBgLGAwXDBgLDQABC54xDBcMGAwXDBgXDAwYFwwMGBcMDBgLGBgLGAwMFxgMGAsYDBcMDBgMFwwXDRcYCxgMDBcMGAwXDBcNFxgMDBcYCw0XDBcNFxgLGAwYCxgMDAABDJ4wDBgMFwwYDBcYDAwXGAwMFxgLDRcMGBcMGAwLGBgLGAwYDBcMDBcNFwwXDBgYCxgMDBcMGAwXDRcMFxgMDBcYDAwXDBgMFxgMFwwYCxgMDAABDJ4wDBgMFwwYDBcYDAwXGAwMFxgMDBcMGBcMGAsMGBgLGAwYCxgMDBcMFw0XDBcYDBgLDBgMFwwYDBcMGBcMDBcYDAwXDRcMFxgMGAsYDBgLDAAF3AAAAAA='
  

  kitten_curtain_down:
   sequence:
     - service: broadlink.send
       data:
         host: 192.168.1.4
         packet: 
          - 'sgGEAwwXDRcXDBgMDBcYDBgLGAwYCwwYDBcMGAwXGAwYCwwYDBcMGAwXDBgYCwwYGAsNFwwXGQsYCwwYDBcYDBcAAQGeMQwYDBcMFw0XGAwMFxgLDBgYDAwXDBcZCxgMDBcYDBcMGAwYCwwYDBcMGAwXGAwYCwwYDBcMGAwXDBgYCwwYGAsMGAwXGAwYDAsYDBgXDBgAAQCeMQwYDBcMFw0XGAsNFxgLDRcYDAwXDBcYDBgLDRcYDBcMGAsYDAwXDRcMFw0XGAsYDAwYDBcMFw0XDBcZCwwYGAsMGAsYGAsYDAwYDBcYDBcAAQGeMA0XDRcMFwwYFwwMFxgMDBcYDAsYDBcYDBcMDBgXDBgLGAwYCwwXDRcMFwwYGAsXDAwYDBcMFwwXDRcYCw0XFwwMGAwXGAsYDAwXDBcYDBj/njAMFwwYDBcMGBcMDBcYDAwXGAwMFwwYFwwYCwwYFwwYCxgMGAsMGAwXDBgLGBcMGAwLGAwYCxgMFwwYFwwMFxgMDBcMGBcMGAsMFw0XGAsY/54xCxgMFw0XDBcYCwwYGAsMFxgMDBcMGBcMGAsMGBgLGAsYDBgLDBcNFwwXDBgXDBgLDBgMFwwXDRcMFxgMDBcYCwwYDBcYDBcMGAsYDAwXDAABCp8wDBcMFw0XDBcYDAwXGAsNFxgLDBgMFxgLGAwMFxgLGAwXDBgLDBgMFwwYDBcYCxgMDBcMFwwYDBcMFxgMDBcYDAsYDBcYCxgMFwwYDAsYDAABCp8wDBcMGAwXDBgXCw0XGAsMGBgLDBcNFxgLGAwMFxgLGAwYCxgLDRcMFwwYCxgYCxgMDBcMFw0XDBcMFxgMDBcYDAwXDBcZCxcMGAwYCwwXDAABC54wDBcNFwwXDBcZCwwXGAwLGBcMDBcNFxcMGAwLGBgLGAwXDBgLDBcNFwwXDBgXDBgLDRcMFwwXDBgMFxgLDRcYCwwXDRcYCxgLGAwYCwwYDAABCp4xDBcMGAsYDBcYDAwXGAsMGBcMDBcNFxcMGAsMGBcMGAwXDBgLDBgMFwwXDRcYCxgMDBcMFwwXDRcMGBcMDBcYDAwXDBgXDBgMFwwYDAsYDAABC50wDRcMFwwYCxgYCwwYGAsMFxgMDBcMGBcMGAsMFxgMGAsYDBcMDBcMGAsYDBcYDBgLDBcMGAwXDBcMGBgLDBgXDAwXDBcZCxcMGAwXDAwXDAAF3AAAAAA='
        
  kitten_curtain_stop:
   sequence:
     - service: broadlink.send
       data:
         host: 192.168.1.4
         packet: 
          - 'sgDuAYswDRcMFwwXDRcYDAwXGAwMFxgMCxgMFxgMGAsMFxgMGAsYDBgLDBcMFw0XDBgXDBgLDRcMFwwXDRcMFxgLDRcYCw0XGAsMGBcMDBcYDAwXGP+eMA0XDBgMFwwXGAwMFxgLDRcYCwwYDBcYDBcMDBcYDBcMGAsYDAwXDBgMFwwYGAsYCw0XDBcMFw0XDBgXDAwXGAwMFxgLDRcYCwwYFwwMGBj/njAMGAwXDBcMGBgLDBcYCw0XGAwMFwwXGQsYCw0XGAsYDBgLGAsNFwwXDRcMFxgLGQsMGAwXDBcMGAwXGAwMFxgLDRcXDAwXGQsMFxgMDBcY/54xDBcMFw0XDBcYDAwXGAsMGBgLDBcNFxgLGAwMFxgMGAsYCxkLDBcMGAwXDBgXDBgLDBgMFwwXDBcNFxgMDBcYCwwXGAwMFxgMDBcYDAwXGP+eMQwXDBgMFwwXGAwMFxgLDBgYCw0XDBcYDBgLDBcYDBgLGAwXDAwXDRcMFwwXGQsYCw0XDBcMGAwXDBcZCwwXGAwMFxgLDRcYCwwYGAsMGBf/njEMFwwXDRcMFxgMDBcYCwwYGAsMFwwYGAsYCw0XGAsYCxgMGAwMFwwXDRYNFxgLGQsMFw0XDBcMGAsYGAsNFxgLDBcYDAwXGAsNFxgLDBcZAAXcDBcMFxgMDBcYCw=='

  kitten_curtain_percent_up: 
   sequence:
     - service: script.kitten_curtain_up
     - delay: 
        milliseconds: >
          {% set newPos = (states.input_number.kitten_curtain_new.state | int) %}
          {% set curPos = (states.input_number.kitten_curtain_cur.state | int) %}
          {% set dif = (newPos - curPos | int) %}
          {{(24200 * (dif/100) )| int }} 
     - service: script.kitten_curtain_stop

  kitten_curtain_percent_down: 
   sequence:
     - service: script.kitten_curtain_down
     - delay: 
        milliseconds: >
          {% set newPos = (states.input_number.kitten_curtain_new.state | int) %}
          {% set curPos = (states.input_number.kitten_curtain_cur.state | int) %}
          {% set dif = (curPos - newPos | int) %}
          {{(21300 * (dif/100) )| int }}
     - service: script.kitten_curtain_stop
1 Like

I found a new curtain motor from xiaomi, supports wifi and bluetooth: YLDJ01YL. Price is below 60 euro on aliexpress, could be interesting.

Anyone have a good solution for vertical blinds operated via a ‘wand’?

These are for horizontal blinds, but should work with vertical blinds. They may be worth looking at if you have a 3D printer. I used the electronics from this build to control them and they work great with home Assistant. They cost about £5 to make and I’ve been using them for over a year and never had a problem. I did have to design a slightly different drive connector to fit my blinds though.

1 Like

I have a printed case that replaces the control end of a vertical blind and drives the rod that adjusts the tilt directly, using a small stepper motor, it’s attached to and esp8266 for control.

It doesn’t pull the blind open or closed though (that can still be done manually), just the tilt.

Current version is not as tidy as it could be, just a prototype, works well though. Next one is for my lounge so will need a bit more work on the case design.

1 Like

Thanks people, I do indeed have a 3d printer. Those designs look nice but I think i’m going to need a battery version as the wife has a phobia of wires :wink:

Hi, to all of you DIYers out there, I just found a great way to make curtains open and close with just some programming and a little physical work.
cc9a5d2a02914d27859027db7f76487f
Just take a quick look at this picture. The only things you need are a string, some rope bearings and a stepper motor with an esp8266. The rope is quite self-explanatory and the programming is easily done with Arduino IDE or EspHome. I hope you guys can work with this. Atleast I will be making this in the near future!

3 Likes

There are some great ideas being shared here. When I think of automating blinds in my home, I give up when I figure nobody is going to want to look at wires going to every window.

What are you all doing to get power cleanly to your blinds? (talking high WAF here)

Unfortunately most homes in my area have a 4x12 header above all windows, so not much room to put a proper j-box in. I figure most folks are drilling out headers and running low voltage (like 12VDC) to the top corners of their windows, similar to an alarm system install.

I think when I do low voltage installs at work, I’ll try and upsell clients on running power to windows along side alarm contact wiring.

If i were you, I’d just buy a small cable manager like in the picture below. If the white housing stands out, you can just paint it in a different color.

1 Like

As picky as my wife is, I know for certain she would not approve of that. At our old rental house I added some racetrack conduit like that to cover some cable tv wires, and she thought it was worse than just seeing painted cables… go figure.

Well, if you stick them next to the window, it is really unnoticeable. If your wifi doesn’t accept that, I’d rather do something about that than finding a different way to manage your cables :wink: .

ROTFLOL, she can’t see that post! :wink:

1 Like

hey - first post here - have you made this? Was it successful?

sorry for the late response, but I haven’t made it, i know it works but I need to find out which stepper motor to buy first. Since my curtains are heavy, my motor has to be strong.

Hi all,
I am finally getting around to posting on github a project I did way more than a year ago and thought this thread would be a good place to mention it. I took Tasmota code (somewhat old by now) and modified it to control a servo motor for tilt blinds and in particular to move the blinds in a slow motion manner. I acquired the hardware parts, including the 3D printed parts from MK Smarthouse.

Here is the github for the software for anyone interested:

@keithh666 I have just seen your messages here and your design for blind motor on Thingiverse and I will give this a try. I have ordered the 12V version of the stepper motor and I can print the pieces. Could you advise what filament you used for the prints please. I have PLA and PETG in stock and some white ABS. I don’t think PLA will work due to its properties but PETG probably will. The blind is a 5 metre wide roman blind and is quite heavy (it breaks the manual chain frequently) so I intend to use two motors, one at each end arranged for counter rotation on the single shaft. I have plenty of ESP32 dev kits but also sufficient NodeMCU’s on hand. Pending delivery of the 12V motors, I will print a test piece and experiment with the 5V versions I have in stock. Although I use the Arduino IDE, I have not built a toolchain for compiling Tasmota sources yet and I’m wondering how much of a learning curve that will be! I note the comments about Arduino libraries elsewhere. Thanks again.

Hi @apemberton
I gave up on mine as mine is too heavy for the 5v steppers I have and they are on all the time, I think you will struggle to get it working even with 2 steppers and unless you can figure out a ratchet system the steppers will have to remain on all the time, they will get very hot and may deform the filament, I certainly wouldn’t recommend PLA.