Best smart blinds and curtains

https://www.nodo-shop.nl/nl/rflink-gateway/159-rflink-arduino-dipool.html

the one you linked is ment for usage on a synology(although i don’t see why that wouldn’t work aswell)
Those are to be connected by usb to your pi.
Check http://rflink.nl ,its a bit messy, but all info is in there.

Most info about configuring blinds/rflink is in the components of ha, with some pitfalls. Shout if you need a hand :wink:

P.S: If you don’t use their solder service, you can just find the parts on aliexpress/gearbest at a fraction of the price and build it yourself. SolderService+case is a quick easymode ofc :slight_smile:

Perfect, thanks!
Just last one before i start soldering :slight_smile: . Do you know if it will work from one room to another. The raspberry pi is upstairs and blinds are downstairs. I wonder if the signal will be able to go through or does it need to be close to each other and without obstruction?

Thanks,
Alex

Mine r about 10 meters apart. But with that antenna I think you should be fine. Can receive sensors and switches(and mess with them) from neighbors so:)

Hey, I am actually looking to setup a smart blind for my home and was wondering if you can help a but with the info.

It looks like this is happening! Europe release Feb 2nd, and US release April 1st.

Here is a video showing the setup in action:

I am all for a DIY solution. But it looks like these will be priced pretty well, unlike every other out-of-the-box solution in this category.

2 Likes

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!

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.

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