My Adaptive Cover Pro setup for a ground-floor bedroom #798
Replies: 2 comments
|
A huge thank you for all the details.... Great job, great sharing. |
|
Small update: I edited the original post and expanded it quite a bit. The first version mostly described how I use Custom Positions, but it did not explain the full ACP decision flow around them — solar tracking, default behavior, the different sun elevation thresholds, manual override, and why the priorities are arranged the way they are. The updated version should now give a better picture of the whole setup, not just the Custom Position helpers. A few notes about the ACP features I currently do not use in this instance:
When I later move a similar ACP setup to the living room, I will probably add another Custom Position for projector mode. For example, when the projector turns on, all relevant blinds should close to If anyone has questions about the configuration, or ideas for tweaking/improving it, I am happy to answer and discuss. I am still tuning this setup, so suggestions and different approaches are very welcome. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
I am using Adaptive Cover Pro for external venetian blinds in a ground-floor bedroom. The cover supports both position and tilt, and my goal is not only “maximum thermal optimization”, but a practical setup that balances:
The apartment is not easy to equip with normal air conditioning, so I am trying to use a combination of external blinds and, later, automated window ventilation to reduce summer heat as much as possible.
I already have Vektiva Smarwi smart window openers at home, but I still need to find time to install them. My long-term idea is to combine:
So the system can eventually decide not only how to position the blinds, but also when opening the windows could actually help cool the apartment.
Why I use helpers instead of one big template
I split the logic into Home Assistant helpers and keep ACP Custom Positions mostly as a clean mapping:
This makes the system much easier to debug. Each helper answers one question, for example:
Then ACP priority decides which active policy physically wins.
Multiple helpers are allowed to be active at the same time. I do not try to make every helper exclude all higher-priority helpers. ACP priority is the conflict resolver.
Position / tilt targets
I describe my targets as:
For this bedroom setup, the important targets are:
30/00/180/11instead of0to avoid mechanical clicking/knocking when moving from0/xto0/0.0/100The
30/0target is a deliberate compromise. Full closure would block heat better, but while somebody may be home it makes the room too dark.30/0is my “maximum acceptable” heat protection for present-like mode.Lowered-open state:
0/100One important target in my setup is:
This means:
I use this as a useful evening/night base state. The blind is already physically lowered, but the slats stay open for airflow and for a less “closed-in” feeling.
This is especially useful in a ground-floor bedroom. If the blind is already lowered and somebody later turns on the bedroom light, ACP does not need to move the whole blind down first. It can usually react mostly by changing tilt:
instead of doing a larger movement like:
That is faster, quieter, and less visible from outside.
In my setup this
0/100state is mainly expressed through thehome_present_night_airflowCustom Position:This helper becomes active when somebody may be home and it is already deeply dark outside.
I also have ACP sunset values configured as:
but the intentional and easiest-to-understand part of my setup is the Custom Position rule above. So I treat
0/100primarily as my night-airflow / lowered-open base state, not as a pure “close at sunset” rule.Light, privacy, airflow, and solar thresholds
I use several different sun elevation thresholds, and each one has a different purpose. I do not use one single “sunset” threshold for everything.
0/100home_present_night_airflow/ deep darkness0/100< 7°0/180/18>= 15°The difference between
0/100and0/18is important for me.0/100is a lowered-open base state: the blind is already down, but the room still feels open and airflow is possible.0/18is the stronger privacy pre-positioning state. Below about7°sun elevation I assume that if someone enters the room, they will probably need to turn on the light, for example to take something from the wardrobe. So I want the blind already in privacy tilt before that happens.The bedroom light rule then acts as actual privacy enforcement. If the blind is already pre-positioned, turning on the light usually does not need to trigger a large movement.
Solar tracking and daytime gate
Solar tracking is gated by sun elevation and window geometry.
In this setup I only want solar tracking when the sun is high enough to matter for this window, so both the solar minimum elevation and my daytime gate are based around
15°elevation.My daytime gate template is also based on sun elevation:
The bedroom window faces approximately azimuth
104°, with a wide field of view of about±85°.That gives a rough sun-in-window sector of:
So ACP only treats the sun as relevant for this window when the sun is roughly within
19°..189°, and above the minimum elevation.Outside of valid solar-tracking conditions, ACP falls back to the normal priority pipeline: Custom Positions first, then default behavior.
Evening and night behavior is mostly handled by my own helpers:
home_present_low_light_privacybelow7°->0/18home_present_night_airflowat or below-10°->0/100I also have
sunset_position: 0andsunset_tilt: 100configured, but the main intentional evening/night behavior in my setup is expressed through the Custom Position helpers above.Occupancy model
I design the logic around two occupancy groups:
The concrete Home Assistant house mode states are implementation details. The cover logic mostly cares whether somebody may need comfort/privacy inside, or whether nobody is expected to care about daylight comfort.
In my current setup:
So the helpers use
present_okoraway_ok, not a long cover-specific list of house-mode decisions.Helper dependency graph
The setup is built as a small chain of helpers, not one giant template.
High-level dependency graph:
Room-local heat risk uses a separate local sensor path:
Base weather / thermal helpers
General outdoor temperature sensor
This is my general outdoor temperature source from a local weather integration.
In my private setup this is a specific local weather-station entity, but for a public example I would describe it generically as:
sensor.<general_outdoor_temperature>It is not the final decision helper. It is used as the input for the 7-day average temperature helper.
sensor.outdoor_7d_avg_tempThis is a statistics helper over the general outdoor temperature.
Configuration:
So it gives a rolling 7-day outdoor average temperature.
I use this instead of the current outdoor temperature for seasonal classification because one hot or cold day should not flip the whole home strategy immediately.
sensor.microseasonThis helper converts the rolling 7-day outdoor average into a more useful “thermal season” than the calendar season.
It uses:
Template:
The important idea is that I split the year into practical thermal periods:
winterearly_springspringearly_summersummerearly_autumnautumnlate_autumnThe helper also uses the previous state as a simple stabilizer: if the previous microseason is still one of the currently valid candidates, it keeps it. That avoids unnecessary bouncing near threshold boundaries.
sensor.home_passive_thermal_modeThis helper turns the detailed microseason into a simple home-level strategy:
Template:
Meaning:
keep_heat_outearly_summer,summer,early_autumnkeep_heat_inThis helper still does not decide the blind position directly. It is a shared input for room and home policy helpers.
Room-local outside temperature helpers
Local bedroom cover/window temperature sensor
This is a local Zigbee temperature sensor mounted near the bedroom cover/window.
Public example name:
sensor.bedroom_cover_outside_temperatureIn my real setup the entity name is slightly more verbose because of how the Zigbee integration generated it, but the meaning is:
It is intentionally different from the general outdoor weather-station temperature. It should represent the microclimate near this specific blind/window.
binary_sensor.bedroom_cover_outside_hot_temperatureThis is the bedroom-local hot-temperature threshold helper.
Configuration:
Meaning:
This helper is room-local. Other windows/rooms should get their own equivalent local temperature helper.
binary_sensor.bedroom_present_outside_heat_riskThis helper combines occupancy, passive thermal mode, and the local bedroom outside temperature.
Template:
It is active when:
keep_heat_outACP target:
This is softer present-like heat protection. It reduces heat gain but keeps a daylight gap.
Away-like heat helpers
binary_sensor.home_away_heat_protectionThis is a global away-like heat protection helper.
Template:
It is active when:
keep_heat_out7°ACP target:
It does not use current outdoor temperature. If nobody is home and the home is in a heat-out period, the goal is to block solar heat gain aggressively.
binary_sensor.bedroom_away_heat_retentionThis is a room-local heat-retention helper for the bedroom.
Template:
Bedroom geometry:
It is active when:
keep_heat_inACP target:
This helper is room-local because each room/window has different geometry.
Sleep and privacy helpers
binary_sensor.bedroom_sleep_blackoutTemplate:
It is active when:
-10°ACP target:
It turns off at deep night so that night airflow can operate normally when it is already naturally dark.
binary_sensor.bedroom_light_privacyTemplate:
It is active when:
ACP target:
This does not depend on outdoor brightness. If the room light is on, privacy is desired.
Storm helpers
binary_sensor.weather_thunderstormTemplate:
It is active only when the weather entity currently reports a thunderstorm-like condition.
I do not use MeteoSwiss warnings for this rule right now.
binary_sensor.weather_thunderstorm_recentThis is a technical hold helper based on
binary_sensor.weather_thunderstorm.Behavior:
It should not include house-mode logic. House-mode logic belongs in
home_present_storm_comfort.binary_sensor.home_present_storm_comfortTemplate:
ACP target:
This is a comfort policy, not a hardware safety policy. It can release immediately if the home becomes away-like, even if the technical storm-recent helper is still in its 10-minute hold period.
Light / night helpers
binary_sensor.home_present_night_airflowTemplate:
It is active when:
-10°ACP target:
This keeps the blind lowered but opens the slats for night airflow.
binary_sensor.home_present_low_light_privacyTemplate:
It is active when:
7°ACP target:
The
7°threshold is my “indoor light likely needed soon” threshold.At this point I assume the room will probably need artificial light if somebody enters, so the blind is already in privacy tilt before the bedroom light is actually switched on.
Manual override
Manual override is triggered from the Shelly wall-switch input sensors, not from generic inferred external movement.
Relevant idea:
I ignore generic inferred external position changes, but explicit Shelly input changes are used as the manual-control signal.
In practical terms, if someone presses the wall switch, ACP should stop fighting them and should hold manual override for the configured duration.
For this cover, manual override sits at priority
80, so it wins over normal solar tracking and most comfort helpers, but my storm comfort Custom Position is intentionally higher at priority95.Final ACP priority ladder
95home_present_storm_comfort0/18078bedroom_sleep_blackout0/176home_away_heat_protectionORbedroom_away_heat_retention0/074bedroom_light_privacy0/1872home_present_night_airflow0/10071bedroom_present_outside_heat_risk30/070home_present_low_light_privacy0/18400100The simplified decision flow is:
Notes on unused ACP features in this instance
For this bedroom instance, I currently do not use these ACP features as the main logic layer:
I keep most of that logic outside ACP for now because I want to understand and debug the behavior clearly.
For example, my weather/storm behavior is handled through my own helper and then mapped into ACP as Custom Position #1.
Why this setup is not purely thermal
If this were only about thermal performance, many rules would simply close the blind fully.
But this is a bedroom that people actually use, so the real target is a compromise:
For example:
30/0is weaker than full closure, but much more acceptable while someone is home.0/18gives privacy without fully sealing the room visually.0/100gives night airflow while still keeping the blind physically lowered.0/1is used instead of exact0/0in some comfort rules to reduce slat knocking/clicking on my hardware.That is why I find ACP Custom Positions useful: ACP handles the final priority decision, but I can keep the meaning of each rule understandable.
Debugging approach
The biggest advantage of this structure is debugging.
If the blind is in an unexpected position, I can check:
In ACP diagnostics, the decision trace makes this very clear because it lists each handler and whether it matched.
Example:
or during direct sun:
or during manual wall-switch use:
This is much easier to debug than one huge automation with all logic embedded in one place.
Current limitations / things I may still change
This setup is still evolving.
Things I may still adjust:
30/0present-like heat-protection targetI am sharing this mainly as a practical example of how ACP can be used as a priority-based cover policy engine, with most of the “why” expressed through small Home Assistant helpers.
All reactions