Don’t just move your external venetian blinds up and down with Shelly and Home Assistant – tilt the slats precisely, to the percent. For years this only worked with ugly workarounds. Since firmware 1.5.0 (early 2025), Shelly devices from Gen2 onwards support it natively. I overlooked the feature for more than a year and only found it because of a bug somewhere completely different – today I’m a big fan. Here’s how to set it up, plus the two automations that only flash by in the video, complete and ready to copy.

Position and tilt: two independent values
With slat control enabled, a cover entity in Home Assistant has two values:
| Value | Meaning | 0 % | 50 % | 100 % |
|---|---|---|---|---|
Position (current_position) | Height of the blind | fully closed | half | fully open |
Tilt (current_tilt_position) | Slat angle | slats pointing down | horizontal | slats pointing up |
The key point: the blind stays at a fixed height, and you still control exactly how much light and sun gets through – purely via the slat angle. In the video I show this on my office blind with a Shelly Plus 2PM: I only move the tilt from 20 to 50 to 80 %, and the height stays the same the whole time.
Backstory: my ugly workarounds
This wasn’t always possible natively. My south-facing windows originally had four Shelly 2.5 – first-generation devices that still don’t support tilt. My workaround back then: four custom switches in Home Assistant that sent a very short pulse via the Shelly REST API, 200 milliseconds up or down, to move the slats somewhat precisely. Yes, it was every bit as hacky as it sounds.
Later I replaced them with second-generation devices – but completely missed the new feature in early 2025. My wake-up routine had a similar trick (more below). By now I’ve thrown all of that out.
Which Shellys support tilt? All cover-capable Shellys from Gen2 onwards (Plus and Pro series as well as Gen3/Gen4) with firmware 1.5.0 or later. First-generation devices (e.g. Shelly 2.5) don’t.
Shelly setup: Slat Control
In the Shelly web interface: Cover → Settings → Slat Control.
- Open Time / Close Time: how long a full slat rotation takes (all the way down to all the way up). Shelly suggests 1.5 s – mine is 1.1 s. Adjust this to your blind, otherwise the calculated percentages will be off.
- Don’t confuse this with the regular travel-time calibration of the blind. That one runs automatically; the slat time has to be entered manually.
- Retain Slat Position: keeps the slat angle when the blind moves. If tilt is at 50 % and you move the blind halfway up, Shelly restores 50 % afterwards.
- Precise Slat Position: according to the docs, this makes slat control even more precise. I haven’t noticed any difference in daily use – if you know what it actually does, let me know in the comments.
The wall switch behaves differently, too: a short press now only moves the slats (in 20 % steps), a long press moves the whole blind as usual. A short press while moving stops it.
How I found the feature: a Matter bug
I didn’t discover Slat Control on my blinds but somewhere completely different: I’m currently testing the new Shelly Gen4 devices, including their Matter support. If you add a Shelly to Home Assistant via Matter and Slat Control is not enabled, Home Assistant doesn’t create a cover entity at all.
The reason: Shelly then reports no value for tilt – null in programming terms, not to be confused with the number 0. That’s exactly what trips up Home Assistant’s Matter integration. As soon as Slat Control is enabled, a real number arrives and the cover entity shows up normally. While debugging this, I came across the setting for the first time.
Update: I contributed a bugfix to Home Assistant for this, shipping with HA 2026.9.3. More on that – and on Matter and Zigbee with the Gen4 devices – in my upcoming videos.
In Home Assistant: attribute and action
- Read: attribute
current_tilt_positionon the cover entity - Set:
cover.set_cover_tilt_position– analogous tocover.set_cover_position
| |
Important: move first, wait, then tilt
In theory Home Assistant can combine position and tilt in one call, but not every device handles that cleanly – it caused problems for me. So:
- Move the blind (
cover.close_coverorcover.set_cover_position) - Wait until it has arrived (
wait_template) - Only then call
cover.set_cover_tilt_position
Without the wait, the commands can override each other and the blind ends up in a state you never wanted.
Automation 1: sun protection based on the sun’s position
My setup consists of two blueprints. The YAML is identical to the German version of this article – labels and descriptions inside the blueprints are in German.
Blueprint A: is the sun hitting the window?
This blueprint turns on an input_boolean per window front (e.g. input_boolean.sudfenster_beschienen) as soon as the sun actually shines onto the glass. It takes into account the compass direction, the orientation of my house (offset: 23 degrees) and the roof overhang: if the sun is high enough, the overhang shades the window and nothing needs to close.
| |
sensor.sun_solar_azimuth and sensor.sun_solar_elevation come from the built-in Sun integration (you may need to enable them). Adjust offset, roof_overhang and window_height to your house.
Blueprint B: close the blind and tilt the slats
This blueprint reacts to the input_boolean from blueprint A: when the sun hits the window, the blind closes, waits until it’s really closed and then tilts the slats to the configured value. When the sun moves away, it opens again – but only if the automation closed it in the first place.
| |
Two entities are specific to my house – replace or remove them:
binary_sensor.sonne_scheint(“sun is shining”) – a brightness sensor so nothing closes on cloudy days.sensor.automation_cover_state– remembers which blinds were closed automatically today. That way the automation never opens a blind you closed yourself, and never closes one again that you opened manually.
Using the blueprint looks like this:
| |
tilt_after_close: 50 sets the slats horizontal. Depending on the window and the incoming light, a different value may work better.
Automation 2: wake-up routine with daylight
My wake-up routine gently brings up lights and radio in the morning. The last step used to be an ugly hack: if the blind was fully closed, it was moved to position 1 % so some light could come through the slat gaps. It sort of worked, but it wasn’t real tilt.
Now the blind stays closed and only the slats are tilted:
| |
The current_position: 0 condition makes sure an already opened blind isn’t touched. continue_on_error prevents the whole routine from aborting if the Shelly happens to be unreachable.
The rest of the routine, in short:
- 10 minutes after the trigger: dim up the bedroom lights over 20 minutes (
transition: 1200) - Set Sonos volume to 0 and start my favorite station – with up to 3 attempts until the player actually reports
playing - Raise the volume in 8 steps, 2 minutes apart
- Tilt the slats (see above)
My takeaway
The feature has been in the firmware since early 2025 – and it’s worth browsing your Shelly settings every now and then, even if you think you know your device inside out.
Two questions for you: do you know what Precise Slat Position actually does? And do you have blinds that could tilt, but you’re not using it yet? Let me know in the comments!
If you haven’t automated your blinds with Shelly at all yet, start with my article Make Blinds Smart with Shelly.
Ad: Want to get a Shelly? Use the code SMARTHOMEABERSICHER-10OFF for 10 % off via this link (affiliate link).
Shelly supplied the Gen4 devices briefly shown in the video free of charge. Shelly had no influence on the content of this article.
Note: Links marked with affiliate link are affiliate links. As a partner of various retailers and manufacturers (e.g. Amazon, OBI via the Awin network, Shelly) I earn from qualifying purchases. This means I receive a small commission if you purchase through these links — at no extra cost to you. The revenue helps me run this blog and YouTube channel and keep creating content. Thank you for your support!
― Joachim
