<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>K@smarthome on Martin Sukany</title><link>https://sukany.cz/tags/k@smarthome/</link><description>Recent content in K@smarthome on Martin Sukany</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://sukany.cz/tags/k@smarthome/index.xml" rel="self" type="application/rss+xml"/><item><title>Home Assistant Blinds: The Practical Setup I Actually Use</title><link>https://sukany.cz/blog/2026-04-09-home-assistant-blinds-practical-setup/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://sukany.cz/blog/2026-04-09-home-assistant-blinds-practical-setup/</guid><description>&lt;p&gt;I try to keep my Home Assistant setup boring in the best possible way. My blinds are not driven by a giant all-knowing automation. Instead, I use a few small pieces that are easy to understand, easy to disable, and easy to restore.&lt;/p&gt;
&lt;p&gt;This post describes the pattern I use at home and how I expose it to Keeper, my Home Assistant assistant agent. If you want something you can reproduce, this is the important part: keep the physical covers, the room-level toggles, and the higher-level automations separate.&lt;/p&gt;
&lt;h2 id="what-the-setup-looks-like"&gt;What the setup looks like&lt;/h2&gt;
&lt;p&gt;I have four rooms with blinds, each exposed as a normal &lt;code&gt;cover.&lt;/code&gt; entity in Home Assistant. In my case they are Shelly-controlled covers, but the pattern does not depend on Shelly specifically.&lt;/p&gt;
&lt;p&gt;For each room I also keep a small set of helper entities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one &lt;code&gt;input_boolean&lt;/code&gt; that says whether room automation is allowed&lt;/li&gt;
&lt;li&gt;one &lt;code&gt;input_number&lt;/code&gt; for the target blind position&lt;/li&gt;
&lt;li&gt;one &lt;code&gt;input_number&lt;/code&gt; for the target tilt angle&lt;/li&gt;
&lt;li&gt;one optional &lt;code&gt;input_boolean&lt;/code&gt; for shading mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This gives me a simple contract. The real cover entity moves hardware. Helper entities store intent.&lt;/p&gt;
&lt;h2 id="the-core-idea-automation-is-a-toggle-not-a-trap"&gt;The core idea: automation is a toggle, not a trap&lt;/h2&gt;
&lt;p&gt;The most useful thing I added was a watchdog automation per room. The watchdog listens to a room toggle such as &lt;code&gt;input_boolean.automatika_zaluzie_loznice&lt;/code&gt; and does only two jobs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when the toggle is turned on, it enables the room automation&lt;/li&gt;
&lt;li&gt;when the toggle is turned off, it disables the room automation, waits four hours, and enables it again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That sounds trivial, but it solves a real problem. Manual override stays manual for long enough to matter, but I do not forget to restore the default behavior the next day.&lt;/p&gt;
&lt;p&gt;In practice, each room has a tiny watchdog automation that turns one real automation on or off. That is much easier to reason about than embedding override logic into every rule.&lt;/p&gt;
&lt;h2 id="room-rules-stay-separate-and-practical"&gt;Room rules stay separate and practical&lt;/h2&gt;
&lt;p&gt;The room automations themselves stay focused.&lt;/p&gt;
&lt;p&gt;Examples from my setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bedroom and kids room use thermal-comfort automations with a default “down + tilt” target&lt;/li&gt;
&lt;li&gt;kitchen has a late-afternoon sun rule that keeps the view usable and also checks cloud conditions&lt;/li&gt;
&lt;li&gt;living room has its own thermal and comfort rule, and I can disable it independently when I want full manual control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also use one helper script for the annoying real-world detail: sometimes position and tilt must be applied in sequence. The script &lt;code&gt;script.blinds_ensure_position_then_tilt&lt;/code&gt; makes that idempotent and adds a timeout, so the higher-level automations can call one stable interface instead of duplicating movement logic.&lt;/p&gt;
&lt;h2 id="how-keeper-fits-into-this"&gt;How Keeper fits into this&lt;/h2&gt;
&lt;p&gt;Keeper does not need to know every low-level rule. It only needs a safe control surface.&lt;/p&gt;
&lt;p&gt;In my setup, that means Keeper works with Home Assistant domains such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cover.*&lt;/code&gt; for open, close, or set position&lt;/li&gt;
&lt;li&gt;&lt;code&gt;automation.*&lt;/code&gt; for turning room logic on or off&lt;/li&gt;
&lt;li&gt;&lt;code&gt;script.*&lt;/code&gt; for the reusable “ensure position, then tilt” action&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_boolean.*&lt;/code&gt; and &lt;code&gt;input_number.*&lt;/code&gt; for room intent and defaults&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That separation matters. If I change an implementation detail inside Home Assistant, I do not need to redesign Keeper. I keep the same room-level interface and update only the HA internals.&lt;/p&gt;
&lt;h2 id="if-you-want-to-reproduce-it"&gt;If you want to reproduce it&lt;/h2&gt;
&lt;p&gt;Start with one room only.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Expose your blind as a &lt;code&gt;cover&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add one boolean helper that means “automation enabled”.&lt;/li&gt;
&lt;li&gt;Create one actual room automation.&lt;/li&gt;
&lt;li&gt;Add one watchdog automation that turns the room automation back on after a few hours.&lt;/li&gt;
&lt;li&gt;If tilt is unreliable, wrap it in one reusable script instead of solving it differently in every room.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is enough to get a system that is practical, debuggable, and friendly to both manual control and agent-driven control.&lt;/p&gt;
&lt;p&gt;The main lesson is simple: do not make your blinds smart in one big step. Make them composable. That is what made the setup usable for me.&lt;/p&gt;</description></item></channel></rss>