<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Yehor Vialov's Blog</title>
        <link>https://www.yevi.org/blog</link>
        <description>Some notes, interesting things and projects</description>
        <lastBuildDate>Mon, 24 Nov 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © ${new Date().getFullYear()} Yehor Vialov</copyright>
        <item>
            <title><![CDATA[Daily Matrix and Mastodon backups with zero downtime]]></title>
            <link>https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime</link>
            <guid>https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime</guid>
            <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As I now run my own Mastodon instance where anyone can request registration, there are goals to achieve with it. For example, the Mastodon Server Covenant. There is "Daily backups" among other requirements, and today's story is about that. It involves Proxmox Backup Server, Ansible, and Tailscale as the three pillars of "Daily Matrix and Mastodon backups with zero downtime."]]></description>
            <content:encoded><![CDATA[<p>As I now run my own <a href="https://mastodon.glitchy.social/" target="_blank" rel="noopener noreferrer">Mastodon instance</a> where anyone can request registration, there are goals to achieve with it. For example, the <a href="https://joinmastodon.org/covenant" target="_blank" rel="noopener noreferrer">Mastodon Server Covenant</a>. There is "Daily backups" among other requirements, and today's story is about that. It involves Proxmox Backup Server, Ansible, and Tailscale as the three pillars of "Daily Matrix and Mastodon backups with zero downtime."</p>
<p>The simplest way to back up my Mastodon and Matrix servers, which run in a separate LXCs, was to set up snapshot-type backups on the Proxmox datacenter level and be happy, but snapshotting the database files is not the right way. You can catch your Postgres in the middle of the transaction and leave it corrupted after the restore. The right way was to make a dump of the databases, for example, with <a href="https://www.postgresql.org/docs/current/app-pgdump.html" target="_blank" rel="noopener noreferrer"><code>pg_dump</code></a>, because "It generates a consistent snapshot of the database at the time the command is executed, even if the database is being used concurrently, without blocking other users."</p>
<p>But what about the other files? Configuration files, secrets, media storage? Sure, we can <code>rsync</code> them off the server along with the database dump and be happy, but what about backup versioning, retention, and deduplication? As I already had a Proxmox Backup Server to handle those, my plan for backing up a server was simple:</p>
<ol>
<li>Make a database dump to the file system of the server</li>
<li>Make a snapshot-type backup of the server to the PBS</li>
</ol>
<p>This way, I'd have consistent daily backups with a database dump and all needed files. And the restore procedure would consist of the same two steps, but in reverse:</p>
<ol>
<li>Restore the server from PBS</li>
<li>Restore the database from the dump on the server's file system</li>
</ol>
<p>I'm not claiming to be an inventor of something new; I just think it is a good way. Loosing or corrupting several media files during this process is far less critical as missing database records or ending up with a corrupted database.</p>
<p>So I ended up with two separate tools to make a backup. First is a <code>pg_dump</code> CLI tool on the server, and the second one is a Proxmox Node to perform an LXC backup. Syncing those two, relying only on the time and delays, felt like a bad idea, so I decided to use Ansible from another Proxmox LXC to connect to my servers, make a database dump, and trigger a Proxmox backup job.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tailscale-ssh">Tailscale SSH<a href="https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime#tailscale-ssh" class="hash-link" aria-label="Direct link to Tailscale SSH" title="Direct link to Tailscale SSH">​</a></h2>
<p>To make that work, I needed an SSH connection between my "guard" server with Ansible running and the other two servers to back up. Sure, I could generate new SSH keys, make an exchange, but I already had Tailscale on my Proxmox guests, so why not use <a href="https://tailscale.com/kb/1193/tailscale-ssh" target="_blank" rel="noopener noreferrer">Tailscale SSH</a> for that?</p>
<p>The hardest part of Tailscale SSH configuration is to configure access rules, because Tailscale SSH between Tailscale devices is disabled by default. To enable it, I created two ACL tags in Tailscale:</p>
<ol>
<li>"ansible-control-node" to assign to the "guard" server</li>
<li>"ansible-managed-node" to assign to the Matrix and Mastodon servers</li>
</ol>
<p>Then, in the Tailscale Access Control, I just created a new rule for Tailscale SSH to allow SSH connection from "ansible-control-node" to "ansible-managed-node".</p>
<p><img decoding="async" loading="lazy" alt="Tailscale ACL rule" src="https://www.yevi.org/assets/images/ts_acl-a20f8bd495a66046becf6c18d6880c01.png" width="1732" height="422" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="playbook">Playbook<a href="https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime#playbook" class="hash-link" aria-label="Direct link to Playbook" title="Direct link to Playbook">​</a></h2>
<p>On the "ansible-control-node", I installed Ansible Core 2.19 (at the moment of writing), created a <code>playbook.yaml</code> and an <code>inventory.yaml</code>.</p>
<p>After some research and documentation reading, my <code>playbook.yaml</code> ended up with two plays.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="database-dump">Database dump<a href="https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime#database-dump" class="hash-link" aria-label="Direct link to Database dump" title="Direct link to Database dump">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Database dumps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">remote_user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Dump all databases</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pg_dumpall </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">c </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">f /var/lib/postgresql/db_dump_all.sql</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">become_user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">become</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>hosts</code> here is a group containing servers with installed PostgreSQL.</p>
<p>I used the <code>ansible.builtin.command</code> task to create a dump of all databases on the server to a file, becoming a <code>postgres</code> user. This system user is created by default in Ubuntu or Debian when installing Postgres from the apt repository.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="proxmox-backup">Proxmox backup<a href="https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime#proxmox-backup" class="hash-link" aria-label="Direct link to Proxmox backup" title="Direct link to Proxmox backup">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Backup Proxmox nodes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> localhost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Backup matrix and mastodon node</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">community.proxmox.proxmox_backup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">api_user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ansible@pve</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">api_password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">***************</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">api_host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">***.***.***.***</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pbs </span><span class="token comment" style="color:#999988;font-style:italic"># PBS storage ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">backup_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> snapshot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">retention</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> keep</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">monthly=6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> keep</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">weekly=4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> keep</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">daily=7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> include</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">wait</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">wait_timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Wait fro x seconds before throwing a timeout error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">vmids</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">## Proxmo guest IDs to backup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">109</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">111</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>hosts</code> here is a <code>localhost</code> because we will trigger the Proxmox backup job through the Proxmox API.</p>
<p>I created a separate user for this task on my Proxmox VE, giving him the <code>VM.Backup</code> role for selected guests and <code>Datastore.Allocate</code> plus <code>Datastore.AllocateSpace</code> for the PBS storage.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="schedule">Schedule<a href="https://www.yevi.org/blog/daily-matrix-and-mastodon-backups-with-zero-downtime#schedule" class="hash-link" aria-label="Direct link to Schedule" title="Direct link to Schedule">​</a></h2>
<p>The last step was to run this playbook daily. I used a cron job. As the path to apps installed with Python was added to the <code>PATH</code> environment variable through the <code>.bashrc</code>, it is not available for the crontab, so I used a full path to the <code>ansible-playbook</code>. Use <code>whereis ansible-playbook</code> to get the full path.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">0 1 * * *  /root/.local/bin/ansible-playbook /root/ansible/playbook.yaml -i /root/ansible/inventory.yaml &gt; /var/log/backups.log 2&gt;&amp;1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This job will be executed every day at 01:00 and write the result of the execution to <code>/var/log/backups.log</code>. The log file will be rewritten in this case. If you want to append the log on each job execution, change <code>&gt; /var/log/backups.log</code> to <code>&gt;&gt; /var/log/backups.log</code>.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a><a class="blogDiscussions_container_bVZd" href="https://mastodon.glitchy.social/@yehor/115604665259369123" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M494.3 113.4C486.9 58.3 439 15 382.1 6.6 372.5 5.2 336.2 0 252 0h-.6c-84.2 0-102.2 5.2-111.8 6.6-55.3 8.2-105.7 47.1-118 102.8-5.9 27.4-6.5 57.8-5.4 85.7 1.6 40 1.9 79.9 5.5 119.7 2.5 26.4 6.9 52.7 13.1 78.5 11.6 47.7 58.7 87.4 104.9 103.6 49.4 16.9 102.6 19.7 153.5 8.1 5.6-1.3 11.1-2.8 16.6-4.5 12.4-3.9 26.9-8.3 37.5-16.1.1-.1.3-.2.4-.4s.1-.3.1-.5v-38.6c0-.2 0-.3-.1-.5s-.2-.3-.3-.4-.3-.2-.5-.2h-.5c-32.6 7.8-66.1 11.7-99.6 11.6-57.7 0-73.2-27.4-77.7-38.8-3.6-9.9-5.8-20.1-6.7-30.6 0-.2 0-.4.1-.5.1-.2.2-.3.3-.4s.3-.2.5-.2h.5c32.1 7.7 65 11.6 98 11.6 7.9 0 15.8 0 23.8-.2 33.2-.9 68.2-2.6 100.8-9 .8-.2 1.6-.3 2.3-.5 51.5-9.9 100.5-40.9 105.5-119.5.2-3.1.7-32.4.7-35.6-.1-11 3.4-77.5-.6-118.3m-81.6 198.5h-54.2V179.2c0-27.9-11.6-42.2-35.3-42.2-26 0-39.1 16.8-39.1 50.1v72.6h-53.8v-72.6c0-33.3-13.1-50.1-39.1-50.1-23.5 0-35.3 14.2-35.3 42.2v132.6h-54.1V175.2c0-27.9 7.1-50.1 21.4-66.6 14.7-16.4 34-24.8 58-24.8 27.7 0 48.7 10.7 62.6 32l13.5 22.6 13.5-22.6c14-21.3 34.9-32 62.6-32 23.9 0 43.2 8.4 58 24.8q21.3 24.6 21.3 66.6z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Mastodon</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Matrix</category>
            <category>Glitchy.Social</category>
            <category>Synapse</category>
            <category>Mastodon</category>
            <category>PBS</category>
            <category>Tailscale</category>
            <category>Ansible</category>
        </item>
        <item>
            <title><![CDATA[Glitchy.Social. The beginning]]></title>
            <link>https://www.yevi.org/blog/glitchy-social-the-beginning</link>
            <guid>https://www.yevi.org/blog/glitchy-social-the-beginning</guid>
            <pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[I've decided that the computing power of my Hetzner dedicated server allows me to provide some services to others. This is where Glitchy.Social has started.]]></description>
            <content:encoded><![CDATA[<p>I've decided that the computing power of my Hetzner dedicated server allows me to provide some services to others. This is where Glitchy.Social has started.</p>
<p>I already had the Synapse Matrix server hosted in my personal domain. And I thought that it was stable enough for me to allow other users to register. With registration tokens, I'll provide, of course. But my personal domain represents a part of my second name. "Who wants a Matrix account in the domain that represents a part of someone's second name?" - I thought.</p>
<p>That's how my Matrix server has migrated to a newly purchased <code>glitchy.social</code> domain. Actually, that was not a migration, but rather starting from scratch. I dropped the database of Synapse and Matrix Authentication Service, changed the homeserver name in all configs, and started fresh.</p>
<p>You can chat with me now at <a href="https://matrix.to/#/@yehor:glitchy.social" target="_blank" rel="noopener noreferrer">@yehor<!-- -->:glitchy<!-- -->.social</a>.</p>
<p>Then I started to think about how people will know how to join. Or even will know about Glitchy.Social itself? "I need a landing page. Or a website!" - I concluded.</p>
<p><a href="https://www.yevi.org/" target="_blank" rel="noopener noreferrer">yevi.org</a> is a Dcusaurus-powered website. And I really like its flexibility. It is as simple as adding or editing markdown files, but at the same time, you can write your own JavaScript components using ReactJS. Isn't it cool?</p>
<p>So I present you today a shiny result of a one-night work: <a href="https://www.glitchy.social/" target="_blank" rel="noopener noreferrer">www.glithcy.social</a>!</p>
<p>"Hey! That's a nice logo you have there," you'll suddenly exclaim, at least in my head. And I appreciate that reaction, because it is not an AI-generated slop. It is several hours of Inkscape with two project managers beside me: my wife and my daughter. I think they are still unsatisfied with my work, but we will improve it someday. For now, it is done, and it is nice in my opinion.</p>
<p>The font is <a href="https://fonts.google.com/specimen/Cal+Sans" target="_blank" rel="noopener noreferrer">Cal Sans by Mark Davis</a>, and the glitch effect is inspired by <a href="https://logosbynick.com/create-glitch-effect-inkscape/" target="_blank" rel="noopener noreferrer">a guide from Nick Saporito</a>.</p>
<p>There is some info on the Matrix server on the website, primarily on how to request a registration token. Also, the Terms of Service, which I wrote by myself, felt disgusted, then asked AI for help, felt disgusted again, combined those two disgusting pieces of human and machine minds, and now you are forced to read it before joining. Sorry about that.</p>
<p>This is how it started, and I'm going to deploy a Mastodon instance in that nice domain as well. Maybe other services later, who knows.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a><a class="blogDiscussions_container_bVZd" href="https://mastodon.glitchy.social/@yehor/115548524889256306" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M494.3 113.4C486.9 58.3 439 15 382.1 6.6 372.5 5.2 336.2 0 252 0h-.6c-84.2 0-102.2 5.2-111.8 6.6-55.3 8.2-105.7 47.1-118 102.8-5.9 27.4-6.5 57.8-5.4 85.7 1.6 40 1.9 79.9 5.5 119.7 2.5 26.4 6.9 52.7 13.1 78.5 11.6 47.7 58.7 87.4 104.9 103.6 49.4 16.9 102.6 19.7 153.5 8.1 5.6-1.3 11.1-2.8 16.6-4.5 12.4-3.9 26.9-8.3 37.5-16.1.1-.1.3-.2.4-.4s.1-.3.1-.5v-38.6c0-.2 0-.3-.1-.5s-.2-.3-.3-.4-.3-.2-.5-.2h-.5c-32.6 7.8-66.1 11.7-99.6 11.6-57.7 0-73.2-27.4-77.7-38.8-3.6-9.9-5.8-20.1-6.7-30.6 0-.2 0-.4.1-.5.1-.2.2-.3.3-.4s.3-.2.5-.2h.5c32.1 7.7 65 11.6 98 11.6 7.9 0 15.8 0 23.8-.2 33.2-.9 68.2-2.6 100.8-9 .8-.2 1.6-.3 2.3-.5 51.5-9.9 100.5-40.9 105.5-119.5.2-3.1.7-32.4.7-35.6-.1-11 3.4-77.5-.6-118.3m-81.6 198.5h-54.2V179.2c0-27.9-11.6-42.2-35.3-42.2-26 0-39.1 16.8-39.1 50.1v72.6h-53.8v-72.6c0-33.3-13.1-50.1-39.1-50.1-23.5 0-35.3 14.2-35.3 42.2v132.6h-54.1V175.2c0-27.9 7.1-50.1 21.4-66.6 14.7-16.4 34-24.8 58-24.8 27.7 0 48.7 10.7 62.6 32l13.5 22.6 13.5-22.6c14-21.3 34.9-32 62.6-32 23.9 0 43.2 8.4 58 24.8q21.3 24.6 21.3 66.6z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Mastodon</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Matrix</category>
            <category>Glitchy.Social</category>
            <category>Synapse</category>
        </item>
        <item>
            <title><![CDATA[Proxmox VE and PBS on Hetzner dedicated server]]></title>
            <link>https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server</link>
            <guid>https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server</guid>
            <pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Circumstances forced me to move all my self-hosted services to a location that does not depend on my living place. Someday, I hope I'll have all that hosted at home again, but now I want to describe my path of setting up a Proxmox VE on a Hetzner dedicated server together with Proxmox Backup Server and Tailscale with backups on Backblaze. This could look like a trivial task at first, but I faced some issues and obstacles I want to document here, for me to remember and for others to be informed.]]></description>
            <content:encoded><![CDATA[<p>Circumstances forced me to move all my self-hosted services to a location that does not depend on my living place. Someday, I hope I'll have all that hosted at home again, but now I want to describe my path of setting up a Proxmox VE on a Hetzner dedicated server together with Proxmox Backup Server and Tailscale with backups on Backblaze. This could look like a trivial task at first, but I faced some issues and obstacles I want to document here, for me to remember and for others to be informed.</p>
<p>I want to warn that this is not a full step-by-step guide. It is rather notes on the process and steps I followed.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h2>
<p>There is documentation on the installation process at <a href="https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve" target="_blank" rel="noopener noreferrer">Hetzner</a>. There are options, and I chose the first one - installing Proxmox VE on Debian.
So, according to the docs, I booted a <a href="https://docs.hetzner.com/robot/dedicated-server/troubleshooting/hetzner-rescue-system/" target="_blank" rel="noopener noreferrer">Rescue System</a> and installed Debian with the <a href="https://docs.hetzner.com/robot/dedicated-server/operating-systems/installimage/" target="_blank" rel="noopener noreferrer">installimage</a>.
Then I followed the <a href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie" target="_blank" rel="noopener noreferrer">guide from Proxmox Wiki</a> to install Proxmox VE. There is a step where you first install a new kernel and reboot to activate it. I was forced to reboot the server twice to make it appear online again. Have no idea why.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="network">Network<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#network" class="hash-link" aria-label="Direct link to Network" title="Direct link to Network">​</a></h2>
<p>Now to the hard part.
The initial plan was to have all LXCs in a single local network to allow internal communication. Also, the host and some containers should have public IPs for external access.</p>
<p>I reviewed a lot of network configuration options around the internet and chose a bridged setup with masquerading (NAT).</p>
<p>For the network I edited <code>/etc/network/interfaces</code> like this:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">auto lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface lo inet loopback</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface lo inet6 loopback</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface enp5s0 inet manual</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface enp5s0 inet6 manual</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">auto vmbr0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface vmbr0 inet static</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        address &lt;Public IPv4&gt;/26</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        gateway &lt;Public IPv4 gateway&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        pointopoint &lt;Public IPv4 gateway&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-ports enp5s0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-stp off</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-fd 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        up route add -net &lt;Public IPv4 gateway - 1&gt; netmask 255.255.255.192 gw &lt;Public IPv4 gateway&gt; dev vmbr0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-up echo 1 &gt; /proc/sys/net/ipv4/ip_forward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-up echo 1 &gt; /proc/sys/net/ipv6/conf/all/forwarding</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d &lt;Public IPv4&gt; --dport 21074 -j DNAT --to 192.168.50.3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -d &lt;Public IPv4&gt; --dport 21074 -j DNAT --to 192.168.50.3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface vmbr0 inet6 static</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        address &lt;Public IPv6&gt;/64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        gateway &lt;Public IPv6 gateway&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">auto vmbr1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">iface vmbr1 inet static</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        address 192.168.50.1/24</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        netmask  255.255.255.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-ports none</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-stp off</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        bridge-fd 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-up iptables -t nat -A POSTROUTING -s '192.168.50.0/24' -o vmbr0 -j MASQUERADE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post-down iptables -t nat -D POSTROUTING -s '192.168.50.0/24' -o vmbr0 -j MASQUERADE</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Let's see what's going on in here.</p>
<p>For the containers that don't require a public IP, I choose <code>vbmr1</code> bridge, set some IP from the local IP range (192.168.50.x), and use host local IP as a gateway:</p>
<p><img decoding="async" loading="lazy" alt="LXC local network" src="https://www.yevi.org/assets/images/vmbr1-4394d16278ed511c05367d03880ac039.png" width="1198" height="534" class="img_ev3q"></p>
<p>For LXCs that require a separate public IP, I choose the <code>vmbr0</code> bridge, set the IP, gateway, and MAC address provided by Hetzner.</p>
<p><img decoding="async" loading="lazy" alt="LXC public network" src="https://www.yevi.org/assets/images/vmbr0-abb8337d2a98e123fda76ffbc4637084.png" width="1202" height="536" class="img_ev3q"></p>
<p>The route with the <code>&lt;Public IPv4 gateway - 1&gt;</code> is a route from the official <a href="https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve" target="_blank" rel="noopener noreferrer">Hetzner docs</a>. That doc was updated while I was writing this post, and the line was removed from the example network configuration there. Some network configuration guides across the internet still have it, so I'm leaving it as is for now. If your public IP gateway is, for example, 67.11.34.23, the route will be</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">up route add -net 67.11.34.22 netmask 255.255.255.192 gw 67.11.34.23 dev vmbr0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The next lines enable IP forwarding across networks:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">post-up echo 1 &gt; /proc/sys/net/ipv4/ip_forward</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">post-up echo 1 &gt; /proc/sys/net/ipv6/conf/all/forwarding</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>And here is an example of forwarding a port <code>21074</code> from the public IP to the local IP of a single LXC:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -d &lt;Public IPv4&gt; --dport 21074 -j DNAT --to 192.168.50.3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -d &lt;Public IPv4&gt; --dport 21074 -j DNAT --to 192.168.50.3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For the local network <code>vmbr1</code> the next lines are needed to make Proxmox Firewall work properly:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="network-security">Network security<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#network-security" class="hash-link" aria-label="Direct link to Network security" title="Direct link to Network security">​</a></h3>
<p>Ports <code>8006</code>, <code>22</code>, and <code>8007</code> are opened on the Proxmox host in the Proxmox firewall, but explicitly closed in the Hetzner firewall. That way, I can use Proxmox VE and PBS web UI only from the Tailscale network, but, in case of an emergency or misconfiguration, I can open critical ports in Hetzner firewall to get access using server's public IP.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="public-reverse-proxy">Public Reverse Proxy<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#public-reverse-proxy" class="hash-link" aria-label="Direct link to Public Reverse Proxy" title="Direct link to Public Reverse Proxy">​</a></h2>
<p>I know it is not the best practice to install anything directly on a Proxmox host, but this looks like a perfect decision, as it already has a public IP address, and I can't unassign it because this is the only way to access the server in case of failure.
So I decided to install Caddy directly to a Proxmox Host and open ports <code>80</code> and <code>443</code> to it. Caddy handles requests and then proxies them to the local IPs of LXCs:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git.nicelycomposed.codes {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reverse_proxy 192.168.50.3:3000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tailscale-and-internal-reverse-proxy">Tailscale and Internal Reverse Proxy<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#tailscale-and-internal-reverse-proxy" class="hash-link" aria-label="Direct link to Tailscale and Internal Reverse Proxy" title="Direct link to Tailscale and Internal Reverse Proxy">​</a></h2>
<p>They call it "bastion host". A single point of connecting to your internal resources that you don't want to expose publicly. I have an LXC for this with Tailscale and another instance of Caddy installed. Let's see how it works on an example.</p>
<p>I want to securely connect to the Proxmox VE web UI using a valid SSL certificate at <code>https://pve.int.example.com</code>.</p>
<p>First, to make Tailscale work inside an LXC, additional configuration should be made on the Proxmox host. LXC configuration file can be found at <code>/etc/pve/lxc/&lt;CT_ID&gt;.conf</code>. Those two lines should be added to the file:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">lxc.cgroup2.devices.allow: c 10:200 rwm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then just restart the LXC.</p>
<p>Then, I installed Tailscale and Caddy on my "bastion host". Then I created a DNS record to point <code>pve.int.example.com</code> to an IP address of my bastion host in the Tailscale network:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">A      pve.int.example.com      10.11.12.13</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then, in the Caddy config, I proxied <code>pve.int.example.com</code> to the local IP of my Proxmox host and port <code>8006</code>, using HTTPS and skipping TLS verification because of Proxmox's default self-signed certificate:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pve.int.example.com {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reverse_proxy 192.168.50.1:8006 {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                transport http {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        tls</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        tls_insecure_skip_verify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now I'm able to point my browser to <code>https://pve.int.example.com</code> while connected to my Tailscale network.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>As all ports are closed on the "bastion host" and it is not exposed publicly, the default ACME HTTP challenge will not work for Caddy to issue SSL certificates for internal resources. <a href="https://caddyserver.com/docs/json/admin/identity/issuers/acme/challenges/" target="_blank" rel="noopener noreferrer">DNS challenge</a> should be used instead.</p></div></div>
<p>I can add other internal resources hosted on other LXCs in the same way:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dockge.int.example.com {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reverse_proxy 192.168.50.4:5000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">element-admin.int.example.com {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reverse_proxy 192.168.50.8:8080</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="proxmox-backup-server">Proxmox Backup Server<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#proxmox-backup-server" class="hash-link" aria-label="Direct link to Proxmox Backup Server" title="Direct link to Proxmox Backup Server">​</a></h2>
<p>It was the simplest part. I know this is not the most recommended method, but my Proxmox Backup Server is <a href="https://pbs.proxmox.com/docs/installation.html#install-proxmox-backup-server-on-proxmox-ve" target="_blank" rel="noopener noreferrer">installed on the Proxmox VE host</a>.
After installing it and configuring it to use <a href="https://pbs.proxmox.com/docs/storage.html#datastores-with-s3-backend" target="_blank" rel="noopener noreferrer">Backblaze S3 storage</a>, I just added it as a storage to Proxmox VE using the local IP of the host.</p>
<p><img decoding="async" loading="lazy" alt="PBS config" src="https://www.yevi.org/assets/images/pbs-ee0f7048d0ed11bc0813df6a032b287c.png" width="1202" height="628" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://www.yevi.org/blog/proxmox-ve-on-hetzner-dedicated-server#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Have no idea why everyone wants to write a conclusion for each post nowadays. It looks like a forced conclusion to a school physics problem in most cases: "Solving this problem of moving trains, we found out that trains can move".</p>
<p>Have a nice tinkering.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Proxmox</category>
            <category>Proxmox VE</category>
            <category>PBS</category>
            <category>Hetzner</category>
            <category>Tailscale</category>
            <category>Caddy</category>
        </item>
        <item>
            <title><![CDATA[Make one Proxmox node to wake-on-lan another]]></title>
            <link>https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another</link>
            <guid>https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another</guid>
            <pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Nothing is eternal, especially the relevance of documentation. I think help.ubuntu.com is an absolute winner, holding the largest number of outdated and irrelevant pages. But that's not a topic for today's post.]]></description>
            <content:encoded><![CDATA[<p>Nothing is eternal, especially the relevance of documentation. I think help.ubuntu.com is an absolute winner, holding the largest number of outdated and irrelevant pages. But that's not a topic for today's post.
One of my Proxmox cluster nodes can't power itself on after the outage. But it supports wake-on-LAN, so I decided that another node could power it on. And the simplicity of this task was overrated by me.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Wake on LAN doesn't work across VLANs. Magic packets could be sent and received only inside a single subnet.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-victim">The victim<a href="https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another#the-victim" class="hash-link" aria-label="Direct link to The victim" title="Direct link to The victim">​</a></h2>
<p>First of all, even after enabling "Wake up on PCI event" or something in BIOS it was not working because WoL was still disabled on a software level. It can be checked with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ethtool</span><span class="token plain"> enp1s0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Where <code>enp1s0</code> is a physical network interface of a Proxmox node, not a bridge.</p>
<p>There should be <code>Wake-on:</code> setting among others. In my case it was <code>Wake-on: d</code>, which means that wake-on-LAN is disabled, according to <code>ethtool</code> documentation:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">p  Wake on phy activity</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">u  Wake on unicast messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">m  Wake on multicast messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">b  Wake on broadcast messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a  Wake on ARP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g  Wake on MagicPacket(tm)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">s  Enable SecureOn(tm) password for MagicPacket(tm)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">d  Disable (wake on nothing).  This option clears  all  previous</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>We need to set it to wake by the MagicPacket(tm).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="for-proxmox-8-or-older">for Proxmox 8 or older<a href="https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another#for-proxmox-8-or-older" class="hash-link" aria-label="Direct link to for Proxmox 8 or older" title="Direct link to for Proxmox 8 or older">​</a></h3>
<p>We need to create a config file for this to be enabled on system start. But first we need to:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">link</span><span class="token plain"> show enp1s0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>and write down our network device MAC address. Then create a file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> /etc/systemd/network/90-wakeonlan.link</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>with the next content:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Match]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MACAddress=&lt;mac-address-here&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Link]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NamePolicy=kernel database onboard slot path</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MACAddressPolicy=persistent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WakeOnLan=magic</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="for-proxmox-9">for Proxmox 9<a href="https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another#for-proxmox-9" class="hash-link" aria-label="Direct link to for Proxmox 9" title="Direct link to for Proxmox 9">​</a></h3>
<p>We need to create a systemd service that will be launched on system start and change the WOL setting with <code>ethtool</code>.</p>
<p>Create a file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> /etc/systemd/system/wol.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>with the next content:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=Enable Wake On Lan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=oneshot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/sbin/ethtool --change enp1s0 wol g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>changing <code>enp1s0</code> to your interface name. Enable the service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl daemon-reload </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> wol.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="then">then<a href="https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another#then" class="hash-link" aria-label="Direct link to then" title="Direct link to then">​</a></h3>
<p>After that we need to reboot and check WOL status again:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ethtool</span><span class="token plain"> enp1s0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now <code>Wake-on</code> should be set to <code>g</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-one-who-bothering">The one who bothering<a href="https://www.yevi.org/blog/make-one-proxmox-node-to-wol-another#the-one-who-bothering" class="hash-link" aria-label="Direct link to The one who bothering" title="Direct link to The one who bothering">​</a></h2>
<p>On another node we need to install an util that will be sending a magic packet:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> etherwake</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now we can power the victim off and try to wake it with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">etherwake </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> vmbr0 </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">mac_address</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Where <code>vmbr0</code> is a bridge network interface of current Proxmox node, and <code>&lt;mac_address&gt;</code> is a MAC address of the victim's physical network interface.</p>
<p>If it works, we can now add a cron job to wake our victim upon current node startup, adding some delay to make sure the network is ready:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">crontab</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-e</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Cron job line to add:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@reboot sleep 30s &amp;&amp; /usr/sbin/etherwake -i vmbr0 &lt;mac_address&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Proxmox</category>
            <category>WOL</category>
        </item>
        <item>
            <title><![CDATA[WireGuard tunnel from Ubuntu VPS to HomeLab through UniFi VPN server]]></title>
            <link>https://www.yevi.org/blog/wireguard-tunnel-from-ubuntu-vps-to-homelab-through-unifi-vpn-server</link>
            <guid>https://www.yevi.org/blog/wireguard-tunnel-from-ubuntu-vps-to-homelab-through-unifi-vpn-server</guid>
            <pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[I'm not surprised people prefer Tailscale over WireGuard. Did you see the WireGuard quick start guide? Did you try to connect using this guide? Anyway, I have a VPS on Hetzner I wanted to connect to my local network through a secure tunnel. Tailscale is nice, but why set up a new infrastructure when I have one inside my UniFi Cloud Gateway Ultra?]]></description>
            <content:encoded><![CDATA[<p>I'm not surprised people prefer Tailscale over WireGuard. Did you see the WireGuard <a href="https://www.wireguard.com/quickstart/" target="_blank" rel="noopener noreferrer">quick start guide</a>? Did you try to connect using this guide? Anyway, I have a VPS on Hetzner I wanted to connect to my local network through a secure tunnel. Tailscale is nice, but why set up a new infrastructure when I have one inside my UniFi Cloud Gateway Ultra?</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This guide will work for you only if you have a static WAN IP</p></div></div>
<p>So first of all I went to <em>Settings -&gt; VPN</em> on my UniFi Cloud Gateway Ultra, switched to a <em>VPN Server</em> tab, and added a new Wireguard VPN server. I let UniFi decide on the client's IP range.</p>
<p>Then I added a client, which will be my VPS. And downloaded a WireGuard interface config file there:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/001-744a585458d8f9c760f15218a37ee1ca.png" width="790" height="934" class="img_ev3q"></p>
<p>Then I connected to my VPS through SSH to make some Linux command line magic.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>I need to mention here that I'm writing this guide a long time after the actual setup. So unfortunately I can't remember the sources I found tips and tricks to make this work. But it works now for me and can help to make it work for you, my dear reader.</p></div></div>
<p>On my VPS I have Ubuntu 24.04 installed.</p>
<p>So, to the command line. Install WireGuard:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> wireguard</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Create a config file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> /etc/wireguard/wg0.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Insert the configuration downloaded from the UniFi VPN client creation step:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Interface]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PrivateKey = ***************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Address = 192.168.4.2/32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DNS = 192.168.4.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Peer]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PublicKey = ***************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AllowedIPs = 0.0.0.0/0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Endpoint = ***.***.**.**:51821</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now edit it to look like this:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Interface]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PrivateKey = ***************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Address = 192.168.4.2/32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ListenPort = 51820</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Peer]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PublicKey = ***************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AllowedIPs = 192.168.4.0/24,192.168.50.0/24,192.168.1.0/24</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Endpoint = ***.***.**.**:51821</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PersistentKeepalive = 10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>PostUp</code> and <code>PostDown</code> are commands to be executed when the WireGuard network interface connects or disconnects. In my case, this is to add and remove <code>iptables</code> rules for WireGuard traffic routing through the default network interface.</p>
<p><code>AllowedIPs</code> should be edited to your needs. Here is my needs:</p>
<ul>
<li><code>192.168.4.0/24</code> allows access to any IP address on the same subnet as the VPS would be placed after connecting</li>
<li><code>192.168.50.0/24</code> allows access to any IP on my other subnet</li>
<li><code>192.168.1.0/24</code> allows access to any IP on my main subnet (I'm not sure about this, but anyway the access is blocked on the UniFi Firewall level)</li>
</ul>
<p>These rules are loose because the Firewall on my UniFi Gateway blocks any cross-subnet traffic anyway allowing only limited communications.</p>
<p>This should be enough to bring the connection up with <code>wg-quick</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> wg-quick up wg0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To see the status:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> wg show</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>And now to make it work through server reboots we need to down the interface:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> wg-quick down wg0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>And up it back with a system service, also enabling it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl start wg-quick@wg0 </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> wg-quick@wg0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Further interface control should be performed through <code>systemctl</code> as well like <code>systemctrl stop</code>, <code>systemctl restart</code> or <code>systemctl status</code>.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>WireGuard</category>
            <category>VPN</category>
        </item>
        <item>
            <title><![CDATA[Monitor USB UPS connected to Synology NAS in Home Assistant]]></title>
            <link>https://www.yevi.org/blog/monitor-usb-ups-connected-to-synology-nas-in-home-assistant</link>
            <guid>https://www.yevi.org/blog/monitor-usb-ups-connected-to-synology-nas-in-home-assistant</guid>
            <pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[There is a lot of automation you can do with this data, but today I want to write up a short guide on how to safely get the information from the UPS connected to your NAS via USB into the Home Assistant.]]></description>
            <content:encoded><![CDATA[<p>There is a lot of automation you can do with this data, but today I want to write up a short guide on how to safely get the information from the UPS connected to your NAS via USB into the Home Assistant.</p>
<p>There is a lot of automation you can do with this data, but today I want to write up a short guide on how to safely get the information from the UPS connected to your NAS via USB into the Home Assistant.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Your Synology NAS and Home Assistant should be in the same local network, or you'll need an additional network configuration that is not a subject of this post</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ups-server">UPS server<a href="https://www.yevi.org/blog/monitor-usb-ups-connected-to-synology-nas-in-home-assistant#ups-server" class="hash-link" aria-label="Direct link to UPS server" title="Direct link to UPS server">​</a></h2>
<p>After connecting the UPS to the NAS we need to enable Synology NAS UPS server that will allow other machines to get UPS information over the local network. In your Synology DSM go to <em>Control Panel -&gt; Hardware &amp; Power -&gt; UPS</em> tab. Here you can set up a UPS connected to your NAS via USB (or via SNMP protocol if you have enterprise-grade UPS for data centers). Assuming you did that, it is time to enable the UPS server by checking the <em>"Enable network UPS server"</em> checkbox.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/001-e578bd8a82dd1a2a12a834b7ac1bd7ab.png" width="1016" height="710" class="img_ev3q"></p>
<p>Also, you need to click the <em>"Permitted Synology NAS Devices"</em> button and add your Home Assistant local IP address there:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/002-5c66d03cd1620a8e5c5c1dc7fb70a076.png" width="516" height="259" class="img_ev3q"></p>
<p>After that, you need to make sure the port for the UPS server is open in the firewall on your NAS. Go to <em>Control Panel -&gt; Security -&gt; Firewall</em> tab and click the <em>"Edit rules"</em> button. Here you need to edit an existing rule for the <em>TCP</em> protocol that has a list of apps in the <em>Ports</em> column:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/003-3f623fde6af16394af120afcf8c4c408.png" width="798" height="576" class="img_ev3q"></p>
<p>In the editing window click the Select button near <em>"Select from a list of built-in applications"</em> and make sure the <em>UPS server</em> is selected:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/004-46a4fcbd90fa17887d60abbb125ee71f.png" width="649" height="427" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="home-assistant-integration">Home Assistant integration<a href="https://www.yevi.org/blog/monitor-usb-ups-connected-to-synology-nas-in-home-assistant#home-assistant-integration" class="hash-link" aria-label="Direct link to Home Assistant integration" title="Direct link to Home Assistant integration">​</a></h2>
<p>The integration that will allow us to connect to the UPS server on Synology NAS is <a href="https://www.home-assistant.io/integrations/nut/" target="_blank" rel="noopener noreferrer">Network UPS Tools</a>.</p>
<p>In your Home Assistant go to <em>Settings -&gt; Devices &amp; services</em> and click the <em>"Add integration"</em> button. Search for "nut" there and choose <em>"Network UPS Tools (NUT)"</em>.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/005-ddbdafa34fa5b14fdecf2f1a54b59ec7.png" width="482" height="415" class="img_ev3q"></p>
<p>In the configuration window that appeared you need to set your NAS's local IP address as a <em>Host</em> and leave the <em>Port</em> number unchanged.</p>
<p>Hit <em>Submit</em> and you are done.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Synology NAS</category>
            <category>UPS</category>
            <category>Smart Home</category>
            <category>Home Assistant</category>
        </item>
        <item>
            <title><![CDATA[Restart or shutdown your Proxmox node from Home Assistant automation]]></title>
            <link>https://www.yevi.org/blog/restart-or-shutdown-your-proxmox-node-from-home-assistant-automation</link>
            <guid>https://www.yevi.org/blog/restart-or-shutdown-your-proxmox-node-from-home-assistant-automation</guid>
            <pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[There is a UPS monitoring through NUT configured in my Home Assistant. So I decided my Home Assistant could shut down my homelab servers on a low UPS battery.]]></description>
            <content:encoded><![CDATA[<p>There is a <a href="https://www.yevi.org/blog/monitor-usb-ups-connected-to-synology-nas-in-home-assistant">UPS monitoring through NUT</a> configured in my Home Assistant. So I decided my Home Assistant could shut down my homelab servers on a low UPS battery.</p>
<p>We will use <a href="https://pve.proxmox.com/wiki/Proxmox_VE_API" target="_blank" rel="noopener noreferrer">Proxmox VE API</a> and Home Assistant <a href="https://www.home-assistant.io/integrations/rest_command/" target="_blank" rel="noopener noreferrer">RESTful Command</a> integration for this.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="proxmox-user-and-permissions">Proxmox user and permissions<a href="https://www.yevi.org/blog/restart-or-shutdown-your-proxmox-node-from-home-assistant-automation#proxmox-user-and-permissions" class="hash-link" aria-label="Direct link to Proxmox user and permissions" title="Direct link to Proxmox user and permissions">​</a></h2>
<p>Let's do things right and don't allow Home Assistant to log in with the root user to your Proxmox environment. We will create a <em>role</em> first. Go to your <em>Datacenter</em> view in Proxmox web UI choose <em>Permissions -&gt; Roles</em> and hit <em>Create</em>.</p>
<p>We will create a <code>PowerManager</code> role with <code>Sys.PowerMgmt</code> privileges. This will allow our user to execute shutdown/restart commands through Proxmox API, but nothing more.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/001-6fce76fd149978e760c2d88fac4aa311.png" width="1504" height="1106" class="img_ev3q"></p>
<p>Next, we will create a user. In Proxmox web UI go to <em>Permissions -&gt; Users</em> and hit <em>Add</em>. Give him a username and password, and choose <em>"Proxmox VE authentication server"</em> as a <em>Realm</em>:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/002-b81b1590ff9a96adad6b8d2e200c5813.png" width="617" height="338" class="img_ev3q"></p>
<p>Next, we will go to our <em>Datacenter</em> view in Proxmox web UI choose <em>Permissions</em> and hit <em>Add</em>. Here, we will set <code>/nodes/&lt;node_name&gt;</code> as the Path, select our newly created <em>User</em> and our newly created <em>Role</em> for him:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/003-455becf05ec612657ec46953db6bfbf1.png" width="397" height="208" class="img_ev3q"></p>
<p>Lastly, we will need an API token to make API calls. For this, we will go to <em>Permissions -&gt; API</em> Tokens and click <em>Add</em>. Choose our newly created user, give the token an ID, and disable <em>Privilege Separation</em>.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/004-15ce4e103af26692d970692638f1be27.png" width="600" height="206" class="img_ev3q"></p>
<p>After clicking <em>Add</em> we will see the token. We need to write down the token ID and token itself to use it in Home Assistant later.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="home-assistant-integration">Home Assistant integration<a href="https://www.yevi.org/blog/restart-or-shutdown-your-proxmox-node-from-home-assistant-automation#home-assistant-integration" class="hash-link" aria-label="Direct link to Home Assistant integration" title="Direct link to Home Assistant integration">​</a></h2>
<p>Now to the Home Assistant. We will need to edit our <code>configuration.yaml</code> file as currently, this is the only way to add RESTful Command integration. Here is an example:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">rest_command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">spacedock_one_shutdown</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://192.168.99.3:8006/api2/json/nodes/spacedock-one/status"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">method</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> post</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">headers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">Authorization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PVEAPIToken=pwrmngr@pve</span><span class="token tag" style="color:#00009f">!power=73892874-ad34-4b98-83e2-7be787f9bee3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">content_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/x-www-form-urlencoded"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">payload</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"command=shutdown"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">verify_ssl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>url</code> should have the next format: <code>https://&lt;proxmox node IP&gt;:8006/api2/json/nodes/&lt;proxmox node name&gt;/status</code>.</p>
<p>The authorization header should have the next format: <code>PVEAPIToken=&lt;proxmox username&gt;@pve!&lt;API token ID&gt;=&lt;API token&gt;</code></p>
<p>You can use <code>shutdown</code> or <code>reboot</code> as a <code>command</code>.</p>
<p>After restarting Home Assistant you will have a new service available. In our example, it would be <code>rest_command.spacedock_one_shutdown</code>. Calling it will do the trick.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Proxmox</category>
            <category>Smart Home</category>
            <category>Home Assistant</category>
        </item>
        <item>
            <title><![CDATA[Hosting Ghost Blog On Synology NAS]]></title>
            <link>https://www.yevi.org/blog/hosting-ghost-blog-on-synology-nas</link>
            <guid>https://www.yevi.org/blog/hosting-ghost-blog-on-synology-nas</guid>
            <pubDate>Tue, 31 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Do you want to know how and where RandomPlace is hosted? Or do you just want to know how to host a Ghost blog on your Synology NAS? I'm here today to answer both questions.]]></description>
            <content:encoded><![CDATA[<p>Do you want to know how and where RandomPlace is hosted? Or do you just want to know how to host a <a href="https://ghost.org/" target="_blank" rel="noopener noreferrer">Ghost</a> blog on your Synology NAS? I'm here today to answer both questions.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This post is from the past. From far away times when this website had another domain, another name and another hosting place.</p><p>Still, this guide can be useful.</p></div></div>
<p>It's been a long way to my current home lab configuration. There were several Intel NUCs, Nextcloud, and so on, but at the end (or just for now) I have Synology NAS and it allows me to host not only my personal cloud but other services as well. This blog is one of them.</p>
<p>RandomPlace blog is running in the Docker container. In Synology DSM it is a <a href="https://www.synology.com/en-us/dsm/feature/container-manager" target="_blank" rel="noopener noreferrer">Container Manager</a> package. To be honest, I'm not a big fan of the everything-in-containers approach. Bare-metal installation is much better in terms of maintainability and flexibility, but it is clear why Docker containers become so popular across our home labs. It is much easier to get something up and running with a single command instead of resolving dependencies and configuring your OS. So when this blog was hosted on Intel NUC with Ubuntu OS, it was not in containers. Now, with a new-for-me DSM software, it is easier to get something up and running with a single command instead of resolving dependencies and configuring my OS =)</p>
<p>I know there is a way to run NodeJS apps on Synology DSM, but this is something I need to discover. I'm also not sure I'm ready to SSH to my NAS and start to edit system files. Stability is the main reason why I'm currently with Synology.</p>
<p>Let's get back to our main topic. All further instructions are from DS423+ and DSM 7.2. But I'm sure it would be the same for many other NASes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="prepare">Prepare<a href="https://www.yevi.org/blog/hosting-ghost-blog-on-synology-nas#prepare" class="hash-link" aria-label="Direct link to Prepare" title="Direct link to Prepare">​</a></h2>
<p>First of all, we will need a <strong>Container Manager</strong> package to be installed from the Package Center</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/001-e40b14aac6bd03e4866da5ca77393ca1.png" width="1055" height="674" class="img_ev3q"></p>
<p>Then we will need some folders to be created. After installing a Container Manager, you will have a new shared folder created for you: <code>docker</code>. A good place to put all your container's data in. We should create a new directory there with any name you want. For example <code>blog</code>. This would be the root of our future project. Then, let's create a <code>content</code> directory inside it:</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="226" height="98" class="img_ev3q"></p>
<p>Lastly, we will need to know the volume number where our directories are placed. For this open <strong>File Station</strong>, right-click on the docker folder and choose <strong>Properties</strong>. The <strong>Location</strong> property in my case tells me that the docker folder is placed on a <code>volume1</code>.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/003-3db3853219901066cd1f4a8b48ff3fea.png" width="524" height="205" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-database">The Database<a href="https://www.yevi.org/blog/hosting-ghost-blog-on-synology-nas#the-database" class="hash-link" aria-label="Direct link to The Database" title="Direct link to The Database">​</a></h2>
<p>The Ghost requires the MySQL database to work. For the database, we have two options. The first is to have a database as a separate docker container. This option is the simplest. Another one is to use the <strong>MariaDB</strong> Synology package to have a single database service for all your projects. This will require us to install the <strong>phpMyAdmin</strong> as well to create and manage databases and users. This option enables the ability for a simple database backup solution because the <strong>MariaDB</strong> package with all data and settings could be included in <strong>Hyper Backup</strong>. Also, we will avoid having several containers with the same database service in the future.</p>
<p>With the second option, after installing <strong>MariaDB</strong> and <strong>phpMyAdmin</strong> from the <strong>Package Center</strong> on our NAS, let's log in to <strong>phpMyAdmin</strong> with the root user and password we set upon installation and create a new database for our blog and name it, for example, "my_blog":</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/004-12624d90474f84ac475d82370faac50a.png" width="810" height="346" class="img_ev3q"></p>
<p>Now we will need to create a user for this database. Choose your newly created database on the left and navigate to the <strong>Privileges</strong> tab. You can find the "Add user account" link there.</p>
<p>Selecting "Any host" for the "Host name" field upon user creation will allow the Ghost container to connect to the database even from the bridged network. But also allows connection from any host within your local network (assuming that you didn't open MySQL port to the public internet which you shouldn't do in any case).</p>
<p>Don't forget to tick "Grant all privileges on database my_blog." on the same user creation page.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/005-9142f07fc1ad130c35c153c504d6e73a.png" width="660" height="563" class="img_ev3q"></p>
<p>Hit <strong>Go</strong> in the bottom and we are done here.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="create">Create<a href="https://www.yevi.org/blog/hosting-ghost-blog-on-synology-nas#create" class="hash-link" aria-label="Direct link to Create" title="Direct link to Create">​</a></h2>
<p>Now the time has come to create a new project in <strong>Container Manager</strong>. Launch it, open the <strong>Projects</strong> view from the left, and hit the <strong>Create</strong> button.</p>
<p>Here we need to give our project a name, choose a previously created path for it, and provide a <code>docker-compose.yml</code>.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/006-f32854aacfe79b0f9ab7b86ab985a5d5.png" width="734" height="469" class="img_ev3q"></p>
<p>And here is our <code>docker-compose.yml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3.1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ghost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ghost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">5.71.0 </span><span class="token comment" style="color:#999988;font-style:italic"># Choose the version here: https://hub.docker.com/_/ghost/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> the_blog_ghost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 43332</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">2368</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Some random port mapped to a default Ghost port inside container</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># This is the path to our directory created at the beginning, mapped to a content directory inside the container</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /volume1/docker/blog/content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/ghost/content</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">database__client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mysql</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">database__connection__host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 192.168.1.2 </span><span class="token comment" style="color:#999988;font-style:italic">#This should be the local IP address of your NAS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">database__connection__user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog_ghost </span><span class="token comment" style="color:#999988;font-style:italic">#Database user we've created previously</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">database__connection__password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'12345'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">#The strongest password you can imagine </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">database__connection__database</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> my_blog </span><span class="token comment" style="color:#999988;font-style:italic">#Database name we've created previously</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//blog.randomplace.online </span><span class="token comment" style="color:#999988;font-style:italic">#Your future blog domain, you definitely already bought</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The next step will allow us to create a web portal for our container on a port we mentioned in <code>docker-compose.yml</code></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/007-8d8f73afaedf9ce6a52d09c41a903f46.png" width="737" height="578" class="img_ev3q"></p>
<p>We should accept this option and hit <strong>Next</strong> and then <strong>Done</strong> to start the container and navigate to a <strong>Web Station</strong> to configure a Web Portal:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/008-d0f27d359852bdc5c505d3f3ffda3784.png" width="636" height="403" class="img_ev3q"></p>
<p>Here we need to create a Name-based portal and use our domain as a Hostname. Also, we should force HTTPS (redirect all HTTP requests to a secure HTTPS connection) with the HSTS option:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/009-ad73ec01f3e9ad73e3e6363ec5088917.png" width="597" height="479" class="img_ev3q"></p>
<p>The last thing we should do is generate a new SSL certificate to serve our blog through HTTPS.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Your domain name should already be pointed to your NAS's public IP address for the certificate generation.</p></div></div>
<p>Go to <strong>Control Panel - Security</strong> and choose the <strong>Certificate</strong> tab. Here we can request a new free SSL certificate by clicking the Add button and choosing "Add new certificate".</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/010-a100c8cee185aed317696f8af8d32e85.png" width="643" height="545" class="img_ev3q"></p>
<p>Then "Get a certificate from Let's Encrypt" and fill in some fields:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/011-5cb583f883a87e1b7c0bec9cb927c640.png" width="648" height="546" class="img_ev3q"></p>
<p>You'll get an email notification on the address added here when there will be time to renew your free certificate.</p>
<p>After certificate generation, we should open Settings on the same Certificates tab, find our domain service, and choose the newly generated certificate for it.</p>
<p>That's it!</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>self-hosting</category>
            <category>homelab</category>
            <category>Synology NAS</category>
            <category>Ghost</category>
        </item>
        <item>
            <title><![CDATA[IR code reader with ESP8266 Wemos D1 mini and ESPHome]]></title>
            <link>https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome</link>
            <guid>https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome</guid>
            <pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Quick step-by-step guide on assembling an IR receiver for reading IR codes from your remotes based on Wemos D1 mini, Wemos IR shield, and using ESPHome.]]></description>
            <content:encoded><![CDATA[<p>Quick step-by-step guide on assembling an IR receiver for reading IR codes from your remotes based on Wemos D1 mini, Wemos IR shield, and using ESPHome.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="components-used">Components used<a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome#components-used" class="hash-link" aria-label="Direct link to Components used" title="Direct link to Components used">​</a></h2>
<ol>
<li>The housing from Broadling RM Pro+</li>
<li><a href="https://www.wemos.cc/en/latest/d1/d1_mini.html" target="_blank" rel="noopener noreferrer">Wemos D1 mini</a> development board</li>
<li><a href="https://www.wemos.cc/en/latest/d1_mini_shield/ir.html" target="_blank" rel="noopener noreferrer">Wemos IR shield</a></li>
<li>USB to micro-USB cable</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="assembling">Assembling<a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome#assembling" class="hash-link" aria-label="Direct link to Assembling" title="Direct link to Assembling">​</a></h2>
<p>First of all, we need to make our shield work with all transmitting LEDs and the pins we need. In this example, we will use <code>D3</code> for sending and <code>D4</code> for receiving.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/d4_ir_recv-19f1303c4f372bfc4a41a704e15a87a4.png" width="1200" height="919" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/shield_contacts_2-37dfd04723f3b9e58f947eba3dc2cdc0.png" width="1200" height="719" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/shield_contacts_1-d9a251e8ab35cbbeccec4b8d07706d08.png" width="1200" height="717" class="img_ev3q"></p>
<p>Now lets put the board into the housing with cable connected and glue it all:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/d1_mini-7acc99ee82205bc24b7906e748562fbc.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>Then put the shield on top:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/shield-1547c2f15af5ad95b26291f93449cdb0.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>Finally, close the housing:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/ready-a5f3110bf8c42271b25928d72d7c3be6.jpg" width="1200" height="689" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="using">Using<a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome#using" class="hash-link" aria-label="Direct link to Using" title="Direct link to Using">​</a></h2>
<p>In ESPHome let’s create a config:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">esphome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ir_receiver</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ESP8266</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">board</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> d1_mini</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">wifi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WiFi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Enable fallback hotspot (captive portal) in case wifi connection fails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IR Receiver"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">captive_portal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable logging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">logger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">level</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DEBUG</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable Home Assistant API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ota</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">remote_receiver</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">inverted</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">dump</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> samsung</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>As you can see it is set up to dump only Samsung-specific codes. You can read more about reading other codes on <a href="https://esphome.io/components/remote_receiver.html" target="_blank" rel="noopener noreferrer">esphome.io</a>. Also pay attention on <code>logger</code> section. It is set to <code>DEBUG</code> level.</p>
<p>Compile, flash, open logs and start firing into our device with your IR remote. You’ll see something like this:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[17:34:48][D][remote.samsung:055]: Received Samsung: data=0xE0E007F8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[17:34:51][D][remote.samsung:055]: Received Samsung: data=0xE0E020DF</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can now use this data with the ESPHome <a href="https://esphome.io/components/remote_transmitter.html" target="_blank" rel="noopener noreferrer">Remote Transmitter</a> component to build, for example, something like <a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome">this</a>.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>DIY</category>
            <category>ESP8266</category>
            <category>Wemos D1 Mini</category>
            <category>WiFi</category>
            <category>ESPHome</category>
            <category>IR</category>
        </item>
        <item>
            <title><![CDATA[Using stepper motor to control amplifier volume knob with ESP8266 and ESPHome]]></title>
            <link>https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome</link>
            <guid>https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome</guid>
            <pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[My living room multimedia setup consists of numerous devices with varying degrees of stupidity. I’m chasing to improve it adding additional DIY hardware and functionality not always because of hate of TV remotes but also because I’m in love with IoT and soldering. First, I’ve added WiFi power control to my Cambridge Audio amplifier, then I’ve implemented WiFi-to-IR remote control to the TV. Then I decided to improve sound quality from TV and added a DAC between the TV and the amplifier. It is connected to the TV via Toslink optical cable. And it broke my volume control because you can’t change the volume on a digital output port on a TV, you forced to rotate the knob on amplifier instead.]]></description>
            <content:encoded><![CDATA[<p>My living room multimedia setup consists of numerous devices with varying degrees of stupidity. I’m chasing to improve it adding additional DIY hardware and functionality not always because of hate of TV remotes but also because I’m in love with IoT and soldering. First, I’ve added <a href="https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier">WiFi power control to my Cambridge Audio amplifier</a>, then I’ve implemented <a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome">WiFi-to-IR remote control to the TV</a>. Then I decided to improve sound quality from TV and added a <a href="https://wikipedia.org/wiki/Digital-to-analog_converter" target="_blank" rel="noopener noreferrer">DAC</a> between the TV and the amplifier. It is connected to the TV via <a href="https://wikipedia.org/wiki/TOSLINK" target="_blank" rel="noopener noreferrer">Toslink</a> optical cable. And it broke my volume control because you can’t change the volume on a digital output port on a TV, you forced to rotate the knob on amplifier instead.</p>
<p>saw several solutions to this problem.</p>
<ol>
<li>The easiest, but boring and expensive, is to purchase an improved model of my amplifier with IR remote control.</li>
<li>Сheap and the one that looks right is to add a digital potentiometer to the amplifier input and control it with Wemos D1 mini I already have in my amp.</li>
<li>Most inaccurate but fancy and the one you will use to impress your family and friends is to add a stepper motor that will rotate the knob for you.</li>
</ol>
<p>I think you already guessed the way I choose, so let’s see how I achieved this.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/gif-10696cfdd1af8155ff610688fbd8e175.gif" width="500" height="281" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="components">Components<a href="https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome#components" class="hash-link" aria-label="Direct link to Components" title="Direct link to Components">​</a></h2>
<p>As I already have Wemos D1 mini and a relay in my amplifier, you could see more components than you expect on photos, but, for simplicity, I’ll list only those components used to control the knob in this article.</p>
<ol>
<li>WEMOS (LOLIN) D1 mini WiFi board (<a href="https://www.wemos.cc/en/latest/d1/d1_mini.html" target="_blank" rel="noopener noreferrer">wemos.cc</a>)</li>
<li>AC-DC 220V to 5V Step-Down Mini Power Supply (<a href="https://www.amazon.com/HLK-PM01-supply-module-intelligent-household/dp/B07G5GL4B8" target="_blank" rel="noopener noreferrer">amazon</a>)</li>
<li>ULN2003 stepper motor driver</li>
<li>5V 28BYJ-48 stepper motor</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="connections">Connections<a href="https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome#connections" class="hash-link" aria-label="Direct link to Connections" title="Direct link to Connections">​</a></h3>
<ul>
<li>5V DC power from power supply, 5V pin of Wemos D1 mini and +5V input of motor driver are connected together.</li>
<li>Ground of the power supply, GND pin of Wemos D1 mini and -5V (ground) of motor driver are also connected together.</li>
<li>IN1 of motor driver -&gt; D5 on Wemos</li>
<li>IN2 of motor driver -&gt; D6 on Wemos</li>
<li>IN3 of motor driver -&gt; D7 on Wemos</li>
<li>IN4 of motor driver -&gt; D8 on Wemos</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>At the moment of writing ESPHome supported only two types of stepper motor drivers. See ESPHome <a href="https://esphome.io/components/stepper/index.html" target="_blank" rel="noopener noreferrer">documentation</a> for more info.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="building">Building<a href="https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome#building" class="hash-link" aria-label="Direct link to Building" title="Direct link to Building">​</a></h2>
<p>The AC-DC power supply was connected to the AC power input of the amplifier.</p>
<p><img decoding="async" loading="lazy" alt="Power connection" src="https://www.yevi.org/assets/images/power-e90f6d019498f2169b6c493f04d21288.png" width="1200" height="811" class="img_ev3q"></p>
<p>Now to the knob. The knob actually rotates an analog <a href="https://wikipedia.org/wiki/Potentiometer" target="_blank" rel="noopener noreferrer">potentiometer</a> – a mechanical component with variable resistance. On my amplifier, all potentiometers have a hexagonal-shaped hole on the other side of the rotating element:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/hole-f31161473aaa6a376a5626f1f8d2b603.jpg" width="1200" height="888" class="img_ev3q"></p>
<p>This made the connection of the motor as easy as a couple of rasp strokes. I mean the shaft of my motor was slightly bigger than the hole on the potentiometer so I took a rasp and made it smaller. Then I used a couple of plastic racks with nuts and a bunch of hot glue to anchor the motor on amp housing.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/shaft-b15244360a0b840a9e9006639a0e6cd9.jpg" width="1200" height="814" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/motor_top-27577a4cb1765c3a317fbbddff20ebaa.jpg" width="1200" height="739" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/motor_side-5beb6ee0656fab8cc882617ee5ef6117.jpg" width="1200" height="1194" class="img_ev3q"></p>
<p>I know it is not the best binding but it works. I don’t think this solution is permanent because I relay want to use digital potentiometers instead. I made this more for fun, but currently, this is the only way to remotely control the volume in my living room. Just to give you an opportunity to change your mind before you start a similar project (or, who knows, maybe to improve it) here is a list of issues it currently has:</p>
<ul>
<li>It is impossible to determine the current motor position because its position resets on each boot.</li>
<li>It is easy to brake reduction gears in motor and even the amp when rotating the potentiometer further than it could.</li>
<li>It is hard to rotate the knob manually because you need to rotate the motor as well.</li>
</ul>
<p>If you are still here lats go to the software part.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="esphome">ESPHome<a href="https://www.yevi.org/blog/using-stepper-motor-to-control-amplifier-volume-knob-with-esp8266-and-esphome#esphome" class="hash-link" aria-label="Direct link to ESPHome" title="Direct link to ESPHome">​</a></h2>
<p>ESPHome could rotate your stepper motors with <a href="https://esphome.io/components/stepper/index.html" target="_blank" rel="noopener noreferrer">Stepper Component</a>. Here is my stepper config in ESPHome:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">stepper</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> uln2003</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volume_motor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin_a</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin_b</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin_c</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin_d</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sleep_when_done</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">max_speed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 250 steps/s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">acceleration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> inf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">deceleration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> inf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The idea is to change the volume on a given relative amount of motor steps. This will simplify the adjustment to find the right volume step for you. I declared a new service in <code>api</code> section of my <code>amplifier.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> set_volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">variables</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> int</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">stepper.report_position</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volume_motor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">position</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">stepper.set_target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volume_motor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!lambda</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'return target;'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>It would be exposed in Home Assistant as <code>esphome.amplifier_set_volume</code> service and will take the only parameter <code>target</code>. So in automation action increasing the volume in my case is looking like this:</p>
<p><img decoding="async" loading="lazy" alt="Automation action" src="data:image/png;base64,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" width="594" height="235" class="img_ev3q"></p>
<p>Or in YAML:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> esphome.amplifier_set_volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Decreasing the volume action is the same, but with negative <code>target</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> esphome.amplifier_set_volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-50</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>DIY</category>
            <category>ESP8266</category>
            <category>Wemos D1 Mini</category>
            <category>WiFi</category>
            <category>ESPHome</category>
        </item>
        <item>
            <title><![CDATA[DIY Smart Appliance: Adding WiFi power control to an integrated amplifier]]></title>
            <link>https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier</link>
            <guid>https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier</guid>
            <pubDate>Wed, 13 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Previously I was using JBL Bar connected to a TV in my living room. It was controlled with WiFi IR bridge, so whenever my Chromecast or PS4 was in playing state, the Bar was turned on and ready.]]></description>
            <content:encoded><![CDATA[<p>Previously I was using JBL Bar connected to a TV in my living room. It was controlled with WiFi IR bridge, so whenever my Chromecast or PS4 was in playing state, the Bar was turned on and ready.</p>
<p>Now I have passive speakers with a simple integrated amplifier, and it can’t be turned on or off without physical interaction. You need to press and release the button on the front panel to toggle amplifier power. So today we will add WiFi power control to Cambridge Audion AXA25 integrated amplifier.</p>
<p>It is not a complex task to simulate button pressing. We just need a relay and a delay. But we also need to detect the amplifier state because there are no differences in turning on and turning off actions. Fortunately, my amplifier has a USB port on the back to power some USB devices. Putting something with an LED indicator in this port helped me to detect that the port is powered only when the amplifier is on. Digital pins of ESP8266 boards are good tools to detect the current presence on a USB port. We will need a 5V power line and a ground line from the port. Here is a pinout of the USB port:</p>
<p><img decoding="async" loading="lazy" alt="USB pins" src="https://www.yevi.org/assets/images/usb_pinout-1e60dc583934347b445e2313fa236e97.png" width="411" height="334" class="img_ev3q"></p>
<p>Let’s draw!</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/amp_diagram-c1eaa2edfb8420b2d90a9d93a3b20a45.png" width="1602" height="819" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="components">Components<a href="https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier#components" class="hash-link" aria-label="Direct link to Components" title="Direct link to Components">​</a></h2>
<ol>
<li>LOLIN (Wemos) D1 mini (<a href="https://www.wemos.cc/en/latest/d1/d1_mini.html" target="_blank" rel="noopener noreferrer">wemos.cc</a>)</li>
<li>5V Relay Brick by Itead (<a href="https://www.itead.cc/electronic-brick-5v-relay.html" target="_blank" rel="noopener noreferrer">itead.com</a>)</li>
<li>AC-DC 220V to 5V Step-Down Mini Power Supply (<a href="https://www.amazon.com/HLK-PM01-supply-module-intelligent-household/dp/B07G5GL4B8" target="_blank" rel="noopener noreferrer">amazon</a>)</li>
</ol>
<p>Wemos has a <a href="https://www.wemos.cc/en/latest/d1_mini_shield/relay.html" target="_blank" rel="noopener noreferrer">relay shield</a> as well but it can commutate up to 10A current so the electromagnet consumes more power. It is better to use some low-current relay for low-current circuits.</p>
<p>As you can see I’m taking 220V AC power from the amplifier and converting it to 5V DC because we need to power the relay even when the amplifier is off. There is an always-powered low-current circuit that exists in the amplifier, but we can’t use it because of…. well, low current. Connecting a WiFi module and a relay to it will definitely destroy our amplifier.</p>
<p><img decoding="async" loading="lazy" alt="Amplifier internals" src="https://www.yevi.org/assets/images/int-03827b517998901bdf4386b6b73a090c.png" width="1109" height="1200" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="firmware">Firmware<a href="https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier#firmware" class="hash-link" aria-label="Direct link to Firmware" title="Direct link to Firmware">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="mqtt">MQTT<a href="https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier#mqtt" class="hash-link" aria-label="Direct link to MQTT" title="Direct link to MQTT">​</a></h3>
<p>If you want to use Arduino IDE to develop and flash the firmware to your Wemos D1 Mini board you’ll need to add an ESP8266 board manager and tools for Arduino. You can do this by performing <a href="https://github.com/esp8266/Arduino?ref=blog.yevi.org#installing-with-boards-manager" target="_blank" rel="noopener noreferrer">several simple steps from the official ESP8266 repository</a>. Then you can see the <a href="https://github.com/estevez-dev/edwin-home/tree/master/devices/amplifier_mqtt" target="_blank" rel="noopener noreferrer">MQTT-based firmware sources</a> I was using before migrating to ESPHome. It could be an example, or you can just use it all.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="esphome">ESPHome<a href="https://www.yevi.org/blog/adding-wifi-power-control-to-an-integrated-amplifier#esphome" class="hash-link" aria-label="Direct link to ESPHome" title="Direct link to ESPHome">​</a></h3>
<p><a href="https://esphome.io/" target="_blank" rel="noopener noreferrer">ESPHome</a> actually makes such projects much easier to implement, improve and support. It also has a very reliable <a href="https://github.com/esphome/hassio" target="_blank" rel="noopener noreferrer">Home Assistant plugin</a> and integration. That is why I moved all my DIY projects to ESPHome and here is a configuration file of my amplifier:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">esphome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> amplifier</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ESP8266</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">board</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> d1_mini</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">wifi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"****"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"**************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Enable fallback hotspot (captive portal) in case wifi connection fails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Cambridge AXA25"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*******"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">captive_portal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable logging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">logger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable Home Assistant API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"******"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ota</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"******"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">binary_sensor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> amplifier_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">internal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INPUT_PULLDOWN_16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">switch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> relay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restore_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ALWAYS_OFF</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Amplifier"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> amplifier</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">lambda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      if (id(amplifier_power).state) </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return true;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> else </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return false;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">turn_on_action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">binary_sensor.is_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> amplifier_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">switch.turn_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> relay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">delay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 300ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">switch.turn_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> relay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">turn_off_action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">binary_sensor.is_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> amplifier_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">switch.turn_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> relay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">delay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 300ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">switch.turn_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> relay</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>That’s it for today. Thanks for reading.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>DIY</category>
            <category>ESP8266</category>
            <category>Wemos D1 Mini</category>
            <category>WiFi</category>
            <category>ESPHome</category>
        </item>
        <item>
            <title><![CDATA[Building WiFi IR remote control for any TV with ESP8266 Wemos D1 mini and ESPHome]]></title>
            <link>https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome</link>
            <guid>https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome</guid>
            <pubDate>Wed, 13 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Many modern TVs can be controlled not only with an IR remote. Many could be easily integrated with Home Assistant or any other smart home solution. Samsung smart TVs, LG with WebOS… But what if your TV is so dumb it even don’t have WiFi or Bluetooth? Today we’ll add WiFi control to an old and dumb Samsung TV with a little help from ESPHome.]]></description>
            <content:encoded><![CDATA[<p>Many modern TVs can be controlled not only with an IR remote. Many could be easily integrated with Home Assistant or any other smart home solution. Samsung smart TVs, LG with WebOS… But what if your TV is so dumb it even don’t have WiFi or Bluetooth? Today we’ll add WiFi control to an old and dumb Samsung TV with a little help from ESPHome.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="components-and-planning">Components and planning<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#components-and-planning" class="hash-link" aria-label="Direct link to Components and planning" title="Direct link to Components and planning">​</a></h2>
<p>The base of our project would be <a href="https://www.wemos.cc/en/latest/d1/d1_mini.html" target="_blank" rel="noopener noreferrer">Wemos D1 mini</a> – an ESP8266-based development board. Actually, it is possible to use any other WiFi development board you’d like, for example, NodeMCU. I choose the D1 mini because of its size and the nice <a href="https://www.wemos.cc/en/latest/d1_mini_shield/ir.html" target="_blank" rel="noopener noreferrer">IR shield</a> it has. So the Wemos IR shield is the second part of our future IoT device. The main goal of the project is to receive commands through WiFi and transmit them to the TV using IR LED. So basically we want to build an IR remote where the buttons are replaced with commands through the WiFi.</p>
<p>Also, we will need 5V DC power for our board. We can’t use a factory USB port on our TV because it is not powered when TV is off. I really like to use mini <a href="https://www.google.com/search?q=hi-link+mini+ac+dc+converter" target="_blank" rel="noopener noreferrer">AC-DC converters from Hi-Link</a> in my projects and I really recommend it, but today I’ll need more power because I want to constantly power my Chromecast from the same power source. Because why not. So I found an old power supply that can handle up to 1.2A of current. Should be enough for a WiFi board and Chromecast.</p>
<p><img decoding="async" loading="lazy" alt="Power supply" src="https://www.yevi.org/assets/images/power_supply-0cb5f33061e8825dcd21861210bb8ee5.jpg" width="1200" height="869" class="img_ev3q"></p>
<p>Finally, we will also connect to the factory USB port of our TV. It is the best way to detect TV state (is it on or off currently).</p>
<p>In general, the parts of the project should be connected like this:</p>
<p><img decoding="async" loading="lazy" alt="Diagram" src="https://www.yevi.org/assets/images/diagram-d1e7e14a90e32391a094389ba6f58c5b.png" width="1545" height="786" class="img_ev3q"></p>
<p>Now we will take a look at our TV from the inside.</p>
<p><img decoding="async" loading="lazy" alt="Inside TV" src="https://www.yevi.org/assets/images/inside_tv_1-8d6c7cf364ae4b18f8c23e42ea35186f.jpg" width="1920" height="1119" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="build">Build<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#build" class="hash-link" aria-label="Direct link to Build" title="Direct link to Build">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="power-supply">Power Supply<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#power-supply" class="hash-link" aria-label="Direct link to Power Supply" title="Direct link to Power Supply">​</a></h3>
<p>First of all, I removed the housing from my power supply. You don’t need to do this when using a Hi-Link power converter because it has places to solder the wires.</p>
<p><img decoding="async" loading="lazy" alt="Power supply internals" src="https://www.yevi.org/assets/images/power_supply_internals-3371434b4c256ad7f65a4da627e6bb69.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>I’ll use a USB port to connect Chromecast to it. Also, I’ll use USB port pins to take power for my WiFi board.</p>
<p><img decoding="async" loading="lazy" alt="USB power pins" src="https://www.yevi.org/assets/images/usb_power_pins-d0777df724ddfe4d264a675ad46b497b.png" width="1200" height="900" class="img_ev3q"></p>
<p>You need to be careful detecting 5V and Ground pins on the USB port. Here is a little help:</p>
<p><img decoding="async" loading="lazy" alt="USB pinout" src="https://www.yevi.org/assets/images/usb_pinout-1e60dc583934347b445e2313fa236e97.png" width="411" height="334" class="img_ev3q"></p>
<p>From the other side of the power supply board, we have contact plates for AC power. That’s the place where we will solder AC power wires.</p>
<p><img decoding="async" loading="lazy" alt="AC power contacts" src="https://www.yevi.org/assets/images/ac_power_contacts-105c1ef25533c1aaf2377ba1e00a2c0c.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>Our power supply is ready:</p>
<p><img decoding="async" loading="lazy" alt="Power supply" src="https://www.yevi.org/assets/images/power_supply_ready-b857d540cd1a70efeafe895af87a5e30.jpg" width="1200" height="900" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-board">The board<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#the-board" class="hash-link" aria-label="Direct link to The board" title="Direct link to The board">​</a></h3>
<p><img decoding="async" loading="lazy" alt="D! min and shield" src="https://www.yevi.org/assets/images/d1_mini_and_shield-836c70447b451fc0225a3554d53ab77c.jpg" width="1200" height="835" class="img_ev3q"></p>
<p>We are ready to build the mainboard now. Wemos D1 mini and its shields come separately from the pin legs. It is a good opportunity to make our device as small as possible.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/pin_legs-da901d827754836b6d16f225efea9e71.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>But first, we need to solder some contacts on the IR shield. It has several IR LEDs as well as several options for a send pin. We will use only one IR LED – <code>IR4</code>, and <code>D3</code> digital pin for sending IR signal, so we need to solder contact plates on the IR shield like this:</p>
<p><img decoding="async" loading="lazy" alt="Shield contacts" src="https://www.yevi.org/assets/images/shield_contacts-037c83c31f71fb748d781ffe29cc1f28.png" width="2000" height="1500" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/ir4_led-709e2b7c61f14599c54a1f98702aed82.png" width="1198" height="778" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/micro_usb-0d01a3d383e4a557b21640a76127bf4a.png" width="1197" height="650" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can use the same board and shield to get IR codes from your TV remote, or build a separate <a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome">IR receiver</a>. If you will use the same board, you need also to enable receiving LED on the IR shield by soldering the corresponding contact plates. For example, to enable the IR receiver on the <code>D4</code> pin:</p><p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/d4_ir_recv-19f1303c4f372bfc4a41a704e15a87a4.png" width="1200" height="919" class="img_ev3q"></p></div></div>
<p>Also, we don’t need such long pin legs so we can shorten it with wire cutters.</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/short_legs-eb7cfe0cdfa66f5d1e7bb8b67d4827f6.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>And solder the legs finally.</p>
<p>Now the wires. We need 5V and ground from our power supply to be connected to 5V and ground pins of the WiFi board.</p>
<p><img decoding="async" loading="lazy" alt="D1 power" src="https://www.yevi.org/assets/images/d1_power-2048x1159-7c9ce92237e121f96989160a9da1c286.jpg" width="2048" height="1159" class="img_ev3q"></p>
<p>Also, we will need the wires to the factory USB port to detect the state of our TV. According to our plan, the 5V from the TV USB port will go to the <code>D2</code> pin of the Wemos board, and the ground should go to the ground pin.</p>
<p><img decoding="async" loading="lazy" alt="USB power" src="https://www.yevi.org/assets/images/usb_power-56a75e59c3ff21fbb59381c3583df1fc.jpg" width="1200" height="639" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-firmware">The firmware<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#the-firmware" class="hash-link" aria-label="Direct link to The firmware" title="Direct link to The firmware">​</a></h3>
<p>We can make it ourselves. That is what I’ve done in the past. It was a solution that takes BASE64 encoded IR data through MQTT protocol, decodes it, and sends it to the IR led. <del>You can check it on my GitHub</del>. I also had a <a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome">separate IR receiver</a> to read IR codes from IR remotes and encode them using BASE64. You don’t need all these sources if you are using ESPHome. With ESPHome we will have a simple YAML config for our device:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">esphome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> living_room_tv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ESP8266</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">board</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> d1_mini</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">wifi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WiFi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Enable fallback hotspot (captive portal) in case wifi connection fails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Living Room TV"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">captive_portal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable logging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">logger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable Home Assistant API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volume_up</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_samsung</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xE0E0E01F</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> volume_down</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_samsung</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xE0E0D02F</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> switch_source</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_samsung</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xE0E0807F</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hdmi1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_raw</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">carrier_frequency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">38029</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">code</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">+4497</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-4497</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1657</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-47858</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> hdmi2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_raw</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">carrier_frequency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">38029</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">code</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">+4523</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-4497</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-1709</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-579</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">+552</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">-43993</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ota</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">remote_transmitter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">carrier_duty_percent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 50%</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">binary_sensor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tv_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">internal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INPUT_PULLDOWN_16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">switch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Living Room TV"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> living_room_tv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">lambda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      if (id(tv_power).state) </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return true;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> else </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return false;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">turn_on_action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">binary_sensor.is_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tv_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_samsung</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xE0E040BF</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">turn_off_action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">binary_sensor.is_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tv_power</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">then</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">remote_transmitter.transmit_samsung</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xE0E040BF</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>remote_transmitter</code> is a part where we are declaring our <a href="https://esphome.io/components/remote_transmitter.html" target="_blank" rel="noopener noreferrer">IR transmitter</a>.</p>
<p><code>binary_sensor</code> is a sensor that will read the voltage from the TV USB port to tell its current state.</p>
<p><code>switch</code> section is our main functionality. It will be exposed as an entity in Home Assistant and will allow us to control our TV. As you can see from <code>lambda</code> it takes the state from <code>binary_sensor</code> and uses an IR transmitter to send IR “power” command to the TV when turned on or off. It also checks the state of <code>binary_sensor</code> before sending IR command to avoid turning off the TV when it was turned on several times, for example, from automation or service.</p>
<p><code>data</code> field for <code>remote_transmitter.transmit_samsung</code> can be discovered using a simple ESPHome <a href="https://www.yevi.org/blog/ir-code-reader-with-esp8266-wemos-d1-mini-and-esphome">IR Receiver</a> built with the same Wemos D1 mini and IR shield. You can even do it with the same board we are using for this project as was mentioned before.</p>
<p>I also want to be able to control TV volume and switch input sources through WiFi. So I’ve added a <code>services</code> section in <code>api</code>. All those <code>services</code> would be exposed as <code>esphome</code> in Home Assistant.</p>
<p>You can see <code>hdmi1</code> and <code>hdmi2</code> services have <code>transmit_raw</code> instead of <code>transmit_samsung</code>. This is because I don’t have such buttons on my TV remote to discover the codes so I found the codes in pronto hex format and was able to convert it to raw data with frequency detection using <a href="https://github.com/bengtmartensson/IrScrutinizer" target="_blank" rel="noopener noreferrer">IrScrutinizer</a>.</p>
<p>That’s it. Compile it and flash it with <a href="https://github.com/esphome/esphome-flasher?ref=blog.yevi.org" target="_blank" rel="noopener noreferrer">ESPHome Flasher</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tv">TV<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#tv" class="hash-link" aria-label="Direct link to TV" title="Direct link to TV">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="placing-the-board">Placing the board<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#placing-the-board" class="hash-link" aria-label="Direct link to Placing the board" title="Direct link to Placing the board">​</a></h3>
<p>Let’s find our TV IR receiver. Usually, it is where the red light is flashing on it. Disassembled my TV more I found it on the bottom edge. We need to put our WiFi board as close as possible to the TV IR receiver pointing our sending IR LED (<code>IR4</code>) in the direction of IR receiver.</p>
<p><img decoding="async" loading="lazy" alt="The board placed inside TV" src="https://www.yevi.org/assets/images/place-2048x1206-a5978214c3b9ffe4c6ebd6c8dd7d126e.jpg" width="2048" height="1206" class="img_ev3q"></p>
<p>While the power from the power supply is not connected yet, we can power the board from a micro USB, power our TV and make the first test.</p>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>You need to be extremely careful when powering on the appliance without its housing! Avoid touching the boards and other internal parts of the appliance because it can lead to appliance damage or your death!</p></div></div>
<p><img decoding="async" loading="lazy" alt="Test run" src="https://www.yevi.org/assets/images/test-e915f7b69995ba9b31529ca129d539cc.gif" width="480" height="270" class="img_ev3q"></p>
<p>When trying to put the TV housing back on with the WiFi board inside I discovered that I need to make the device even smaller. So I removed IR receiving LED as I have an IR receiver as a separate device. Also, I was forced to solder all wires on the same side of the board.</p>
<p><img decoding="async" loading="lazy" alt="Removed IR receiver" src="https://www.yevi.org/assets/images/remove_receiver-665c6d1a10edcbae63c52b444759d522.jpg" width="1200" height="900" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Change wires side" src="https://www.yevi.org/assets/images/change_wires-46c182c126af3874b8e4575cfa6cbe30.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>Now we are ready to use our favorite tool – double-sided adhesive tape, to put the board in its constant living place.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="factory-usb-port">Factory USB port<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#factory-usb-port" class="hash-link" aria-label="Direct link to Factory USB port" title="Direct link to Factory USB port">​</a></h3>
<p>Here it is on the factory board:</p>
<p><img decoding="async" loading="lazy" alt="Factory USB port" src="https://www.yevi.org/assets/images/factory_usb-156e26251c02ed85cbbd04294deb41ea.png" width="1200" height="626" class="img_ev3q"></p>
<p>On the other side of this board, we can find the pins where we will solder the wires from the WiFi board – one from <code>D2</code>, and the other from the ground.</p>
<p><img decoding="async" loading="lazy" alt="Factory USB pins" src="https://www.yevi.org/assets/images/factory_usb_pins-63b546229984c2fc342a71e334348162.jpg" width="1200" height="598" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="power">Power<a href="https://www.yevi.org/blog/building-wifi-ir-remote-control-for-any-tv-with-esp8266-wemos-d1-mini-and-esphome#power" class="hash-link" aria-label="Direct link to Power" title="Direct link to Power">​</a></h3>
<p>Now let’s take a look at the AC power connector on the TV. We can find the pins on the opposite side of the board and solder AC wires from our power supply to it.</p>
<p><img decoding="async" loading="lazy" alt="AC wires" src="https://www.yevi.org/assets/images/ac_wires-c7f111ee7a33ac774dbfb39a083f4ffd.jpg" width="1200" height="763" class="img_ev3q"></p>
<p>Before placing our power supply inside the TV we need to make sure it is isolated from its metal body. I’ve put a layer of plastic under it.</p>
<p><img decoding="async" loading="lazy" alt="Plastic film" src="https://www.yevi.org/assets/images/plastic-8e69e6b68df18a662b625535f598f04c.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>So the overall picture is looking like this:</p>
<p><img decoding="async" loading="lazy" src="https://www.yevi.org/assets/images/overview-022868fdd21fba85ab3fa01187317f33.png" width="2000" height="1054" class="img_ev3q"></p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>DIY</category>
            <category>ESP8266</category>
            <category>Wemos D1 Mini</category>
            <category>WiFi</category>
            <category>ESPHome</category>
        </item>
        <item>
            <title><![CDATA[Send and receive SMS in Home Assistant with GSM modem]]></title>
            <link>https://www.yevi.org/blog/send-and-receive-sms-in-home-assistant-with-gsm-modem</link>
            <guid>https://www.yevi.org/blog/send-and-receive-sms-in-home-assistant-with-gsm-modem</guid>
            <pubDate>Wed, 06 Jan 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Yes, it is possible and you don’t need to build anything from sources. Sending SMS from your home could be useful, for example, to send emergency alerts. But what about receiving and parsing SMS messages? Well, I used it to integrate my car security system with my Home Assistant. Now my Home Assistant could start the engine of my car automatically to warm it up before driving to work.]]></description>
            <content:encoded><![CDATA[<p>Yes, it is possible and you don’t need to build anything from sources. Sending SMS from your home could be useful, for example, to send emergency alerts. But what about receiving and parsing SMS messages? Well, I used it to integrate my car security system with my Home Assistant. Now my Home Assistant could start the engine of my car automatically to warm it up before driving to work.</p>
<p>First of all, we need to set up notification service via GSM modem following the official <a href="https://www.home-assistant.io/integrations/sms" target="_blank" rel="noopener noreferrer">documentation</a>. This will allow us to send SMS messages by calling the notify service, for example in automation action:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> notify.sms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Hi</span><span class="token tag" style="color:#00009f">!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>But also this integration allows reading SMS messages sent to the modem phone number by listening to the <code>sms.incoming_sms</code> event.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sms.incoming_sms</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="Automation trigger in UI" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtcAAAGTCAMAAADUcc6IAAABAlBMVEX////4+Pj29vby8vL09PT39/dfY2ju7u7w8PAgIST7+/v19fb9/f3g4OG9vb4tLjGcnZ/Z2tqur7DAwcMzNDfExMWampw9PkDi4uODhYm4ubrS09NNTVB2eHrn6OirrK0iIya1trcwMTPx8fHLy8yWl5nV1td+f4FiZmtbW16kpKcqKy2LjI5UVFeys7SfoKKIiYvNzs/IyMmhoaJlZmjd3d5zdHePkJLFxsjq6upqbG+UlphJSkwnKCvs7O1oaWxQUVPk5OVvcnaAgoViYmQ5Oj1FRklCQ0UkJSinqKl6e35ub3GTk5VXWFo2Nzm/wMFeX2FAQUTQ0dGpqquvsbJ7foKQgyf0AAAXF0lEQVR42uzYMWrEMBRF0a8vKR6skHKaVMFFvIdAINn/omJF9qhIMS4Cgx73gCu3l8e3LdzkjdcHGMoebg6d9awr91ISMJRS3HP1t+sWdW06AoOpbbe0e9c965I8zAYMZg4lbmX3sHvXnj05UWNQc9rK9uy9632uSwoGDCvEmMptsG3P2hNjjaGFJSY/wrY9a9Yao/M97N61FzdgcPUS8d41VwgkzEtMvettuZlrKIhL+3RsXTvXNSTkOth+dJ0LZwgUzJeYStvr9u/agPE9T+0f9tF1NEDAtMTetSe6hoSt6+R0DTF0DUXTpXftdA0Rv107XUMLXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUMRXUPRia4/m/ZqoXwM4ETX67o+bc/Vqo+r3fX6ZcDDnL9Dvl9s59nuen8z4D8tP+zbaW8SURTG8YfSTDnDBVkEO1PZlGVEHCiWshjAUrULNmgt3/+r2IHKYoxClTgzeX5vTkLCu3/ImTuX5suddX2U7MTCnSIQvotNWtHlVMlYYgBEj+xvAEK5UaNQtgE0UyqXtWNRBaBcr8ZB9CimiJi76jo3nNb338WgzjN2vWcsJt5dm+neAYxhLQEgWBi1Jy0tC5yaupZJ5IZVINqzc8NbED3GjYic7KzrjA7cd31rHQB1YzHLwxBQy8FIr+whGRsR7UDXmkDTCu5Zx4BtgOgxTnbatYFZ1/Y5gISxmLlT0zRrbRiJla7vprhrQNfKQECLH2kF06wPQeS+PeSh61xj1vNiVkf1e4X1rrtatjKZd62s26JWdygQue258UfXk5Fyel5MM6PgWOsaRt0KzrvOamcRbQCiv7HzroNDW89mjMUM9RJKv+osu25UFRDV2oCuxfTAu6lSRntfdaogcu3vNZo967RmLGf82rJqoWXXSW0EBK2O03V6bJ22gEHNGl7zoI/ctV+vU3oIsdJyAvv7WLW/B3SHe3D2EHWg4AiEQOSuc741gWlx0LSOF/NXVPdzDLOuQeTWc751x+e9aWoxf+lMM4IA9BF3D/LKHrIJHumR+58bibyFXZMH8PeafMg9+zWRx875iP7Mg+d8RH/CPYSIz41E/6rrz7W5KIi8YZOun8jrmQZ+L17iW3Nyh426vsBGbMmByA226loPwBHQcS9U7s4/UziM64AKJOQqwHsh5AZbdd2WIoBBfgwEx3mRV10gLfZzkdcJxMXRBNH/t1XXEakAqEoU+vt+qZjuP1dIS7+S/Pa03w1PGmJM+O8BcoONun79wdEG3nxUwJenOq6kCqAkSaSlDeCtmN7brw87C4cgX9mo6/6No+HkW8TLywrwJR8GEJca0pICkJS697rGYfIBs/ab7c5DDi7PkZNj4EKeOCTz0HVKYh7sGpHkTATkM9t1jZOP6uQrgGcvSjNRb3eNCLP2py27Lkiq3wbwJh/AjMe7RiuZbIF8Z8uuA0++SmRWcwmAfqevdl2QK3hOnO9I/Wijrp+mZ6IAMvIe9/Y+SWVivsoXV7s+khszC6L/b6OuZa4HoCn1+ffGlyIXUax2jbEI70aRGzz+nmo4nsXPsmd8j05uwPvX5EfsmvyIXZMfsWvyI3ZNfsSuyY/YNX1n726bkojCMI5fiCH3siDPCog8hIiA8VCiSFoiWUlCZn3/r9JhVyFbCnCaAU/X781x8BzvN/9hltkd0dEcXXv+JyAt8P2adMSuSUfsmnTErklH7Jp0xK5JR+yadMSuSUfsmnTErklH7Jp0xK5JR+yadMSuSUfsmnTErklH7Jp0xK5JR+yadMSuSUfsmnTErklH7Jp0xK5JR+yadDRP197zkXUQPRfzdP2jNJLBdBvN+5Vf+U8rY66uw/iLRmm8Eq2IBbo+KQAYpmBGguFzIBA6CWZe4qRTyvgBe400AeRCu692M8FvwP1WolmW2HWkZcL1rojOdTJ+uoFEt5P7cYlGsJTbBuw11zXR9vhTpctc0NPAw1aiWZbRdTeRSBzDVzpCoWsW33mBagaJL0DIs/7oOuTcE0IyjZTnJVC7hL31+X25ND17c3W912g0UkDnDnt3yLSSyWT1GIkw0Pa0H3WNehn1sOraBFIl82Er0RyW9bmxkTZO/Sh3a0pueteRrrt0YXcd8rgethLNssSujdPwDyCZNqFM73qtVNuH3XWkr7by63dpPsvo+rNXWQPKpRzgPQ2bxueTcddFj9eEYq8dT27U9dA8vy6PtxLNsJSuPSM14MhzDiB0XSpVveOuXdelIRR7bagtquvgqSexPt5KNMMSunZaX8cvTK85WSMJWNchhvd+K2+/0xxWous/cvnTMatrXlfTQla762GpZgIIddk1LWS1uwZ7ppXA569JR+yadMSuSUfsmnTErklH7Jp0xK5JR+yadPRPu64lsLCLfgNEq9z11ScfFpWTKohWueuLIyzMbLhAtJSuN4peKIbLhL/4AsB26AUsxpHfwAPDZe/ZDhkPvy3e/2T6iz5rdRlop7wAzove+xesg0bIb8LiV2dchmO+4/BkPtETug7diMhXPxCX8q1I5XtoR+RsD4C5tymSr+HeTnS059WO2hOGUo6KbMah5LbUiX0DSEn9QCR7+fI0K9J3AQEpA71KYCCylQJQvFJnMtmWc77j8GQ+0cJdrw2imcbepy0DcanEY7XNs2hr+P2jNICg9JvD93L3a9eq38hd9KwNvJaDQKwnQSAn7wOFa3k3SlP2I+rwh8NkoCd7D11LPh7rZN8C3mi2GgnmpTVlvuPwZD7Rol035RhAPZpC3CqoIz0AMfkC3GQNYGPQf9T1MUZJJ2FsfjQA42oAYxD1AejKCVLSBVCQ0Qu+s4Nx1ycA3okXHYlbf7w1Zb7j8GQ+0aJdb8tOCJa4NAEkrfQuJA20pOaCbdJ1DEBEamhKx8qybBSkDiUl+0hZkbqlB2Xrdty1AaAuIRyIG8CutKbMdx5W8/mpk57WNcoVud1vjLsOSNBKLw20D6Xy9bXb2XVM7QnLd9jCcgdlTXr3afrkjZXm1qOuq1LEVR7jrh3zHYft+byZRE/pGt6707yknV0rheqORFN/6PoVbBkJQ3HLm9ldD8ZdO+Y7Dk/mEy3atbttAr6eFBxdm+3R/pPswdSum/IFSvvILEgVSkMuZ3bdk3W76ynzHYcn84kW7bpulVqTpKPrtewhlPzbqV278rcGYKoXjUHUDaAvhZld1yRujWhNme84PJlPtGjX/sqHcvNzdHPD0TWupTuM9KUKpK+8v3eNshzmhm9G3ebkKhxLSx8zu/ZtZeuBvYq0psx3Hrbn8048PaFrfNsRkcMUnF0b9U2RzWMDuDnbdXRt3ZcZ3EFJbolU6sbsrnGkhkXj0nLOdxwez+cdR1q8a+X8yI3pDP+FYa0+TGH6/SZs235j7qdMjG9yiTOx1WfNZ9W08s9fG3UvgLQE8Lls42Os9Py7vshHL49v5Cv/wQ7p1DV292/zbzu8tiC9uiZi10Tsmv4b7Jp0xK5JR3N07SFaaXy/pv8EuyYdsWvSEbsmHbFr0hG7Jh2xa9IRuyYdsWvSEbsmHbFr+smunfYmEUZhGH6MS30pq7ZlKaVIEIJQSherrWCHWgvIYqz6//+KQ8GmMZAqamZycl+fJpM58+nO5EzyWkTXsIiuYRFdwyK6hkV0DYvoGhbRNSyia1hE17CIrmERXcMiuoZFdA2L6BoW0TUsomtYRNewiK5h0X/p+vFWRcDvC6LrQnum/PsvdUcC/kAAXWfc8cupmJZrXS3verwj4B5BdH2k+1RLy7u+OhdwjwC7PmtJinmb0m5+Y/xWeu5tH0/a3/x7G30vqRvlvQ2vOZ3InHxMDzN64XVK3qE08DbyrwQsFmDXjUREetl5qFG/1Tzup/TMTRqDcTH1dFCrDw40FetcHW1N/In3ft7fel8epAaT/KCrN/038awbCFgoiK57Nd8rvXZxyTvTaX8kRXpDv+ucdOqSd/aQk8RTadvv+vCsIH125fkeUk1K8moCFgug61rWF5fyJyq4nHZdrlKpnF/5XcckdVp3uu4Nb/frh9fxpMvd7tevN3NeW8BSQf037ici+6WIRu5GYlHX9ey862i2nt7L33a93a7nxyW6xjIBdv2+Hx9/krZcZn1qUdfpnXnXX11cqvzsOpqurUvHdI3FAu1al5fFslR2XyU9iizq+jIdnU1UE5Le/ux6zSUl7dE1lgii6+rm1KnUdNNsVUs8Kxy0q3e6HhXLBU2V3UXlYM/vetc1Us2PrinVeqmnSvcOr3dcT8BCQXQ9sys9TjTke3jRd8XztTtdZybuk27s111nVDxStFp0paRrSPGOa+q659zlsL8u4B4Bnntaj/1SaKQb0cyD2OP5RSYyf7gQlXS6JmC5MHQNhBpdwyK6hkV0DYvoGhbRNSyia1hE17CIrmERXcMiuoZFdA2L6BoW0TUsomtYRNewiK5hEV3DIrqGRXQNi+gaFtE1LKJrWPRPun4iIFToGhbRNSyia1hE17CIrmERXcMiuoZFdA2L6BoW/UXXjz606BrhtGrXkW7uYviBrhFOq3Z9/SR78I6uEVIrf68jEl0jrFbfr+ka4UXXsIiuYRFdwyK6hkWrdv2g2+02vne7a3SNEFq169STmXd0jRDifAgsomtYRNewiK5hEV3DIrqGRXQNi+gaP9i7t500wigMwx+1jV0DyKbIRoZhpAgBKlUBrYgKKohKjaj3fy11Nk4sxUQSe+Diew48WPn/NSdvyISYoBG7Jo3YNWnErkkjdk0a8fcKSCN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRrp63q9Bde3OmhpvaFrq/cIVz5Txoz9U7yrd9hfLcFVGIKW1hu6zkocrkG3gxnpCbCWeh7/LmBx/vX5k/SEXdP/7Pp1m5KAZ3SKRfnXX5+wa/rPXVf691jr79VSvccv1WGmGgaq17ibSu/MzbF/XOrvAQ9myizCNzgbZs4/YesuAuBuCyjXbnst4KS/Vh1Od4zn65X2cJRzn+5PvvU3zb6zH9jbTm2v15rA4PR29DO3A6Bopn7/gnco2IlQLjOs7gddN81ULYFovwkgvR0CLY9Fui7LOoqSSddNu9d9yNk5oLaN5LUcbOBJ4urWvBrgh1QfC3IE18mtWUzHbrAuu8C9fMOvcbeZs+uwJLb/UJC6f90q1ZrpWA0Ob5J8OnDk7EfnePQzPZQ4jGlsUjfHbWAy3mm2xwnvULATBbv60JXnru3LVnpYWkHGWTu9AC2RxbsuO5PfANqXTtez7yEDewdAdXzovxR8BR6lE7nNATu3BkY17xXBkiqAy7Z/PSlRIGl6j/cnG/D27zdWgYrEUZRvwKfbNg7HE8C4vPEOBTuj9g8AF89dNw6Bjr2FA/sECUmClsjiXWcBuO2ex+Z1XZcOgIQ8wpG5q1Qq67KJXAaYniMrP54GR3JiyRWAu75//d7u3kfgC0r39o+6AL5LHNcpPOm1UZSNpy2nI+9QsLMpnX/er81TRKWOo+PPoCXy7l0fSMjNMA3HWFxxVOQ+IXmUxZOf6RprppQKg7ldx879rts9v+uJuGLeoWBnWsIzXXtP6NfQ74KWybt3HZdDAFG5gqNRCDsMoJc7uATyknQHkdmuAesqM/w0r+vpvt91IeN3nZZs2OEdCnYWxfr38/oCaNkV2QAtk3fv+t4NNi0dOGpTw3mIM8n0JkCo4UQa+YqZro8KADYkP6/r04wBDCSOlrM0kmmjLA8APhveoWBnXooAgu9DYiHg5DgHrI7NGL8NWS5v6vp63RF5peuyxKNw1S4TX3ERaw4eG1249ux2xZo0LMCy3VAnchDtdHvB57V//UomVqcdCwPwJi+63pWbyu62xBEu9fYSBWkDtVjS2u1VkfxrJ2qlzWh8/Ny1tPP3tfEAwIXsg5bKm7r2hF7p2tiWS7jWjqWJ8P5Yjq+/wB9lRIZN+IkCkaOYiFlB0LV/faskMtqDw5286BqthhznJA6UhyLdaRtYORuLfbrqHQp2wtoWMYPP6151LCX30U1ZBy2VOV0vLGKF4QlbEedvNgQELGf2gpFdnXfdGKzOLgyEol+8L+oi2a9IFdwnRcPzdh5aeCGcNeBopQzQUvkA/8+Xv1mBcTO2sNLuAD9lEwtameZAy+UDdD3oNcxS4xEwunYvY59jQWel4QlouXyArmH8am0ewpGoFxNY1NXWIWjJfISuidg1Ebsmndg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSuSSN2TRqxa9KIXZNG7Jo0YtekEbsmjdg1acSu6Q/7dteTNhiGcfyqzs2rtjBWWBlSLJ2ExCqKWBQUlTh8f9fv/1kGT7vZZWZpdiDk8f4d8JpcR/+QhxJ0JF0LHUnXQkfStdCRdC109N9dL69CiFmVqevFze7Vtzb+UC1CiFmVpevtgO5ByK6ZqWunIYcZMTXZu14q5leBOY/7mbq+ZBlCTEn2rks8wZgZjNSdXTBTXS8UbMSWCpEFmIbHyIBiGhYAyzDjt2sA0guGiWEEIZQpdO1honIxuXHJ4OJX19Z1SJ61ARjNAek66HACyjVXAeTYAea7PnlWQnohvLmiHNJF4s27Xrj1GwZiOW7knBvmkq6/0dtujfI1oM/mXv30/HF494Mrd391vePvt7/cnkfphZDuegdCKG/eNZZHzHuOCcAauQvAh+Jx3HXk9wG0uYVHegCG/lXqfJ3q2vJvJo+KnfRCGBxCiMTbd425zSrpVuKEx458Q3XdoIOxYAO7KmG0Kq93DTdfsjCWXgg3MF3lvd/kq65mMnStlK8DPqPFQX7snDXV9SXD/Jj/AI81xF7venXE4lXdRGph+l2j7CQka91k6lqxQxcr7DeUedV1l1vq2Ro89v7ZNczKpcvq99TCDHQN21FsCM1k6LobDDFxTGOP6+nr1+ssIZacQ8rDdNcNbiddGz0DsHa5j5eFWegatmStpwxdf45T/JQvwgiK3wEsF+KuH3lvAags4pFdAIeDPtCkjdgz11TdHThqosDmy8JsdI3IceQauoayXOfb4M5KbvOMHWCFD0/bX8P7uGt0eV8vNdkA+vTuWqeDZeArmxUTE72w+JQ78dmBeXC+u1evsvSyMCNdo1CA0E+GrrGwOyJ5UMdYyyUH3fmka3M9TwYNK/ldptoGsHhKLkGpB6R7zQ7QO/JJt5VamJWuhZayfW+0atESEsNoDi/MyDahGFEtecn+hIRll5H4EPXSC0K8Tv5XIIR0Ld4T6VroSLoWOpKuhY6ka6Ej6VroSLoWOsrQ9cf3BEIL8nktdCRdCx1J10JH0rXQkXQtfrZ3RzcSwjAARGNiK4hsF+m/xwteLgt0YGueRAejyPYPGdE1MqJrZETXyIiukRFdIyO6RkZ0jYzoGhnRNTKia2R079roGkl410bXyKUNukY6n0fX1utRgPCO2XW3X9cqBQjPWtX/ruXsuhcgvLp71/LtetuUQQTxiY/X29W1DyJagOBGG9rNrq6/FxEmbATX1zVkdd0JG8FZO6fre9f+YA/+koHAetv9uV5dr7BZHhGVjEfW3vW1OtZZth2fAoTyOay2Nup1u3ZFnG22qdYx9gaEs49RVWfEJs+up62r1lrHjBsIYwY7s1VfGe3e9Qr7LFsrEIyeVa+sV9fOrrS7AqF0j3qSpcjiXZ8fEIqHO8mr68UmykYo9iUPRV4MCEfeigD50DUyomtk9AeMVFqyUkhaaQAAAABJRU5ErkJggg==" width="727" height="403" class="img_ev3q"></p>
<p>In automation <code>action</code>, we can now parse the message by searching keywords in it:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">choose</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">conditions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">value_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">'engine is off' in trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'text'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">sequence</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="Parsing action" src="https://www.yevi.org/assets/images/parse_action-86c7897bb2c08d0c321cd1289e06f2d2.png" width="706" height="577" class="img_ev3q"></p>
<p>Here we are checking for the <code>engine is off</code> text in incoming SMS to perform some action. For example, to set the value of some <code>input_boolean</code>.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>home automation</category>
            <category>SMS</category>
            <category>GSM</category>
        </item>
        <item>
            <title><![CDATA[Bed presence detection with Aqara window and door sensor and a cheap car part]]></title>
            <link>https://www.yevi.org/blog/bed-presence-detection-with-aqara-window-and-door-sensor-and-a-cheap-car-part</link>
            <guid>https://www.yevi.org/blog/bed-presence-detection-with-aqara-window-and-door-sensor-and-a-cheap-car-part</guid>
            <pubDate>Tue, 29 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Bed presence detection could be very useful in home automation to control the lights and appliances you don’t need at night, but want to be ready in the morning. And today we will build a bed presence sensor out of a very universal device for DIY IoT. It is an Aqara ZigBee window and door sensor. Why it is so universal? Let’s take a closer look at its internals.]]></description>
            <content:encoded><![CDATA[<p>Bed presence detection could be very useful in home automation to control the lights and appliances you don’t need at night, but want to be ready in the morning. And today we will build a bed presence sensor out of a very universal device for DIY IoT. It is an Aqara ZigBee window and door sensor. Why it is so universal? Let’s take a closer look at its internals.</p>
<p><img decoding="async" loading="lazy" alt="internals" src="https://www.yevi.org/assets/images/internals-1-9e74527fd85875375072f92a96d21076.jpg" width="1200" height="602" class="img_ev3q"></p>
<p>See that little glass tube? That’s a <a href="https://en.wikipedia.org/wiki/Reed_switch" target="_blank" rel="noopener noreferrer">reed switch</a>. It operates under a magnetic field generated by the magnet inside the second part of the sensor. So, in general, it just closes the contact between two points of the electrical circuit. We can unsolder it and replace it with something else. A switch, for example. Or with a car seat pressure sensor, like this one:</p>
<p><img decoding="async" loading="lazy" alt="Car seat sensor" src="https://www.yevi.org/assets/images/seat_sensor-7cd6e9d687ae4361441a118f0b731cdb.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>It could be found on Amazon or our favorite Chinese store just for 5$. It has two wires that could be closed or opened according to pressure presence. So all we need is to solder this sensor to the Aqara sensor’s board instead of the reed switch.</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://www.yevi.org/assets/images/solder-11bcbb21c7bbef74a25c2499c8c1cbbd.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>I’ve removed the button cup from the top of the sensor to leave a hole for wires. Just remember to pair your sensor with whatever you are using as a ZigBee hub before doing this.</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://www.yevi.org/assets/images/wires-64eb7562c2db228c09fa616de8f76eb6.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>All we need to do now is to put our new sensor under the mattress. I have a bed with wood slats that is narrower than the pressure sensor so I decided to put the sensor on a cardboard sheet</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://www.yevi.org/assets/images/cardboard-2df7fe4054a716fd6786763ba2a42e80.jpg" width="1200" height="900" class="img_ev3q"></p>
<p>I made two sensors to separately detect the bed presence of me and my wife. You need to experiment with the sensor position to get the most accurate results. Also, you need to remember that the “open” state of the sensor means “the bed is not occupied” and “closed” means that “the bed is occupied”.</p>
<p><img decoding="async" loading="lazy" alt="Bed sensors in Home Assistant UI" src="https://www.yevi.org/assets/images/bed_sensors-4be4a04386abf022239526851a4bd315.png" width="506" height="271" class="img_ev3q"></p>
<p>The third sensor on the screenshot is a Home Assistant <a href="https://www.home-assistant.io/integrations/binary_sensor.template/" target="_blank" rel="noopener noreferrer">template binary sensor</a> that represents unconditional bed occupation. In other words, it is <code>on</code> when someone is in bed, and <code>off</code> otherwise:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">binary_sensor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sensors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">bed_occupancy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">friendly_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Bed occupancy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">device_class</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> occupancy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{is_state('binary_sensor.bed_occupancy_door_side', 'off') or is_state('binary_sensor.bed_occupancy_window_side', 'off')}}"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>home automation</category>
            <category>DIY</category>
            <category>Aqara</category>
            <category>Xiaomi</category>
        </item>
        <item>
            <title><![CDATA[Using variables as configuration for Home Assistant automation]]></title>
            <link>https://www.yevi.org/blog/using-variables-as-configuration-for-home-assistant-automation</link>
            <guid>https://www.yevi.org/blog/using-variables-as-configuration-for-home-assistant-automation</guid>
            <pubDate>Tue, 10 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Home Assistant 0.115 got the ability to use variables in automation and scripts. You can declare variables even using templates and use them across the script or automation.]]></description>
            <content:encoded><![CDATA[<p>Home Assistant 0.115 got the ability to use variables in automation and scripts. You can declare variables even using templates and use them across the script or automation.
Here is an example from the release notes:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">automation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sun</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sunset</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">offset</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token datetime number" style="color:#36acaa">00:30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">variables</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">notification_service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> notify.paulus_iphone</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ notification_service }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Beautiful sunset</span><span class="token tag" style="color:#00009f">!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>It is very useful and fun feature but at first I didn’t realize how powerful it is. Today I want to show you an example how you can use variables as some sort of configuration for automation to avoid creating a lot of <code>if</code>s and automation to handle identical tasks.</p>
<p>I have a lot of ZigBee wall switches. Previously I had a separate automation to handle each of them. Every automation was handling:</p>
<ul>
<li>First button press – toggle the lights with max brightness</li>
<li>Second button press – toggle the lights with low brightness</li>
<li>First button long press – increase the brightnress</li>
<li>Second button long press – decrease the brightness</li>
</ul>
<p>After implementing <code>variables</code> for automation I decided to store the mapping of device id, event (represents the button pressed and the type of press: long or short), corresponding brightness and light <code>entity_id</code> in <code>variables</code> like this:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">variables</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">device_map</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:cb:1a:9b</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.kitchen</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:c9:39:62</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.hallway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">55</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:e9:fe:9e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.living_room</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:cb:64:b4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.hallway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:c9:37:7d</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.bedroom</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:58:61:74</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.bathroom</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>So now I can take the brightness value from my <code>device_map</code> by device id and event. Also, I can take <code>entity_id</code> of the light each wall switch should control.</p>
<p>Also when I’m toggling the light I need to use <code>brightness_pct</code> service data to set the brightness, but when changing the brightness I need to use <code>brightness_step_pct</code>. So I added another variable to set the brightness service data name:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">variables</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">brightness_attr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> == 2001) or (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">== 1001) %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">brightness_step_pct</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% else %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">brightness_pct</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% endif %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>So when the button held the event is <code>2001</code> or <code>1001</code> (first and second button) and I need <code>brightness_step_pct</code>. I’m getting <code>brightness_pct</code> in another case.</p>
<p>Now we can use all these variables in <code>action</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">'{{brightness_attr}}'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> device_map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''unique_id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.brightness_buttons</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> device_map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''unique_id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.light_entity_id</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> == 2001) or (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">== 1001) %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">turn_on</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% else %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">toggle</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% endif %</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Here we are using the most of variables – we are getting the right brightness value by the <code>unique_id</code> of our device and by the <code>event</code> that is representing the button and the type of press:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{{ device_map[trigger.event.data[''unique_id'']].brightness_buttons[trigger.event.data[''event'']]}}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Also, we are getting light <code>entity_id</code> by <code>unique_id</code> of the switch:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{{ device_map[trigger.event.data[''unique_id'']].light_entity_id}}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>And the full automation:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> wall_switch_handler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Wall switch handler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">event_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1001</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deconz_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">event_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1002</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deconz_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">event_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2001</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deconz_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">event_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2002</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deconz_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">value_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">''wall_switch'' in trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">'{{brightness_attr}}'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> device_map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''unique_id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.brightness_buttons</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> device_map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''unique_id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">.light_entity_id</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> == 2001) or (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      == 1001) %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">turn_on</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% else %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">toggle</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% endif %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">variables</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">brightness_attr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% if (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> == 2001) or (trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''event''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      == 1001) %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">brightness_step_pct</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% else %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">brightness_pct</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% endif %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">device_map</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:cb:1a:9b</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.kitchen</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:c9:39:62</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.hallway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">55</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:e9:fe:9e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.living_room</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:cb:64:b4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.hallway</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:c9:37:7d</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.bedroom</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">00:15:8d:00:02:58:61:74</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">light_entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> light.bathroom</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">brightness_buttons</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">1002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2001</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">2002</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">initial_state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> parallel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>I have not only wall switches so I’m using template condition here to make sure the switch is the wall switch:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">value_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">''wall_switch'' in trigger.event.data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">''id''</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Also, this automation should be able to run in parallel to make it possible to handle several switch clicks at the same time in different rooms by different persons:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> parallel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Home Assistant</category>
            <category>home automation</category>
        </item>
        <item>
            <title><![CDATA[Home Assistant presence detection with Google WiFi]]></title>
            <link>https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi</link>
            <guid>https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi</guid>
            <pubDate>Thu, 21 Feb 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Previously my presence detection in Home Assistant works through Asus router and asuswrt component. And it was bad. Very bad. Recently I switched to Google WiFi and realized that the only way to implement presence detection with this router is IFTTT (Update: No). I thought it would be the slowest presence detection in the world but I was wrong.]]></description>
            <content:encoded><![CDATA[<p>Previously my presence detection in Home Assistant works through Asus router and <code>asuswrt</code> component. And it was bad. Very bad. Recently I switched to Google WiFi and realized that the only way to implement presence detection with this router is IFTTT (Update: No). I thought it would be the slowest presence detection in the world but I was wrong.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>While you still can do this through IFTTT you need to know that there is much easier way not depending on your router model and any 3rd party services – <a href="https://www.home-assistant.io/integrations/nmap_tracker" target="_blank" rel="noopener noreferrer">Nmap Tracker</a>. You just enable this component and configure your devices IP addresses.
I configured static IP addresses for devices I wanted to track using <a href="https://support.google.com/wifi/answer/6274660?hl=en" target="_blank" rel="noopener noreferrer">DHCP IP Reservation</a> on Google WiFi router.</p></div></div>
<p>If you still want to use IFTTT, you are welcome to continue reading.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="home-assistant-ifttt-webhook">Home Assistant IFTTT webhook<a href="https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi#home-assistant-ifttt-webhook" class="hash-link" aria-label="Direct link to Home Assistant IFTTT webhook" title="Direct link to Home Assistant IFTTT webhook">​</a></h2>
<p>First of all, we need to create a webhook for IFTTT in our Home Assistant instance through Integrations. Go to “Configuration” -&gt; “Integrations” in the Home Assistant web UI. Find “IFTTT” in the “Set up a new integration” section and click “CONFIGURE”. You will be provided with a webhook URL to use in IFTTT applets. It should look similar to this:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">https://ha.mydomain.com:8123/api/webhook/e7cd74856399e8934b8f5beffeeeaee4c351cdc8373647585ec040c7b69c2b999</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Save this URL somewhere because you will not be able to see it again in your Home Assistant UI.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="home-assistant-entities">Home Assistant Entities<a href="https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi#home-assistant-entities" class="hash-link" aria-label="Direct link to Home Assistant Entities" title="Direct link to Home Assistant Entities">​</a></h2>
<p>For presence detection, I’m using <code>binary_sensors</code> with <code>device_class: presence</code>. Also, the state of those sensors depends on the corresponding <code>input_boolean</code>. It is made to be able to switch someone’s presence on and off manually by adding <code>input_boolean</code> to UI and switching its state. Don’t set the initial state for input_boolean. It will make it possible to save and restore its state on HA reboots. Also, I set these sensors to have different pictures depending on their presence.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">input_boolean</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">is_yegor_home</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> “Yegor’s presence”</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">binary_sensor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sensors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">presence_yegor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">friendly_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Yegor"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ is_state('input_boolean.is_yegor_home', 'on') }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">device_class</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> presence</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">entity_picture_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/local/yegor_picture_bw.jpg"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ifttt-applets">IFTTT applets<a href="https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi#ifttt-applets" class="hash-link" aria-label="Direct link to IFTTT applets" title="Direct link to IFTTT applets">​</a></h2>
<p>Next. There is an official Google WiFi service in IFTTT and it can create IF’s like “If some device connected/disconnected”. That’s exactly what we need.</p>
<p><img decoding="async" loading="lazy" alt="Google WiFi in IFTTT" src="https://www.yevi.org/assets/images/ifttt_google_wifi-da09e1de2e1de1bd0199a6df1bb066ca.png" width="390" height="233" class="img_ev3q"></p>
<p>Open <a href="https://ifttt.com/" target="_blank" rel="noopener noreferrer">IFTTT website</a> and log in with your account. Go to “My Applets” and click “New Applet” in the upper right corner.</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://www.yevi.org/assets/images/screenshot-ifttt.com-2019.02.21-11-10-25-22fad62d9407515c8dd509b79efe6e22.png" width="800" height="224" class="img_ev3q"></p>
<p>Then hit “+this”, search for “Google WiFi” and click it. You will be asked to authorize IFTTT in your google account. After that you will be able to select one of the triggers Google WiFi can send to IFTTT:</p>
<p><img decoding="async" loading="lazy" alt="image" src="https://www.yevi.org/assets/images/screenshot-ifttt.com-2019.02.21-11-20-06-a33236523dddfddd62290913d1a99c85.png" width="800" height="348" class="img_ev3q"></p>
<p>Let’s start with “Device connects”. Click it and select the device name you want to track in the next step.</p>
<p>Next, you will be asked to create an action by clicking “+that”. For action, you need to find the “Webhooks” service and choose the only action it provides – “Make a web request”.</p>
<p>Now we need to fill all the fields for web request:</p>
<p>URL: <code>[The url of our Home Assistant webhook we created recently]</code></p>
<p>Method: <code>POST</code></p>
<p>Content Type: <code>application/json</code></p>
<p>Body: <code>{ "action": "call_service", "service": "input_boolean.turn_on", "entity_id": "input_boolean.is_yegor_home"}</code></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="handling-ifttt-requests">Handling IFTTT requests<a href="https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi#handling-ifttt-requests" class="hash-link" aria-label="Direct link to Handling IFTTT requests" title="Direct link to Handling IFTTT requests">​</a></h2>
<p>The last thing we need is to create a handler in Home Assistant for web requests from IFTTT. It will be new automation:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ifttt_webhook'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IFTTT Webhook</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ifttt_webhook_received</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">event_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> call_service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{{ trigger.event.data.service }}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">data_template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{{ trigger.event.data.entity_id }}'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This automation will handle any requests from IFTTT that will have <code>action: call_service</code> in their body with <code>service</code> and <code>entity_id</code> in it.</p>
<p>For disconnecting from Google WiFi we need to create another applet in IFTTT. It will be the same except for two things:</p>
<ol>
<li>We should select “Device disconnects” from Google WiFi services when creating “+this” for applet.</li>
<li>We need to replace input_boolean.turn_on with input_boolean.turn_off in web request’s “Body” field when creating “+that” to make it looks like this:</li>
</ol>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{ "action": "call_service", "service": "input_boolean.turn_off", "entity_id": "input_boolean.is_yegor_home"}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="automation-based-on-presence">Automation based on presence<a href="https://www.yevi.org/blog/home-assistant-presence-detection-with-google-wifi#automation-based-on-presence" class="hash-link" aria-label="Direct link to Automation based on presence" title="Direct link to Automation based on presence">​</a></h2>
<p>Assuming we’ve set up presence detection for everyone living in our home, we now need one variable to know if there is nobody home now. It would be helpful when creating automation that should be triggered when there is nobody home or when someone is back home. So we will add all our presence sensors in a group in <code>groups.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">presence</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">entities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> binary_sensor.presence_someone</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> binary_sensor.presence_yegor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> binary_sensor.presence_someone_else</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now we can rely on that group’s state to check if there is nobody home. I’ve added a delay of 10 minutes to make sure this automation will not be triggered when I simply reboot my device or there was a short connection lost to a router.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'nobody_home'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Nobody home'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> group.presence</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">for</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'on'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> state</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">to</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> “Looks like there is nobody home now”</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> notify.push</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>That is all for now. Thanks for reading.</p>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Google WiFi</category>
            <category>Home Assistant</category>
            <category>home automation</category>
        </item>
        <item>
            <title><![CDATA[Smart doorbell with Xiaomi Aqara button and Google Home]]></title>
            <link>https://www.yevi.org/blog/smart-doorbell-with-xiaomi-aqara-button-and-google-home</link>
            <guid>https://www.yevi.org/blog/smart-doorbell-with-xiaomi-aqara-button-and-google-home</guid>
            <pubDate>Fri, 15 Feb 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[So I have several Xiaomi Aqara buttons. Today I want to explain how to use this button as a smart doorbell that will play sound to your Google Home device through Home Assistant.]]></description>
            <content:encoded><![CDATA[<p>So I have several Xiaomi Aqara buttons. Today I want to explain how to use this button as a smart doorbell that will play sound to your Google Home device through Home Assistant.</p>
<p>All my Aqara ZigBee devices are connected to Home Assistant via <a href="https://phoscon.de/en/conbee2" target="_blank" rel="noopener noreferrer">ConBee II</a> and <a href="https://www.home-assistant.io/integrations/deconz" target="_blank" rel="noopener noreferrer">deCONZ</a>.</p>
<p>First of all, let’s create a script that will be executed when the button is pressed. In your <code>scripts.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">doorbell</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Doorbell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sequence</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.googlehome4615 </span><span class="token comment" style="color:#999988;font-style:italic">#Your Google Home device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.turn_on</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">delay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token datetime number" style="color:#36acaa">00:00:03</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">#To make sure we are connected to Google Home</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.googlehome4615 </span><span class="token comment" style="color:#999988;font-style:italic">#Your Google Home device</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">media_content_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//your.homeassistant.domain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">8123/local/doorbell.mp3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">media_content_type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> music</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.play_media</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">delay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token datetime number" style="color:#36acaa">00:00:05</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#The same as doorbell.mp3 file ledgth</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.googlehome4615</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> media_player.turn_off</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To make <code>doorbell.mp3</code> available by that URL you need to place it to <code>/config/www</code> in your Home Assistant.</p>
<p>Now we need to create a handler of the Aqara button in <code>automations.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> doorbell_notify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">alias</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Doorbell notify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">trigger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">entity_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> script.doorbell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'off'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> state</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">to</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'on'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">condition</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Someone near your front door"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> notify.push</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>Aqara</category>
            <category>Xaomi</category>
            <category>Home Assistant</category>
        </item>
        <item>
            <title><![CDATA[DIY Smart Appliance: Making a WiFi-enabled smart air humidifier from a regular one]]></title>
            <link>https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier</link>
            <guid>https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier</guid>
            <pubDate>Thu, 21 Jun 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[So there was a simple air humidifier… Actually, this post is a good example of how to make your regular boring home appliance a little smarter. The main part of my humidifier will be the Wemos (or Lolin) D1 mini board based on the ESP8266 WiFi chip.]]></description>
            <content:encoded><![CDATA[<p>So there was a simple air humidifier… Actually, this post is a good example of how to make your regular boring home appliance a little smarter. The main part of my humidifier will be the Wemos (or Lolin) D1 mini board based on the ESP8266 WiFi chip.</p>
<p>My air humidifier has no automatic turn on and off, no timers, only a regulator that also works like a switch. The idea is to make it WiFi-friendly and work with Home Assistant through MQTT.</p>
<p>Actually, I was pretty lucky with this device because there are other models of it with built-in sensors, screens, and other stuff so the hardware was prepared to connect additional modules. But we don’t want to measure humidity inside the humidifier right? So the sensor will be a separate part of the system.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="teardown">Teardown<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#teardown" class="hash-link" aria-label="Direct link to Teardown" title="Direct link to Teardown">​</a></h2>
<p><img decoding="async" loading="lazy" alt="First look on the insides" src="https://www.yevi.org/assets/images/001-3cc59f447bc5f7ccaa1ab7ca65f00566.jpg" width="1024" height="859" class="img_ev3q"></p>
<p>So it has an AC/DC power supply. Now we need to find 5v power line for our additions. All internal parts are powered with 12V DC so we need a step down module. In my case there was an empty 12V connector right on the factory board:</p>
<p><img decoding="async" loading="lazy" alt="12V connector on the factory board" src="https://www.yevi.org/assets/images/002-fd2b11d447107a1d16256ed64eea1d1b.jpg" width="1024" height="768" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="assembling">Assembling<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#assembling" class="hash-link" aria-label="Direct link to Assembling" title="Direct link to Assembling">​</a></h2>
<p>So we will connect there a regulated power down module and set it up to a 5V output:</p>
<p><img decoding="async" loading="lazy" alt="Power down module" src="https://www.yevi.org/assets/images/003-4dc5c6825a922a6d424d75ef4b37d1e3.jpg" width="1024" height="768" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Power down module connection to a factory board" src="https://www.yevi.org/assets/images/004-5048734718e23de5ad257772303aa47a.jpg" width="1024" height="768" class="img_ev3q"></p>
<p>Now the main hardware. It is a Wemos D1 Mini ESP8266-based board (well almost because in my case it is a no-name copy of it, don’t buy it please) and a beautiful relay brick from Itead Studio:</p>
<p><img decoding="async" loading="lazy" alt="Wemos D1 mini and relay brick" src="https://www.yevi.org/assets/images/005-26e3ceee83a43b760a3950c6dfca3d8c.jpg" width="1024" height="768" class="img_ev3q"></p>
<p>Connect it all together. Wemos D1 mini can be powered with stable 5V DC power connected to its 5V pin:</p>
<p><img decoding="async" loading="lazy" alt="Wemos D1 mini and relay brick connected to power source" src="https://www.yevi.org/assets/images/006-3966174dab08545443bce866951c8fa7.jpg" width="1024" height="905" class="img_ev3q"></p>
<p>Now we need to unsolder the wires from a factory button or switch and connect it to our relay:</p>
<p><img decoding="async" loading="lazy" alt="Wires from the factory switch connected to a relay" src="https://www.yevi.org/assets/images/007-3392dc0bf2b3f05c73aaa4ab604c6195.jpg" width="1024" height="768" class="img_ev3q"></p>
<p>The last step will be gluing all new parts inside our device. Don’t repeat my mistake and glue the WiFi board with micro-USB port pointing outside of the humidifier, not inside it:</p>
<p><img decoding="async" loading="lazy" alt="Glued boards inside the humidifier" src="https://www.yevi.org/assets/images/008-3d6c2b889e53563e99cf0a36975e1999.jpg" width="1024" height="768" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="improvements">Improvements<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#improvements" class="hash-link" aria-label="Direct link to Improvements" title="Direct link to Improvements">​</a></h2>
<p>The final version of my humidifier also checks the state of the factory switch and reports the state to <a href="https://www.home-assistant.io/integrations/binary_sensor.mqtt" target="_blank" rel="noopener noreferrer">MQTT binary sensor</a> in Home Assistant. Here is a final diagram of this project:</p>
<p><img decoding="async" loading="lazy" alt="Project diagram" src="https://www.yevi.org/assets/images/009-d753bf90de13c9a7bc5f7f2cc149d255.png" width="1811" height="842" class="img_ev3q"></p>
<p>The software was also improved. There was <a href="https://github.com/tzapu/WiFiManager" target="_blank" rel="noopener noreferrer">WiFiManager for ESP8266</a> boards added to make it possible to configure WiFi and MQTT settings without flashing the board.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-code">The code<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#the-code" class="hash-link" aria-label="Direct link to The code" title="Direct link to The code">​</a></h2>
<p>The old code was missing long time ago.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="home-assistant">Home Assistant<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#home-assistant" class="hash-link" aria-label="Direct link to Home Assistant" title="Direct link to Home Assistant">​</a></h2>
<p>An example of MQTT platform switch configuration in Home Assistant for humidifier:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">switch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">– platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mqtt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Humidifier"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state_topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"edwin/humidifier/state"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command_topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"edwin/humidifier/power"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"on"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"off"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">payload_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">payload_off</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="esphome-migration">ESPHome migration<a href="https://www.yevi.org/blog/making-a-wifi-enabled-smart-air-humidifier#esphome-migration" class="hash-link" aria-label="Direct link to ESPHome migration" title="Direct link to ESPHome migration">​</a></h2>
<p>And finally here is a YAML configuration of my humidifier after it was migrated to <a href="https://esphome.io/" target="_blank" rel="noopener noreferrer">ESPHome</a>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">esphome</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> humidifier</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ESP8266</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">board</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> d1_mini</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">wifi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"****"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Enable fallback hotspot (captive portal) in case wifi connection fails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Edwin Humidifier"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">captive_portal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable logging</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">logger</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable Home Assistant API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">ota</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"************"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">switch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Humidifier"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restore_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ALWAYS_OFF</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">binary_sensor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gpio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Humidifier state"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> D5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INPUT</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<section class="blogDiscussions_W1In"><a class="blogDiscussions_container_bVZd" href="https://matrix.to/#/%23yevi-org-pub:glitchy.social" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 512 512" fill="currentColor" class="icon_nwaY" role="img"><path d="M465.3 499.7V11.8h-35V.1h48.6V512h-48.6v-11.7zM163.4 167v24.6h.7c6.2-9 14.3-16.5 23.8-21.9 9.3-5.2 20-7.8 31.8-7.8 11.5 0 22.1 2.2 31.5 6.7 9.5 4.5 16.8 12.3 21.8 23.7 5.4-8 12.7-15.1 22.1-21.1 9.3-6.1 20.3-9.2 33-9.2 9.6 0 18.6 1.2 26.7 3.5 8.2 2.4 15.3 6.1 21.1 11.3 5.9 5.2 10.4 11.9 13.7 20.3s4.9 18.4 4.9 30.2v122.1h-50.1V246.1c0-6.1-.2-11.9-.7-17.3-.3-4.9-1.6-9.7-3.9-14.1-2.1-4-5.4-7.3-9.3-9.5-4.1-2.3-9.7-3.5-16.8-3.5-7 0-12.7 1.4-17.1 4-4.4 2.7-7.8 6.2-10.2 10.6-2.5 4.6-4.2 9.6-4.9 14.8q-1.2 8.4-1.2 16.8v101.6h-50.1V247.1c0-5.4-.1-10.8-.3-16-.2-5-1.2-10-3-14.7-1.7-4.4-4.8-8.2-8.8-10.8-4.1-2.7-10.2-4-18.2-4-3.2.1-6.3.7-9.3 1.6-4.1 1.2-8 3.2-11.3 6-3.6 2.9-6.8 7.2-9.3 12.7-2.6 5.5-3.9 12.8-3.9 21.8v105.9h-50.2V167.2zM46.7 12.3v487.9h35v11.7H33.1V0h48.5v11.7z" style="fill:#fff"></path></svg><span class="linkText_cQyw">Discuss on Matrix</span></a></section>]]></content:encoded>
            <category>smart home</category>
            <category>DIY</category>
            <category>ESP8266</category>
            <category>ESPHome</category>
            <category>humidifier</category>
            <category>Wemos D1 mini</category>
            <category>WiFi</category>
        </item>
    </channel>
</rss>