<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>lights on Wouter Bulten</title>
    <link>https://www.wouterbulten.nl/tags/lights/</link>
    <description>Recent content in lights on Wouter Bulten</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Copyright Wouter Bulten (except otherwise noted) &amp;copy; 2023 • All rights reserved.
</copyright>
    <lastBuildDate>Thu, 17 Jan 2019 00:00:00 +0000</lastBuildDate><atom:link href="https://www.wouterbulten.nl/tags/lights/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Setting color temperature and brightness of IKEA Tradfri lights simultaneously with Home Assistant</title>
      <link>https://www.wouterbulten.nl/posts/ikea-tradfri-temp-and-brightness-with-home-assistant/</link>
      <pubDate>Thu, 17 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.wouterbulten.nl/posts/ikea-tradfri-temp-and-brightness-with-home-assistant/</guid>
      <description>A small trick to set the color temperature and brightness of IKEA Tradfri lights simultaneously using Home Assistant and/or Node-RED.</description>
      <content:encoded><![CDATA[<p>In my smart home I use multiple IKEA Tradfri lights in combination with a Conbee Zigbee hub and Home Assistant. Recently I encountered a problem when trying to set both the brightness and the color temperature in a Home Assistant service call (<code>light.turn_on</code>). Apparently, the Tradfri bulbs only respond to one of these values at a time. This is unfortunate as changing the temperature and brightness is usually linked. For example, setting the lights to a dimmed warm setting at night or bright white in the morning. Luckily, there is a workaround to be able to set both simultaneously (sort of at least).</p>
<p>The <strong>solution to setting brightness and color temp on Tradfri lights</strong> is to split the single service call in to two and let those blend. In my setup, I first set the brightness of the lights with a small transition and use a second call to change the color temperature with a longer transition. I have tested multiple setups and this method results in the smoothest transition. In essence my workaround performs three steps:</p>
<ol>
<li>Turn on the light with the target brightness.</li>
<li>Delay for a second to make sure that the previous call has finished.</li>
<li>Set the color temperature of the light with a short transition (5 seconds).</li>
</ol>
<p>By putting these steps in to a script it can act as a drop-in replacement of a normal light call. If one of the settings was already set earlier, for example the brightness did not change, the transition is even smoother.</p>
<p>I have created two versions of this workaround, one for <a href="#ha">Home Assistant (YAML)</a> and one for <a href="#nodered">Node-RED</a>, to help others that encounter this problem. It is not the most elegant solution but in practice it works pretty good!</p>
<p><a name="ha"></a></p>
<h2 id="home-assistant-script">Home Assistant script</h2>
<p>To use the workaround in Home Assistant (yaml) add the following snippet to <code>scripts.yaml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">turn_on_ikea_light</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">sequence</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Check whether the light is off (optional)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">condition</span><span class="p">:</span><span class="w"> </span><span class="l">template</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">value_template</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ is_state(entity, &#39;off&#39;) }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">delay</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;00:00:01&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Set the brightness of the lights.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">light.turn_on</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">data_template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">entity_id</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ entity }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">brightness_pct</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ brightness_pct }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">transition</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">delay</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;00:00:01&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Set the color temperature.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">light.turn_on</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">data_template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">entity_id</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ entity }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">color_temp</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ color_temp }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">transition</span><span class="p">:</span><span class="w"> </span><span class="m">5</span><span class="w">
</span></span></span></code></pre></div><p>This block of code adds a new script <code>turn_on_ikea_light</code> that can be called inside automations. <code>entity</code>, <code>brightness_pct</code> and <code>color_temp</code> are variables that can be set when calling the script. An example is the following automation where a light is turned on when a motion sensor registers movement:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Example automation using the script</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">automation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">Turn on lights on movement</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">trigger</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">platform</span><span class="p">:</span><span class="w"> </span><span class="l">state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">entity_id</span><span class="p">:</span><span class="w"> </span><span class="l">sensor.motion_sensor</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;on&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">action</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">script.turn_on_ikea_light</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">data_template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># Variables that are passed on to the script:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">entity</span><span class="p">:</span><span class="w"> </span><span class="l">light.some_light_entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">brightness_pct</span><span class="p">:</span><span class="w"> </span><span class="m">80</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">color_temp</span><span class="p">:</span><span class="w"> </span><span class="m">350</span><span class="w">
</span></span></span></code></pre></div><p><a name="nodered"></a></p>
<h2 id="node-red-script">Node-RED script</h2>
<p>I&rsquo;ve recently switched most of my automations to Node-RED so also rewrote my workaround. In Node-RED we need two service calls to HA (one for brightness and one for color temp). In the most simple case this can be done with two &ldquo;call service&rdquo; nodes and a delay node. To be able to reuse the flow this can be created as a subflow:</p>
<p><figure>
    <img loading="lazy" src="/assets/images/ha/ikea-tradfri-subflow.png" alt="Subflow to set brightness and color temperature on Ikea lights">
    <figcaption>
        <p>Subflow to set brightness and color temperature on Ikea lights</p>
    </figcaption>
</figure>  </p>
<p>The subflow shown above expects a JSON message as the <code>msg.payload</code>. The payload is then split in to the two service calls. For example, to set the temperature of a light to 150 and the brightness to 100%, one could send the following payload:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;entity_id&#34;</span><span class="p">:</span> <span class="s2">&#34;light.some_light_entity&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;color_temp&#34;</span><span class="p">:</span> <span class="mi">150</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;brightness_pct&#34;</span><span class="p">:</span><span class="mi">100</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The values can be hard coded in a change-node or can be dynamically set (for example based on the time of day).</p>
<p><figure>
    <img loading="lazy" src="/assets/images/ha/ikea-tradfri-flow.png" alt="Complete flow in Node-RED. Replace the inject node with something useful, e.g. a motion event.">
    <figcaption>
        <p>Complete flow in Node-RED. Replace the inject node with something useful, e.g. a motion event.</p>
    </figcaption>
</figure>  </p>
<p>The nodes of the subflow can be imported using the following snippet:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">[{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;13593ff8.a6556&#34;</span><span class="p">,</span><span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;api-call-service&#34;</span><span class="p">,</span><span class="nt">&#34;z&#34;</span><span class="p">:</span><span class="s2">&#34;2dc416a2.d3b6fa&#34;</span><span class="p">,</span><span class="nt">&#34;name&#34;</span><span class="p">:</span><span class="s2">&#34;Turn on lights&#34;</span><span class="p">,</span><span class="nt">&#34;server&#34;</span><span class="p">:</span><span class="s2">&#34;161bb087.35566f&#34;</span><span class="p">,</span><span class="nt">&#34;service_domain&#34;</span><span class="p">:</span><span class="s2">&#34;light&#34;</span><span class="p">,</span><span class="nt">&#34;service&#34;</span><span class="p">:</span><span class="s2">&#34;turn_on&#34;</span><span class="p">,</span><span class="nt">&#34;data&#34;</span><span class="p">:</span><span class="s2">&#34;{\&#34;entity_id\&#34;:\&#34;light.some_entity\&#34;,\&#34;transition\&#34;:1}&#34;</span><span class="p">,</span><span class="nt">&#34;render_data&#34;</span><span class="p">:</span><span class="kc">false</span><span class="p">,</span><span class="nt">&#34;mergecontext&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span><span class="nt">&#34;output_location&#34;</span><span class="p">:</span><span class="s2">&#34;payload&#34;</span><span class="p">,</span><span class="nt">&#34;output_location_type&#34;</span><span class="p">:</span><span class="s2">&#34;msg&#34;</span><span class="p">,</span><span class="nt">&#34;x&#34;</span><span class="p">:</span><span class="mi">700</span><span class="p">,</span><span class="nt">&#34;y&#34;</span><span class="p">:</span><span class="mi">480</span><span class="p">,</span><span class="nt">&#34;wires&#34;</span><span class="p">:[[]]},{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;7167f74f.dd6528&#34;</span><span class="p">,</span><span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;api-call-service&#34;</span><span class="p">,</span><span class="nt">&#34;z&#34;</span><span class="p">:</span><span class="s2">&#34;2dc416a2.d3b6fa&#34;</span><span class="p">,</span><span class="nt">&#34;name&#34;</span><span class="p">:</span><span class="s2">&#34;Set color temp&#34;</span><span class="p">,</span><span class="nt">&#34;server&#34;</span><span class="p">:</span><span class="s2">&#34;161bb087.35566f&#34;</span><span class="p">,</span><span class="nt">&#34;service_domain&#34;</span><span class="p">:</span><span class="s2">&#34;light&#34;</span><span class="p">,</span><span class="nt">&#34;service&#34;</span><span class="p">:</span><span class="s2">&#34;turn_on&#34;</span><span class="p">,</span><span class="nt">&#34;data&#34;</span><span class="p">:</span><span class="s2">&#34;{\&#34;transition\&#34;:5}&#34;</span><span class="p">,</span><span class="nt">&#34;render_data&#34;</span><span class="p">:</span><span class="kc">false</span><span class="p">,</span><span class="nt">&#34;mergecontext&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span><span class="nt">&#34;output_location&#34;</span><span class="p">:</span><span class="s2">&#34;payload&#34;</span><span class="p">,</span><span class="nt">&#34;output_location_type&#34;</span><span class="p">:</span><span class="s2">&#34;msg&#34;</span><span class="p">,</span><span class="nt">&#34;x&#34;</span><span class="p">:</span><span class="mi">840</span><span class="p">,</span><span class="nt">&#34;y&#34;</span><span class="p">:</span><span class="mi">420</span><span class="p">,</span><span class="nt">&#34;wires&#34;</span><span class="p">:[[]]},{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;96a91d65.7a1a4&#34;</span><span class="p">,</span><span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;delay&#34;</span><span class="p">,</span><span class="nt">&#34;z&#34;</span><span class="p">:</span><span class="s2">&#34;2dc416a2.d3b6fa&#34;</span><span class="p">,</span><span class="nt">&#34;name&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span><span class="nt">&#34;pauseType&#34;</span><span class="p">:</span><span class="s2">&#34;delay&#34;</span><span class="p">,</span><span class="nt">&#34;timeout&#34;</span><span class="p">:</span><span class="s2">&#34;1&#34;</span><span class="p">,</span><span class="nt">&#34;timeoutUnits&#34;</span><span class="p">:</span><span class="s2">&#34;seconds&#34;</span><span class="p">,</span><span class="nt">&#34;rate&#34;</span><span class="p">:</span><span class="s2">&#34;1&#34;</span><span class="p">,</span><span class="nt">&#34;nbRateUnits&#34;</span><span class="p">:</span><span class="s2">&#34;1&#34;</span><span class="p">,</span><span class="nt">&#34;rateUnits&#34;</span><span class="p">:</span><span class="s2">&#34;second&#34;</span><span class="p">,</span><span class="nt">&#34;randomFirst&#34;</span><span class="p">:</span><span class="s2">&#34;1&#34;</span><span class="p">,</span><span class="nt">&#34;randomLast&#34;</span><span class="p">:</span><span class="s2">&#34;5&#34;</span><span class="p">,</span><span class="nt">&#34;randomUnits&#34;</span><span class="p">:</span><span class="s2">&#34;seconds&#34;</span><span class="p">,</span><span class="nt">&#34;drop&#34;</span><span class="p">:</span><span class="kc">false</span><span class="p">,</span><span class="nt">&#34;x&#34;</span><span class="p">:</span><span class="mi">680</span><span class="p">,</span><span class="nt">&#34;y&#34;</span><span class="p">:</span><span class="mi">420</span><span class="p">,</span><span class="nt">&#34;wires&#34;</span><span class="p">:[[</span><span class="s2">&#34;7167f74f.dd6528&#34;</span><span class="p">]]},{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;b76ccf31.5d0c&#34;</span><span class="p">,</span><span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;function&#34;</span><span class="p">,</span><span class="nt">&#34;z&#34;</span><span class="p">:</span><span class="s2">&#34;2dc416a2.d3b6fa&#34;</span><span class="p">,</span><span class="nt">&#34;name&#34;</span><span class="p">:</span><span class="s2">&#34;Split payload&#34;</span><span class="p">,</span><span class="nt">&#34;func&#34;</span><span class="p">:</span><span class="s2">&#34;br = {\n    payload: {\n        data: {\n            entity_id: msg.payload.entity_id,\n            brightness_pct: msg.payload.brightness_pct\n        }\n    }\n}\n\nwarmth = {\n    payload: {\n        data: {\n            entity_id: msg.payload.entity_id,\n            color_temp: msg.payload.color_temp\n        }\n    }\n}\n\nreturn [warmth, br]\n&#34;</span><span class="p">,</span><span class="nt">&#34;outputs&#34;</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="nt">&#34;noerr&#34;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="nt">&#34;x&#34;</span><span class="p">:</span><span class="mi">490</span><span class="p">,</span><span class="nt">&#34;y&#34;</span><span class="p">:</span><span class="mi">440</span><span class="p">,</span><span class="nt">&#34;wires&#34;</span><span class="p">:[[</span><span class="s2">&#34;96a91d65.7a1a4&#34;</span><span class="p">],[</span><span class="s2">&#34;13593ff8.a6556&#34;</span><span class="p">]]},{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;161bb087.35566f&#34;</span><span class="p">,</span><span class="nt">&#34;type&#34;</span><span class="p">:</span><span class="s2">&#34;server&#34;</span><span class="p">,</span><span class="nt">&#34;z&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">,</span><span class="nt">&#34;name&#34;</span><span class="p">:</span><span class="s2">&#34;Home Assistant&#34;</span><span class="p">}]</span>
</span></span></code></pre></div><div class="post-info-frame">
    <figure style="max-width: 240px;">
     <img src="/assets/images/ha/logos/ha-logo.svg" loading="lazy" alt="Home automation"></a>
    </figure>
    
    <h2>Series on Home Automation</h2>
    
    <p>This post is part of a series of posts on Home Automation. These posts usually cover a part of my own smart home or a project I worked on. I make heavy use of Home Assistant, Node-RED and AppDaemon to control my home; these posts are examples of this.</p>
        
    <h3>Interested in my setup?</h3>

    <a class="btn btn-primary" href="/posts/home-assistant-smart-home-hardware-setup/">Home Automation hardware setup</a>

    <h3>Other posts in this series</h3>
    <p>Interested in Home Automation, Home Assistant or Node-RED? I have a few other posts that might be of interest:</p>
    <ul>
    
        <li>
            <h4><a href="https://www.wouterbulten.nl/posts/home-assistant-smart-home-setup-two-years-later/">Home Automation / Home Assistant setup with recommended hardware: The four-year update</a></h3>
            <p><small>Overview of my current hardware for my smart home powered by Home Assistant. An update on my previous post of four years ago (!) when I had just started with home automation.</small></o>
        </li>
     
        <li>
            <h4><a href="https://www.wouterbulten.nl/posts/auto-turn-on-off-chromecast/">Automatically turn on tv when streaming to a Chromecast</a></h3>
            <p><small>Quick Node-RED tutorial on automatically turning on a TV when streaming media.</small></o>
        </li>
     
        <li>
            <h4><a href="https://www.wouterbulten.nl/posts/home-assistant-automatic-dark-mode/">Automatic dark mode for Home Assistant</a></h3>
            <p><small>Quick tutorial on setting up an automatic dark mode for Home Assistant.</small></o>
        </li>
     
    </ul>   
</div>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
