<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[JLo's Blog]]></title><description><![CDATA[I'm Jean-Loïc, but everybody calls me JLo. I am currently the Lead of Product and Design at the Open Home Foundation (Home Assistant, Music Assistant, ESPHome). This is my blog.]]></description><link>https://blog.jlpouffier.fr/</link><image><url>https://blog.jlpouffier.fr/favicon.png</url><title>JLo&apos;s Blog</title><link>https://blog.jlpouffier.fr/</link></image><generator>Ghost 5.62</generator><lastBuildDate>Tue, 07 Apr 2026 21:05:32 GMT</lastBuildDate><atom:link href="https://blog.jlpouffier.fr/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[A complex smart heating system, simply built.]]></title><description><![CDATA[<p>Winter is coming, so it&apos;s a good time to take care of the heating in our homes. In this post, I will show how I built a complex heating system for my home using Home Assistant. I also have a secret agenda &#x1F648; It&apos;s to share</p>]]></description><link>https://blog.jlpouffier.fr/a-complex-smart-heating-system-build-simply/</link><guid isPermaLink="false">67213a25b30ee400017c39a3</guid><category><![CDATA[Home Assistant]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Wed, 30 Oct 2024 08:32:26 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1530389361604-f5fb2936a855?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHRoZXJtb3N0YXR8ZW58MHx8fHwxNzMwMjc3MDI3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1530389361604-f5fb2936a855?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHRoZXJtb3N0YXR8ZW58MHx8fHwxNzMwMjc3MDI3fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="A complex smart heating system, simply built."><p>Winter is coming, so it&apos;s a good time to take care of the heating in our homes. In this post, I will show how I built a complex heating system for my home using Home Assistant. I also have a secret agenda &#x1F648; It&apos;s to share my <strong>thought process</strong> when approaching an automation problem that looks complex. </p><p>In this blog post, you will learn that you can build complex automations by combining two things:</p><ul><li>Planning upfront what you want to achieve</li><li>Breaking down the automation into smaller, simpler parts</li></ul><h2 id="the-outcome">The outcome</h2><p>Let&apos;s start by the end. Let me &quot;sell&quot; you what I created so that you want to continue reading &#x1F4AA;&#x1F3FB;. &#xFE0F;</p><p>My heating system is <strong>granular</strong> per room, each room has a standalone heating mode that can be:</p><ul><li><code>Present</code></li><li><code>Absent</code></li><li><code>Vent</code></li></ul><p>Each mode (of each room) has a <strong>different target temperature</strong> based on the official French energy savings recommendations.</p><p>The heating mode is automatically set based on a few factors:</p><ul><li>Presence in the room</li><li>Ventilation of the room (It&apos;s a fancy term to say &quot;Windows open&quot;)</li></ul><p>If I am working in my office, only my office will be set to <code>Present</code>, and every other room will be set to <code>Absent</code>. Rooms with the windows open will be set to <code>Vent</code>.</p><p>Basically, the <strong>heat follows me</strong>. I heat only what&apos;s necessary.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.41.11@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="2000" height="1222" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-21.41.11@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-21.41.11@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-29-at-21.41.11@2x.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2024/10/CleanShot-2024-10-29-at-21.41.11@2x.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>My heating control center. I rarely go there, everything is automated.</figcaption></figure><p>I can also <strong>override anything manually</strong>, without going to Home Assistant. I just walk to a radiator, turn the valve and the room goes into override for a specific amount of time (In my system: One hour).</p><blockquote><strong>Helpful, but never in my way</strong>. </blockquote><p>If one day I am sick and cold while going to bed, I don&apos;t want to fight with my house to get heat. </p><p>I also have other specificities for specific rooms, such as a <code>Boost</code> mode in my bathroom that automatically triggers when I take a shower based on humidity. I won&apos;t go into all the little detail in this post, simply because I won&apos;t need to. We&apos;re going to focus on a single room, but the same thought process was used in every room. Sometimes inputs slightly vary from room to room, but the principle stays the same. &#xA0;</p><h2 id="hardware">Hardware</h2><p>Let&apos;s not get fixated too much on hardware, I think what I created could work with almost any hardware available. I do not own fancy stuff.</p><h3 id="heating">Heating</h3><p>I have a gas boiler. It&apos;s connected to a smart thermostat. Mine is a Netatmo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/thermostat.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1200" height="900" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/thermostat.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/thermostat.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/thermostat.png 1200w" sizes="(min-width: 720px) 720px"><figcaption>A Netatmo thermostat</figcaption></figure><p>Each radiator has a thermostatic valve, I stayed on the same Netatmo ecosystem</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/valve.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1200" height="900" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/valve.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/valve.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/valve.png 1200w" sizes="(min-width: 720px) 720px"><figcaption>A Netatmo thermostatic valve</figcaption></figure><p>They all work the same way. The thermostat controls when the gas boiler heats or not. The thermostatic valves open or close based on the room temperature.</p><p>By default, these systems are usually set in a mode called <code>Eco</code> (Or similar). In this mode, only the thermostat can request heat from the boiler. So if the room where the thermostat is located is &quot;warm&quot; (It&apos;s usually in the main living space) and you set the thermostatic valve of a secondary room (like a bedroom) to a temperature higher than the current temperature, nothing will happen. The valve may open but the thermostat won&apos;t request heat, so the room won&apos;t heat up. The reasoning behind this is cost saving, as it is difficult to request heat in a granular way out of the box (but we are going to do it &#x1F609;).</p><p>There is usually another mode, called <code>Comfort</code> (Or similar) that allows individual valves to request heat. You can heat a secondary room independently of the temperature of the room hosting the thermostat. This is the mode my system is in.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F449;&#x1F3FB;</div><div class="kg-callout-text">In Home Assistant, every radiator is represented by a device that exposes a <code>climate</code> entity. The thermostat too.</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.14.20@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1546" height="1838" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-21.14.20@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-21.14.20@2x.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.14.20@2x.png 1546w" sizes="(min-width: 720px) 720px"><figcaption>The Netatmo Ecosystem in Home Assistant</figcaption></figure><p>A climate entity is simply a representation of something that heats or cools (or both). It has a current temperature, a target temperature, and a mode. My climate entities are &quot;pure heating&quot; entities, they have only one mode, <code>heating</code>. If the target temperature is above the current one, it heats, else it is idle. It does not get simpler than that.</p><h3 id="presence">Presence</h3><p>I also have presence sensors in every room. Mine are <a href="https://shop.everythingsmart.io/collections/everything-presence-one">Everything Presence One</a>. They are awesome.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/presense_sensor.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="900" height="1200" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/presense_sensor.png 600w, https://blog.jlpouffier.fr/content/images/2024/10/presense_sensor.png 900w" sizes="(min-width: 720px) 720px"></figure><p> A presence sensor is simply a sensor that detects presence (not movement!). These ones use a technology called mmWave sensing. They detect movements as small as a fraction of a millimeter, such as the chest movements from a beating heart, or breathing.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F449;&#x1F3FB;</div><div class="kg-callout-text">In Home Assistant, they are represented by a device exposing a presence binary sensor.&#xA0;</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.11.42@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1546" height="1164" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-21.11.42@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-21.11.42@2x.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.11.42@2x.png 1546w" sizes="(min-width: 720px) 720px"><figcaption>My presence sensors in Home Assistant</figcaption></figure><p>A simple boolean value that is either <code>on</code> when presence is detected, or <code>off</code> otherwise</p><h3 id="openings">Openings</h3><p>I also have contact sensors on all my windows and doors. Mine are Zigbee Aqara sensors. I bought a dozen of them second-hand. These things are unkillable, I just changed the battery when I received them.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/IMG_7106.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1200" height="900" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/IMG_7106.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/IMG_7106.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/IMG_7106.png 1200w" sizes="(min-width: 720px) 720px"><figcaption>A contact sensor</figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">&#x1F449;&#x1F3FB;</div><div class="kg-callout-text">In Home Assistant, these are represented by a device exposing an opening binary sensor.&#xA0;</div></div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.55.10@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1986" height="1100" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-21.55.10@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-21.55.10@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-29-at-21.55.10@2x.png 1600w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-21.55.10@2x.png 1986w" sizes="(min-width: 720px) 720px"><figcaption>My contact sensors in Home Assistant</figcaption></figure><p>A simple boolean value that is either <code>on</code> when the &quot;support&apos; (door or window) is open or <code>off</code> otherwise.</p><p>This is all the hardware I use for my heating system.</p><h2 id="the-plan">The plan</h2><p>In this blog post, I&apos;ll focus on a single room, not because I am lazy or want to hide complexity, but simply because it&apos;s all you need to know to understand the whole system. What I did in a room, I repeated it in every other room.</p><p>So I&apos;ll focus on my office, it&apos;s a pretty generic room in my home. It has a window with a contact sensor, a presence sensor, and a radiator. That&apos;s about it.</p><p>Let&apos;s start by looking at the bigger picture, and break it down into pieces.</p><p>I want modes, driven by a few inputs such as the state of my window or the presence in my office. Modes will drive the target temperature. The target temperature, and also the manual override, will drive the radiator.</p><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">&#x2705;</div><div class="kg-callout-text">Here I defined 3 different <strong>independent</strong> pieces</div></div><ul><li>Inputs drive modes</li><li>Modes drive the target temperature</li><li>The target temperature (And the overdrive) drives the actual radiator</li></ul><p> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-13.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1130" height="2106" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-13.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/image-13.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/image-13.png 1130w" sizes="(min-width: 720px) 720px"><figcaption>The high level plan</figcaption></figure><h3 id="the-modes">The modes</h3><p>We need to start somewhere, let&apos;s start with the modes. They seem to be the simplest to grasp when starting from a blank page.</p><p>I want 3 modes in this specific room.</p><ul><li><code>Present</code> when I am present</li><li><code>Absent</code> when I am not</li><li><code>Vent</code> when the windows are open</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-2.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1394" height="196" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-2.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/image-2.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/image-2.png 1394w" sizes="(min-width: 720px) 720px"><figcaption>The heating modes for my office</figcaption></figure><h3 id="the-target-temperatures">The target temperatures</h3><p>I researched online the local heating recommendations and found that for a &quot;living space&quot;, such as a living room or an office, the recommended target temperature when the room is used is 19&#xB0;C. When the room is not used, it is 16&#xB0;C. </p><p>Then, most heating specialists recommend setting a minimum temperature of 7&#xB0;C if the windows are open to prevent pipes from bursting if something really bad happens and you need to leave your house unattended for a long time with the windows open in cold winter (This is called Frost Protection or Frost Guard)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-14.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1394" height="1376" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-14.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/image-14.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/image-14.png 1394w" sizes="(min-width: 720px) 720px"><figcaption>The heating modes of my office and their respective target temperatures</figcaption></figure><h3 id="the-inputs">The inputs</h3><p>I do not want to change modes manually, so I need to find the triggers and conditions that will drive my modes.</p><p>We already talked about most of it, now let&apos;s clarify the details.</p><p>If the windows are open, whether I am present or not in the room, I want the mode to be set to <code>Vent</code>. To avoid constantly changing the modes, and also because a heating system has an inherent inertia, let&apos;s add a small minimum duration and say that the mode should be set to <code>Vent</code> if the windows are open for more than 5 minutes. <br>5 minutes could seem a bit random, but I usually vent my office during breaks. <em>(I have an Air Quality sensor in every room that shows it&apos;s enough in my case)</em></p><p>Then if the windows are closed, I want the mode to be set to <code>Present</code> if presence is detected, else to <code>Absent</code>. &#xA0;Let&apos;s also solve all the small nuances here. Presence detection can be finicky sometimes, and detect presence when there is not (We call this a false positive) or not detect presence when there is (We call this a false negative). I also want to avoid setting a room to <code>Present</code> just because I went there to grab something, so let&apos;s also put a 5-minute minimum duration. I also live with pets that constantly trip presence detection, I cannot really do much here but I can at least optimize one common use case: If the home is empty, then I&apos;ll ignore the granular room presence sensors.</p><p>All in all, it looks like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-8.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1394" height="1374" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-8.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/image-8.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/image-8.png 1394w" sizes="(min-width: 720px) 720px"><figcaption>Inputs driving modes</figcaption></figure><h3 id="the-override">The override</h3><p>The override can look daunting. Is it another mode? Is it something else?</p><p>There are dozens of ways to implement an override, but I picked the simplest one (It has limitations that I am fine with because I rarely use this feature)</p><p>In Home Assistant, you can trigger an automation when something changes, or when something changes and stays &quot;there&quot; &#xA0;for a duration (We used that for the contact sensor and presence states above).</p><p>I decided to use this for my override, to trigger something when the target temperature of my radiator changed for 1 hour. </p><p>This can happen for two reasons:</p><ul><li>One hour after a mode change (in this case, the target temperature should be coherent with what the current mode is dictating)</li><li>One hour after a manual override (in this case, the target temperature should <strong>not</strong> be coherent with what the current mode is dictating)</li></ul><p>So I decided to simply re-apply the target temperature of the mode when the target temperature of my radiator has changed for 1 hour. If no override exists, it will be coherent and nothing will change. If an override exists, it will be erased.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-18.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="804" height="922" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-18.png 600w, https://blog.jlpouffier.fr/content/images/2024/10/image-18.png 804w" sizes="(min-width: 720px) 720px"><figcaption>The 1 hour override</figcaption></figure><p>Alright, the planning is done. </p><p>To be honest, we know what we want to do, but this still looks daunting at first. Look at the whole picture!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/image-17.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1394" height="2590" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/image-17.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/image-17.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/image-17.png 1394w" sizes="(min-width: 720px) 720px"><figcaption>The whole heating system for my office.</figcaption></figure><h2 id="the-implementation">The implementation</h2><p>In this section, we are going to implement this, but we are going to break it down into smaller, simpler, more manageable parts.</p><p>Eventually, the implementation will be a succession of simple parts, and the complexity will only lie in the whole.</p><h3 id="the-modes-1">The modes</h3><p>Let&apos;s start simple, we defined 3 modes, let&apos;s represent them. We will use a dropdown helper that will represent our heating modes.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F440;</div><div class="kg-callout-text"><em>You will see that I am extensively using helpers when creating automations. Helpers are a way to represent inputs or to derive data from other data points. They are extremely useful to &quot;bound&quot; the complexity.&#xA0;</em></div></div><p>As we are going to create a few of them in this post, let&apos;s do the first one together.<br>Helpers can be found under Settings &gt; Devices and Services &gt; Helpers. Or simply by clicking on that big button:</p><figure class="kg-card kg-image-card"><a href="https://my.home-assistant.io/redirect/helpers/"><img src="https://my.home-assistant.io/badges/helpers.svg" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy"></a></figure><p> The creation process of a helper is straightforward. Here is me creating the heating office modes.</p><figure class="kg-card kg-video-card kg-card-hascaption"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2024/10/CleanShot-2024-10-29-at-22.57.49.mp4" poster="https://img.spacergif.org/v1/2174x1284/0a/spacer.png" width="2174" height="1284" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2024/10/media-thumbnail-ember537.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div><figcaption>Creating process of a helper in Home Assistant</figcaption></figure><h3 id="the-target-temperatures-1"> The target temperatures</h3><p>Each mode has a target temperature attached to it, let&apos;s create three new helpers, one per mode that store that target temperature. This time, we will use a number helper. I won&apos;t show all the creation of the helpers, it&apos;s a matter of following what is on the screen &#x1F609;</p><p>This is what we have done so far. Nothing is automated, nothing is even linked. We just have a dropdown and 3 numbers</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.08.08@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1854" height="1162" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-23.08.08@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-23.08.08@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-29-at-23.08.08@2x.png 1600w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.08.08@2x.png 1854w" sizes="(min-width: 720px) 720px"></figure><p>Let&apos;s tie the targets and the modes by creating, you guessed it, another number helper that will represent the overall office target temperature. And this time, let&apos;s automate it.</p><p>The automation is really simple.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.18.25@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="2000" height="1338" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-23.18.25@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-23.18.25@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-29-at-23.18.25@2x.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2024/10/CleanShot-2024-10-29-at-23.18.25@2x.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>We trigger on everything, a change of mode or a change of our 3 helpers holding the target temperature for each mode. </p><p>Then based on the mode, we set the value of the office target temperature based on the target temperature of the mode.</p><p>The YAML looks like this but don&apos;t get discouraged by it, it&apos;s simple to do via the UI</p><pre><code class="language-YAML">alias: Compute Office Target Temperature
triggers:
  - trigger: state
    entity_id:
      - input_select.office_heating_modes
      - input_number.office_target_temp_absent
      - input_number.office_target_temp_present
      - input_number.office_target_temp_vent
  - event: start
    trigger: homeassistant
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.office_heating_modes
            state: Present
        sequence:
          - action: input_number.set_value
            data:
              value: &quot;{{states(&apos;input_number.office_target_temp_present&apos;)}}&quot;
            target:
              entity_id: input_number.office_target_temp
      - conditions:
          - condition: state
            entity_id: input_select.office_heating_modes
            state: Absent
        sequence:
          - action: input_number.set_value
            data:
              value: &quot;{{states(&apos;input_number.office_target_temp_absent&apos;)}}&quot;
            target:
              entity_id: input_number.office_target_temp
      - conditions:
          - condition: state
            entity_id: input_select.office_heating_modes
            state: Vent
        sequence:
          - action: input_number.set_value
            data:
              value: &quot;{{states(&apos;input_number.office_target_temp_vent&apos;)}}&quot;
            target:
              entity_id: input_number.office_target_temp
mode: single</code></pre><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>Note: I added one more trigger, a Home Assistant restart. So that if something happens during a shutdown, this automation will run at startup and fix the target temperature</em></div></div><p>Here is the result:</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2024/10/CleanShot-2024-10-29-at-23.23.10.mp4" poster="https://img.spacergif.org/v1/1830x1062/0a/spacer.png" width="1830" height="1062" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2024/10/media-thumbnail-ember645.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Prettty cool! We built a brick, a small brick but that complexity is taken care of now. We will never have to deal with it ever again.</p><p>Let&apos;s move on.</p><h3 id="the-inputs-1">The inputs</h3><p>Input will only drive the modes. Modes are already driving the target temperature. This is the beauty of breaking down the problem into smaller parts. Once a part is taken care of, we do not deal with it again.</p><p>The automation for this part is also straightforward. </p><p>I trigger on every input, some with a duration</p><ul><li>The state of my home</li><li>The presence in my office with a 5-minute duration</li><li>The state of my window with a 5-minute duration</li></ul><p>Then I select the mode based on the conditions we already defined in the planning <em>(If the window is open, it&apos;s </em><code><em>Vent</em></code><em>, if both the home presence and the office presence are on, it&apos;s </em><code><em>Present</em></code><em>, otherwise, it is </em><code><em>Absent</em></code><em>)</em></p><p>Again everything can be done via the UI, but the YAML looks like this:</p><pre><code class="language-YAML">alias: Compute Office Heating Modes
triggers:
  - trigger: state
    entity_id:
      - input_select.home_modes
  - entity_id:
      - binary_sensor.office_window
    for:
      minutes: 5
    trigger: state
  - entity_id:
      - binary_sensor.office_presence
    for:
      hours: 0
      minutes: 5
    trigger: state
  - event: start
    trigger: homeassistant
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: binary_sensor.office_window
            for:
              minutes: 5
            state: &quot;on&quot;
        sequence:
          - action: input_select.select_option
            data:
              option: Vent
            target:
              entity_id:
                - input_select.office_heating_modes
      - conditions:
          - condition: state
            entity_id: binary_sensor.office_presence
            state: &quot;on&quot;
            for:
              minutes: 5
          - condition: state
            entity_id: input_select.home_modes
            state: Occupied
        sequence:
          - action: input_select.select_option
            data:
              option: Present
            target:
              entity_id: input_select.office_heating_modes
    default:
      - action: input_select.select_option
        data:
          option: Absent
        target:
          entity_id:
            - input_select.office_heating_modes
mode: single
</code></pre><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>Note: I added one more trigger, a Home Assistant restart. So that if something happens during a shutdown, this automation will run at startup and fix the heating mode</em></div></div><p>We built more than half now! And we did not even touch the radiator yet. Here are a few screenshots of different cases. </p><p>Presence in the house, but not in the office, windows closed.<br>Mode: <code>Absent</code><br>Target temperature: 19&#xB0;C</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.23@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1576" height="1614" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-23.51.23@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-23.51.23@2x.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.23@2x.png 1576w" sizes="(min-width: 720px) 720px"></figure><p>Presence in the office, windows closed.<br>Mode: <code>Present</code><br>Target temperature: 19&#xB0;C</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.41@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1576" height="1614" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-23.51.41@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-23.51.41@2x.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.41@2x.png 1576w" sizes="(min-width: 720px) 720px"></figure><p>Presence in the office, windows open.<br>Mode: <code>Vent</code><br>Target temperature: 7&#xB0;C</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.55@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1576" height="1614" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-29-at-23.51.55@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-29-at-23.51.55@2x.png 1000w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-29-at-23.51.55@2x.png 1576w" sizes="(min-width: 720px) 720px"></figure><h3 id="lets-finally-drive-this-radiator">Let&apos;s finally drive this radiator</h3><p>The two automations we created are simple. The first one drives the mode based on a few inputs, and the second one drives the target temperature based on the mode.</p><p>The last one is also going to be simple, especially since we have all this architecture already in place. We are simply going to drive the radiator itself based on the target temperature.</p><p>I trigger on two things:</p><ul><li>An immediate change in our office target temperature helper.</li><li>A change in the radiator target temperature for 1 hour (this is for the override)</li></ul><p>Then, regardless of the trigger, I will just apply (or re-apply) the target temperature to the thermostat.</p><p>It looks like this:</p><pre><code class="language-YAML">alias: Drive Office Radiator
triggers:
  - entity_id:
      - input_number.office_target_temperature
    trigger: state
  - entity_id:
      - climate.office_radiator
    attribute: temperature
    for:
      hours: 1
    trigger: state
  - event: start
    trigger: homeassistant
actions:
  - action: climate.set_temperature
    data:
      temperature: &quot;{{states(&apos;input_number.office_target_temperature&apos;)}}&quot;
    target:
      entity_id: climate.office_radiator
mode: single
</code></pre><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>Note: Again I added one more trigger, a Home Assistant restart. So that if something happens during a shutdown, this automation will run at startup and fix the target temperature</em></div></div><h3 id="thats-it">That&apos;s it?</h3><p>Yes! 3 simple automations working as a small chain</p><ul><li>The input drives the mode</li><li>The mode drives the target temperature</li><li>The target temperature drives the radiator</li></ul><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-30-at-00.10.53@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="2000" height="1115" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-30-at-00.10.53@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-30-at-00.10.53@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-30-at-00.10.53@2x.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2024/10/CleanShot-2024-10-30-at-00.10.53@2x.png 2400w" sizes="(min-width: 720px) 720px"></figure><h2 id="the-end">The end.</h2><p>This is my whole heating system.</p><p>The 3 automations you saw are duplicated for every room. Some rooms have fewer modes like my bathroom that has no window, and some rooms have different modes, again like my bathroom that has a <code>Boost</code> mode, driven by a humidity sensor. </p><p>In the end, it&apos;s just a bunch of helpers (26), and a bunch of automations (20) doing what we just did together. </p><ul><li>Computing modes</li><li>Computing target temperatures</li><li>Driving radiators</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-30-at-09.29.19.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="1606" height="1117" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-30-at-09.29.19.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-30-at-09.29.19.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-30-at-09.29.19.png 1600w, https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-30-at-09.29.19.png 1606w" sizes="(min-width: 720px) 720px"><figcaption>Exact of my helpers for the heating system</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2024/10/CleanShot-2024-10-30-at-00.21.13@2x.png" class="kg-image" alt="A complex smart heating system, simply built." loading="lazy" width="2000" height="1349" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2024/10/CleanShot-2024-10-30-at-00.21.13@2x.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2024/10/CleanShot-2024-10-30-at-00.21.13@2x.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2024/10/CleanShot-2024-10-30-at-00.21.13@2x.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2024/10/CleanShot-2024-10-30-at-00.21.13@2x.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Exact of my automations for the heating system</figcaption></figure><p>This post is long because I decided to focus on all the small details. But nothing is complicated because we planned well and broke down the problem into small manageable parts.</p><p>Nothing is complicated, yet the sum is beautiful and complex. </p><p>I hope you enjoyed this post and learned something &#x1F60D;</p><p>My complete Home Assistant configuration is available <a href="https://github.com/jlpouffier/home-assistant-config">here</a></p><p>JLo &#x270C;&#x1F3FB;</p>]]></content:encoded></item><item><title><![CDATA[How not to build a hardware product]]></title><description><![CDATA[<p>Hello &#x1F44B;&#x1F3FB;</p><p>It&apos;s Wednesday morning, a perfect time to sip your coffee while I talk about a topic dear to me. <strong>Sustainability</strong>.</p><p>More precisely <strong>Sustainability in hardware products.</strong></p><p>10 months ago, two start-up founders went on stage and unveiled the Humane AI Pin.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/9lNIwOOMVHk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="This is the Humane Ai Pin"></iframe></figure><p>A wearable AI device</p>]]></description><link>https://blog.jlpouffier.fr/how-not-to-build-a-hardware-product/</link><guid isPermaLink="false">66f3bf7b634e580001b71f96</guid><category><![CDATA[Tech]]></category><category><![CDATA[Home Assistant]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Wed, 25 Sep 2024 07:56:57 GMT</pubDate><media:content url="https://blog.jlpouffier.fr/content/images/2024/09/jl.o_A_field_full_of_e-waste_74cc2d96-a117-4a4b-9525-a33f36e2f801-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jlpouffier.fr/content/images/2024/09/jl.o_A_field_full_of_e-waste_74cc2d96-a117-4a4b-9525-a33f36e2f801-1.png" alt="How not to build a hardware product"><p>Hello &#x1F44B;&#x1F3FB;</p><p>It&apos;s Wednesday morning, a perfect time to sip your coffee while I talk about a topic dear to me. <strong>Sustainability</strong>.</p><p>More precisely <strong>Sustainability in hardware products.</strong></p><p>10 months ago, two start-up founders went on stage and unveiled the Humane AI Pin.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/9lNIwOOMVHk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="This is the Humane Ai Pin"></iframe></figure><p>A wearable AI device that was supposed to replace your smartphone and assist you in your daily lives.</p><p>The keynote was met with skepticism, the mood was a mix of &quot;<em>A pretty dark Black Mirror episode</em>&quot; x &quot;<em>Do they see themselves as the next Apple</em>&quot; x &quot;<em>OMG please I do not want to live in this future</em>&quot;</p><p>A few months after that the first units were shipped and, as everyone would have guessed, the reviews were bad.</p><p>MKBHD called it the worst product ever.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/TitZV6k8zfA?start=1266&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="The Worst Product I&apos;ve Ever Reviewed... For Now"></iframe></figure><ul><li>Overheating product</li><li>Bad battery life</li><li>Constant hallucinations. </li></ul><p>This happens when you build a product solely on LLMs. Hallucinations are part of the game, but it&apos;s not all bad when you can close the ChatGPT app and search online to verify results, it&apos;s problematic, and borderline dangerous when &quot;<em>you don&apos;t do apps, you do AI experiences</em>&quot;</p><p>I hate AI scams, but let&apos;s say that for the sake of this article, I do not care. If investors are willing to pump money into these products, it&apos;s their problem, not mine.</p><p>Now we meet the part of the timeline that is dear to me. <strong>The returns</strong>. <a href="https://www.theverge.com/2024/8/7/24211339/humane-ai-pin-more-daily-returns-than-sales">The verge states</a> that &quot;between May and August, more AI Pins were returned than purchased&quot;. So how does Humane deal with these returns? </p><p><strong>They do not</strong>.</p><p>I&apos;ll quote the Verge again:</p><blockquote>&quot;Once a Humane Pin is returned, the company has no way to refurbish it, sources with knowledge of the return process confirmed. The Pin becomes e-waste, and Humane doesn&#x2019;t have the opportunity to reclaim the revenue by selling it again. The core issue is that there is a T-Mobile limitation that makes it impossible for Humane to reassign a Pin to a new user once it&#x2019;s been assigned to someone&quot;.</blockquote><p>The secondhand market for the AI Pin is impossible.</p><p>I want to make my point very clear:</p><h3 id="it-is-inexcusable-and-unacceptable-to-use-resources-to-build-a-bad-product-that-cannot-be-repurposed-or-re-used-after-the-first-purchasescam-people-all-you-want-take-their-money-and-sell-them-air-but-you-do-not-waste-the-earths-resources-period">It is inexcusable and unacceptable to use resources to build a bad product that cannot be repurposed or re-used after the first purchase.<br>Scam people all you want. Take their money, and sell them air, but you do not waste the earth&apos;s resources. Period.</h3><p></p><p>Let me tell you another part of the same story of sustainability in hardware products.</p><p>I&apos;m part of the team building a new voice assistant at <a href="https://nabucasa.com/">Nabu Casa</a> &amp; <a href="https://www.home-assistant.io/">Home Assistant</a>. We&apos;re soon going to release our own hardware.</p><p>The hardware will be open, and the software running on the hardware will be (already is) open, guaranteeing a long and sustainable life for every unit we release in the world.</p><p><strong>Nevertheless, we produced a bit of waste during the development process</strong>. We went through 3 main revisions of the board. This means that boards were shipped to us, we tested them, found improvements, and asked our manufacturing partner to implement these hardware changes.</p><p>These intermediary boards had a lifetime of about a week and became &quot;end of life&quot; pretty fast. All in all, I think about 30 of these boards exist, only shipped to employees for internal testing.</p><p>This week is the production of the batch of 1000 units. With the development rush behind us, we are now spending a bit of time to make sure these boards do not end as dead weight.</p><p><strong>Just because deep inside my guts, I was not sleeping well knowing I was part of a team that produced 30 boards that were destined to rot in a drawer.</strong></p><p>Am I writing this to tell you &quot;Their way is bad, our way is good&quot;?</p><p>Absolutely not.</p><p>I am writing this to tell you &quot;Their way is unacceptable and inexcusable, and our way should be the baseline for every company building hardware&quot;</p><p>In every hardware pitch, we should see the following:</p><blockquote>How do we make a product that does X while making sure it will keep working when our business model collapses, our servers shut down and our company dies.</blockquote><p>Humane is not an isolated case, Spotify made the same move with their first (and only) hardware product a few months ago, <a href="https://newsletter.openhomefoundation.org/all-cloud-based-products-will-come-to-an-end/.">we wrote about it too</a></p><p>Congratulations Humane on your first hardware product launch, the world hopes it will be the last.</p><p><strong>Be better.</strong></p>]]></content:encoded></item><item><title><![CDATA[GPT-powered music search engine on a local voice assistant]]></title><description><![CDATA[<p>Today I am going to explain to you how to build this:</p><figure class="kg-card kg-video-card kg-card-hascaption"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/hells_bells.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember130.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div><figcaption><em>Great .... he played a song by voice. Yay</em></figcaption></figure><p>Ok fine! I am going to explain to you how to build this:</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/narcos.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember197.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/pink_floyd.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember185.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>A way to play music,</p>]]></description><link>https://blog.jlpouffier.fr/chatgpt-powered-music-search-engine-on-a-local-voice-assistant/</link><guid isPermaLink="false">654c974cb564560001ddf08f</guid><category><![CDATA[Home Assistant]]></category><category><![CDATA[Tech]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Thu, 09 Nov 2023 18:46:41 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1453738773917-9c3eff1db985?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxWb2ljZSUyMGFzc2lzdGFudHxlbnwwfHx8fDE2OTk1MTgyOTN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1453738773917-9c3eff1db985?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxWb2ljZSUyMGFzc2lzdGFudHxlbnwwfHx8fDE2OTk1MTgyOTN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="GPT-powered music search engine on a local voice assistant"><p>Today I am going to explain to you how to build this:</p><figure class="kg-card kg-video-card kg-card-hascaption"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/hells_bells.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember130.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div><figcaption><em>Great .... he played a song by voice. Yay</em></figcaption></figure><p>Ok fine! I am going to explain to you how to build this:</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/narcos.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember197.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/11/pink_floyd.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/11/media-thumbnail-ember185.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>A way to play music, on a wide variety of speakers in your home, by voice, coupled with a very powerful search engine. Something that does not only match a song name or an album name, but also more complex queries, as you saw in the two videos above.</p><p>This blog post will assume a few prerequisites if you wish to follow along:</p><ol><li>You need to be using <strong>Home Assistant</strong>. (Get started <a href="https://www.home-assistant.io/getting-started/">here</a>)</li><li>You need to have a <strong>voice assistant</strong> configured on Home Assistant. (Follow our guides <a href="https://www.home-assistant.io/voice_control/">here</a>).</li><li>You need an <strong>OpenAi API Key</strong> <em>(Note: It costs money ... But it is dirt cheap, less than 1$/month even with all my extensive testing) </em></li></ol><p>Excluding the prerequisites above, there are two main &quot;blocks&quot; that we need to cover in order to build our powerful search engine:</p><ul><li><strong>Music Assistant </strong></li><li><strong>OpenAI GPT</strong></li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-16.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="2000" height="1421" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/11/image-16.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/11/image-16.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/11/image-16.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2023/11/image-16.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>A high-level view of what we are going to build</figcaption></figure><h2 id="music-assistant">Music Assistant</h2><p>Music Assistant is the perfect music companion for all Home Assistant users. It allows you on the one hand to gather all your music in a single place, whether it is located on streaming services or stored locally. And on the other hand, it allows you to stream it to almost any speaker (or group of speakers) compatible with Home Assistant.</p><p>Music Assistant is still in beta, so the installation is currently not straightforward. But I am going to guide you nevertheless.</p><p><strong>The Music Assistant server</strong></p><p>The first brick you need to install is the Music Assistant Server. It&apos;s an add-on available on a custom repository. Fortunately, we are thinking about convenience when we manage such a distributed product so we have some helpers to guide you, even for complex tasks like this.</p><p>Click here to add the custom repository:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Fmusic-assistant%2Fhome-assistant-addon"><img src="https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>And then click here to install Music Assistant:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/supervisor_store/"><img src="https://my.home-assistant.io/badges/supervisor_store.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>When the add-on is started, you&apos;ll be able to add your music under <code>Settings</code> &gt; <code>Providers</code> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-1.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="322" height="538"><figcaption>Add any music provider to Music Assistant</figcaption></figure><p></p><p>And you&apos;ll be able to configure the auto-discovered speakers under <code>Settings</code> &gt; <code>Players</code> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-2.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="557" height="307"><figcaption>Configure your discovered players in Music Assistant</figcaption></figure><p>Even without going further on this blog post, Music Assistant, as a standalone product, is a great way to play music coming from different sources in different players in your house. You can even create groups of speakers from different brands, which is unprecedented in a music app.</p><p><strong>The Music Assistant Integration</strong></p><p>Even if Music Assistant is cool as a standalone product, now we&apos;re going to sprinkle some automation magic on top of it. And the first step is to integrate it into Home Assistant.</p><p>A Music Assistant integration exists on the Community Store, you can install it by clicking here:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/hacs_repository/?owner=music-assistant&amp;repository=hass-music-assistant&amp;category=integration"><img src="https://my.home-assistant.io/badges/hacs_repository.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>Once installed, you should be able to integrate the players you created on Music Assistant (Groups or not) into Home Assistant </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-3.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="1172" height="179" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/11/image-3.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/11/image-3.png 1000w, https://blog.jlpouffier.fr/content/images/2023/11/image-3.png 1172w" sizes="(min-width: 720px) 720px"><figcaption>My two Music Assistant players integrated into Home Assistant</figcaption></figure><p><strong>The Music Assistant Services</strong></p><p>Since the last version of the Music Assistant integration, Music Assistant provides some very interesting services with great potential. It is actually the release of these services that sparked the whole idea of the smart music search engine voice assistant.</p><p>To put it simply, the service <code>mass.play_media</code> allows you to play music by describing it like you would on Spotify or Tidal: With an artist name, an album name, or a track name. </p><p>Here is how you play a track on an album of an artist:</p><pre><code class="language-yaml">service: mass.play_media
data:
  media_id: Hells Bells
  media_type: track
  artist: AC/DC
  album: Back in Black
target:
  entity_id: media_player.music_assistant_bureau_sonos</code></pre><p>Here is how you play a complete album</p><pre><code class="language-yaml">service: mass.play_media
data:
  media_id: Back in Black
  media_type: album
  artist: AC/DC
target:
  entity_id: media_player.music_assistant_bureau_sonos</code></pre><p>And here is how you play a complete artist</p><pre><code class="language-yaml">service: mass.play_media
data:
  media_id: AC/DC
  media_type: artist
target:
  entity_id: media_player.music_assistant_bureau_sonos</code></pre><p>And that concludes the first &quot;building block&quot;. You can now play any music you want on any speaker you want in your house with just a track name or an artist name.</p><p>Let&apos;s now dive into the second block, which is the voice commands</p><h2 id="voice-commands-and-openai-to-the-rescue">Voice Commands, and OpenAI to the rescue</h2><p>2023 is (or was depending on when you read this blog post) the <a href="https://www.home-assistant.io/blog/2022/12/20/year-of-voice/">Year of the Voice for Home Assistant</a>.</p><p>We shipped some pretty cool things such as the ability to repurpose almost any object into a voice assistant.</p><p><em>Really anything ... </em>&#x1F648;</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/Eyoqvw8qLLc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Happy HAlloween!"></iframe></figure><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/HqYbhk6vq9E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="This 70s Walkie Talkie controls your smart home"></iframe></figure><p>The great thing about our voice assistant product is that it is fully customizable.</p><ul><li>You can change the wake word it reacts to</li><li>You can change the language that you speak</li><li>You can change the voice used to reply</li><li>You can even create your own sentences and how Home Assistant would react to these.</li></ul><p>This last customization point is exactly what we are going to do for that project. We are going to create a custom sentence that catches a &quot;playing intent&quot;, and sends it to Music Assistant using the service we saw in the above section (<code>mass.play_media</code>)</p><p>A custom &quot;intent&quot; is composed of 3 main parts:</p><ul><li>The input sentence that will trigger it</li><li>The list of actions that need to be executed once triggered </li><li>The response needed to be sent back to the voice assistant</li></ul><p>In order to provide more flexibility in the input sentences, Home Assistant provides a way to describe &quot;free text&quot; called wildcard variables. For example: <code>What&apos;s the weather like in {location}?</code> and we are able to get the content of our wildcard variables in the actions and so use them. </p><p>At first, I tried to create my search intent(s) &quot;the old-fashioned way&quot; by trying to match every possible use case:</p><ul><li>A track by an unknown artist <code>play {track}</code></li><li>An artist <code>play {artist}</code></li><li>An album by an unknown artist <code>play {album}</code></li><li>A track by an artist <code>play {track} by {artist}</code> </li><li>An album by an artist <code>play the album {album) by {artist}</code></li><li>A track in an album by an artist <code>play {track} in album {album} by {artist}</code></li></ul><p>However, I faced lots of issues with intent matching and it became quite big and difficult to maintain quite fast.</p><p>Before giving up, I decided to try a different approach. I tried to find a component that would do the &quot;music part of the matching&quot; for me. That way, I would only have to create a single intent in Home Assistant : &#xA0;<code>play {query}</code>, then I would pass &#xA0;<code>{query}</code> to that magical component and get in return a structured way representing what track, album, or artist it is so that I can use it with Music Assistant.</p><p>And I found exactly what I was looking for with OpenAI GPT.</p><p>Large Language Models (LLM) are super good at doing fuzzy tasks like transforming a line of text such as &quot;Hells bells from AC/DC&quot; into a structure model like </p><pre><code class="language-json">{
	&quot;media_id&quot;: &quot;Hells Bells&quot;,
	&quot;media_type&quot;: &quot;track&quot;,
	&quot;artist&quot;: &quot;AC/DC&quot;
}</code></pre><p>In case you are not familiar with LLM (even if this is not the place to explain in detail how they work, most notably because.. well I don&apos;t know), a LLM is an AI model that has been trained at guessing the next word after a certain block of text.</p><p>So if you give <code>The mouse was eaten by the</code> to an LLM, it will give you back <code>cat</code>.</p><p>Not very useful in itself, but as the input block of text can be pretty long, we usually use LLMs paired with the concept of pre-prompt.</p><p>A pre-prompt is a set of instructions you give to an LLM before giving your actual input. A simplified way of thinking about a pre-prompt is to see it as a block of text you add before your input. For example, if you want to create an AI assistant that translates English to French, you may create the very simple pre-prompt: <code>You&apos;re a bot that helps me translate an english sentence into a french one. Here is the sentence:</code> </p><p>Then the LLM does what it does best: Guessing the next word after a certain block of text, except this time, the block of text would look like this:</p><p><code>You&apos;re a bot that helps me translate an english sentence into a french one. Here is the sentence: LLM are pretty powerfull</code></p><p>And you get yourself an AI assistant that is pretty good at translating English into French.</p><p><em>(Note: Coming up with good prompts is now a skill in itself, a bit too trendy if you ask me, called prompt engineering, the art of creating good prompts) </em> </p><p>Before showing you the prompt I used to translate things like <code>The song used in the opening credit of the Narcos TV show</code> into the correct structure data, let me show you how to integrate OpenAI LLM (called <code>GPT</code>, yes not <code>ChatGPT</code>, <code>ChatGPT</code> is the Chatbot product from OpenAI using their LLM <code>GPT</code>) &#xA0;into Home Assistant</p><p>Click here to integrate OpenAi into your Home Assistant:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/config_flow_start/?domain=openai_conversation"><img src="https://my.home-assistant.io/badges/config_flow_start.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>All you need now is to input your OpenAI API key and you will be able to configure your OpenAI integration:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-7.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="419" height="518"><figcaption>The configuration screen for OpenAI in Home Assistant</figcaption></figure><p>As you can see the configuration is pretty simple</p><ul><li>A prompt</li><li>A GPT version </li><li>A few parameters that I will overlook because they are not really useful for generating structured data </li></ul><p>For the GPT version, keep <code>gpt-3.5-turbo</code> or use <code>gpt-4</code> if you have access to it.</p><p>And here is the famous prompt. Warning: It&apos;s long</p><pre><code>You are an AI process that transforms a music search query into a structured JSON. 

Here is the structured JSON that I expect in response {&quot;media_id&quot;:&quot;name&quot;,  &quot;media_type&quot;:&quot;type&quot;, &quot;artist&quot;:&quot;name&quot;, &quot;album&quot;:&quot;name&quot;}

&quot;media_type&quot; can be one of 3 different values: &quot;track&quot; if the search is about a specific track, &quot;album&quot; if the search is about an album, or &quot;artist&quot; if the search is about an artist.
media_type is mandatory

media_id is the most specific from track, album, and artist.
If the search is about a track: Then media_id is the track name.
If the search is about an album: Then media_id is the album name.
If the search is about an artist: Then media_id is the artist name.
media_id is mandatory.

If case it is needed, the fields &quot;artist&quot; and &quot;album&quot; can be used to further restrict the search. 
For example, if the input is &quot;Hells Bells by ACDC&quot;, then the output should be  {&quot;media_id&quot;:&quot;Hells Bells&quot;,  &quot;media_type&quot;:&quot;track&quot;, &quot;artist&quot;:&quot;AC/DC&quot;}
&quot;artist&quot; and &quot;album&quot; are optional.

There can be 4 types of answers: 
Just an artist like that {&quot;media_id&quot;: &quot;artist name&quot;, &quot;media_type&quot;:&quot;artist&quot;}.
An album by an artist like that {&quot;media_id&quot;: &quot;album name&quot;, &quot;media_type&quot;:&quot;album&quot;, &quot;artist&quot;: &quot;artist name&quot;}.
A track by an artist like that {&quot;media_id&quot;:&quot;track name&quot;, &quot;media_type&quot;:&quot;track&quot;, &quot;artist&quot;: &quot;artist name&quot;}.
Just a track if the artist is not known like that {&quot;media_id&quot;:&quot;track name&quot;, &quot;media_type&quot;:&quot;track&quot;}.

You must reply with only the JSON model, nothing before nor after because your response will be processed by a search component of a media listening service. 

Note that the input query can be in French or English. 

Here are a few examples of input with the expected output:
&quot;Hells Bells by ACDC&quot; &gt; {&quot;media_id&quot;:&quot;Hells Bells&quot;,  &quot;media_type&quot;:&quot;track&quot;, &quot;artist&quot;:&quot;AC/DC&quot;}. 
&quot;La discographie de Pink Floyd&quot; &gt;&gt; {&quot;media_id&quot;: &quot;Pink Floyd&quot;, &quot;media_type&quot;:&quot;artist&quot;}. 
&quot;The artist that composed the soundtrack of Inception&quot; &gt;&gt; {&quot;media_id&quot;: &quot;Hans Zimmer&quot;, &quot;media_type&quot;:&quot;artist&quot;}.</code></pre><p>Once the OpenAI integration is configured on Home Assistant, let&apos;s take a small detour to test what we just created. </p><p>In the developer tools, you can test the service called <code>conversation.process</code>. Just click here to test it:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/developer_call_service/?service=conversation.process"><img src="https://my.home-assistant.io/badges/developer_call_service.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>Select your OpenAi integration and write some input text. <code>Click on Call</code> service and you should see the power of LLMs &#x263A;&#xFE0F;</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-8.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="1562" height="836" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/11/image-8.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/11/image-8.png 1000w, https://blog.jlpouffier.fr/content/images/2023/11/image-8.png 1562w" sizes="(min-width: 720px) 720px"></figure><p>BTW, A simpler way to test this, but completely optional is to create a separate voice assistant using this conversation agent.</p><p>Go to <code>Settings</code> &gt; <code>Voice Assistants</code> by clicking here:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/voice_assistants/"><img src="https://my.home-assistant.io/badges/voice_assistants.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><p>Click on <code>Add Assistant</code> and use your openAi integration as a <code>Conversation Agent</code>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-11.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="728" height="811" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/11/image-11.png 600w, https://blog.jlpouffier.fr/content/images/2023/11/image-11.png 728w" sizes="(min-width: 720px) 720px"><figcaption>Configure a voice assistant to test your prompt.</figcaption></figure><p>Nothing else matters on this screen as we will only use this voice assistant to test the prompt. &#xA0; </p><p>You can now converse with this voice assistant to test your prompt </p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/11/image-12.png" class="kg-image" alt="GPT-powered music search engine on a local voice assistant" loading="lazy" width="533" height="643"></figure><h2 id="putting-everything-together">Putting everything together </h2><p>Because we clarified all the building blocks needed, putting everything together is actually very simple now.</p><p>We are going to create an automation, that matches a certain sentence, passes the query to OpenAI, and then passes the OpenAI response to Music Assistant.</p><p>And the heavy lifting has been done for you, you can just use this blueprint:</p><!--kg-card-begin: markdown--><p><a href="https://my.home-assistant.io/redirect/blueprint_import/?blueprint_url=https%3A%2F%2Fgithub.com%2Fjlpouffier%2Fhome-assistant-config%2Fblob%2Fmaster%2Fblueprints%2Fautomation%2Fperso%2Fplay_media_on_music_assistant.yaml"><img src="https://my.home-assistant.io/badges/blueprint_import.svg" alt="GPT-powered music search engine on a local voice assistant" loading="lazy"></a></p>
<!--kg-card-end: markdown--><h2 id="conclusion">Conclusion </h2><p>I hope you learned something today. <a href="https://twitter.com/jlpouffier">Contact me</a> if you use the blueprint and you like it! </p><p>AI is a touchy topic, very trendy, I feel everyone is putting AI everywhere without a concrete reason. I enjoy that particular personal project because it shows AI solving an actual problem I faced. </p><p>Peace!<br>JLo</p><p> </p>]]></content:encoded></item><item><title><![CDATA[Thoughts on VR meetings]]></title><description><![CDATA[<p>VR meetings? Do they work? Is it a gimmick? (Also, where are my legs?)<br><br>At <a href="https://www.linkedin.com/company/nabu-casa/">Nabu Casa</a>, all meetings (except for 1 to 1) are conducted in VR.<br>I&apos;ve been in the company for a bit more than a month, so I decided to reflect on this unusual</p>]]></description><link>https://blog.jlpouffier.fr/thougths-about-vr-meetings/</link><guid isPermaLink="false">64ff8c27637d040001cc3d82</guid><category><![CDATA[Tech]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Thu, 07 Sep 2023 21:56:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1538388149542-5e24932d11a8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fFZpcnR1YWwlMjByZWFsaXR5fGVufDB8fHx8MTY5NDQ2OTM2OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1538388149542-5e24932d11a8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fFZpcnR1YWwlMjByZWFsaXR5fGVufDB8fHx8MTY5NDQ2OTM2OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Thoughts on VR meetings"><p>VR meetings? Do they work? Is it a gimmick? (Also, where are my legs?)<br><br>At <a href="https://www.linkedin.com/company/nabu-casa/">Nabu Casa</a>, all meetings (except for 1 to 1) are conducted in VR.<br>I&apos;ve been in the company for a bit more than a month, so I decided to reflect on this unusual practice.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/My-Movie-3.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember3448.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="what-works-well">What works well?</h2><p>VR meetings have had the sharpest focus I ever experienced. No side discussion, no phone checking. Meetings tend to be shorter, and straight to the point. This is a good thing in this day and age where companies tend to suffer from the too-many-meetings-not-enough-outcomes syndrome </p><p>I also noticed that we tend to cut each other less compared to a regular Zoom-style meeting.</p><p>I cannot really put my finger on the reasons, but the mix of spatial awareness and body language cues is clearly helping.</p><p>You see people facing you before they talk, you see who&apos;s looking at the shared screen, who&apos;s quickly searching for something on his/her computer.</p><p>Sound is spatialized so you have no issue understanding who&apos;s talking and where he/she is located. This is a definite improvement if you compare it to the flat 2D wall of sound coming out of a regular Zoom-style meeting.</p><p>You&apos;re in a room. It just happens that the room is virtual.</p><h2 id="what-does-not-work-well">What does not work well?</h2><p>Well for a start typing is harder, but it&apos;s a good opportunity to perfect your touch typing &#x1F60A;</p><p>The biggest problem is that VR meetings work well until they don&apos;t.</p><p>The software used to conduct these meetings (Meta Horizon Workrooms) cannot be considered stable as of today. Connecting to a room is long and tedious, sometimes people get stuck trying to join or drop off unexpectedly.</p><p>The meeting size is limited to 16 to reduce lag. Past this threshold, later joiners are able to join a &quot;zoom-style&quot; version of the VR meeting.</p><p>They see the VR room, and people in the VR room see their faces on a floating screen. Just like a regular hybrid setup. This negates, in my own opinion, the whole point of VR meetings</p><h2 id="is-it-for-everyone">Is it for everyone?</h2><p>Absolutely not.</p><p>But this is something that I believe is worth exploring if you fit these two requirements:</p><ul><li>Small teams (less than 20 people)</li><li>Full remote</li></ul>]]></content:encoded></item><item><title><![CDATA[Home Assistant Hot Tips of the Day]]></title><description><![CDATA[<p>Beginning of September, I started a series on <a href="https://twitter.com/jlpouffier">Twitt<a href="https://twitter.com/jlpouffier">e</a>r</a> and <a href="https://fosstodon.org/@jlo">Mastodon</a> called <strong>Home Assistant Hot Tip of the day.</strong></p><p>I&apos;ll still post on Twitter and Mastodon, but this post act as a repository of all past tips.</p><p>I&apos;ll try to keep it as up-to-date</p>]]></description><link>https://blog.jlpouffier.fr/home-assistant-hot-tips-of-the-day/</link><guid isPermaLink="false">64ff8127637d040001cc3c27</guid><category><![CDATA[Home Assistant]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Tue, 01 Aug 2023 21:49:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1513584684374-8bab748fbf90?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fEhvbWUlMjBBdXRvbWF0aW9ufGVufDB8fHx8MTY5NDQ2NjM5NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1513584684374-8bab748fbf90?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fEhvbWUlMjBBdXRvbWF0aW9ufGVufDB8fHx8MTY5NDQ2NjM5NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Home Assistant Hot Tips of the Day"><p>Beginning of September, I started a series on <a href="https://twitter.com/jlpouffier">Twitt<a href="https://twitter.com/jlpouffier">e</a>r</a> and <a href="https://fosstodon.org/@jlo">Mastodon</a> called <strong>Home Assistant Hot Tip of the day.</strong></p><p>I&apos;ll still post on Twitter and Mastodon, but this post act as a repository of all past tips.</p><p>I&apos;ll try to keep it as up-to-date as possible.</p><p>Last updated: 2023-09-11</p><hr><h2 id="local-assist">Local Assist</h2><p>Our voice assistant can be set up completely locally if you have enough CPU to perform Speech-to-text and Text-to-speech.</p><p>Here is a video comparing the speed of Assist using Home Assistant Cloud and running it locally.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/My-Movie-7.mp4" poster="https://img.spacergif.org/v1/960x540/0a/spacer.png" width="960" height="540" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember671.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Using Assist with Home Assistant Cloud is a one-click setup</p><p>(Actually, we set it up for you, so it&apos;s a zero-click setup)</p><p>You&apos;re also supporting the development of Home Assistant by using it.</p><p>Learn more here</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.nabucasa.com/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Nabu Casa</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.nabucasa.com/img/favicon.png" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Nabu Casa</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.nabucasa.com/img/default-social.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><p>Using Assist locally requires you to run Piper and Whisper locally</p><ul><li><a href="https://github.com/home-assistant/addons/tree/master/piper" rel="nofollow noopener noreferrer">https://github.com/home-assistant/addons/tree/master/piper</a></li><li><a href="https://github.com/home-assistant/addons/tree/master/whisper" rel="nofollow noopener noreferrer">https://github.com/home-assistant/addons/tree/master/whisper</a></li></ul><p>The demo you saw above is <strong>NOT</strong> performed on a Raspberry Pi, it is performed on a powerful NUC i5 with a pretty heavy model for both TTS and STT.</p><h2 id="remote-backups">Remote Backups</h2><p>BACK. UP. YOUR. DATA</p><p>Since a few versions, Home Assistant supports network storage.<br>If you have a NAS, setting up a daily backup takes less than 2 minutes.</p><p>Seriously: Watch</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/7da7ba2cee72fcb6.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember2650.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="supercharged-mushroom-person-card">Supercharged mushroom person card </h2><p>Reflecting on yesterday&apos;s post about &#x1F344; Mushroom by <a href="https://fosstodon.org/@piitaya">@piitaya</a>, I&apos;d like to share my favorite card in my setup: The super-charged person card</p><p>It&apos;s subtle but this card packs lots of details that I absolutely love.</p><p>Can you spot them?</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-16.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="600" height="600" srcset="https://blog.jlpouffier.fr/content/images/2023/09/image-16.png 600w"></figure><p>Here is what the card supports </p><p>Standard features:</p><ul><li>Show when a person is home </li><li>Show when a person is in a zone</li></ul><p>Added features:</p><ul><li>Gendered adjectives (Pr&#xE9;sent / Pr&#xE9;sente)</li><li>Show where the person is if he/she is away (City, or City + Country if abroad)</li></ul><p>This card is a template &#x1F344; mushroom card, mixing data coming from two different sources</p><ul><li>The person entity</li><li>The Geocoded Location sensor coming from our companion app</li></ul><p>You&apos;ll need the app to make this card work:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://companion.home-assistant.io"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Companion Docs | Home Assistant Companion Docs</div><div class="kg-bookmark-description">Welcome to the Home Assistant App docs</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://companion.home-assistant.io/img/favicon.png" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Companion Apps</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://companion.home-assistant.io/img/default-social.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><p>You can find the card here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/1f5f3f5f55727a4641f7bcda2a98a2db"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Supercharged Mushroom Person card</div><div class="kg-bookmark-description">Supercharged Mushroom Person card. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="tile-card-and-its-features">Tile card and its features</h2><p>Everyone loves &#x1F344; mushroom cards by <a href="https://fosstodon.org/@piitaya">@piitaya</a>.<br>But do you know the native Tile card allows you to create a similar look and feel?</p><p>Here are some of my dashboards. 90% is native. I only use Mushroom for titles and subtitles.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-15.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="653" height="353" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-15.png 600w, https://blog.jlpouffier.fr/content/images/2023/09/image-15.png 653w"></figure><p>The tile card and its features are also built by <a href="https://fosstodon.org/@piitaya">@piitaya</a></p><h2 id="turning-off-and-on-many-automations-at-once">Turning off and on many automations at once</h2><p>Most of the time, one &quot;functionality&quot; is implemented in many automations.<br>(For example, my &quot;Smart cleaning&quot; functionality is split into 12 automations)</p><p>Create an input_boolean helper and add it as a condition to every automation.</p><p>Result: A single button that controls the complete functionality.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-14.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1074" height="160" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-14.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-14.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image-14.png 1074w" sizes="(min-width: 720px) 720px"></figure><h2 id="universal-media-player">Universal Media Player</h2><p>So you have your TV as a media player, then Cast, then your speakers, then maybe Plex, &#xA0;Android TV remote</p><p>And you wonder how to have a nice media center experience in Home Assistant</p><p>The Universal Media Player integration<br><a href="https://home-assistant.io/integrations/universal/" rel="nofollow noopener noreferrer">https://home-assistant.io/integrations/universal/</a></p><p>This integration allows you to create a main media player by picking what works best in all your child media centers.</p><p>You can override the turn-on action, the volume actions, the state, etc</p><p>Here is mine for inspiration</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/jlpouffier/home-assistant-config/blob/master/packages/media_center/media_player_universal_media_center.yaml"><div class="kg-bookmark-content"><div class="kg-bookmark-title">home-assistant-config/packages/media_center/media_player_universal_media_center.yaml at master &#xB7; jlpouffier/home-assistant-config</div><div class="kg-bookmark-description">Open source configuration of my connected apartment - jlpouffier/home-assistant-config</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">jlpouffier</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/5fad944fcd6900619fea7348a4576698490dd6cfb3130ceb0ab8d7b1e00a48ad/jlpouffier/home-assistant-config" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="macos-companion-app">MacOS Companion app</h2><p>Working on Mac? Did you know we have a native macOS App?</p><p>It exposes lots of sensors coming directly from your machine to your Home Assistant.</p><p>One of them is a boolean &quot;Camera in use&quot;, I use it when I am in meetings.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/e9fdf47ee635ea81.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember920.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>The app is available on the AppStore</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://apps.apple.com/app/home-assistant/id1099568401"><div class="kg-bookmark-content"><div class="kg-bookmark-title">&#x200E;Home Assistant</div><div class="kg-bookmark-description">&#x200E;Control and monitor your home from anywhere in the world. Home Assistant Companion lets you control all your devices and provides advanced location and notification engines to allow for complex automations. Home Assistant is an open-source home automation platform that focuses on local control and&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://t2.gstatic.com/faviconV2?client=SOCIAL&amp;type=FAVICON&amp;fallback_opts=TYPE,SIZE,URL&amp;url=https://apps.apple.com/app/home-assistant/id1099568401&amp;size=128" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">App Store</span><span class="kg-bookmark-publisher">Nabu Casa, Inc</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://is1-ssl.mzstatic.com/image/thumb/Purple126/v4/1e/74/42/1e74424a-413e-f923-c0f0-0e0cca3e3b73/AppIcon-0-2x-4-85-220.png/1200x630wa.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="testing-an-automation-by-faking-state-change">Testing an automation by faking state change</h2><p>So, you built an automation but can&apos;t test it in the real world?</p><p>The developer tools can help you simulate literally everything on Home Assistant.</p><p>Look how I can change the outside temperature without waiting to fix global warming.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/a154d18183caac45.mp4" poster="https://img.spacergif.org/v1/1920x844/0a/spacer.png" width="1920" height="844" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember901.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>But be careful, It&apos;s a double-edged sword - use it with caution. Make sure you put back real values once you are done testing.</p><h2 id="favorite-colors">Favorite colors</h2><p>Did you know that lights have favorite colors?<br>Long press on them to edit them and add/remove some!</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/31ec3e58b8de3b2f.mp4" poster="https://img.spacergif.org/v1/1186x1458/0a/spacer.png" width="1186" height="1458" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember878.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="absolute-vs-relative-time-display">Absolute vs relative time display</h2><p>In the new more-info screen (Available for Lights, Covers, Switches, Alarms, Fans, Sirens and Locks for now) you can change the way the last state change is displayed by clicking on it.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/67b4c813c40fd4bf.mp4" poster="https://img.spacergif.org/v1/564x790/0a/spacer.png" width="564" height="790" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember866.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="aliases">Aliases</h2><p>You can add aliases to entities and areas. Aliases are alternate names that you can use when using Assist, our private voice assistant.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/bfb96b607e2a3921.mp4" poster="https://img.spacergif.org/v1/1280x712/0a/spacer.png" width="1280" height="712" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember854.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Note: Aliases also work with Google Assistant, but not with Alexa</p><h2 id="areas">Areas</h2><p>Areas represent rooms in your home.<br>Until this year they have been used lightly in the product, but now they are a core part of Assist, our voice assistant.</p><p>Look how a good area setup can unlock great assist commands.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/3166f228043e6c0f.mp4" poster="https://img.spacergif.org/v1/1362x1316/0a/spacer.png" width="1362" height="1316" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember837.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Note: Here I am writing the commands for the sake of simplicity but the commands are meant to be spoken</p><h2 id="dynamic-scenes">Dynamic scenes</h2><p>You can capture the state of your devices in order to restore them later with &apos;scene.create&apos;</p><p>Watch how the light state is restored in this video.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/da7f36b162412162.mp4" poster="https://img.spacergif.org/v1/1220x1484/0a/spacer.png" width="1220" height="1484" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember652.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Script available here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/b5c5ecc93e80bbbfca0adada21eee347"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip: Dynamic Scene</div><div class="kg-bookmark-description">Home Assistant Hot Tip: Dynamic Scene. GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><p>Scenes created with &apos;scene.create&apos; do not survive a restart.</p><p>Note: Scenes created with &apos;scene.create&apos; do not survive a restart.</p><h2 id="copy-paste-and-cut-on-dashboards">Copy, Paste and Cut on dashboards</h2><p>Similarly to yesterday&apos;s tip, you can COPY, CUT and PASTE cards within a view, across views, and across dashboards.</p><p>Here I recreate a dummy dashboard with only COPY, CUT and PASTE</p><p>Super useful when reshuffling views!</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/a99a6a3219d8fafb.mp4" poster="https://img.spacergif.org/v1/1280x708/0a/spacer.png" width="1280" height="708" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember638.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="copy-paste-and-cut-on-automations">Copy, Paste and Cut on automations</h2><p>You can COPY, CUT and PASTE blocs when creating automations.</p><p>It allows you to tweak what you are building with minimal effort.</p><p>Here I change the way conditions are checked and actions are run in a few seconds.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/af879048468ea9d1.mp4" poster="https://img.spacergif.org/v1/1280x840/0a/spacer.png" width="1280" height="840" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember626.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="wildcards">Wildcards</h2><p>Wildcards allow you to match lazily part of a sentence such as &quot;Add {item} to my shopping list&quot;</p><p>Let&apos;s play a game: <br>What does this automation do?<br>(Think carefully)</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-12.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1418" height="1462" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-12.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-12.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image-12.png 1418w" sizes="(min-width: 720px) 720px"></figure><p>Well, it chains 2 commands, right?</p><p>I can say &quot;{Turn on the living room light} and {close the shades}&quot;</p><p>Correct.<br>But this is not all.</p><p>Have a look</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/72582f0ea9eed9f2.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember602.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Since wildcards are lazily matched, the simple automation above is recursively called.</p><p>When I say &quot;1 and 2 and 3 and 4&quot;, it is matched as such: &quot;{1} and {2 and 3 and 4}&quot;</p><p>And processing &quot;2 and 3 and 4&quot; calls the same automation and matches &quot;{2} and {3 and 4}&quot;</p><p>And so on.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-13.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1705" height="1217" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-13.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-13.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image-13.png 1600w, https://blog.jlpouffier.fr/content/images/2023/09/image-13.png 1705w" sizes="(min-width: 720px) 720px"></figure><p>Caveats (aka. Why this is just an experiment and you should think twice before adding it on your side):</p><ul><li>The structure is so simple &quot;{1} and {2}&quot; that this automation will be triggered when you don&apos;t want to.<br>Like &quot;{Add peanut} and {jam to my shopping list}&quot;</li><li>You won&apos;t get feedback if some commands are erroneous:<br>&quot;{Turn on the living room lights} and {make me a coffee}&quot; will just ... &quot;work&quot; <br>(But you won&apos;t get your coffee)</li></ul><p>Still a cool experiment to learn wildcards</p><h2 id="expand">expand()</h2><p>expand() is an advanced templating feature that lets you expand specific parts of your state machine.</p><p>This small sensor gives me the number of pending updates and their names.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-7.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1561" height="1328" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-7.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-7.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image-7.png 1561w" sizes="(min-width: 720px) 720px"></figure><p>For the state of the sensor, this is what the template does:</p><ul><li>It expands all the entities in the update domain</li><li>It filters the ones that have a state equal to &apos;on&apos; (update available)</li><li>It lists them</li><li>And counts them</li></ul><p>The result is the number of pending updates (4)</p><p>For the attribute &quot;entities&quot;, &#xA0;this is what the template does</p><ul><li>It expands all the entities in the update domain</li><li>It only keeps the attribute &quot;friendly_name&quot; for each of them</li><li>It lists them</li><li>And sort them</li></ul><p>The result is a list of available updates </p><!--kg-card-begin: markdown--><pre><code>[  
  - Vacuum Update  
  - ..
]
</code></pre>
<!--kg-card-end: markdown--><p>A very simple automation triggered by this sensor, and you can be notified as soon as updates are available across your system.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-11.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1179" height="652" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-11.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-11.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image-11.png 1179w" sizes="(min-width: 720px) 720px"></figure><p>Full sensor available here</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/0c2223d4ec402ee0fc02f4597a9b3e98"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the Day: Available Updates</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the Day: Available Updates - available_updates.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="sentence-trigger">Sentence trigger </h2><p>You can extend what Assist understand by creating really simple automations.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/0431081dc22a1027.mp4" poster="https://img.spacergif.org/v1/1080x1920/0a/spacer.png" width="1080" height="1920" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember292.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Here is one triggered by the custom sentence &quot;Raise the desk&quot;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/76f21c499fec73137bf04c967f7574ad"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the Day: Sentence Trigger</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the Day: Sentence Trigger - automation.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="automation-editor">Automation editor</h2><p>The automation editor packs a lot of features that help you during an automation creation.</p><p>You can:</p><ul><li>See triggers fired</li><li>See the trigger data</li><li>Test conditions</li><li>Run actions</li></ul><p>without even saving the automation.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/13707ecbd6269d2f.mp4" poster="https://img.spacergif.org/v1/1644x1194/0a/spacer.png" width="1644" height="1194" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember273.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="subviews">Subviews</h2><p>A subview is a view that does not appear in the dashboard top bar.</p><p>In this simple example, I use a subview per room, and navigate using Tiles.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/6834086275e8e28d.mp4" poster="https://img.spacergif.org/v1/1300x1558/0a/spacer.png" width="1300" height="1558" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember254.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>The navigation card is available here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/0bea5eb4c35512fa5c69951ee68a4a99"><div class="kg-bookmark-content"><div class="kg-bookmark-title">tile_navigation_card.yaml</div><div class="kg-bookmark-description">GitHub Gist: instantly share code, notes, and snippets.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="coloring-cards">Coloring cards</h2><p>Most cards use the primary color.<br>The Tile card can use the accent color.<br>Some entities like battery sensors compute color based on their state.</p><p>You can change the primary/accent colors to make Home Assistant your own.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/4a25e1742b597a9a.mp4" poster="https://img.spacergif.org/v1/1280x1120/0a/spacer.png" width="1280" height="1120" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember242.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="how-to-use-logbook-data">How to use logbook data</h2><p>The logbook holds valuable information, often overlooked.<br>In this example I dig up why a toggle was triggered and find out:<br>- The automation<br>- The trigger<br>- The conditions<br>- The user initially responsible</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/49f50ea20d859df1.mp4" poster="https://img.spacergif.org/v1/1280x856/0a/spacer.png" width="1280" height="856" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember230.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>JL triggered the &quot;Trigger toggle&quot;<br>&#x2003;and because the sun was above the horizon <br>&#x2003;&#x2003;the automation &quot;My Automation&quot; was processed<br>&#x2003;&#x2003;&#x2003;and turned on the &quot;Result toggle&quot;</p><h2 id="display-precision">Display precision</h2><p>Change the display precision of your numerical sensors directly in the UI.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/246a30b47ac527e4-1.mp4" poster="https://img.spacergif.org/v1/1224x1482/0a/spacer.png" width="1224" height="1482" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember218.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>Note: This does not change the value of the sensor, just the way it is displayed.</p><h2 id="device-class-of-binary-sensors">Device class of binary sensors</h2><p>Edit the device class of your binary sensors directly on the UI to change the way they are displayed (Icon + State labels)</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/c9279ce95cb0c5e3-1.mp4" poster="https://img.spacergif.org/v1/1406x1552/0a/spacer.png" width="1406" height="1552" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember206.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="trigger-ids">Trigger IDs</h2><p>Combine &quot;Trigger IDs&quot; and the &quot;choose&quot; action to group simple automations by little functional packages.</p><p>For example, this is a single automation that toggles a light based on the sun&apos;s position.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-6.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1437" height="1443" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-6.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-6.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image-6.png 1437w" sizes="(min-width: 720px) 720px"></figure><h2 id="decluttering-your-sidebar">Decluttering your sidebar</h2><p>You can declutter your sidebar and organize it by long-pressing on &quot;Home Assistant&quot;.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/58cdd56b74db5c9d-1.mp4" poster="https://img.spacergif.org/v1/1624x1250/0a/spacer.png" width="1624" height="1250" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember175.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>I created a navigation card for everything &quot;technical&quot; so that it&apos;s not in my way every day.</p><p>The card is here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/f738bc35ed39993c3375eb9d20e7f823"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the Day: A Navigation Card to declutter your side bar</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the Day: A Navigation Card to declutter your side bar - card.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="keeping-automation-instant">Keeping automation instant</h2><p>Automations are not meant to be running forever.<br>They reset after a restart.<br>If you need to wait hours to perform an action, use an input_datetime and a second automation triggered by it.</p><p>These 2 automations are instant</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-5.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1605" height="1291" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-5.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-5.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image-5.png 1600w, https://blog.jlpouffier.fr/content/images/2023/09/image-5.png 1605w" sizes="(min-width: 720px) 720px"></figure><p>Note: From a performance perspective, there is nothing wrong with having automation running for a long time.<br>You just increase the risk of having a restart in a middle of an automation.</p><h2 id="running-a-script-vs-turning-on-a-script">Running a script vs turning on a script</h2><p>RUNNING a script blocks the subsequent actions until the script is over.</p><p>TURNING ON a script is an immediate action that does not wait for the script response to continue to the next actions.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/6e8ce321b3d4df5d-1.mp4" poster="https://img.spacergif.org/v1/1092x650/0a/spacer.png" width="1092" height="650" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember129.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><p>You can find the scripts used in the video here:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/7cc9b0d71c82983c368c2e7e3a85f465"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the Day: Run vs Turn on Script</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the Day: Run vs Turn on Script - script.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="reusable-logic-on-a-template-sensor">Reusable logic on a template sensor</h2><p>If you keep creating the same complex trigger/condition: Simplify your automation by creating a template sensor. <br>So that the logic is only in one place.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image-4.png" class="kg-image" alt="Home Assistant Hot Tips of the Day" loading="lazy" width="1847" height="1122" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image-4.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image-4.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image-4.png 1600w, https://blog.jlpouffier.fr/content/images/2023/09/image-4.png 1847w" sizes="(min-width: 720px) 720px"></figure><p>Here is my &quot;Home Occupancy&quot; sensor for example:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/44a6a5937eed0881a71c09c0dff56894"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the Day: Home Occupancy Sensor</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the Day: Home Occupancy Sensor - configuration.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure><h2 id="trigger-data">Trigger Data</h2><p>Triggers convey a lot of data, and you can see the data while building an automation!<br>Just fire the trigger and click on the &quot;Triggered&quot; banner.</p><p>Here is an example with the new wildcard trigger available since the 2023.8 release.</p><figure class="kg-card kg-video-card"><div class="kg-video-container"><video src="https://blog.jlpouffier.fr/content/media/2023/09/2fc7a0acb9635c60-1.mp4" poster="https://img.spacergif.org/v1/1190x870/0a/spacer.png" width="1190" height="870" playsinline preload="metadata" style="background: transparent url(&apos;https://blog.jlpouffier.fr/content/images/2023/09/media-thumbnail-ember91.jpg&apos;) 50% 50% / cover no-repeat;"></video><div class="kg-video-overlay"><button class="kg-video-large-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button></div><div class="kg-video-player-container"><div class="kg-video-player"><button class="kg-video-play-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/></svg></button><button class="kg-video-pause-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/><rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/></svg></button><span class="kg-video-current-time">0:00</span><div class="kg-video-time">/<span class="kg-video-duration"></span></div><input type="range" class="kg-video-seek-slider" max="100" value="0"><button class="kg-video-playback-rate">1&#xD7;</button><button class="kg-video-unmute-icon"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/></svg></button><button class="kg-video-mute-icon kg-video-hide"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/></svg></button><input type="range" class="kg-video-volume-slider" max="100" value="100"></div></div></div></figure><h2 id="state-of-zones">State of zones</h2><p>The state of a zone represents the number of persons present in it.</p><p>You can very easily create triggers that will fire, or conditions that will match, when:</p><ul><li>Your home is empty</li><li>Your home is occupied</li><li>Your home is full</li></ul><p>I created a small gist that contains them all:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://gist.github.com/jlpouffier/da718f724417629e4f2d27904dcc4681"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Home Assistant Hot Tip of the day: home occupancy</div><div class="kg-bookmark-description">Home Assistant Hot Tip of the day: home occupancy - conditions.yaml</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/pinned-octocat.svg" alt="Home Assistant Hot Tips of the Day"><span class="kg-bookmark-author">Gist</span><span class="kg-bookmark-publisher">262588213843476</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://github.githubassets.com/images/modules/gists/gist-og-image.png" alt="Home Assistant Hot Tips of the Day"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Working with engineers]]></title><description><![CDATA[<p>I have been working in Product for 7 years now.<br>I don&apos;t consider myself <em>skilled</em> as I believe I will never stop learning.<br><br>However, if there is one type of individual that seems to enjoy how I work, how I approach my job, and how I interact with</p>]]></description><link>https://blog.jlpouffier.fr/working-with-engineers/</link><guid isPermaLink="false">64ff7040637d040001cc3b54</guid><category><![CDATA[Product Management]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Fri, 10 Dec 2021 00:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1579403124614-197f69d8187b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNvZnR3YXJlfGVufDB8fHx8MTY5NDQ2MjAzNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1579403124614-197f69d8187b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNvZnR3YXJlfGVufDB8fHx8MTY5NDQ2MjAzNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Working with engineers"><p>I have been working in Product for 7 years now.<br>I don&apos;t consider myself <em>skilled</em> as I believe I will never stop learning.<br><br>However, if there is one type of individual that seems to enjoy how I work, how I approach my job, and how I interact with them, it&apos;s <strong>engineers</strong>.<br>I decided to reflect, both personally and with some fellow engineer colleagues, and try to understand the reasons.<br><br>I hope that this article will give some leads to fellow product managers about how to work well with engineers.<br><br>Here are the key messages of this article:</p><ul><li>&#x1F4AA; Do everything you can to empower your engineers so they own <em>problems</em> and not only <em>solutions</em>.</li><li>&#x1F4A1; Be curious and learn their language.</li><li>&#x269B;&#xFE0F; Shield your team from the outside noise.</li><li>&#x1F469;&#x200D;&#x1F4BB; Know your product, even its dark side.</li><li>&#x1F4E3; Align by communicating.</li></ul><h2 id="%F0%9F%92%AA-empowerment">&#x1F4AA; Empowerment</h2><p>The first and most important lead I would like to give to fellow product managers would be to <strong>empower your engineers</strong> as much as you can.<br><br>Non empowered engineers own <em>solutions </em>and have little interest in the &quot;whys&quot; that are behind these solutions (The users &amp; customers, the <em>problem</em> to be solved, etc).<br>Empowered engineers own a <em>problem. </em>They leverage <em>technology</em> and <em>context</em> to figure out the best <em>solution.</em><br><br><em>Non-empowered engineers are </em><strong><em>mercenaries</em></strong><em>.</em><br><em>Empowered engineers are </em><strong><em>missionaries</em></strong><em>.</em></p><blockquote><em>Teams of </em><strong><em>missionaries</em></strong><em> are engaged, motivated, have a deep understanding of the business context, and tangible empathy for the customer.</em><br><em>Teams of </em><strong><em>mercenaries</em></strong><em> feel no real sense of empowerment or accountability, no passion for the problem to be solved, and little real connection with the actual users and customers.</em><br><br><a href="https://svpg.com/missionaries-vs-mercenaries/">Missionaries vs. Mercenaries</a></blockquote><p>Marty Cagan considers empowering engineers is <a href="https://svpg.com/the-most-important-thing/">The Most Important Thing</a></p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/357416a1/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCSmRRL0NVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--380600239bf84f2880491d65df0fec436f9f202c/spotify.png?disposition=attachment"><img src="https://world.hey.com/jlpouffier/357416a1/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCSmRRL0NVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--380600239bf84f2880491d65df0fec436f9f202c/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/spotify.png" class="kg-image" alt="Working with engineers" loading="lazy"></a></figure><p><br><em>Extracted from the <a href="https://engineering.atspotify.com/2014/03/27/spotify-engineering-culture-part-1/">Spotify Engineering Culture</a></em><br><br>Your goal as a product manager is to make sure everyone in your team gets why they work, and why your company believes in what your team is pursuing.<br><br>They need to understand the company&apos;s vision, and how your team&apos;s vision ties to it.<br>They need to understand the company objectives, and how your team is contributing to them.<br>They need to know their users, their wishes &amp; pains, through accessible user feedback.<br><br>Empowering engineers is far from easy.<br>If not done right, it can lead to a lot of noise &amp; overhead, and would be counter-productive.<br>It&apos;s a delicate balance.<br><br>My goal is to make sure the team is a great <strong>understanding</strong> of how we take decisions about what problem to focus on while maximizing the time the team has to find and build the best solutions.<br><br><strong>Some tips on how I keep my engineers empowered:</strong></p><ul><li>I take bottom-up inputs to revise the <strong>company product vision</strong> from each team member as part of a recurring event called the <em>Rolling Strategy Process </em>happening every 3 months.</li><li>We shape the <strong>team product vision</strong> together as a team.</li><li>I try to make sure that our <strong>contribution to the company objectives</strong> can be easily understood and tracked via accessible dashboards.</li><li>I make sure <strong>user feedback</strong> is accessible by everyone in the team. I spend some time reading it weekly, and share a digest with my team.</li><li>Once we know which problem to solve, we always <strong>ideate</strong> together in order to find potential solutions.</li><li>When I plan to do some <strong>user interviews</strong>, I usually invite some of my engineers to one of them.</li><li>If I need to talk to a <strong>third-party partner</strong> (for example we are actively looking for our next payment partner), I either involve some of my engineers or share updates regularly with them if I consider the session will be too high level.</li></ul><h2 id="%F0%9F%92%A1-curiosity">&#x1F4A1; Curiosity</h2><p>I believe that you need to be curious and learn what software development really means.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/agrd8yb9mll61.jpg" class="kg-image" alt="Working with engineers" loading="lazy" width="700" height="212" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/agrd8yb9mll61.jpg 600w, https://blog.jlpouffier.fr/content/images/2023/09/agrd8yb9mll61.jpg 700w"></figure><p>Admittedly, this may be a bit simpler for me: I have a master of engineering, I have a hacker mindset, and try to cultivate it with <a href="https://blog.jlpouffier.fr/home-assistant-hot-tips-of-the-day/">side projects</a> every time I get a chance.<br><br>I cannot give you the scope of what you need to understand, as it vastly depends on how your company operates, and your affinity with learning technical topics.<br><br>Try to learn at least the following terms and concepts</p><ul><li>A front end</li><li>A back end</li><li>An API</li><li>A data model</li><li>A persistency layer</li><li>A pull request</li><li>A repository</li><li>A deployment</li><li>A rollback (or fallback)</li></ul><p>I believe these will always be useful regardless of where you work.<br><br>Try also to learn</p><ul><li>The <strong>review &amp; approval process</strong> (How engineers are making sure that issues are surfaced and fixed before reaching your customers)</li><li>The <strong>deployment process</strong> (How a piece of software code transitions from <em>done</em> to <em>available to your customers</em>)</li><li>The <strong>programming languages</strong> used by your engineers.</li><li>The <strong>high-level architecture</strong> of your product</li></ul><p>&#x1F914; <strong><em>But ... how?</em></strong><br>Start somewhere, book some slot with your engineers and ask them to explain something you don&apos;t know.I try to do a &#x2615;&#xFE0F; <em>Tech coffee</em> every week to keep myself up to date on technical concepts.<br><br>Build something! There are so many resources online, it would be a pity not to use them.<br>It can be as simple as a slack bot if your company uses slack.<br><br>&#x1F928; <strong><em>But ... why?</em></strong><br>There are so many advantages to speaking the same language as your engineers.<br><br>Being able to grasp the challenges faced by your team, you&apos;ll be able to <strong>communicate them much more efficiently to your stakeholders</strong>.<br><br>Let me give you a real example. <br>Last week one of my front-end engineers told me &quot;We should migrate one of our applications to NextJS&quot;.<br>I had no idea what it was nor why it was needed. I sat down with him and asked him to explain.<br><br>During our next planning event, this is how I will pitch it:</p><blockquote><em>Our checkout application contains 3 pages : a delivery section, a payment section, and a success screen. </em><br><em>Today most of the code needed to run the 3 pages is loaded when our users reach the first page.</em><br><em>It increases the response time on a very critical flow of our product.</em><br><em>With NextJS, we will automatically load only the right code at the right time, decreasing the response time and optimising the overall user experience of our checkout.</em><br><em>On top of that, migrating to NextJS will reduce the number of dependencies that our front-end engineers have to tediously handle manually.</em></blockquote><p>Did I totally understand this concept? Of course not.<br>Do I believe that the above pitch will be more convincing than: <em>&quot;We need to migrate to NextJS because my engineers told me so and I trust them </em>&#x1F937;&#x200D;&#x2642;&#xFE0F; <em>&quot; </em>? Yes. 100% yes.</p><h1 id="%E2%9A%9B%EF%B8%8F-entropy"><strong>&#x269B;&#xFE0F; Entropy</strong></h1><p>Being able to grasp technical concepts will also help you to <strong>shield your team from the noise.</strong><br><br>I&apos;ll quote <a href="https://twitter.com/lennysan">Lenny Rachitsky</a></p><blockquote><em>It&#x2019;s your job to shield your teams from stupid shit. Like time-sucking questions, unnecessary drama, and the whims of execs. People outside your team have no idea how much impact their ad hoc asks and &#x201C;quick&#x201D; questions have on the team. It&#x2019;s your job to help them see this, and to protect your team from them. Help your makers (e.g. engineers, designers, etc.) stay focused and in flow. Unfurl your shit umbrella.</em><br><br><a href="https://twitter.com/lennysan/status/1468249894531989505"><em>See twitter thread</em></a></blockquote><p>And I believe that the best way to shield your team from these <em>quick</em> questions is to be able to answer them yourself. </p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/357416a1/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTjZrK1NVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--ab0b21748524db477fa70fd9aa2848927d9660c2/d4d410c34fab7e6e55873196065bf725.png?disposition=attachment"><img src="https://world.hey.com/jlpouffier/357416a1/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTjZrK1NVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--ab0b21748524db477fa70fd9aa2848927d9660c2/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/d4d410c34fab7e6e55873196065bf725.png" class="kg-image" alt="Working with engineers" loading="lazy"></a></figure><p>Then, consider the current iteration (sprint, cycle, whatever its name) <strong>unbreakable</strong>.<br><br>If your company has a good understanding and implementation of agile, you should rarely learn things that are going to jeopardize what your team is doing <em>right now</em> (ie, in the current iteration).<br><br>&#x1F914; <strong><em>Why?</em></strong><br>Because agile teams either build to <em>learn</em> if they are on a discovery phase, or build <em>safe bets</em> that are already validated if they are on a delivery phase.<br>Plus these <em>safe bets</em> are very small: the size of the iteration (usually short).<br><br>If a new piece of information makes your current goals irrelevant then:</p><ul><li>Either you are building something that was not validated in a discovery phase</li><li>Either your iteration is so long that context changed</li></ul><p>Even bugs are usually not interrupting our iterations...<br>Bugs are not more important than everything else by default.<br>If a bug is extremely severe (a crisis, an outage), then we drop everything and fix it. No question asked.<br>Otherwise, it waits until the next iteration (That is very short)<br><br>At Ricardo, we plan work in 6 weeks cycles. (Each cycle is composed of 3 sprints of 2 weeks)<br>We now reached a point where bugs are planned during each cycle, like everything else.<br><br>It&apos;s aligned with how Basecamp deals with bugs</p><blockquote><em>There is nothing special about bugs that makes them automatically more important than everything else. The mere fact that something is a bug does not give us an excuse to interrupt ourselves or other people. All software has bugs. The question is: how severe are they? If we&#x2019;re in a real crisis&#x2014;data is being lost, the app is grinding to a halt, or a huge swath of customers are seeing the wrong thing&#x2014;then we&#x2019;ll drop everything to fix it. But crises are rare. The vast majority of bugs can wait six weeks or longer, and many don&#x2019;t even need to be fixed. If we tried to eliminate every bug, we&#x2019;d never be done. You can&#x2019;t ship anything new if you have to fix the whole world first.</em><br><br><a href="https://basecamp.com/shapeup/2.2-chapter-08#what-about-bugs"><em>Shape-up</em></a></blockquote><h1 id="%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-knowledge"><strong>&#x1F469;&#x200D;&#x1F4BB; Knowledge</strong></h1><p>This next statement is going to blow your mind :<br>As a product manager, you need to know your product &#x1F92F;<br><br>Pretty self-explanatory...<br>Or is it ?! <em>(VSAUCE vibes)</em><br><br>It&apos;s one thing to know your product.<br><br>It&apos;s another thing to know</p><ul><li>Your product</li><li>Its history</li><li>Its bugs</li><li>Its funky business rules</li><li>Its quirks</li><li>Its edge cases</li><li>Why were certain decisions taken a few years ago</li><li>What was already tested</li><li>What failed</li><li>etc.</li></ul><p>A product is like an onion, and your users only see the outer layer.<br>A product manager should know the whole onion.<br><br>A good product manager should be able to break his own product by pressing exactly where it hurts, and then explain to everyone why the team never worked on this specific edge case.<br><br>This is super useful for your engineers. You can point them towards potential pitfalls, dark edge cases that may cause a problem a few iterations down the road, and so on.<br><br><strong>A small tip:</strong><br>I keep a list of <strong>onboarding challenges</strong> that I use every time a newcomer is joining my team.<br>It consists of a list of tasks (or jobs) to be done on our product, as a user.<br>Each job is more complex than the previous one and builds on top of the learnings of the previous jobs.<br><br>It&apos;s a very fun way to learn your product and its intricacies as an engineer.</p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/357416a1/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTDRlK2lVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--eb0fd7678dcd7083c246af7835b8e8269e07f58c/image.png?disposition=attachment"><img src="https://world.hey.com/jlpouffier/357416a1/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTDRlK2lVPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--eb0fd7678dcd7083c246af7835b8e8269e07f58c/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJY0c1bkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--946116ea0c454412635aa7309bd9472bf633014c/image.png" class="kg-image" alt="Working with engineers" loading="lazy"></a></figure><p><em>Example of an &quot;onboarding challenge&quot;</em></p><h2 id="%F0%9F%93%A3-communication">&#x1F4E3; Communication</h2><p>As a product manager, you also own the newspaper that talks about your product, and you need to keep it alive.<br><br>Document and communicate every major decision the team is taking, so that you don&apos;t have the repeat why you are not working on <em>that-pet-project-your-CTO-always-talks-about.</em><br>&#x1F3AF; It&apos;s a great way to shield your team even more from the noise.<br><br>Share your team&apos;s success and its learnings.<br>Share what your users think about your new features.<br>Share the impact you are making, and why it is instrumental to the company&apos;s success.<br>&#x1F3AF; It&apos;s a fantastic way to remind engineers why they work and empower them.<br><br>When it comes to communication internal to your team :<br> <br>Document how features are built <em>(Usually in a document called the product requirements document [PRD])</em></p><ul><li>The assumptions</li><li>The tests you made, and their results</li><li>The business rules</li><li>The design choices</li><li>The wording choices</li><li>The edge cases that are considered out of scope</li><li>What you decided to track, and why.</li></ul><p>&#x1F3AF; This will be extremely useful to the team for future increments <em>(Nobody will remember everything after a few iterations)</em></p>]]></content:encoded></item><item><title><![CDATA[Predictability at Ricardo]]></title><description><![CDATA[<p>Over my 7 years of experience in Product, I have managed to be predictable only for the last 8 months. This article shed some light on how.</p><h2 id="what-is-predictability">What is predictability?</h2><p>As in every company, my team and I are asked to be <em>predictable.</em><br><br>At a certain point in time, we</p>]]></description><link>https://blog.jlpouffier.fr/predictability-at-ricardo/</link><guid isPermaLink="false">64fec5c3637d040001cc3af2</guid><category><![CDATA[Product Management]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Mon, 27 Sep 2021 00:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1611920504212-25894774afc5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fExBYnlyaW50aHxlbnwwfHx8fDE2OTQ0MTg3NjZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1611920504212-25894774afc5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fExBYnlyaW50aHxlbnwwfHx8fDE2OTQ0MTg3NjZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Predictability at Ricardo"><p>Over my 7 years of experience in Product, I have managed to be predictable only for the last 8 months. This article shed some light on how.</p><h2 id="what-is-predictability">What is predictability?</h2><p>As in every company, my team and I are asked to be <em>predictable.</em><br><br>At a certain point in time, we have to <em>say</em> what we plan to <em>do</em> over a certain period of <em>time</em>.<br>Once the time period is over, we have to <em>review</em> if we <em>did</em> what we <em>said</em>.<br><br>&#x1F446; This is the definition of <em>predictability</em>.</p><p>&#x1F64B; <strong><em>Why do we need to be predictable in the first place?</em></strong><br><br>For many different reasons!<br><br>It&apos;s very difficult for a company to believe in an idea if you cannot put a price tag next to it.<br><br>An unpredictable team will get stuck on dependencies with others. <br>The execution will be sub-optimal, for the team, but also for everyone that will be affected by the dependencies.<br><br>An unpredictable team may be working on the wrong thing. <br>A &quot;Quick win&quot; that a team prioritized now could very easily become a &quot;Very long fail&quot; if the team failed to see some UX or technical challenges.<br><br>An unpredictable team may &quot;sprint&quot; at the end of a period to finish things over. <br>It may neglect quality to &quot;check&quot; some arbitrary boxes.<br>I used the word &quot;sprint&quot; on purpose.<br>People should never sprint. Stories, tasks, things (call it however you want) should sprint.</p><blockquote><em>Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.</em><br>- <a href="https://www.agilealliance.org/agile101/12-principles-behind-the-agile-manifesto/"><em>Agile Principle #8</em></a></blockquote><p>&#x1F64B; <strong><em> Can we become 100% predictable?</em></strong><br><br>I don&apos;t think so. Estimation is an art.<br><br>The only way to estimate some work with <strong>100% accuracy</strong> &amp; <strong>100% confidence</strong> is to <strong>do it</strong>.<br><br>This means that any estimation methods lies between these two (useless) extremes:</p><ul><li>Estimation cost 0 &amp; accuracy 0% (For example: &quot;g<em>ive me your task I&apos;ll size it randomly</em>&quot;)</li><li>Estimation cost = implementation cost &amp; accuracy 100% (&quot;g<em>ive me your task, I&apos;ll do it and tell you afterward how much it took me</em>&quot;)</li></ul><p><br>Any other method will introduce risks and bias. <br>It&apos;s a balance between the effort it will take to estimate and the accuracy of the estimation.</p><h2 id="predictability-at-ricardo">Predictability at Ricardo</h2><p>&#x1F4A1; <em>Note: At </em><a href="https://ricardo.ch/"><em>Ricardo</em></a><em>, we like to revise iteratively our processes in order to continuously improve the way we work, so this article is </em><strong><em>not</em></strong><em> the definitive guide of how to be predictable. It is where we are, as a company, on our predictability journey.</em><br><br>&#x2B50;&#xFE0F; We believe that a common lightweight framework is required to align at the company level.<br>Similarly to many other companies, we do not believe in ready-to-use frameworks built by others that have to be adapted to our way of working (SAFe among others).<br>We believe that following the agile principles and creating something of our own is far more efficient.<br><br>At the company level, we plan work in chunks of 6 weeks that we call a <strong>cycle</strong>.<br>The 6-week planning chunk is becoming the norm for more and more companies, I will quote Basecamp:</p><blockquote><em>We wanted a cycle that would be long enough to finish a whole project, start to end. At the same time, cycles need to be short enough to see the end from the beginning. People need to feel the deadline looming in order to make trade-offs. If the deadline is too distant and abstract at the start, teams will naturally wander and use time inefficiently until the deadline starts to get closer and feel real.</em><br><br><em>After years of experimentation we arrived at six weeks. Six weeks is long enough to finish something meaningful and still short enough to see the end from the beginning.</em><br>- <a href="https://basecamp.com/shapeup/2.2-chapter-08#six-week-cycles">Shape-Up</a></blockquote><p>This article is going to be mainly focused on how we plan a cycle as a company... but first, let&apos;s quickly review how we operate <strong>inside</strong> a cycle :<br><br>&#x2B50;&#xFE0F; We believe that teams should have the freedom to adapt their process:Each team is free to organize the work the way they want within a cycle.<br><br>This is self-management at its finest.</p><blockquote><em>Scrum Teams are [...] self-managing, meaning they internally decide who does what, when, and how.</em><br>- &#x1F4AC; <a href="https://scrumguides.org/scrum-guide.html">Scrum Guide</a></blockquote><p>Some teams are doing 6 sprints of 1 week, others are doing 3 sprints of 2 weeks, others are using Kanban.<br>Each member of the company is invited to a single demo event, every week. <br>Each team chooses if they want to show something they shipped or learned, or if they pass their turn.<br>That&apos;s it. <br>It is as lightweight as it gets.</p><h3 id="the-festival">The Festival</h3><p>In between two cycles, we have a 2-day event that we call a <strong>Festival</strong> (&quot;<em>We rock</em>&quot; was one of our internal slogans when we started the festivals and the name stayed &#x1F60A;)</p><blockquote><em>Our Festival main goal is to commit on the best possible plan to execute, as a company, for the next 6 weeks. It&apos;s an alignment exercise where, as a team, we build and share our plan to move our business forward.</em><br>- Dimitri Kandassamy - Head of Delivery</blockquote><blockquote><em>The main goal of the Festival is surfacing all the possible dependencies and connections between all the departments and align employees to pursue all together the main goal of the company, precisely, directly and delivering it with high quality standards.</em><br>- Mirko Brambilla - Engineering Manager and Agile Lead</blockquote><p>A Festival is always composed of the same parts, in the same order</p><ul><li>&#x2728; Demo</li><li>&#x1F3A4; Pitch</li><li>&#x1F377; Speed Dating</li><li>&#x1F5FA; Planning</li><li>&#x1F3AF; Final Presentation</li></ul><p>&#x1F3B6; <em><strong>ACT 1: <a href="https://open.spotify.com/track/5WZDLZVCvY1rEyNir6k8Pg?si=cc27b7947f314f80">The show must go on</a></strong></em><br><br>The &#x2728; <strong>Demo</strong> is built like a show.<br>Each team goes on stage and has 10 minutes to show the <strong>impact created</strong> over the last 6 weeks.<br><br>We show that the needle moved, or we show what we learned to make it move the next time. We are emphasizing on the outcome we reached, and of course the outputs we built <em>(</em><a href="https://blog.jlpouffier.fr/dont-fall-in-love-with-what-you-do-fall-in-love-with-why-you-are-doing-it/"><em>Don&apos;t fall in love with what you do, fall in love with why you are doing it</em></a><em>)</em><br>The format is free. <br>Some teams are doing collaborative demos across different platforms, with some story-telling.<br>Some are playing with the audience.<br>Some teams are preparing after-movies.</p><p>&#x270B; <em>Personally, I am a big fan of presenting the problem by showing the user experience as it was before: Broken, boring, too long. Focusing a lot on the problems.</em><br><em>Then presenting what we did with the new experience, focusing a lot on the solutions we brought to the product.</em><br><em>Finally concluding by showing the impact of what we just presented: User feedback and data points.</em></p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/d29d5039/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCRHVsa1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--d25a32449dc84fbc15e81da127dac33b7f650157/20210914_Richardo_OMP_012.jpg?disposition=attachment"><img src="https://world.hey.com/jlpouffier/d29d5039/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCRHVsa1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--d25a32449dc84fbc15e81da127dac33b7f650157/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--0b5e092e6240e14fab357b4c1013c9a0c881ff87/20210914_Richardo_OMP_012.jpg" class="kg-image" alt="Predictability at Ricardo" loading="lazy"></a></figure><p><br>&#x1F3B6; <strong><em>ACT 2: </em></strong><a href="https://open.spotify.com/track/1hwdPQtFHISvZ9SXMkNrIK?si=383732aefd144333"><strong><em>I can show you the world</em></strong></a><br><br>After the demo, each team is &#x1F3A4; <strong>Pitching </strong>an opportunity.<br>The pitch is the presentation of the <strong>wished scope and the expected impact</strong> that the team wants to deliver in the next cycle.<br>The pitch is prepared by all the members of the team (engineers, designers, product Managers) and presented by the product manager.<br>Once again: the format is free. <br>All that matters is that the team is able to convey :</p><ul><li>What outcome they want to reach ...</li><li>... thanks to what output.</li></ul><p><br>&#x270B;<em> I like to make my pitches as if they were &quot;trailers for future demos&quot;.</em><br><em>I present the problem with the current user experience, I present what I plan to build with anything that can make it interesting: early designs, interactive prototypes, storytelling:</em><br><em>Some PMs like to explain much more in detail the reason behind their team choices.</em><br></p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/d29d5039/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTDJsa1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3561c84bc9ea9d9e3fbd4d434c067c785d785914/20210914_Richardo_OMP_011.jpg?disposition=attachment"><img src="https://world.hey.com/jlpouffier/d29d5039/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCTDJsa1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--3561c84bc9ea9d9e3fbd4d434c067c785d785914/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--0b5e092e6240e14fab357b4c1013c9a0c881ff87/20210914_Richardo_OMP_011.jpg" class="kg-image" alt="Predictability at Ricardo" loading="lazy"></a></figure><p></p><p>&#x1F3B6; <strong><em>ACT 3: </em></strong><a href="https://open.spotify.com/track/3z8h0TU7ReDPLIbEnYhWZb?si=5082450f1d9147d4"><strong><em>Is this the real life? Is this just fantasy?</em></strong></a><br><br>Most of the time (if not always &#x1F60A;) pitches are too idealistic.<br>We forgot some tasks or some duties, we assumed a department will be able to fully support us, etc, etc.<br>This is why the remaining part of the festival is used to &quot;reality check&quot; each pitch: This is the role of the &#x1F377; <strong>Speed dating.</strong><br><br>With the speed dating, each team gets the opportunity to stress test their plans, receive feedback and understand different perspectives from stakeholders. It&apos;s also the time to understand our dependencies better<br><br>At Ricardo, each opportunity team meets the following stakeholders and tries to answer the following questions:</p><p>SRE team</p><ul><li>Did we take into account all the infrastructure aspects of what we plan to create?</li></ul><p>Engineering heads</p><ul><li>Is technical debt handled?</li><li>Are post-mortem actions from past incidents taken care of?</li><li>Did we consider our engineers&apos; well-being? (Personal projects, technical training, etc)</li></ul><p>UX team</p><ul><li>Did we plan research efforts?</li><li>Do we need UX writing?</li></ul><p>Customer Care team</p><ul><li>Are the main customer pain points taken care of?</li><li>Do we need to train customer care agents for big new features</li><li>Is our help center up to date?</li><li>Does our internal <em>customer care administration tool</em> need new functionalities?</li></ul><p>Data Intelligence team</p><ul><li>Can we generate insights based on what we plan to build? (Do we know what to track, and how ?)</li><li>Are we lacking insights, and do we need to plan big data analysis (Like cohort analysis)</li></ul><p>Marketing team</p><ul><li>Do we have a go-to-market strategy, and do we need the marketing team to support us</li></ul><p>Business Development team</p><ul><li>Did we take into account our key accounts?</li><li>Do we need to talk or interact with our key accounts?</li></ul><p>SEO team</p><ul><li>Can we use what we plan to build as an opportunity to promote our product?</li><li>Are there SEO risks related to what we plan to build?</li></ul><p><br>&#x270B; <em>Speed dating is exhausting.</em><br><em>I like to bring the whole team with me, and assign a note-taker for every session (10 minutes per session).</em><br><em>I received great feedback from some developers that are learning or discovering some aspects of our work in these sessions (the research efforts for much later, the marketing campaigns we are trying to create to advertise our new features).</em><br></p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/d29d5039/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCQTZta1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--b6c3505d033fc400b7d77d5eb23e1e2efdd2df7d/20210915_Richardo_OMP_067.jpg?disposition=attachment"><img src="https://world.hey.com/jlpouffier/d29d5039/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCQTZta1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--b6c3505d033fc400b7d77d5eb23e1e2efdd2df7d/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--0b5e092e6240e14fab357b4c1013c9a0c881ff87/20210915_Richardo_OMP_067.jpg" class="kg-image" alt="Predictability at Ricardo" loading="lazy"></a></figure><p><br><br>&#x1F3B6;<strong> <em>ACT 4: </em></strong><a href="https://open.spotify.com/track/1qPbGZqppFwLwcBC1JQ6Vr?si=176a0ec9ea2144d4"><strong><em>By now you should&apos;ve somehow realized what you gotta do</em></strong></a><br><br>As you may have guessed, the opportunity teams usually finish the speed dating with a list of <em>things</em> they initially overlooked, a bunch of dependencies they did not think about, and a more accurate picture of the availability of each department that must support their opportunities.<br><br>Naturally, the next step is to revise the scope of the opportunity based on every learning of the speed dating sessions.<br>In other words: We &#x1F5FA; <strong>Plan</strong><br>We take the initial (and idealist) opportunity pitch and all the outputs generated from the speed dating, and we create from these a realistic plan.<br><br>This is when we ruthlessly prioritize between opportunities, operational work, and requests so we build the best possible plan while keeping in mind the constraints of running our business<br><br>The plan is composed of the scope that we commit to deliver during the next cycle and the milestones we plan to hit.<br><br>This plan takes into consideration everything:</p><ul><li>Features we plan to develop</li><li>Support from other departments</li><li>Quality work: Bugs, Technical debt, Design and UX debt, Post Mortem actions, Technical improvement</li><li>Research effort</li><li>Holidays, Training, Personal projects</li><li>etc</li></ul><p><br>This plan is a commitment from the team.<br>&#x270B;<em> The more we prepare and refine what we bring to the festival, the more accurate our estimations are.</em><br><em>During this session, we try to answer these questions:</em></p><ul><li><em>Do we all have the same understanding of what we plan to deliver, and why?</em></li><li><em>Did we plan all the dependencies that we knew or that we discovered during the speed dating?</em></li></ul><p><em>And then we put a rough estimate on each user stories and place them on a timeline.</em><br><em>We try not to overthink the planning, as we will refine these tasks every week during the cycle anyway.</em><br><em>Finally, we decide what is not making the cut.</em></p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/d29d5039/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCUFdta1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--0d7dd9184282165454f03611c807293f30672b46/20210915_Richardo_OMP_074.jpg?disposition=attachment"><img src="https://world.hey.com/jlpouffier/d29d5039/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCUFdta1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--0d7dd9184282165454f03611c807293f30672b46/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--0b5e092e6240e14fab357b4c1013c9a0c881ff87/20210915_Richardo_OMP_074.jpg" class="kg-image" alt="Predictability at Ricardo" loading="lazy"></a></figure><p><br>&#x1F3B6;<em> </em><strong><em>ACT 5: </em></strong><a href="https://open.spotify.com/track/7MJQ9Nfxzh8LPZ9e9u68Fq?si=760460a09559473e"><strong><em>Snap back to reality</em></strong></a><br><br>Finally, we close the festival with the <strong>&#x1F3AF; Final Team Presentations.</strong><br>Each PM goes back on stage and presents their committed planning, focusing on the delta with their initial (and idealistic) pitch.</p><figure class="kg-card kg-image-card"><a href="https://world.hey.com/jlpouffier/d29d5039/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCREtua1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--154946e53d43b6fc3237fd07ddd13ad7ff0f287d/20210914_Richardo_OMP_004.jpg?disposition=attachment"><img src="https://world.hey.com/jlpouffier/d29d5039/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCREtua1NBPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--154946e53d43b6fc3237fd07ddd13ad7ff0f287d/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDam9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2RkhKbGMybDZaVjkwYjE5c2FXMXBkRnNIYVFLQUIya0NBQVU2REhGMVlXeHBkSGxwU3pvTGJHOWhaR1Z5ZXdZNkNYQmhaMlV3T2cxamIyRnNaWE5qWlZRPSIsImV4cCI6bnVsbCwicHVyIjoidmFyaWF0aW9uIn19--0b5e092e6240e14fab357b4c1013c9a0c881ff87/20210914_Richardo_OMP_004.jpg" class="kg-image" alt="Predictability at Ricardo" loading="lazy"></a></figure><p><br>Everyone leaves the festival with a clear picture of <em>what</em> we are going to deliver, <em>why</em> and <em>when</em>, and with the certainty that most of the dependencies and other blockers will be handled</p><h3 id="the-festival-preparation">The Festival Preparation</h3><p>During a cycle, the team dedicates some time to prepare what they want to pitch next.<br>During the 4th week of a cycle, the team meets the leadership team for a &quot;cycle preparation&quot;, where they have the chance to &quot;rehearse&quot; their pitch.<br><br>This session is twofold:<br>&#x1F4AC; It is a discussion between the team and the leadership team. <br>&#x1F6A6; It is a decision meeting: the pitch is either green-lit or some aspects need to be revised before the festival (For example: maybe the expected impact is not aligned with our company OKRs)</p><h2 id="conclusion">Conclusion</h2><p>We just ended our 20th edition of the festival &#x1F389;<br>We are still adapting, trying, practicing. Our festival is and will always be a living process</p><blockquote><em>Practice isn&apos;t the thing you do once you&apos;re good. It&apos;s the thing you do that makes you good</em><br><em>- </em>Malcolm Gladwell</blockquote><p>I joined the company 11 cycles ago (1.5 years ago), it&apos;s amazing to see the result of our practice.<br>We are becoming more and more predictable and impactful.<br><br>1.5 years ago, for cycle #9, my team and I committed to delivering a proof of concept of a delivery service.<br>The plan was invalidated within the first week: We forgot to plan technical debt and our delivery provider was not ready to provide us with usable APIs.<br>We could have predicted it!<br>Last cycle (cycle #19), we completed all our main product goals (spread across iOS, android, and the web), technical goals, and quality goals.<br><br>We are not working faster, even if it feels much faster. <br>We just know where we are going now, we are predictable.</p><blockquote><em>1.5 years ago we were entering a maze every new cycle, now we still enter a maze but with google maps and some nice drone shots to show us what danger lies ahead.</em><br>- <em>Me, just now</em></blockquote>]]></content:encoded></item><item><title><![CDATA[Don't fall in love with what you do, fall in love with why you are doing it.]]></title><description><![CDATA[<blockquote><em>Dont fall in love with your code. </em><br><em>Fall in love with the results you deliver to users.</em></blockquote><p>This is what <a href="https://twitter.com/foz">Jeremy Seitz</a> said to all engineers when he was CTO at <a href="https://ricardo.ch/">Ricardo</a>.</p><p>When I asked Jeremy if I could quote him for this post he gave me a bit more</p>]]></description><link>https://blog.jlpouffier.fr/dont-fall-in-love-with-what-you-do-fall-in-love-with-why-you-are-doing-it/</link><guid isPermaLink="false">64fec419637d040001cc3aaa</guid><category><![CDATA[Product Management]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Wed, 10 Mar 2021 07:45:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1517607648415-b431854daa86?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxMb3ZlfGVufDB8fHx8MTY5NDQxNzk1M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<blockquote><em>Dont fall in love with your code. </em><br><em>Fall in love with the results you deliver to users.</em></blockquote><img src="https://images.unsplash.com/photo-1517607648415-b431854daa86?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxMb3ZlfGVufDB8fHx8MTY5NDQxNzk1M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Don&apos;t fall in love with what you do, fall in love with why you are doing it."><p>This is what <a href="https://twitter.com/foz">Jeremy Seitz</a> said to all engineers when he was CTO at <a href="https://ricardo.ch/">Ricardo</a>.</p><p>When I asked Jeremy if I could quote him for this post he gave me a bit more insights &#x1F4A1;</p><blockquote><em>Code is a cost, not an asset.</em><br><em>We should never be afraid to rewrite or delete code due to ego or sunk costs.</em><br><em>You&#x2019;re a great engineer if you deliver results</em><br><strong><em>The product is what has to be perfect, not the code.</em></strong></blockquote><p>First of all: I think it is amazing to hear these words from a CTO &#x2764;&#xFE0F;<br>This really speaks to the culture we have at Ricardo.<br>You should definitely <a href="https://careers.ricardo.ch/jobs">check us out</a> &#x1F4AA;</p><p>But here is my point of view: The product does not have to be perfect.<br>The product, just as the code, is an <strong>Output.</strong> Outputs are never complete</p><p>There will always be a way to add more features to a product, to make a user experience more appealing, or to make an API more robust.</p><p>Everything is a cost, the whole <strong>Output</strong> is expandable: The Product, the Code.<br>It all serves a higher purpose, The <strong>Outcome :</strong></p><ul><li>The user pains you are trying to solve</li><li>The benefits you are trying to bring to your users</li><li>The value</li></ul><p>This is why the &#x1F3AF; <strong>Outcome</strong> should always be the starting point for everything you do:<br>Don&apos;t fall in love with what you do (The <strong>Output</strong>)<br>Fall in love with why you are doing it (The <strong>Outcome</strong>)</p><p>If it means removing code, removing features, removing product ... Do it.</p><p>Everything you do today will be considered debt in the near future.<br>Not only code: The market evolves, your users evolve, standards evolve.<br>What is considered bleeding edge will become has-been one day.</p><p>Un-used features have a cost, but it&apos;s not money:<br>It is &#x1F4F1; screen real estate, &#x1F9D0; mental load... and these are limited resources.</p><p>Outputs are never complete.<br>This is why instead of thinking in <strong>estimate</strong>: &quot;How much time do we think this output (this feature) will be delivered ?&quot;...<br>I like to think in <strong>appetite</strong>: &quot;How much time are we willing to invest to reach this outcome? And what could we build in that time frame ?&quot;</p><p>Read more on working with appetites instead of estimates <a href="https://basecamp.com/shapeup/1.2-chapter-03#setting-the-appetite"><em>here</em></a></p><p>I will quote:</p><blockquote><em>Estimates start with a design and end with a number. </em><br><em>Appetites start with a number and end with a design.</em></blockquote><p>Of course, trying to reach an <strong>outcome</strong> with an appetite of a week compared with trying to reach it with an appetite of a year will not lead to the same <strong>output</strong>... the same product...<br>One will be much more refined than the other</p><p>Thinking in relatively small appetites (6 weeks for Ricardo) allows you to stop and reflect frequently about where you are compared to your targeted <strong>Outcome</strong>... and decide if you have more appetite or not for it.</p><p>This is the most effective way to make sure you are always working on the most important thing and not spending time over-optimizing something that is already good enough for your users.</p><p>&#x1F4D6; Further reads :<br><br><strong>Escaping the Build Trap</strong> - Melissa Perri </p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/DmJXpI7OJuY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Escaping the Build Trap - Melissa Perri"></iframe></figure><p>I&apos;ll quote one of the first sentences </p><blockquote><em>Companies end up in the build trap when they misunderstand value.</em><br><em>Instead of associating value with the </em><strong><em>outcomes </em></strong><em>they want to create [...], they measure value by the number of </em><strong><em>things</em></strong><em> they produce</em></blockquote>]]></content:encoded></item><item><title><![CDATA[My privacy journey, and how you can start yours]]></title><description><![CDATA[<h2 id="the-origin-story">The origin story</h2><p>One of my 2020 New Year resolutions was &quot;A month without social network&quot;.<br>The least I can say is that it was an enabler for me &#x1F4AA;</p><p>I spent way too much time in front of my screen endlessly scrolling for my next shot of</p>]]></description><link>https://blog.jlpouffier.fr/my-privacy-journey-and-how-you-can-start-yours/</link><guid isPermaLink="false">64fe3c91637d040001cc3a32</guid><category><![CDATA[Tech]]></category><category><![CDATA[Privacy]]></category><dc:creator><![CDATA[JLo]]></dc:creator><pubDate>Fri, 05 Mar 2021 00:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1555529902-5261145633bf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fExvY2t8ZW58MHx8fHwxNjk0NDE3NzQzfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="the-origin-story">The origin story</h2><img src="https://images.unsplash.com/photo-1555529902-5261145633bf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fExvY2t8ZW58MHx8fHwxNjk0NDE3NzQzfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="My privacy journey, and how you can start yours"><p>One of my 2020 New Year resolutions was &quot;A month without social network&quot;.<br>The least I can say is that it was an enabler for me &#x1F4AA;</p><p>I spent way too much time in front of my screen endlessly scrolling for my next shot of dopamine.<br>So in March 2020 (after a &#x1F378; Dry January and a &#x1F357; Vegan February - Maybe the subject of another blog post &#x1F914;), I went all-in:</p><p>I disconnected all my devices from:</p><ul><li>Facebook</li><li>YouTube (If you think YouTube is not a social network.. good for you... Don&apos;t spend too much time.. YouTube is the final boss of Social networks for me)</li><li>9gag</li><li>Reddit</li><li>Instagram</li><li>Twitter</li><li>LinkedIn</li></ul><p>and removed all apps from my phone.</p><p>The month went on ... like a breeze.<br>(Yes: it&apos;s actually easy to survive without social network, it&apos;s not like air or sleep ... Who would have thought &#x1F937;&#x200D;&#x2642;&#xFE0F;)<br>I honestly felt it was a loss of time.</p><p>It was only in April, when I was back on social networks, that I started to become way more aware of the enormous amount of time that I was losing scrolling endlessly &#x1F440; ...</p><h2 id="the-research">The research</h2><p>So I did as any curious person would do... I researched:<br>Why are we addicted to social media?<br>What is happening inside my brain when I scroll Facebook?<br>What&apos;s in it for Instagram when I interact with content on their platform?</p><p>Obviously, these answers are well known ... Everybody knows it.<br>Yet I found it extremely interesting to do my own research.</p><p>A TL;DR:<br>Companies collect your behavioral data to sell them to other companies that are using them (The more common example is targeting ads).<br>The more you interact with such platforms, the more data they collect, and the more precise the targeting is.<br>Social networks use strong cognitive biases such as the Default choice, The Ikea Choice, the Esthetic reward, etc., etc. to trick your brain into asking for more content.</p><p>Do you remember the time when the web was paginated?<br>The designer of the &quot;infinite scrolling&quot; thinks that his creation (Although extremely effective in keeping you engaged) <a href="https://www.telegraph.co.uk/technology/2019/05/10/lost-control-creations-silicon-valley-heretic-mission-make-big/">wastes around 200&apos;000 human lifetimes every day</a></p><ul><li>Watch the wonderful video series &quot;Dopamine&quot; on Arte available in <a href="https://www.arte.tv/fr/videos/RC-017841/dopamine/">French</a>, <a href="https://www.arte.tv/en/videos/RC-017841/dopamine/">English</a>, and <a href="https://www.arte.tv/de/videos/RC-017841/dopamin/">German</a>... It is an amazing eye-opener...</li><li>Dig deeper with Netflix&apos;s <a href="https://www.netflix.com/title/81254224">/the social dilemma</a> if you have more time.</li></ul><p>The point is: that I became data-aware.<br>I started to research how the services I was using were using my data...<br>And I decided to see if I could find more &quot;data-responsible&quot; alternatives... or as a fallback, ways to reduce the usage of a specific platform.</p><h2 id="the-solutions">The solutions </h2><p><strong>&#x1F44D; Facebook / &#x1F4F8; Instagram</strong></p><p>Eventually, I ended up deleting my Facebook and Instagram accounts: No alternatives here.</p><p><strong>&#x1F3A5; Youtube</strong></p><p>I did not manage to find a way to fully replace YouTube yet.<br>However, I found some pretty good tricks to better own my watch time.</p><ol><li>De-activate Auto-Play</li><li>Replace your YouTube bookmark with <a href="https://www.youtube.com/feed/subscriptions">https://www.youtube.com/feed/subscriptions</a> that way you will go straight to the content YOU subscribed to, and not the content YouTube thinks will keep you engaged.</li></ol><p><strong>&#x1F50D; Searching the web</strong></p><p>I replaced Google Search with DuckDuckGo.<br>For personal tips and learnings:</p><ul><li>Google search is miles away from any competitors in terms of search accuracy.<br>(They have way more data, they understand much more precisely your search intents, they give better results, rinse, repeat, profit)</li><li>The above point &#x1F446; can discourage you, because when you venture into the unknown, you will focus more easily on things you don&apos;t like.</li><li>&#x2705; Tips for new DuckDuckGo users: It is okay to give up and want to fall back to Google sometimes... DuckDuckGo has you covered. It&apos;s called <a href="https://duckduckgo.com/bang">bangs</a>. Just prefix any search by &quot;!g&quot; and you will fall back to Google automatically. Just like that</li><li>&#x2705; Using Qwant? prefix your search by &quot;&amp;g&quot; for the same result. They call them <a href="https://help.qwant.com/help/qwant-search/searching/how-use-qwick/">qwicks</a></li></ul><p><strong>&#x2709;&#xFE0F; e-mails</strong></p><p>I replaced Gmail with <a href="https://hey.com/">Hey</a><br>I am going to be honest with you... Hey is weird.<br>Hey is not &quot;yet another mail client&quot;.<br>Hey is doing almost everything the opposite way than other mail clients... I love it &#x1F525;.<br>It&apos;s pricy though .. 99$/Year<br>I would suggest you check the <a href="https://hey.com/features/">feature tour</a> before committing to Hey...<br>I would understand that people dislike Hey, as it is so far away from anything we know about emails...</p><p>I tried others before:</p><ul><li><a href="https://tutanota.com/">TutaNota</a></li><li><a href="https://protonmail.com/">ProntonMail</a></li></ul><p>Both security-oriented mail providers... way cheaper too.</p><p>But as a PM, I got attracted by some of the features that Hey offered, and at the end of the day, I think it&apos;s worth every penny.</p><p><strong>&#x1F30D; Browsing the Web</strong></p><p>I replaced Chrome with <a href="https://brave.com/">Brave</a>.<br>Brave is a Chrome-based browser.<br>This means you can use everything you know and love about Chrome (Extensions, shortcuts, etc, etc.).<br>It&apos;s available on all platforms (iOS, Android, Mac, Windows, name it)<br>Fewer barriers to migrate for you &#x1F389;</p><p>Brave has a really well-thought built-in tracker and ad blocker, and it works amazingly well.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image.png" class="kg-image" alt="My privacy journey, and how you can start yours" loading="lazy" width="2000" height="1228" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2023/09/image.png 2400w" sizes="(min-width: 720px) 720px"></figure><p><em>19 data points blocked after 2 minutes of watch time on YouTube...</em></p><p>I honestly don&apos;t see a single negative point with Brave... Give it a try now.<br>You will be surprised to see how many trackers Brave is blocking for you.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image--1-.png" class="kg-image" alt="My privacy journey, and how you can start yours" loading="lazy" width="2000" height="759" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image--1-.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image--1-.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image--1-.png 1600w, https://blog.jlpouffier.fr/content/images/2023/09/image--1-.png 2124w" sizes="(min-width: 720px) 720px"></figure><p><strong>&#x1F4AC; Instant Messaging</strong></p><p>I created a <a href="https://telegram.org/">Telegram</a> account and a <a href="https://www.signal.org/">Signal</a> account a long time ago...<br>The biggest barrier to switching an instant messaging app is that you also need your friends to do it &#x1F605;.<br>But honestly, since the whole &quot;<a href="https://www.bbc.com/news/technology-55573149">Whatsapp - Facebook will share your private data</a>&quot; debacle, everyone started to talk about Signal...</p><p>I managed to migrate my 4 most active multi-chat groups on Signal...<br>I said to myself &quot;It&apos;s a good first step&quot; ...<br>Well, it turned out to be an amazing first step, It&apos;s been 2 months since I opened Whatsapp.</p><p>More and more people are trying out Signal...<br>Speak to your friends, I am pretty sure you are not that far from saying &quot;bye-bye&quot; to Whatsapp.</p><p><strong>&#x2601;&#xFE0F; Cloud Storage, &#x1F305; Photo Storage</strong></p><p>Like a lot of people, I got hooked by Google Photo.<br>Fast service, unlimited storage for free...</p><p>&#x1F4A1; Heads-up if you are not aware and if you are using Google Photo: Google Photo is changing its <a href="https://blog.google/products/photos/storage-changes/">storage policy</a>: Starting June 1, 2021, any new photos and videos you upload will take up storage space.</p><p>This one is, unfortunately, a bit more hardcore to replace &#x1F613;<br>I own a Synology NAS, and for a few months, I have been using their <a href="https://www.synology.com/en-global/dsm/feature/moments">Moments</a> service...</p><p>So I am now storing my photos locally in my own &quot;Cloud&quot;.</p><p>Moments is available for both Android and iOS...<br>The web app is wonderfully designed (Strong inspirations from Google Photo)</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image--2-.png" class="kg-image" alt="My privacy journey, and how you can start yours" loading="lazy" width="2000" height="992" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image--2-.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image--2-.png 1000w, https://blog.jlpouffier.fr/content/images/size/w1600/2023/09/image--2-.png 1600w, https://blog.jlpouffier.fr/content/images/size/w2400/2023/09/image--2-.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>The only negative point of this alternative is the price &#x1F937;&#x200D;&#x2642;&#xFE0F; ...</p><ul><li>A NAS costs roughly 300$</li><li>Add 300$ of Hard drives</li></ul><p><strong>&#x1F5FA; DNS Routing</strong></p><p>This one is much geekier than the others...<br>That&apos;s why it&apos;s the last one &#x1F605;.</p><p>For those not familiar (like me before starting this project), there are some servers acting as big &quot;Address book of the internet&quot;: DNS Servers.</p><p>Every time you type an address on your browser (let&apos;s say www.google.com), it goes to a DNS server... and the DNS server replies:<br>Yep ! The closet way to go to www.google.com is to reach this random server <a href="https://www.google.com/">64.233.160.0</a><br>So you don&apos;t have to remember IP addresses by heart... (They change anyway so &#x1F937;&#x200D;&#x2642;&#xFE0F; don&apos;t try)</p><p>Interesting to know...</p><ul><li>Almost all third-party ads on a website are coming from the same sources... The famous companies that are making a profit by targeting ads. (Like <a href="https://www.criteo.com/">criteo</a>)</li><li>Almost all tracking points are collected to the same destination ... (Like <a href="https://analytics.google.com/">Google Analytics</a>)</li></ul><p>When you load a webpage:<br>If this webpage is integrating a Criteo ad: a DNS query will be sent to resolve criteo domain.<br>If this web page is tracking your behavior... It will try to send data to Analytics, and the DNS will have to resolve it too.</p><p>Most of the time, DNS servers are owned by big companies (Cloudflare, Google, Your Local ISP ...)</p><p>Some projects are using this &quot;Single point of resolution&quot; as a powerful way to block Ads and Trackers:</p><ul><li><a href="https://adguard.com/en/adguard-home/overview.html">AdGuard Home</a> (I am using that one)</li><li><a href="https://pi-hole.net/">PiHole</a></li></ul><p>In layman&apos;s terms (that&apos;s all I know anyway) :<br>It&apos;s a local DNS server.<br>For almost every resolution request, your DNS server is going to delegate the resolution to an upstream DNS server (So it&apos;s a lazy local DNS)<br>Your local DNS server has a list of every ad domain and tracking domain.<br>For those resolutions, it does not delegate anything: It just routes them to a back hole (Literally: 0.0.0.0)</p><p>It&apos;s like having Ad Block on your network.</p><p>Every connected device benefits from it</p><ul><li>Your TV</li><li>Your connected lights</li><li>Your friend phones</li><li>Etc .. etc...</li></ul><p>A safe bubble &#x1F4AA;</p><p>I was surprised to see the share of resolution blocked...</p><p>~15% of all my DNS resolutions are blocked by AdGuard Home.</p><figure class="kg-card kg-image-card"><img src="https://blog.jlpouffier.fr/content/images/2023/09/image--3-.png" class="kg-image" alt="My privacy journey, and how you can start yours" loading="lazy" width="1216" height="492" srcset="https://blog.jlpouffier.fr/content/images/size/w600/2023/09/image--3-.png 600w, https://blog.jlpouffier.fr/content/images/size/w1000/2023/09/image--3-.png 1000w, https://blog.jlpouffier.fr/content/images/2023/09/image--3-.png 1216w" sizes="(min-width: 720px) 720px"></figure><p><br>&#xFEFF;&#xFEFF;That&apos;s right... 15% of internet resolutions are either for Ads or for Tracking &#x1F92F;</p><p>The most blocked domains for me are:</p><ul><li>Analytics related to my PhilipsHue lights</li><li>Analytics related to my smart climate control</li><li>Analytics related to my smart vacuum cleaner</li><li>Analytics related to Netflix</li></ul><h2 id="conclusion">Conclusion</h2><p>I hope you learned something about what you can do to start owning your data.<br>Start small: Use Brave, Try DuckDuckGo. These are 2 really easy steps.</p>]]></content:encoded></item></channel></rss>