<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Random Musings</title>
        <link>https://blog.fuzzymistborn.com/post/</link>
        <description>Recent content in Posts on Random Musings</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fuzzymistborn.com/post/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>MXroute Email Aliases - A SimpleLogin Replacement</title>
        <link>https://blog.fuzzymistborn.com/mxroute-email-aliases/</link>
        <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/mxroute-email-aliases/</guid>
        <description>&lt;p&gt;Recently I discovered that my favorite email service (MXroute) introduced an API which has opened up a lot of fun new possibilities with the service, including letting me recreate most (if not all) of the functionality of SimpleLogin.  In this post I&amp;rsquo;m going to detail some of what SimpleLogin is, why you should use a service like it, and if you&amp;rsquo;re an MXroute user some cool apps to check out.&lt;/p&gt;
&lt;h1 id=&#34;simplelogin&#34;&gt;SimpleLogin
&lt;/h1&gt;&lt;p&gt;So what is SimpleLogin?  Simply (heh) put, it&amp;rsquo;s a service that lets you create email forwarders.  For example, if you&amp;rsquo;re signing up for some sketchy service you aren&amp;rsquo;t 100% sure about, you can create &lt;code&gt;sketchyservice@example.com&lt;/code&gt; as an email address and sign up with that.  All the email sent to that address can then be forwarded to your actual email address and nobody on the other side is the wiser.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using SimpleLogin now since 2021 (so almost 5 years) and really have had few complaints.  It got bought/acquired by &lt;a class=&#34;link&#34; href=&#34;https://techcrunch.com/2022/04/08/proton-buys-simplelogin/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Proton in 2022&lt;/a&gt; (the people behind ProtonMail and other privacy-focused services) and IMO I think Proton has done a good job of keeping the product alive, though I haven&amp;rsquo;t seen a whole lot of innovation/development.&lt;/p&gt;
&lt;p&gt;As mentioned above, the main usecase is to sign up for services with what is essentially a disposable email address.  Instead of having to worry about not being able to unsubscribe to emails from a company (I think we all know one company/email that we just cannot unsubscribe to), you just turn off/delete the forwarder and no more emails!  The other advantage I see is that if there is a data breach, your real email address isn&amp;rsquo;t out there.  Moreover, having forwarder addresses like this lets you track down the source of a breach (or even see if a company sold your email address/data to another company).&lt;/p&gt;
&lt;p&gt;I tried self-hosting SimpleLogin on a number of occasions because it is &lt;a class=&#34;link&#34; href=&#34;https://github.com/simple-login&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;open source&lt;/a&gt;, but I could never get it to work.  Because &lt;em&gt;self-hosting email is awful&lt;/em&gt;.  And nobody should do it unless you truly enjoy bashing your head against the desk and fighting spam/IP block lists.  Given the relatively low price of SimpleLogin ($30 for the year, though looks like they raised the price to $36 a year) I was content to continue paying for the service.&lt;/p&gt;
&lt;p&gt;I did have a slight annoyance with SimpleLogin (that is not their fault): I want to actually use my root domain name for normal email, so I had to put SimpleLogin on a subdomain for email.  So my main email is &lt;code&gt;@example.com&lt;/code&gt; and SimpleLogin is hosted at &lt;code&gt;@sl.example.com&lt;/code&gt;.  Not the worst thing but it is ever so slightly annoying if I have to give out the email address and potentially explain that yes, there is a period in the domain name part.&lt;/p&gt;
&lt;h1 id=&#34;mxroute&#34;&gt;MXroute
&lt;/h1&gt;&lt;p&gt;Since self-hosting emails is not an option, a few years ago I started exploring alternatives to GMail (because Google being Google).  First I tried ProtonMail, but didn&amp;rsquo;t like the Android app (didn&amp;rsquo;t sync read emails for notifications, which drove me crazy) and having to use the Bridge to connect to something like Thunderbird wasn&amp;rsquo;t the end of the world but was limiting.  Then I tried FastMail and generally liked that as an option.  But then I stumbled onto MXroute in early 2022 and I have not looked back.  The first year I purchased a yearly subscription, but on Black Friday that year for just $100 I got a lifetime subscription to 10 gigs of storage.  The packages have changed and prices have gone up (&lt;a class=&#34;link&#34; href=&#34;https://blog.mxroute.com/moving-forward-with-lifetime-plans-smarter-this-time/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;and there have been changes to the lifetime plan&lt;/a&gt;), but I still think it&amp;rsquo;s worth it.&lt;/p&gt;
&lt;p&gt;This is in no ways a paid advertisement, but I simply cannot rave enough about MXroute.  The owner, Jarland, has quite the personality if you browse around various forums and places you&amp;rsquo;ll see what I mean.  In my very few interactions with him via support tickets, the guy &lt;em&gt;clearly&lt;/em&gt; knows his stuff and is incredibly passionate about what he does.  Moreover, he takes things &lt;em&gt;seriously&lt;/em&gt;.  If you at all end up on his bad side (cough cough spammer cough cough) &lt;a class=&#34;link&#34; href=&#34;https://mxroutespammer.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;he does not pull his punches&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, it&amp;rsquo;s important to note that there are &lt;em&gt;no free trials&lt;/em&gt;.  My advice if you&amp;rsquo;re interested in the service is buy a year, test it out, then go for the Black Friday sale.  &lt;a class=&#34;link&#34; href=&#34;https://mxroute.blackfriday/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Usually there are some good deals&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;mxroute-aliases&#34;&gt;MXroute Aliases
&lt;/h2&gt;&lt;p&gt;So there I was one day a week ago, logging into the webmail page for my email and I noticed I had an SSL cert error.  Well that was weird.  So I did some poking around trying to figure out what was going on, which led me to the MXroute subreddit.*  And that&amp;rsquo;s where I learned that not only does MXroute offer unlimited email aliases/forwarding, but there&amp;rsquo;s a new &lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;https://api.mxroute.com/docs#description/introduction&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API&lt;/a&gt;&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/mxroute/comments/1q4xs8s/new_mxroute_api/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;as of 3 months ago&lt;/a&gt;) for setting up those aliases.  And people have taken advantage and written some really cool apps!&lt;/p&gt;
&lt;p&gt;The first I found is &lt;a class=&#34;link&#34; href=&#34;https://gitlab.com/tomhello56/mxroute-alias-manager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;mxroute-alias-manager&lt;/a&gt;.  This is what sold me on ditching SimpleLogin.  It&amp;rsquo;s incredibly easy to set up and has a really straightforward and polished UI for creating and managing your email aliases on MXroute.  Really there&amp;rsquo;s not much to the setup: it&amp;rsquo;s just one container, you need to generate an API key from MXroute and configure your email server/username/email domains to use.  And boom, all set.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oh&amp;hellip;I did have some permission issues with the docker container in bind mount.  So you may need to create (I used &lt;code&gt;touch&lt;/code&gt;) the following files: &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;dest_templates.json&lt;/code&gt;, &lt;code&gt;labels.json&lt;/code&gt;, &lt;code&gt;tags-metadata.json&lt;/code&gt;, and &lt;code&gt;users.json&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The second app I&amp;rsquo;ve run into and tested so far is a &lt;a class=&#34;link&#34; href=&#34;https://github.com/bfpimentel/bitwarden-mxroute&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bitwarden integration&lt;/a&gt;.  Bitwarden offers options to generate usernames/email addresses with services like SimpleLogin or AnnonAddy, which simplifies the creation of mostly anonymous logins.  With the MXroute Bitwarden integration, you can generate aliases on MXroute for Bitwarden.  The only &amp;ldquo;gotcha&amp;rdquo; I had with this one is that I needed to set up a reverse-proxy with SSL in order to use it with the Android app.  It did not like using a non-HTTPS IP address of the local server.  Which is not an issue for me, so more of a heads up.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;In the end, I spent an evening migrating all my aliases off of SimpeLogin and moved my email completely to MXroute.  I wasn&amp;rsquo;t able to migrate some logins off of my &lt;code&gt;sl.example.com&lt;/code&gt; setup, so unfortunately I&amp;rsquo;ve had to retain that for legacy purposes.  But now if I ever have to provide an email address over the phone or in person it&amp;rsquo;ll be a little bit easier to say.  I can now save $36 a year, which really wasn&amp;rsquo;t my main issue with SimpleLogin but I&amp;rsquo;ll happily save on one more subscription.&lt;/p&gt;
&lt;p&gt;In summary: if you&amp;rsquo;re using MXroute, take a look at the awesome projects out there!  It&amp;rsquo;s really incredible and I think it&amp;rsquo;s just the beginning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;I did ultimately figure out what my SSL cert issue was.  Turns out there&amp;rsquo;s a new &lt;a class=&#34;link&#34; href=&#34;http://panel.mxroute.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;management panel&lt;/a&gt; that largely supplants the old DirectAdmin control panel, and somehow some of my settings involving the SSL certs got wonky.  That is probably my only complaint about MXroute: it&amp;rsquo;s not the easiest service to get configured and things move around, but I do think things are getting better and the new panel is a step in the right direction.  Once I reconfigured the SSL certs in the new panel, everything updated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>Printing HomeBox QR Code Labels to HomeAssistant over MQTT</title>
        <link>https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/</link>
        <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/</guid>
        <description>&lt;p&gt;Yes, it&amp;rsquo;s the end of another year.  And while I could look back and reflect on the year, I&amp;rsquo;m instead looking forward to next year and some things I want to accomplish.  I&amp;rsquo;m not going to necessarily call them &amp;ldquo;resolutions&amp;rdquo; as I kinda hate that idea, but I would like to keep better track of all the stuff in my house.  Things like how many of a specific smart switch I have, do I have any spare SSDs, when did I buy that TV for warranty purposes.  All that info would be helpful to have in any easily accessible place.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update 1/10/2026: Reddit user /u/slurdge made some improvements to the QR code output.  You can read more &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/selfhosted/comments/1q6t2cx/comment/nyo4x6h/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  Their tweaks to the labels have been incorporated below.  You can also follow their guide to add MQTT to the container and avoid the need for scripts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;homebox-setup&#34;&gt;Homebox Setup
&lt;/h2&gt;&lt;p&gt;I will admit that I have not spent much time setting up &lt;a class=&#34;link&#34; href=&#34;https://github.com/sysadminsmedia/homebox&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HomeBox&lt;/a&gt; yet, but in short it&amp;rsquo;s software to help you take inventory of and organize things in your house.  It&amp;rsquo;s pretty feature rich, with lots of customization and data that can be stored.  Essentially it does exactly what it says on the box.  It&amp;rsquo;s something I&amp;rsquo;ve known about but never really played around with.&lt;/p&gt;
&lt;p&gt;I give full credit to &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/selfhosted/comments/1py3gze/printing_homebox_labels_directly_to_a_niimbot/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;/u/flybrys on Reddit&lt;/a&gt; for the inspiration here (and really the inspiration to finally take a look at HomeBox) as they did most of the work figuring this out.  Also, for pointing out the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/dp/B0CZ6WCHGF&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Niimbot D110&lt;/a&gt;, which is just $18 on Amazon as a label printer.  It works over Bluetooth, so you&amp;rsquo;ll need some Bluetooth proxies to use it with HomeAssistant.  I already have some ESP32&amp;rsquo;s set up to do just that so this was not an issue for me.&lt;/p&gt;
&lt;p&gt;In terms of the setup from /u/flybrys, I&amp;rsquo;ve mostly just made some tweaks to streamline things.  Namely their setup used network shares (and a number of scripts) and I am instead using MQTT.  There&amp;rsquo;s nothing wrong with network shares, but in my homelab the LXC that runs HomeAssistant is 1) on a different VLAN and 2) doesn&amp;rsquo;t have network shares enabled.  I could have resolved both of those, but I really didn&amp;rsquo;t want my IOT stuff having access to a network mount, so I endeavored to find another solution.&lt;/p&gt;
&lt;p&gt;To start, here is my Docker Compose snippet to setup HomeBox:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  homebox:
    image: ghcr.io/sysadminsmedia/homebox:0.22.3
    container_name: homebox
    restart: unless-stopped
    environment:
      - HBOX_LOG_LEVEL=info
      - HBOX_LOG_FORMAT=text
      - HBOX_WEB_MAX_UPLOAD_SIZE=10
      - HBOX_LABEL_MAKER_PRINT_COMMAND=cp {{.FileName}} /labels/label.png
      - HBOX_LABEL_MAKER_PADDING=5
      - HBOX_LABEL_MAKER_MARGIN=5
      - HBOX_LABEL_MAKER_WIDTH=320
      - HBOX_LABEL_MAKER_HEIGHT=96
      - HBOX_LABEL_MAKER_FONT_SIZE=24
      - HBOX_OPTIONS_ALLOW_ANALYTICS=false
    volumes:
      - &amp;#34;{{ appdata_path }}/homebox/data:/data/&amp;#34;
      - &amp;#34;{{ appdata_path }}/homebox/labels:/labels/&amp;#34;
    ports:
      - 7745:7745
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Key things to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you update the image tag to whatever the latest version is!&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;HBOX_LABEL_MAKER_PRINT_COMMAND&lt;/code&gt; is necessary to enable the &amp;ldquo;Print on Server&amp;rdquo; button.  All we need is a simple &lt;code&gt;cp&lt;/code&gt; command to copy the QR code label out of the container to the mounted directory &lt;code&gt;/labels&lt;/code&gt;.  &lt;code&gt;{{.FileName}}&lt;/code&gt; is straight from the HomeBox docs.&lt;/li&gt;
&lt;li&gt;The rest of the padding/width/height specs come straight from /u/flybrys&amp;rsquo;s post.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;to-homeassistant&#34;&gt;To HomeAssistant!
&lt;/h2&gt;&lt;p&gt;Once you spin up HomeBox and create a user/your first item, you&amp;rsquo;ll now have the option to &amp;ldquo;Print from Browser&amp;rdquo;.  If you click it you&amp;rsquo;ll see a &amp;ldquo;Print on Server&amp;rdquo; button.  Right now if you click it, all it will do is create a &lt;code&gt;label.png&lt;/code&gt; file in the directory you mounted in &lt;code&gt;/labels&lt;/code&gt;.  Let&amp;rsquo;s fix that so it does more now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-from-browser.png&#34;
	width=&#34;1254&#34;
	height=&#34;154&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-from-browser_hu_2611dda4b0ad5df9.png 480w, https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-from-browser_hu_c267c6316a88b728.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Print from Browser Button&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;814&#34;
		data-flex-basis=&#34;1954px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-on-server.png&#34;
	width=&#34;517&#34;
	height=&#34;338&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-on-server_hu_484bb3e30a781d07.png 480w, https://blog.fuzzymistborn.com/homebox-labels-over-mqtt/print-on-server_hu_231317f225bbe7c3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Print On Server Button&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;152&#34;
		data-flex-basis=&#34;367px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;The next step is to create a bash script that uses &lt;code&gt;inotify&lt;/code&gt; to monitor the &lt;code&gt;/labels&lt;/code&gt; directory for a new PNG file.  When it detects a new PNG file in the directory, it fires off the image to MQTT.  We&amp;rsquo;ll use this to get the image into HomeAssistant pretty seamlessly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sidenote: The reason for the script outside the container is that the HomeBox image does not contain mosquitto-client, so we have to go external in order to push it over MQTT.  Perhaps someday mosquitto will be built into the container and you won&amp;rsquo;t need this part.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WATCH_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PATH-TO-HOMEBOX-LABELS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MQTT_BROKER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;BROKER-IP-ADDRESS&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MQTT_USERNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MQTT-USERNAME&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MQTT_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;MQTT-PASSWORD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MQTT_TOPIC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;homebox/labels&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;inotifywait -m -e close_write,moved_to &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$WATCH_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --format &lt;span class=&#34;s1&#34;&gt;&amp;#39;%w%f&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; FILE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$FILE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; *.png &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Detected new PNG: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$FILE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# Publish file via MQTT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        mosquitto_pub -h &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MQTT_BROKER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -u &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MQTT_USERNAME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -P &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MQTT_PASSWORD&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -t &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$MQTT_TOPIC&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --retain -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$FILE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can remove the MQTT username and password fields/arguments if you aren&amp;rsquo;t using them for your MQTT setup.  The rest should all be customized as applicable.  You can test it by running the script (mine is called &lt;code&gt;monitor_homebox.sh&lt;/code&gt;, so &lt;code&gt;./monitor_homebox.sh&lt;/code&gt; worked for me).  Note you will probably want to run the script as root since the label.png file will be owned by root with limited permissions.  You could tweak the &lt;code&gt;HBOX_LABEL_MAKER_PRINT_COMMAND&lt;/code&gt; environment variable to run a bash script like /u/flybrys does and &lt;code&gt;chmod&lt;/code&gt; the file.  I didn&amp;rsquo;t feel like taking that step, so I just run it as root.  /shrug.&lt;/p&gt;
&lt;p&gt;Go back to HomeBox and click the &amp;ldquo;Print on Server&amp;rdquo; button and check your MQTT server to see if there&amp;rsquo;s a new entry.  Now to run the script all the time in order to monitor the folder for any new labels created, I just created a simple systemd service file, like the one below (again notice I&amp;rsquo;m running this as root, you can change that if you are uncomfortable with the approach).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=Homebox Label Monitor Service
After=network.target

[Service]
ExecStart=PATH/TO/YOUR/SCRIPT/monitor_homebox.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Don&amp;rsquo;t forget to enable and start the systemd service (and check to make sure it&amp;rsquo;s running) before proceeding to the next step.&lt;/p&gt;
&lt;h2 id=&#34;final-steps&#34;&gt;Final Steps
&lt;/h2&gt;&lt;p&gt;Almost there!  To tie the Niimbot D110 into HomeAssistant, you&amp;rsquo;ll need &lt;a class=&#34;link&#34; href=&#34;https://github.com/eigger/hass-niimbot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this integration&lt;/a&gt;.  Install it (HACS is easiest as a custom repository).  You&amp;rsquo;ll also want to set up an &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/camera.mqtt/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MQTT Camera&lt;/a&gt; entity in your config based on the MQTT topic you set up in the &lt;code&gt;monitor_homebox.sh&lt;/code&gt; script.  Mine is just this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;camera&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Homebox Labels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;homebox/labels&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And reboot HomeAssistant.  Now add your D110 to HomeAssistant as a device (may have to scroll depending on how many Bluetooth devices you have in range).&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t do a lot of HomeAssistant automations (I use NodeRed) but I&amp;rsquo;m fairly certain there&amp;rsquo;s an MQTT trigger, so you can trigger the below action based on that trigger.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;action: niimbot.print
data:
  payload:
    - type: dlimg
      url: &amp;gt;-
        http://HA_IP:HA_PORT/{{ state_attr(&amp;#39;camera.YOUR_CAMERA_NAME&amp;#39;,
        &amp;#39;entity_picture&amp;#39;) }}
      x: 0
      &amp;#34;y&amp;#34;: 0
      xsize: 320
      ysize: 96
  width: 320
  height: 96
  rotate: 90
  print_line_batch_size: 10
  wait_between_print_lines: 0.01
  density: 5
  preview: false
target:
  device_id: YOUR_D110_DEVICE_ID
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A few things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You can play with &lt;code&gt;print_line_batch_size&lt;/code&gt;.  /u/flybrys used 32.  From my own trial and error I&amp;rsquo;ve settled on 10.  My understanding is it controls print speed, and I found 10 to be fine.&lt;/li&gt;
&lt;li&gt;The Niimbot requires a URL in order to print and can&amp;rsquo;t print a local file.  Hence why we set up an MQTT camera.  Using the template pulls the necessary camera API token to allow printing.&lt;/li&gt;
&lt;li&gt;You can change &lt;code&gt;preview&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; if you want to test without physically printing anything.  You can see what would have been printed if you look at the &lt;code&gt;Last Label Made&lt;/code&gt; entity.&lt;/li&gt;
&lt;li&gt;To find the device_id, go to the Actions screen and use the UI to select the Niimbot device and then switch back to YAML mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That should be it!  Now if you go into HomeBox and click the &amp;ldquo;Print on Server&amp;rdquo; button a label should be printed within a few seconds on your Niimbot.  Pretty sweet!&lt;/p&gt;
&lt;p&gt;Happy organizing!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Migrating to PostgreSQL</title>
        <link>https://blog.fuzzymistborn.com/postgresql-migration/</link>
        <pubDate>Fri, 26 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/postgresql-migration/</guid>
        <description>&lt;p&gt;I&amp;rsquo;ve been taking some time off work to enjoy the holidays, and decided that now was a good time to take on a few interesting projects I&amp;rsquo;ve wanted to do in the good ole homelab before the end of the year.  The main one I accomplished today was migrating from MariaDB to PostgreSQL for the majority of my database backends.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve long been a user of MariaDB for all my database needs.  It has done the job and upgrades have been relatively straightforward, even between major versions.  And there has been nothing really &amp;ldquo;wrong&amp;rdquo; with my setup.  But over the years I&amp;rsquo;ve seen a lot more positive opinions express over PostgreSQL and a lot more projects supporting it (sometimes as the only option).  I&amp;rsquo;ve run it for those few instances where I&amp;rsquo;ve needed it, but I was never a huge fan because to upgrade between major versions (ie going from 14&amp;ndash;&amp;gt;15) in Docker required you to basically dump your entire database, create a new container, and restore the backup.  That being said, PostgreSQL supports major versions for a &lt;a class=&#34;link&#34; href=&#34;https://www.postgresql.org/support/versioning/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;em&gt;long&lt;/em&gt; time&lt;/a&gt;, so I never feel compelled to upgrade that often.&lt;/p&gt;
&lt;p&gt;What really prompted me to start looking into migrating was the deprecation of the MariaDB backend for Umami, the software I use to track visits to this blog.  As much as I like Umami and the relative simplicity to set it up, I&amp;rsquo;ve been bitten twice by bad migrations involving the database, forcing me to start fresh.  Going from MariaDB to PostgreSQL was the second instance.  However, I&amp;rsquo;m hopeful that this will be the last time as I really don&amp;rsquo;t want to have to deal with it again.  And the developer has indicated that PostgreSQL is easier to support for the software so&amp;hellip;.fingers crossed.&lt;/p&gt;
&lt;p&gt;It just so happened at the time I was doing this conversion (over Thanksgiving when I was visiting family and bored), &lt;a class=&#34;link&#34; href=&#34;https://theorangeone.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TheOrangeOne&lt;/a&gt; shared an interesting container that removes the major pain point I&amp;rsquo;ve had with PostgreSQL: automatic upgrades.  The container is &lt;code&gt;pgautoupgrade/pgautoupgrade&lt;/code&gt;, and just like the name implies, it handles the upgrades for you.  Obviously you should still backup before upgrading, but this container allowed me to upgrade my existing PostgreSQL instances without any issues to the latest version.  You can read more about the container &lt;a class=&#34;link&#34; href=&#34;https://github.com/pgautoupgrade/docker-pgautoupgrade&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a result of the Umami database conversion, the only other DB I had left on my VPS is for Gitea, so I figured I would look into migrating my MariaDB backend for Gitea to PostgreSQL.  And oooof, it was not easy.  I played around with various sql dumps, &lt;code&gt;pgloader&lt;/code&gt;, and everything in between.  After faffing about for several hours, I was ultimately successful in migrating the data over (though don&amp;rsquo;t ask me how now).  Huzah, two fewer instances of MariaDB and only one image/database type on my VPS.&lt;/p&gt;
&lt;p&gt;After the pain of the Gitea migration I took a bit of a break.  But I got in a homelabbing mood today setting up Booklore so figured I would take the rest of the migrations I could.  And overall I was successful in migrating the following apps from MariaDB to PostgreSQL.  I&amp;rsquo;ve sorted them by ease of migration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nextcloud&lt;/strong&gt; - &lt;em&gt;Super&lt;/em&gt; simple.  There&amp;rsquo;s an &lt;code&gt;occ&lt;/code&gt;-based migration tool, &lt;code&gt;occ db:convert&lt;/code&gt;.  You can read more about it &lt;a class=&#34;link&#34; href=&#34;https://docs.nextcloud.com/server/stable/admin_manual/configuration_database/db_conversion.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  I spun up a new PostgreSQL container, filled out the command and ran it.  Took about 5 minutes and everything was migrated over.  It even handled updating Nextcloud&amp;rsquo;s &lt;code&gt;config.php&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vaultwarden&lt;/strong&gt; - Relatively simple.  Followed the instructions in the Github &lt;a class=&#34;link&#34; href=&#34;https://github.com/dani-garcia/vaultwarden/wiki/Using-the-PostgreSQL-Backend#migrating-from-mysql-to-postgresql&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  Basically spun up a new Vaultwarden instance (with the new PostgreSQL database), stopped both the old and new instances, and used &lt;code&gt;pgloader&lt;/code&gt; to migrate the data.  Only complication for me was that my database was old so it was &lt;code&gt;bitwarden_rs&lt;/code&gt; and not &lt;code&gt;vaultwarden&lt;/code&gt; in the load file&amp;rsquo;s &lt;code&gt;ALTER SCHEMA&lt;/code&gt; line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HomeAssistant&lt;/strong&gt; - On par with the Gitea migration, but for a different reason.  My HA database is quite large, with a few million entries, which is not surprising given how many entities I have.  I therefore worked with my AI buddy Claude to tweak the settings for &lt;code&gt;pgloader&lt;/code&gt; to ultimately get it to work.  The main struggle was with memory limits in both the databases as well as &lt;code&gt;pgloader&lt;/code&gt;.  For posterity, this was my &lt;code&gt;pgloader&lt;/code&gt; &lt;code&gt;.load&lt;/code&gt; file that ended up working:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;LOAD DATABASE
  FROM mysql://hass:password@192.168.50.1:3306/homeassistant
  INTO postgresql://homeassistant:password@192.168.50.1:5432/homeassistant

WITH include drop, create tables, create indexes, reset sequences, workers = 2, concurrency = 1

EXCLUDING TABLE NAMES MATCHING &amp;#39;statistics&amp;#39;, &amp;#39;statistics_short_term&amp;#39;

CAST type datetime to timestamptz drop default drop not null using zero-dates-to-null 

BEFORE LOAD DO
 $$ drop schema if exists homeassistant cascade; $$, 
 $$ create schema homeassistant; $$;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;And a very distant 4th place would be Umami and Gitea tied.  Umami because I was unsuccessful (which I guess maybe should make it 5th), and Gitea just because it took forever.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I fully recognize that database migrations aren&amp;rsquo;t the simplest thing, and the easiest solution would have been to just start fresh, but I really didn&amp;rsquo;t want to lose any data.  Therefore I fought a bit but ultimately seem to have come out (mostly) victorious.  The end result is that I only have 2 databases running MariaDB (Booklore and ROMM), and it&amp;rsquo;s unclear if there will ever be PostgreSQL support for either.  But if there is, I will probably migrate.&lt;/p&gt;
&lt;p&gt;Also shout out to &lt;a class=&#34;link&#34; href=&#34;https://github.com/dimitri/pgloader&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pgloader&lt;/a&gt; as a useful tool for migrating between instances.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t noticed much performance wise yet (it&amp;rsquo;s only been a few hours), but I did immediately notice that my database LXC dropped about 5% in RAM usage as a result of the switch.  Granted, the LXC only has 3gb of RAM, but still that&amp;rsquo;s a fairly substantial drop!  Will track performance and update this post if I notice anything worth mentioning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update: RAM usage seems to now be 50% lower (from ~40% to under 20% overall utilization).  And at least HomeAssistant feels snappier in the UI.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>How to Enable IPv6 on OPNSense for Matter Support</title>
        <link>https://blog.fuzzymistborn.com/opnsense-ipv6-matter/</link>
        <pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/opnsense-ipv6-matter/</guid>
        <description>&lt;p&gt;I&amp;rsquo;ve wanted to play around with the new hot smarthome standard, known as &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Matter_%28standard%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matter&lt;/a&gt;, for a while.  What is Matter?  Simply put it&amp;rsquo;s supposed to be an interoperable standard for all smart home devices.  Big companies like Apple, Amazon, and Google are all backing the standard.  The hope is to avoid the classic xkcd comic called &amp;ldquo;Standards&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/standards_2x.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Standards&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Personally I&amp;rsquo;m not fully bought into the Matter standard as I think it has a long way to go and it needs more features/support more device types, though to the standard&amp;rsquo;s credit they&amp;rsquo;re continuing to move things along.  I&amp;rsquo;ll put it this way: I&amp;rsquo;m not going to purposefully no buy a device because it supports Matter, but I&amp;rsquo;m also not going to go out of my way to buy a Matter-compliant device either.  Nor am I going to go out and replace all my devices just to switch to Matter.&lt;/p&gt;
&lt;p&gt;I did finally get some Govee LED lights (the Permanent Outdoor LED 2s) and spent a good day and half hanging them up.  They support Matter so I figured I would take some time and configure Matter.  However it proved to be a bit of an adventure to get it all working because I had to enable IPv6, which is something I had not messed around with before.  Nor could I find any good guides for enabling it.  Hence this post sharing my experience.&lt;/p&gt;
&lt;h2 id=&#34;ipv4-v-ipv6&#34;&gt;IPv4 v. IPv6
&lt;/h2&gt;&lt;p&gt;A long, detailed explanation of IPv6 and it&amp;rsquo;s importance is beyond the scope of this post.  In short, we&amp;rsquo;ve exhausted existing pools of &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Ipv4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IPv4&lt;/a&gt; addresses (192.168.1.1 is an IPv4 address, for example).  IPv4 just uses a set of numbers and therefore only has 4,294,967,296 unique addresses.  Sounds like a lot right?  But remember with the explosion of cell phones and other smart home devices (as well as the world becoming more connected) there &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/IPv4_address_exhaustion&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;aren&amp;rsquo;t nearly enough addresses&lt;/a&gt;.  Hence the development of IPv6, which has 340,282,366,920,938,463,463,374,607,431,768,211,456 unique addresses.  That&amp;hellip;should be enough for a while.&lt;/p&gt;
&lt;p&gt;Matter relies on IPv6 for communication, which is frustrating because I have enough IPv4 addresses internally.  But&amp;hellip;.standards I guess?  Anyway, on to how I configured IPv6 on OPNsense.&lt;/p&gt;
&lt;h2 id=&#34;opnsense-configuration&#34;&gt;OPNsense Configuration
&lt;/h2&gt;&lt;p&gt;The first step is to log into your OPNSense box and go to Interfaces-&amp;gt;Settings and make sure the &amp;ldquo;Allow IPv6&amp;rdquo; is clicked/toggled on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-enable-ipv6.png&#34;
	width=&#34;980&#34;
	height=&#34;1006&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-enable-ipv6_hu_f50bb5cca701021f.png 480w, https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-enable-ipv6_hu_a076bccf4f5d04d5.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;97&#34;
		data-flex-basis=&#34;233px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Click Save.  Not the bit at the bottom that the change will only take affect upon reboot of the machine or reconfiguring each interface.  I didn&amp;rsquo;t need to reboot as we&amp;rsquo;re going to reconfigure the interfaces.&lt;/p&gt;
&lt;p&gt;The next step is to configure/enable DHCP for IPv6 on each VLAN/interface.  Personally I have multiple VLANs, but I really only need IPv6 on my IOT VLAN.  I also enabled IPv6 on my management VLAN so my network switches and APs would have an IPv6 address.  To set up the DHCP, go to the specific interface you want to add IPv6 to.  Set &lt;code&gt;IPv6 Configuration Type&lt;/code&gt; to &lt;code&gt;Static IPv6&lt;/code&gt;.  That will add a new dropdown box for configuring DHCP for IPv6.  I used the following for my address &lt;code&gt;fd00:0:0:30::1&lt;/code&gt;.  My IOT network uses VLAN 30, so you can adjust the &lt;code&gt;30&lt;/code&gt; to be whatever you want.  You also need to adjust the &lt;code&gt;128&lt;/code&gt; to &lt;code&gt;64&lt;/code&gt; that is in the dropdown next to the address box.  Again click Save.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-dhcp-ipv6.png&#34;
	width=&#34;1130&#34;
	height=&#34;1124&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-dhcp-ipv6_hu_a7f7407d962ba528.png 480w, https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-dhcp-ipv6_hu_1f660166045a6979.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;100&#34;
		data-flex-basis=&#34;241px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure if this next step is necessary because I have VLANs or if it&amp;rsquo;s optional but I found it mentioned in a few articles/Reddit posts so I figured I would enable it.  You&amp;rsquo;ll need to use &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;https://docs.opnsense.org/manual/radvd.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Router Advertisements&lt;/a&gt;&amp;rdquo; under Services and configure it like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-router-advertisements.png&#34;
	width=&#34;1834&#34;
	height=&#34;1068&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-router-advertisements_hu_7fd6d6cfa957de1f.png 480w, https://blog.fuzzymistborn.com/opnsense-ipv6-matter/opnsense-router-advertisements_hu_3f049f3c055ca37f.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;171&#34;
		data-flex-basis=&#34;412px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Essentially I set the &amp;ldquo;Router Advertisement&amp;rdquo; setting to &amp;ldquo;Assisted&amp;rdquo; and copied the IPv6 prefix from the earlier settings (in my case &lt;code&gt;fd00:0:0:30::1&lt;/code&gt;) and clicked Save.  You should be able to leave all the other settings the same.&lt;/p&gt;
&lt;h2 id=&#34;omada-configuration&#34;&gt;Omada Configuration
&lt;/h2&gt;&lt;p&gt;I run TP-Link Omada switches/Access Points for my network, and they required a little extra configuration to work as well.  Basically I had to go into each network switch, go to &amp;ldquo;Config&amp;rdquo;, and scroll down a bit till I saw DHCP options.  I needed to enable IPv6 and then I made sure &amp;ldquo;Dynamic IP (SLAAC/DHCPv6)&amp;rdquo; was selected.  I did similar for each Access Point.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/omada-switch.png&#34;
	width=&#34;646&#34;
	height=&#34;620&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/omada-switch_hu_b613b008a4fec188.png 480w, https://blog.fuzzymistborn.com/opnsense-ipv6-matter/omada-switch_hu_47b18d4c9cd193b5.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;104&#34;
		data-flex-basis=&#34;250px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;configuring-proxmox&#34;&gt;Configuring Proxmox
&lt;/h2&gt;&lt;p&gt;I had to make a minimal change to my Proxmox network configuration in &lt;code&gt;/etc/network/interfaces&lt;/code&gt; to enable IPv6.  Specifically I needed to add &lt;code&gt;iface vmbr1 inet6 manual&lt;/code&gt;.  I use Linux Bridges, so my configuration looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;auto bond0  
iface bond0 inet manual  
       bond-slaves enp4s0f0 enp4s0f1 enp4s0f2 enp4s0f3  
       bond-miimon 100  
       bond-mode 802.3ad  
  
auto vmbr0  
iface vmbr0 inet static  
       address 192.168.1.10/24  
       gateway 192.168.1.1  
       bridge-ports eno1  
       bridge-stp off  
       bridge-fd 0  
       bridge-vlan-aware yes  
       bridge-vids 2-4094  
#Onboard NIC (VLAN 1)  
  
auto vmbr1  
iface vmbr1 inet manual  
       bridge-ports bond0  
       bridge-stp off  
       bridge-fd 0  
       bridge-vlan-aware yes  
       bridge-vids 2-4094  
#LAGG Connection (All VLANs)  
  
iface vmbr1 inet6 manual #THIS IS NEW FOR IPv6!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;rsquo;ll need to reboot the server or run &lt;code&gt;sudo ifreload -a&lt;/code&gt; to reload the interfaces for Proxmox.&lt;/p&gt;
&lt;p&gt;To enable IPv6 for the LXC where I run HomeAssistant, I picked &lt;code&gt;SLAAC&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/proxmox-lxc.png&#34;
	width=&#34;758&#34;
	height=&#34;466&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-ipv6-matter/proxmox-lxc_hu_f0a679d9c5be2f56.png 480w, https://blog.fuzzymistborn.com/opnsense-ipv6-matter/proxmox-lxc_hu_5ce1cda5d4145a2f.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;162&#34;
		data-flex-basis=&#34;390px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Now when I go into the LXC (probably need to reboot the LXC), when I run the &lt;code&gt;ip&lt;/code&gt; command I see an IPv6 address!&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ip -6 a show eth0  
2: eth0@if21: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 0  
   inet6 fd00::30:893:69ff:fe34:159f/64 scope global dynamic mngtmpaddr noprefixroute    
      valid_lft 86226sec preferred_lft 14226sec  
   inet6 fe80::893:69ff:fe34:159f/64 scope link    
      valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this case, its &lt;code&gt;fd00::30:893:69ff:fe34:159f&lt;/code&gt; (notice the 30 from the early step in OPNsense?).&lt;/p&gt;
&lt;h2 id=&#34;matter-docker-container&#34;&gt;Matter Docker Container
&lt;/h2&gt;&lt;p&gt;Thankfully this part is pretty easy.  The OpenHome Foundation (folks behind HomeAssistant) have made an Docker container to run the server.  I suggest running it on the same VLAN as your HomeAssistant instance as I imagine crossing VLANs will be painful.  Here&amp;rsquo;s my Docker-Compose configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;matter-server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ghcr.io/home-assistant-libs/python-matter-server:stable  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;matter-server  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;network_mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;host  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/home/fuzzy/docker/matter-server/data:/data/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just run &lt;code&gt;docker compose up -d matter-server&lt;/code&gt; and it should spin up and hopefully &lt;code&gt;Just Work&lt;/code&gt; provided IPv6 is working.  You can then add Matter in HomeAssistant (mine popped up automatically when I went to the Devices menu).  You&amp;rsquo;ll have to pair the actual Matter device from your phone as for now Matter also relies on Bluetooth for now (hopefully that will be changing as &lt;a class=&#34;link&#34; href=&#34;https://www.helpnetsecurity.com/2025/08/11/matter-1-4-2-smart-home-security/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Matter 1.4.2 was just released&lt;/a&gt; that permits WiFi only commissioning).&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;I may be forgetting a step, but that should get you most of the way there.  Not really intuitive at all, but at least now I can connect to Matter devices.  But it&amp;rsquo;s still VERY finicky to get paired into HomeAssistant.  Have to disable any VPN, need to be on the same WiFi network, and you sometimes need to factory reset the device/reboot it in order to get it to successfully pair.&lt;/p&gt;
&lt;p&gt;The functionality in Matter for the Govee lights is pretty limited, but I&amp;rsquo;m hoping that improves with time.  Still not completely sold on Matter as it&amp;rsquo;s not very consumer friendly to set up, but again&amp;hellip;time.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Setting up Pocket-ID with Caddy-Security</title>
        <link>https://blog.fuzzymistborn.com/pocket-id-setup/</link>
        <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/pocket-id-setup/</guid>
        <description>&lt;p&gt;I&amp;rsquo;ve long been interested in setting up an easy authentication system for logging into (and in some case protecting) services I self-host.  I looked into options like &lt;a class=&#34;link&#34; href=&#34;https://goauthentik.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Authentik&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.authelia.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Authelia&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://www.keycloak.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Keycloak&lt;/a&gt; but they seemed overly complicated to me/difficult to set up.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also wanted to check out &lt;a class=&#34;link&#34; href=&#34;https://fidoalliance.org/passkeys/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;passkeys&lt;/a&gt;, which are a relatively new form of authentication to replace passwords.  They have a lot of potential and I needed something to motivate me to start the transition.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen a lot of mentions of Pocket-ID before, which is a lightweight OIDC (OpenID Connect) services that uses passkeys for authentication instead of dealing with passwords.  I figured I&amp;rsquo;d spend an evening spinning it up and seeing if it was as easy as people said it was.  Ultimately in some ways it was very easy, but in others I wanted to pull hair out.  I decided I should document how I got things working in case it was helpful to others.  I&amp;rsquo;m by no means an expert but I&amp;rsquo;m happy to help if you run into issues.&lt;/p&gt;
&lt;h1 id=&#34;setting-up-pocket-id&#34;&gt;Setting up Pocket-ID
&lt;/h1&gt;&lt;p&gt;Setting up Pocket-ID is really simple.  The &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/introduction&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;documentation&lt;/a&gt; is actually quite good, though I personally don&amp;rsquo;t like the &lt;code&gt;.env&lt;/code&gt; file approach given how I have my infra set up, so here&amp;rsquo;s a docker-compose file with the key bits you need:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;pocket-id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ghcr.io/pocket-id/pocket-id:v1.6.2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pocket-id&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;APP_URL=https://pocket-id.example.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TRUST_PROXY=true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;MAXMIND_LICENSE_KEY=YOUR_API_KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;ENCRYPTION_KEY=YOUR_ENCRYPTION_KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PUID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;PGID=1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;1411&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1411&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/home/fuzzy/docker/pocketid/data:/app/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll need a few things to set this up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Maxmind License Key.  You sign up for a key &lt;a class=&#34;link&#34; href=&#34;https://www.maxmind.com/en/geolite2/signup&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  I&amp;rsquo;ve also started using this in conjunction with geoblocking using this &lt;a class=&#34;link&#34; href=&#34;https://github.com/porech/caddy-maxmind-geolocation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Caddy plugin&lt;/a&gt;, so it&amp;rsquo;s worth signing up (and it&amp;rsquo;s free!).&lt;/li&gt;
&lt;li&gt;As explained in the &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/configuration/environment-variables#encryption-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;docs&lt;/a&gt;, you can set an encryption key.  It&amp;rsquo;s technically optional as you can run Pocket-ID without it, but I&amp;rsquo;d recommend this step.  Security is not a bad idea given that this is a gateway into some of your apps/services.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also take a look through the various &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/configuration/environment-variables/#encryption-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;environment variables&lt;/a&gt; you can set.  Most can also be set from the UI, but I find from a documentation perspective it&amp;rsquo;s easier to set the variables and then commit it to GitHub so I can easily recreate things if needed.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it!  You&amp;rsquo;ll also need to put it behind a reverse proxy &lt;strong&gt;with HTTPS&lt;/strong&gt; for Pocket-ID/passkeys to work, but that&amp;rsquo;s beyond the scope of this post.  Also consider looking at the hardening guide &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/advanced/container-security-hardening&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;configuring-pocket-id&#34;&gt;Configuring Pocket-ID
&lt;/h1&gt;&lt;h2 id=&#34;apps-that-support-oidc&#34;&gt;Apps that Support OIDC
&lt;/h2&gt;&lt;p&gt;Many apps support OIDC which is an authentication protocol based on the OAuth 2.0 standard.  Pocket-ID&amp;rsquo;s documentation has a &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/client-examples&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;number of examples&lt;/a&gt; of how to configure apps to work with OIDC, including Proxmox, Nextcloud, Audiobookshelf and others.  You can also search for &amp;ldquo;OIDC NAME-OF-APP&amp;rdquo; and probably find information on how to set up a few more.  In the end a good chunk of the apps I run support OIDC natively, which is great because there&amp;rsquo;s no additional steps to get things to work.  The more complicated part (and what I struggled with) was configuring apps that &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; support OIDC natively.&lt;/p&gt;
&lt;h2 id=&#34;apps-that-dont-support-oidc&#34;&gt;Apps that Don&amp;rsquo;t Support OIDC
&lt;/h2&gt;&lt;p&gt;In the case of apps that don&amp;rsquo;t support OIDC natively, there are a few options.  Again, the &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/guides/proxy-services&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Pocket-ID docs&lt;/a&gt; on the topic are a great starting point and certainly pointed me in the right direction.  Going through the list, I don&amp;rsquo;t run Traefik (and didn&amp;rsquo;t want to switch) so that wasn&amp;rsquo;t an option.  I tried both &lt;a class=&#34;link&#34; href=&#34;https://oauth2-proxy.github.io/oauth2-proxy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OAuth2-Proxy&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://tinyauth.app/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TinyAuth&lt;/a&gt;.  I couldn&amp;rsquo;t get Oauth2-Proxy to work, probably due to my somewhat complicated setup where I have multiple domains and I use a VPS to tunnel my traffic to home.  I liked  TinyAuth a lot, but ultimately discovered it wouldn&amp;rsquo;t work in my setup because I have multiple domains and didn&amp;rsquo;t want to have to work with multiple instances.&lt;/p&gt;
&lt;p&gt;I was about to give up but then I decided to try &lt;a class=&#34;link&#34; href=&#34;https://github.com/greenpau/caddy-security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Caddy-Security&lt;/a&gt;.  Full disclosure, there were &lt;a class=&#34;link&#34; href=&#34;https://blog.trailofbits.com/2023/09/18/security-flaws-in-an-sso-plugin-for-caddy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;some vulnerabilities disclosed in 2023&lt;/a&gt;.  The developer of Caddy-Security has responded in &lt;a class=&#34;link&#34; href=&#34;https://github.com/greenpau/caddy-security/issues/349&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this issue on GitHub&lt;/a&gt;.  You make up your own mind as to whether to rely on Caddy-Security.  Personally, I think the security issues are unlikely to affect me in my home-lab, but if this was a corporate thing then it maybe worth closer investigation.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to use xCaddy to build your Caddy binary to include &lt;code&gt;github.com/greenpau/caddy-security&lt;/code&gt;.  That&amp;rsquo;s beyond the scope of this post as it depends on how you handle your Caddy binary.  I use Ansible so it was as simple as adding the repo to the &lt;code&gt;caddy_packages&lt;/code&gt; variable.  Now comes the tricky part.&lt;/p&gt;
&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/guides/proxy-services#caddy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Pocket-ID documentation&lt;/a&gt; is&amp;hellip;fine but I think left a few things out that took me a while to figure out.  The first thing is step 1, creating the OIDC client in Pocket-ID.  You don&amp;rsquo;t need to create multiple clients (unless you really are paranoid/want to).  I wanted something simple, so I have just one OIDC client for all of Caddy.  To handle that, for your callback URL, you will want to use a wildcard.  So instead of setting &lt;code&gt;https://nextcloud.example.com/caddy-security/oauth2/pocket-id/authorization-code-callback&lt;/code&gt; and &lt;code&gt;https://homeassistant.example.com/caddy-security/oauth2/pocket-id/authorization-code-callback&lt;/code&gt;, you can just do &lt;code&gt;https://*.example.com/caddy-security/oauth2/pocket-id/authorization-code-callback&lt;/code&gt; where the &lt;code&gt;*&lt;/code&gt; is the wildcard to handle all your subdomains.  Make sure you copy/save the &lt;code&gt;client_Id&lt;/code&gt; and &lt;code&gt;client_secret&lt;/code&gt;, you&amp;rsquo;ll need those in a minute.&lt;/p&gt;
&lt;p&gt;Also, keep in mind &lt;code&gt;pocket-id&lt;/code&gt; in the URL is going to be directly tied into the next step when configuring Caddy-Security.  So if you change the provider below (I&amp;rsquo;ll highlight what I mean) you&amp;rsquo;ll need to adjust your callback URL.&lt;/p&gt;
&lt;h3 id=&#34;caddyfile&#34;&gt;Caddyfile
&lt;/h3&gt;&lt;p&gt;I&amp;rsquo;m going to provide the relevant Caddyfile bits now, but scroll down if you want to understand how you can tweak this/things I discovered.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the top part of my Caddyfile (in the &lt;a class=&#34;link&#34; href=&#34;https://caddyserver.com/docs/caddyfile/options&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;global options block&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Caddy-Security introduced a &lt;a class=&#34;link&#34; href=&#34;https://github.com/greenpau/caddy-security/issues/455#issuecomment-3987143294&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;breaking change&lt;/a&gt; in v1.136, released March 1, 2026.  The fix is included below, but in short you need to add &lt;code&gt;trust login redirect uri domain suffix example.com path prefix /&lt;/code&gt; to the authentication portal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;order&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;authenticate&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;respond&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;order&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;authorize&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;basicauth&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;	# caddy-security
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;security&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;oauth&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;identity&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;realm&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;driver&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;generic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;client_id&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;secret_caddy_pocket_id_user&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;client_secret&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;secret_caddy_pocket_id_key&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;scopes&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;openid&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;profile&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;base_auth_url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;https://pocket-id.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;metadata_url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;https://pocket-id.example.com/.well-known/openid-configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;delay_start&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authentication&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;portal&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;crypto&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;lifetime&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;86400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;enable&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;identity&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;trust&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;login&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;redirect&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;uri&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;domain&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;suffix&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;example.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;prefix&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;transform&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;				&lt;span class=&#34;k&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;realm&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;				&lt;span class=&#34;k&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;role&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authorization&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;policy&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;auth&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/caddy-security/oauth2/pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;allow&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;roles&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;inject&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;claims&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, to make it easy to import into your existing config, I have the following snippet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;(pocket-id)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/caddy-security/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authenticate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authorize&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can then import this snippet with just &lt;code&gt;import pocket-id&lt;/code&gt; like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;drop.fuzzymistborn.com {
	import pocket-id
	reverse_proxy localhost:3200
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;explanationthings-i-learned&#34;&gt;Explanation/Things I Learned
&lt;/h3&gt;&lt;p&gt;So what&amp;rsquo;s different between my Caddyfile and the Pocket-ID documentation?  A few things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I changed the identity provider from &lt;code&gt;generic&lt;/code&gt; to &lt;code&gt;pocket-id&lt;/code&gt;.  Made more sense to me.  If you also want to change this value, this is what you need to change in your callback URL above for Pocket-ID.  IE &lt;code&gt;https://*.example.com/caddy-security/oauth2/generic/authorization-code-callback&lt;/code&gt; versus &lt;code&gt;https://*.example.com/caddy-security/oauth2/pocket-id/authorization-code-callback&lt;/code&gt;.  You&amp;rsquo;ll also need to change the &lt;code&gt;realm&lt;/code&gt; to match.&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;scopes&lt;/code&gt; i added &lt;code&gt;groups&lt;/code&gt; which I&amp;rsquo;ll talk about below.&lt;/li&gt;
&lt;li&gt;I changed the &lt;code&gt;authentication portal&lt;/code&gt; to &lt;code&gt;pocket-id&lt;/code&gt;, again because I think that makes more sense than &lt;code&gt;myportal&lt;/code&gt;.  I also changed the identity provider to &lt;code&gt;pocket-id&lt;/code&gt; instead of &lt;code&gt;generic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I kept the &lt;code&gt;transform user&lt;/code&gt; bit, but there&amp;rsquo;s another example (in line with #2 above) where you can limit which Pocket-ID groups can log in.  I didn&amp;rsquo;t go this route, but I&amp;rsquo;ll document a bit how you&amp;rsquo;d do it if you want.&lt;/li&gt;
&lt;li&gt;Again, in the &lt;code&gt;authorization policy&lt;/code&gt; I changed things to &lt;code&gt;pocket-id&lt;/code&gt; instead of &lt;code&gt;mypolicy&lt;/code&gt; and &lt;code&gt;generic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Finally I used a &lt;a class=&#34;link&#34; href=&#34;https://caddyserver.com/docs/caddyfile/concepts#snippets&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;snippet&lt;/a&gt;to make repeating code easier.  Repeating myself again, but if you changed anything in the global options block, you&amp;rsquo;ll need to change the reference in the &lt;code&gt;route @auth&lt;/code&gt; and &lt;code&gt;route&lt;/code&gt; blocks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My approach will allow all users in Pocket-ID to be able to authenticate and log into any app/website protected by Pocket-ID and Caddy-Security.  For my use case, that&amp;rsquo;s completely fine as it&amp;rsquo;s just family using it.  But if you wanted to restrict certain pages to certain groups, here&amp;rsquo;s how you&amp;rsquo;d go about it.&lt;/p&gt;
&lt;h4 id=&#34;restricting-to-groups&#34;&gt;Restricting to Groups
&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/greenpau/caddy-security/issues/378#issuecomment-2765955344&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This post&lt;/a&gt; was key to figuring this one out.  But essentially the difference between this and the above is that we can create a group in Pocket-ID (and you&amp;rsquo;ll want to limit the &lt;a class=&#34;link&#34; href=&#34;https://pocket-id.org/docs/configuration/allowed-groups&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OIDC client as well&lt;/a&gt;).  In this case we&amp;rsquo;ll create one called &lt;code&gt;private&lt;/code&gt;.  Add the necessary users, then create the new authorization policy below.  Also, note that the &lt;code&gt;authentication portal&lt;/code&gt; is different.  We removed this bit:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;			transform user {
				match realm pocket-id
				action add role user
			}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That bit is what basically turned all users authenticating via Caddy-Security into a generic user (who could in turn authenticate with Pocket-ID).&lt;/p&gt;
&lt;p&gt;Here is what your Caddyfile would look like if you wanted to limit a login to certain groups.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;order&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;authenticate&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;respond&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;order&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;authorize&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;basicauth&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;	# caddy-security
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;security&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;oauth&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;identity&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;realm&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;driver&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;generic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;client_id&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;secret_caddy_pocket_id_user&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;client_secret&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;secret_caddy_pocket_id_key&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;scopes&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;openid&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;profile&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;base_auth_url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;https://pocket-id.example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;metadata_url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;https://pocket-id.example.com/.well-known/openid-configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;delay_start&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authentication&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;portal&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;crypto&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;lifetime&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;86400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;enable&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;identity&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authorization&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;policy&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;limited-group&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;auth&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/caddy-security/oauth2/pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;allow&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;roles&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;			&lt;span class=&#34;k&#34;&gt;inject&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;claims&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Snippet would look something like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;(limited-group) {
	@auth {
		path /caddy-security/*
	}
	route @auth {
		authenticate with pocket-id
	}
	route /* {
		authorize with limited-group
	}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;bypassing-auth&#34;&gt;Bypassing Auth
&lt;/h4&gt;&lt;p&gt;For some apps/services that have, for example, an API, you may not want to protect that aspect.  A great example is HealthChecks.  Protecting the &lt;code&gt;/ping&lt;/code&gt; endpoint would mean clients wouldn&amp;rsquo;t be able to just curl the URL, which would basically break the entire point of the app.  So I added a custom authorization policy for Healthchecks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;authorization&lt;/span&gt; &lt;span class=&#34;gh&#34;&gt;policy&lt;/span&gt; &lt;span class=&#34;gh&#34;&gt;hc-pocket-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;auth&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/caddy-security/oauth2/pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;allow&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;roles&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;inject&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;claims&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;bypass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;uri&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;prefix&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/ping/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;bypass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;uri&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;prefix&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/api/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;bypass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;uri&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;prefix&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/badge/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then a custom snippet (or just included in the actual URL I&amp;rsquo;m setting up) like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;(hc-auth)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/caddy-security/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authenticate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authorize&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;hc-pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;healthckecks.example.com&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; hc-auth
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;reverse_proxy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-caddyfile&#34; data-lang=&#34;caddyfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;healthckecks.example.com&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/caddy-security/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;@auth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authenticate&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;route&lt;/span&gt; &lt;span class=&#34;nd&#34;&gt;/*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;k&#34;&gt;authorize&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;hc-pocket-id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;reverse_proxy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;further-reading&#34;&gt;Further Reading
&lt;/h3&gt;&lt;p&gt;If you want some further reading, I found the following threads/posts incredibly helpful in figuring all this out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/greenpau/caddy-security/issues/378&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/greenpau/caddy-security/issues/378&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pocket-id/pocket-id/discussions/252&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/pocket-id/pocket-id/discussions/252&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/selfhosted/comments/1jdq5xn/caddy_security_pocket_id_multiple_oidc_clients_my/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.reddit.com/r/selfhosted/comments/1jdq5xn/caddy_security_pocket_id_multiple_oidc_clients_my/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/sPUkAm7yDlU&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

</description>
        </item>
        <item>
        <title>The Amazing Arc Pro A40 and Problems with Coral TPU Passthrough</title>
        <link>https://blog.fuzzymistborn.com/intel-arc-pro/</link>
        <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/intel-arc-pro/</guid>
        <description>&lt;p&gt;Thanks to a  fun garage sale by a certain IronicBadger, I picked up an &lt;a class=&#34;link&#34; href=&#34;https://www.intel.com/content/www/us/en/products/docs/discrete-gpus/arc/workstations/a-series/a40.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Intel Arc Pro A40&lt;/a&gt; graphics card for a very reasonable price and decided to put it to use for transcoding.  This post is going to be documenting some of my failures/issues in the dream of a single VM to house all my transcoding apps (Jellyfin, Handbrake, and Frigate).&lt;/p&gt;
&lt;p&gt;I wrote this post for 2 reasons.  First, I wanted to document my failures for the USB Coral TPU passthrough in case someone searching for answers comes across my efforts and learns it&amp;rsquo;s not going to happen.  And second, my experiences so far with the Arc Pro A40 as I&amp;rsquo;ve been moving my infrastructure around.&lt;/p&gt;
&lt;p&gt;TLDR: you can&amp;rsquo;t pass through a Coral TPU USB device to VM for Frigate, but it was kinda fun trying.&lt;/p&gt;
&lt;p&gt;Second TLDR: the Arc Pro is a flipping BEAST for transcoding.&lt;/p&gt;
&lt;h1 id=&#34;transcoding-setup&#34;&gt;Transcoding Setup
&lt;/h1&gt;&lt;p&gt;We&amp;rsquo;ll start with my first attempt to house everything in an LXC.  I know there are security concerns/issues with running Docker containers inside an LXC and the Proxmox devs do not support/condone it.  But&amp;hellip;it works for me and it&amp;rsquo;s incredibly lightweight so&amp;hellip;I do it anyway.  However, I ran into an issue that I couldn&amp;rsquo;t get around.  Namely that was passing through the correct graphics card to the LXC as I have both an iGPU from my i5-10400 and the Arc Pro.  Annoyingly in my past experience the two would flip back and forth between &lt;code&gt;/dev/dri/renderD128&lt;/code&gt; and &lt;code&gt;/dev/dri/renderD129&lt;/code&gt;.  Therefore I couldn&amp;rsquo;t reliably ensure that the Arc Pro was the card available in the LXC, which kind of defeated the entire purpose of the setup.  I only wanted to pass the one through so that way when I configured the services I knew I had the Arc Pro available and not the iGPU.&lt;/p&gt;
&lt;p&gt;So after a few days spent toying with udev rules, I abandoned the LXC approach and went for a full VM.  Much simpler to handle passing only the Arc Pro through and the trade off of the higher resource requirements was worth it for a guarantee of always having the Arc Pro available.  All my issues solved right?  Wrong.&lt;/p&gt;
&lt;h1 id=&#34;coral-tpu-over-usb&#34;&gt;Coral TPU over USB
&lt;/h1&gt;&lt;p&gt;As I mentioned above, I wanted to also run Frigate in the VM and use the Arc Pro to handle all the transcoding of my camera streams.  I use a Coral TPU over USB, which has worked extremely well as an efficient solution for person/car detection in Frigate.  I figured it wouldn&amp;rsquo;t be hard to pass through the USB device to the VM.  How wrong I was.&lt;/p&gt;
&lt;p&gt;I quickly learned how much of a special snowflake the Coral TPU USB is.  When you first plug it in, it shows up as&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Bus 002 Device 002: ID 1a6e:089a Global Unichip Corp.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, after it&amp;rsquo;s used/initialized, it changes it&amp;rsquo;s device ID (!!!!!!) to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Bus 002 Device 003: ID 18d1:9302 Google Inc.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What.  The.  Hell.&lt;/p&gt;
&lt;p&gt;You can read more about it in this &lt;a class=&#34;link&#34; href=&#34;https://github.com/google-coral/edgetpu/issues/536&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;long GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because it changed IDs (and I think I tried passing both through to the VM and it didn&amp;rsquo;t work), I needed a way initialize the Coral on the host then pass through the &amp;ldquo;right&amp;rdquo; device ID to the VM.  So along with my AI pal Claude, we came up with this solution:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Created a Docker container that contains the necessary bits to intialize the device: &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/docker-coral-usb/?tab=readme-ov-file&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/FuzzyMistborn/docker-coral-usb/?tab=readme-ov-file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Made a bash script that would run the Docker container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm --device /dev/bus/usb ghcr.io/fuzzymistborn/docker-coral-usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Create a udev rule to run the bash script when the Coral is plugged in:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION==&amp;#34;add&amp;#34;, SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTRS{idVendor}==&amp;#34;1a6e&amp;#34;, ATTRS{idProduct}==&amp;#34;089a&amp;#34;, RUN+=&amp;#34;/home/fuzzy/usb-docker-trigger.sh&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Create a systemd service to also call the bash script on boot:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=USB TPU Initialize Docker on Boot
After=docker.service
Wants=docker.service

[Service]
Type=oneshot
ExecStart=/home/{{main_username}}/usb-docker.sh
User={{main_username}}
RemainAfterExit=yes
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Profit?&lt;/p&gt;
&lt;p&gt;That all worked.  I could see the Coral TPU in the VM as the &lt;code&gt;Google Inc.&lt;/code&gt; whenever I would reboot the server or plug/unplug.  Problems solved right?&lt;/p&gt;
&lt;p&gt;Wrong.&lt;/p&gt;
&lt;p&gt;I noticed very quickly that my Frigate logs were filled with this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;frigate.watchdog               INFO    : Detection appears to be stuck. Restarting detection process...
root                           INFO    : Waiting for detection process to exit gracefully...
root                           INFO    : Detection process didn&amp;#39;t exit. Force killing...
root                           INFO    : Detection process has exited...
detector.coral                 INFO    : Starting detection process: 34258
frigate.detectors.plugins.edgetpu_tfl INFO    : Attempting to load TPU as usb
frigate.detectors.plugins.edgetpu_tfl INFO    : TPU found
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I found a number of threads like &lt;a class=&#34;link&#34; href=&#34;https://github.com/blakeblackshear/frigate/discussions/16977&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://github.com/blakeblackshear/frigate/discussions/16649&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt;of people with the issue.  I tried all the solutions: a powered USB hub, a shorter cable, etc.  None of that worked.  I thought about getting the Dual PCIe TPU instead, but that was quickly going to add up in costs, partly thanks to tariffs and also partly just because they&amp;rsquo;re hard to find as I believe Google has stopped production.&lt;/p&gt;
&lt;p&gt;For now, I&amp;rsquo;ve reverted to having Frigate run on the host in Docker with the TPU USB passed through, and that works fine.  I&amp;rsquo;ve been playing with &lt;code&gt;OpenVINO&lt;/code&gt; on the Arc Pro in the VM and it consumes a lot more power in comparison to the USB Coral.  So I think until the USB Coral dies, I&amp;rsquo;m going to stick with my current setup as the power draw is well worth it.  Plus I have the detection settings dialed in nicely for the TPU and I would have to play a bit more with OpenVino to get it &amp;ldquo;right.&amp;rdquo;&lt;/p&gt;
&lt;h1 id=&#34;arc-pro-transcoding-performance&#34;&gt;Arc Pro Transcoding Performance
&lt;/h1&gt;&lt;p&gt;It&amp;rsquo;s. A. Monster.&lt;/p&gt;
&lt;p&gt;As mentioned above, I have an i5-10400 in my server, which has a UHD Graphics 630 iGPU.  Per the very handy &lt;a class=&#34;link&#34; href=&#34;https://en.m.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wikipedia page on Intel Quick Sync&lt;/a&gt;, the 630 can handle HEVC and even HEVC-10bit.  It cannot handle AV1, which the Arc Pro can.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t really pushed the Arc Pro long term yet, but with some quick performance tests in Jellyfin, I found the Arc Pro was about twice as fast transcoding 4k files than the iGPU.  Granted, we&amp;rsquo;re talking ~60 FPS on the iGPU so it wasn&amp;rsquo;t BAD, but I&amp;rsquo;m never going to have transcoding issues/stutters with the Arc Pro.&lt;/p&gt;
&lt;p&gt;The addition of AV1 also is potentially interesting, though I noticed the speed is more like 25% faster on the Arc Pro than the iGPU (50fps on the iGPU, 75fps on the Arc Pro).  What&amp;rsquo;s more interesting is that when I used Handbrake to reencode some files, the resulting files were noticeable &lt;em&gt;smaller&lt;/em&gt; from the Arc Pro.  For example:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;Device&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Starting Size&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Ending Size&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;iGPU&lt;/td&gt;
          &lt;td&gt;8.7 GB&lt;/td&gt;
          &lt;td&gt;3.9 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Arc Pro&lt;/td&gt;
          &lt;td&gt;8.7 GB&lt;/td&gt;
          &lt;td&gt;2.7 GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In terms of power draw, I&amp;rsquo;m relatively pleased.  My first experience with an Arc card, the A380, &lt;a class=&#34;link&#34; href=&#34;https://techhub.social/@FuzzyMistborn/111592531655107031&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the power draw was terrible&lt;/a&gt;.  I think there have been some improvements to the Linux kernel and also more time to figure out that you need to enable ASPM in the BIOS.  Thankfully my motherboard supported ASPM so I was able to get the draw down to around 10watts idle.&lt;/p&gt;
&lt;p&gt;I think long term the Arc Pro is going to have a happy life in my home lab.  One day it&amp;rsquo;ll probably take over image processing for the Coral TPU while also handling all my transcoding needs.  And who knows what else some clever developer will come up with that can take advantage of the Arc card.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to Send an Snapshot of a Traffic Map to Your Phone</title>
        <link>https://blog.fuzzymistborn.com/traffic-map/</link>
        <pubDate>Sat, 25 Jan 2025 00:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/traffic-map/</guid>
        <description>&lt;p&gt;One of my absolute favorite automations I have set up is the one that sends me a notification on workdays with an image displaying a Google Map with the traffic layer turned on.  Thankfully I have several ways I can get from home to the office, but the main way along the interstate backs up very quickly if there&amp;rsquo;s an accident or other issue.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using Google Maps for a while, but this solution should work for any traffic map you can find that allows you to set the lat/long/zoom by URL.  I also just started playing around with using the &lt;a class=&#34;link&#34; href=&#34;https://www.waze.com/live-map/directions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Waze map&lt;/a&gt; to send myself a screen shot of the possible routes home.  And the other benefit is I can use CATT in the morning to cast the map to the Google Home Hub that sits in my kitchen so I can see my commute as I&amp;rsquo;m eating breakfast and making my lunch.&lt;/p&gt;
&lt;p&gt;Under the hood this relies on &lt;a class=&#34;link&#34; href=&#34;https://www.selenium.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Selenium&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/cobrateam/splinter/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Splinter&lt;/a&gt;, which is a Python app that has a relatively straightforward API to interact with Selenium.&lt;/p&gt;
&lt;h2 id=&#34;install-splinter&#34;&gt;Install Splinter
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;ll want to install Splinter in a Python virtual environment,  particularly if you&amp;rsquo;re running recent versions of Ubuntu or Debian.  &lt;code&gt;pipx&lt;/code&gt; won&amp;rsquo;t work.  You can read more about virtual environments &lt;a class=&#34;link&#34; href=&#34;https://docs.python.org/3/library/venv.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;, but essentially it&amp;rsquo;s like a mini virtual machine but just for python, allowing it to be isolated from the system&amp;rsquo;s python packages.&lt;/p&gt;
&lt;p&gt;I set my &lt;code&gt;venv&lt;/code&gt; up in &lt;code&gt;.venv&lt;/code&gt;, so the command to create it for me was:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python3 -m venv .venv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can use whatever directory/path you want though.  Once that&amp;rsquo;s done, you need to activate the virtual environment with this (adjust the &lt;code&gt;.venv&lt;/code&gt; part at the beginning depending on the path you selected above):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the virtual environment is activated, run this command to install Splinter:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip3 install splinter&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;selenium&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This also will install the needed &lt;a class=&#34;link&#34; href=&#34;https://pypi.org/project/selenium/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;driver/bindings for Selenium&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;install-selenium&#34;&gt;Install Selenium
&lt;/h2&gt;&lt;p&gt;For running Selenium, I found the available docker container to be easiest.  I&amp;rsquo;m a fan of Firefox, so I chose the Firefox version but you could probably do this with Edge or Chrome as well.  Here&amp;rsquo;s my docker-compose snippet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selenium&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;selenium/standalone-firefox:133.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;selenium&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;4444&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4444&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;SE_NODE_MAX_SESSIONS=2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=SET_YOUR_TIMEZONE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;shm_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;2g&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll want to update the tag to be whatever version you want.  I&amp;rsquo;d recommend running the latest version (you can read more how I handle updates to my infrastructure &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/using-renovatebot/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;), but not the &lt;code&gt;latest&lt;/code&gt; tag.  Also set the timezone as that will be helpful if you also want the Waze directions option discussed below.&lt;/p&gt;
&lt;p&gt;I did notice a bit of a memory leak with Selenium, so I scheduled a daily reboot at 4:30am via cron with the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;30 4 * * * docker container restart selenium &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;google-maps-setup&#34;&gt;Google Maps Setup
&lt;/h2&gt;&lt;p&gt;You can skip this part if you don&amp;rsquo;t want to use Google Maps.  I understand the want/desire to deGoogle, but I still find Google Maps to be unparalleled, particularly for traffic data.  Since the only thing Google is getting is the location of the map I want to generate, I think the trade off is worth it, but again, entirely up to you.&lt;/p&gt;
&lt;p&gt;The first thing you&amp;rsquo;ll need is a Google Maps API key.  You can follow the instructions &lt;a class=&#34;link&#34; href=&#34;https://github.com/googlemaps/google-maps-services-python#api-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  We&amp;rsquo;ll be using the &lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/maps/documentation/javascript/overview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Maps JavaScript API&lt;/a&gt;.  You &lt;strong&gt;do&lt;/strong&gt; need to provide credit card information to access it, but there is a free tier that you should be able to stay well under.  Google is making &lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/maps/billing-and-pricing/faq&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;changes to their API pricing&lt;/a&gt;, but from what I can gather, I don&amp;rsquo;t think the changes impact the Maps JavaScript API.  You only get charged an API hit when you load the map, so based on the cronjob I have detailed later, I only use ~1,000 API requests a month.  I&amp;rsquo;m sure I could streamline that down further if needed.  If you&amp;rsquo;re worried about being charged, you can &lt;a class=&#34;link&#34; href=&#34;https://developers.google.com/maps/documentation/distance-matrix/usage-and-billing#set-caps&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;set quota limits&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that you have the API key, you&amp;rsquo;ll need to have a way to display the map.  Below is some HTML that will render the map in a browser.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;initial-scale=1.0, user-scalable=no&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Traffic Layer&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;c&#34;&gt;/* Always set the map height explicitly to define the size of the div  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;      * element that contains the map. */&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;c&#34;&gt;/* Optional: Makes the sample page fill the window. */&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;map&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;initMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;google&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;maps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;map&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;zoom&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;YOUR_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;YOUR_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lng&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;YOUR_VALUE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;disableDefaultUI&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;trafficLayer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;google&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;maps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;TrafficLayer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nx&#34;&gt;trafficLayer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;initMap&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;initMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;defer&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://maps.googleapis.com/maps/api/js?key=INSERT_YOUR_API_KEY_HERE&amp;amp;callback=initMap&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You will need to insert your API key towards the bottom (replace &lt;code&gt;INSERT_YOUR_API_KEY_HERE&lt;/code&gt;).  You&amp;rsquo;ll also need to set the desired latitude and longitude, as well as the zoom level (replace &lt;code&gt;YOUR_VALUE&lt;/code&gt;, from my experience something like 10-13 gets you into the ballpark you probably want).  Save it as an html file, like &lt;code&gt;traffic.html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To view the page there are a few options.  The option I used for a long time was to copy the HTML file into the &lt;code&gt;www&lt;/code&gt; directory in HomeAssistant and accessed it via &lt;code&gt;http://YOUR_HA_INSTANCE_IP:PORT/local/traffic.html&lt;/code&gt;.  However, if your HA instance is publicly accessible, so is your map.  Which isn&amp;rsquo;t ideal, because 1) bots could abuse it and rack up a bill if you didn&amp;rsquo;t set a limit and 2) well&amp;hellip;it&amp;rsquo;s public so anyone could see roughly where you live if you set the view around your house.  The other option is to use a reverse proxy, like Caddy, nginx, or Apache (I &lt;em&gt;think&lt;/em&gt; Traefik can handle static files but I&amp;rsquo;m not 100% sure).  Here is an example of my Caddy file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;traffic.example.com&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;err&#34;&gt;file_server&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;err&#34;&gt;root&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/home/fuzzy/web&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;err&#34;&gt;tls&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/home/fuzzy/lego/certificates/_.example.com.crt&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/home/fuzzy/lego/certificates/_.example.com.key&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that the TLS/HTTPS part is optional.  I&amp;rsquo;ve used AdGuardHome to rewrite URL queries to a custom domain pointed at my Caddy instance.  So HomeAssistant and other things on my network can access it, but it&amp;rsquo;s inaccessible outside my LAN.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll end up with a screen shot that looks like this:
&lt;img src=&#34;https://blog.fuzzymistborn.com/traffic-map/google_map.png&#34;
	width=&#34;1280&#34;
	height=&#34;782&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/traffic-map/google_map_hu_b3b9245edafd0889.png 480w, https://blog.fuzzymistborn.com/traffic-map/google_map_hu_952321822bd599a6.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Google Maps&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;163&#34;
		data-flex-basis=&#34;392px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;waze-setup&#34;&gt;Waze Setup
&lt;/h2&gt;&lt;p&gt;If all the above seems way too complicated to you (API keys, html pages, reverse proxies oh my!), there&amp;rsquo;s another simpler option.  Waze offers a &lt;a class=&#34;link&#34; href=&#34;https://www.waze.com/live-map&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;live map&lt;/a&gt; that shows real time traffic info (yes I know Google owns Waze, but I haven&amp;rsquo;t found another traffic map with programmable URLs, let me know in the comments if you know one).  The URL is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://embed.waze.com/iframe?zoom=YOUR_VALUE&amp;amp;lat=YOUR_VALUE&amp;amp;lon=YOUR_VALUE&amp;amp;ct=livemap&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://embed.waze.com/iframe?zoom=YOUR_VALUE&amp;lat=YOUR_VALUE&amp;lon=YOUR_VALUE&amp;ct=livemap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just like with the Google map, play around with the zoom level (from my experience something like 10-13 gets you into the ballpark you probably want) and location latitude/longitude.  This is the result:
&lt;img src=&#34;https://blog.fuzzymistborn.com/traffic-map/waze_live_map.png&#34;
	width=&#34;1280&#34;
	height=&#34;782&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/traffic-map/waze_live_map_hu_4ed6bcf5bdde2e2b.png 480w, https://blog.fuzzymistborn.com/traffic-map/waze_live_map_hu_134bfa43d00dbbb9.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Waze Live Map&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;163&#34;
		data-flex-basis=&#34;392px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, you can use the Driving Directions map to generate a map.  The URL looks something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.waze.com/live-map/directions/the-metropolitan-museum-of-art-5th-ave-1000-manhattan?utm_campaign=iframe_search&amp;amp;utm_medium=fullscreen_map&amp;amp;utm_source=direct_link&amp;amp;to=place.w.187433368.1874595822.373029&amp;amp;from=place.w.187433367.1874399211.868693&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.waze.com/live-map/directions/the-metropolitan-museum-of-art-5th-ave-1000-manhattan?utm_campaign=iframe_search&amp;utm_medium=fullscreen_map&amp;utm_source=direct_link&amp;to=place.w.187433368.1874595822.373029&amp;from=place.w.187433367.1874399211.868693&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And the result is this:
&lt;img src=&#34;https://blog.fuzzymistborn.com/traffic-map/waze_directions.png&#34;
	width=&#34;1280&#34;
	height=&#34;782&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/traffic-map/waze_directions_hu_e5440dedbc671d38.png 480w, https://blog.fuzzymistborn.com/traffic-map/waze_directions_hu_907495443b0bd9df.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Waze Directions&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;163&#34;
		data-flex-basis=&#34;392px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;putting-it-all-together&#34;&gt;Putting it All Together
&lt;/h2&gt;&lt;p&gt;Now that we have all the pieces, time to actually get it to work in HomeAssistant!  The first thing you&amp;rsquo;ll need is a Python script to take the snapshot.  Here&amp;rsquo;s an example for the Google Map option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;splinter&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;driver_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;remote&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;command_executor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://SELENIUM_IP_ADDRESS:4444/wd/hub&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;firefox&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;wait_time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://traffic.example.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Solution to fix &amp;#34;wait&amp;#34; which is broken  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;find_by_css&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;screenshot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/fuzzy/hass/tmp/commute&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;full&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unique_file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the Waze LiveMap option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;splinter&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;driver_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;remote&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;command_executor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://SELENIUM_IP_ADDRESS:4444/wd/hub&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;firefox&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;wait_time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;YOUR_WAZE_URL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Hack to wait for JavaScript to fully load&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;screenshot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/fuzzy/hass/tmp/waze&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;full&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unique_file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And finally, the Waze Directions option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;splinter&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;driver_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;remote&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;command_executor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://SELENIUM_IP_ADDRESS:4444/wd/hub&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;firefox&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;wait_time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;YOUR_WAZE_URL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Solution to fix &amp;#34;wait&amp;#34; which is broken  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_text_present&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Arrive&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;find_by_xpath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/html/body/div[1]/div[2]/button&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;screenshot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/fuzzy/hass/tmp/waze&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;full&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unique_file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;quit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;FYI the &lt;code&gt;xpath&lt;/code&gt; bit clears out the Waze banner at the bottom about installing the Android/iOS app.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll want to adjust the visit URL as well as the Selenium IP address and screenshot save path.  Note you do not need to put a file extension for the screenshot path.  In my example, it will save the screenshot as &lt;code&gt;/home/fuzzy/hass/tmp/commute.png&lt;/code&gt; or &lt;code&gt;waze.png&lt;/code&gt;.  I&amp;rsquo;d suggest putting it in a subdirectory in your HomeAssistant folder to make the next part easier.  Make the .py file executable: &lt;code&gt;chmod +x YOURFILE.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To take the screenshot, I use two cronjobs.  The first handles snapshots during commute times, the second during times surrounding commute time&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;*/10 7-8,16-18 * * 1-5 .venv/bin/python3 /home/fuzzy/scripts/traffic.py
*/30 9-15 * * 1-5 .venv/bin/python3 /home/fuzzy/scripts/traffic.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;rsquo;ll need to update &lt;code&gt;.venv/bin/python3&lt;/code&gt; to be whatever path you set up your venv in above.  Basically the first cronjob updates every 10 minutes between 7 and 8am and 4 and 6pm Monday through Friday, and the second runs every 30 minutes between 9am and 3pm Monday through Friday.  IE it updates more frequently during the times I&amp;rsquo;m most likely to commute, and less often during the workday in case I leave a bit later or earlier.  And then it doesn&amp;rsquo;t run any other time.  This is how I greatly limit the number of API calls.  You can use &lt;a class=&#34;link&#34; href=&#34;https://crontab.guru&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://crontab.guru&lt;/a&gt; to come up with your own setup.&lt;/p&gt;
&lt;h2 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h2&gt;&lt;p&gt;After all that work, you finally should have a snapshot of whatever map you chose saved in a directory HomeAssistant can access.  You can then use this to send a notification to your phone as desired.  I also add a little spice by adding the following text beneath the image:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here is your current commute.  The fastest route takes approximately XY minutes via I-95.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can get the &amp;ldquo;via&amp;rdquo; part if you use the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/waze_travel_time/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Waze Travel Time integration&lt;/a&gt; though I&amp;rsquo;ve found it to be slow to update.  Here&amp;rsquo;s an example of how it looks in Signal:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/traffic-map/notification.png&#34;
	width=&#34;358&#34;
	height=&#34;298&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/traffic-map/notification_hu_4c647153f9c8a428.png 480w, https://blog.fuzzymistborn.com/traffic-map/notification_hu_5fcc24256ea4dc4.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Signal Notification&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;120&#34;
		data-flex-basis=&#34;288px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Again, over the years I&amp;rsquo;ve found this to be invaluable for knowing both how long my commute is going to take and if there&amp;rsquo;s going to be traffic and I need to find a different way home.  I hope you find it useful as well!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>2024 Homelab Remodel</title>
        <link>https://blog.fuzzymistborn.com/homelab-remodel/</link>
        <pubDate>Tue, 11 Jun 2024 23:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/homelab-remodel/</guid>
        <description>&lt;p&gt;I recently finished some homelab renovations, both in hardware and in software, that I think are pretty neat.  This post will be a quick summary of some of the bigger changes.&lt;/p&gt;
&lt;h2 id=&#34;no-more-drone&#34;&gt;No More Drone
&lt;/h2&gt;&lt;p&gt;Continuing on &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/drone-love-hate/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;my love/hate relationship with Drone&lt;/a&gt;, I finally hit an overwhelming sense of hate, so that&amp;rsquo;s where I&amp;quot;m going to start.  Part of the reason why it&amp;rsquo;s been a while between posts (Ok ok, I&amp;rsquo;ve also just been super busy) is that my automated build setup for deploying this blog to my VPS has been annoyingly broken due to &lt;a class=&#34;link&#34; href=&#34;https://github.com/drone-plugins/drone-hugo/issues/38&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this issue.&lt;/a&gt;  And over a year later there&amp;rsquo;s been no resolution (and no other commits to the repo/image).  Now granted, as I&amp;rsquo;ve now discovered, I could use just any Docker image with Hugo I wanted to generate the blog, but I think this issue underscores an issue I&amp;rsquo;ve had with Drone, namely that there hasn&amp;rsquo;t been anything new or added in the almost 3 years I&amp;rsquo;ve run it.&lt;/p&gt;
&lt;p&gt;The positive way to look at that is that there hasn&amp;rsquo;t been anything that&amp;rsquo;s particularly broken about Drone in that time.  But I think it&amp;rsquo;s representative of a larger issue, namely that they no longer support the open source version.  There&amp;rsquo;s also this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homelab-remodel/Drone_Limit_1.png&#34;
	width=&#34;1599&#34;
	height=&#34;557&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homelab-remodel/Drone_Limit_1_hu_dc85a67ca1b96f1.png 480w, https://blog.fuzzymistborn.com/homelab-remodel/Drone_Limit_1_hu_85a368c14a2d338e.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Drone Limits&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;287&#34;
		data-flex-basis=&#34;688px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Whenever I logged into Drone, this banner was stuck on the bottom.  No way to hide or remove.  And more annoyingly, IT BLOCKS PEOPLE FROM SEEING THINGS IN THE UI!  Plus, I&amp;rsquo;m self-hosting Drone, which should be free (and as best I could tell, there was no limit on what I could do, beyond the banner).  So while not itself a dealbreaker, I was reminded every time I logged in that Drone is basically dead for self hosters.&lt;/p&gt;
&lt;p&gt;So I decided to take another look at Woodpecker CI.  And wow things have improved over the past few years.  I was able to move all my repos over to Woodpecker over the course of 2 nights, largely helped by this &lt;a class=&#34;link&#34; href=&#34;https://codeberg.org/lafriks/woodpecker-pipeline-transform&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;helpful plugin to convert Drone pipelines to Woodpecker&lt;/a&gt;.  I was able to take the converted files and with a little trial and error (plus some tweaking because things had broken over the past few years) I was able to fully convert off Drone.  Honestly the part I struggled with the most was getting the agent/runner on my local server to connect to the Woodpecker server running on my VPS.  But in the end, I&amp;rsquo;m happy with the change and to be running an actively developed project.  So if you&amp;rsquo;re running Drone still, I&amp;rsquo;d highly suggest checking out Woodpecker.&lt;/p&gt;
&lt;p&gt;Now why not GItea Runner you may be asking?  I looked hard at it, but what ultimately held me up were 2 things.  First, my VPS lacks a lot of horsepower (on purpose) so I&amp;rsquo;d prefer the build agents to be on my local server.  While I understand I can run the Gitea runner/agent locally I tried it and it didn&amp;rsquo;t seem to be the easiest thing to run.  More importantly, I would have had to move all my development over to Gitea instead of Github.  I wasn&amp;rsquo;t keen on the idea, largely because I view my Gitea instance as a testbench and as a backup/mirror of my work.  Not the primary source.  So it would have been a fundamental change in my setup that I&amp;rsquo;m not quite ready to take.  Not knocking Gitea at all here, it&amp;rsquo;s just not what I&amp;rsquo;m after right now.&lt;/p&gt;
&lt;h2 id=&#34;goodbye-synology&#34;&gt;Goodbye Synology
&lt;/h2&gt;&lt;p&gt;In hardware upgrades, I realized that my Synology NAS was&amp;hellip;well&amp;hellip;.old.  It&amp;rsquo;s a DSM 713+, meaning it&amp;rsquo;s from 2013.  The Linux kernel on the thing was 3.10, I&amp;rsquo;m pretty sure it wasn&amp;rsquo;t getting updates anymore&amp;hellip;.it was time.  I recently sunset my BlueIris box in favor of going all in on Frigate (which has been amazing and it looks like the next release in 0.14 is going to make some major UI improvements I&amp;rsquo;m eagerly awaiting), so I realized I had a spare i5-10400 lying around doing nothing.  I decided to use this as the basis for a new NAS box.  And I decided I wanted to make it rack-mounted.  I ultimately landed on this &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/gp/product/B0CH3JXKZF/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RackChoice 2U server chassis.&lt;/a&gt;  Overall, I&amp;rsquo;m going to say I&amp;rsquo;m impressed with it.  The build was a little tight in some spots and cable management was&amp;hellip;.well&amp;hellip;basically non-existent.  I largely just tried to make sure the airflow wasn&amp;rsquo;t too obstructed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-1.png&#34;
	width=&#34;943&#34;
	height=&#34;1253&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-1_hu_dac787e674092095.png 480w, https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-1_hu_eaabd739a48bd230.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Rack Build&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I also had to deal with a dead power supply which was annoying (the BeQuiet in the above picture, swapped it for a Corsair RM750 which works just fine).  The only other hardware change I made was I swapped the 4 front mounted fans for some Noctua NF-R8&amp;rsquo;s.  The included fans were probably &lt;em&gt;fine&lt;/em&gt;, but I&amp;rsquo;ve always loved Noctua fans for their performance and silence.  And they weren&amp;rsquo;t too expensive.&lt;/p&gt;
&lt;p&gt;I also dealt with some &lt;em&gt;tight&lt;/em&gt; clearance in the back of my rack (19&amp;quot; wall mounted).  I accidentally squeezed the box&amp;rsquo;s networking cable (still works just fine but&amp;hellip;it&amp;rsquo;s on the &amp;ldquo;to replace&amp;rdquo; list).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-2.png&#34;
	width=&#34;1664&#34;
	height=&#34;1253&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-2_hu_38e58a7896ca5999.png 480w, https://blog.fuzzymistborn.com/homelab-remodel/rackmount-build-2_hu_bd84cd44e7906af.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Rack&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Software wise, I went with Proxmox and created a cluster with my other rig, so now I can move LXCs/VMs around as needed for maintenance if needed.  Plus, I have a ton more horsepower at my disposal.  I&amp;rsquo;ve got 3 disks in the 2U chassis (with room for 2 more if needed, which I probably won&amp;rsquo;t), running with MergerFS and Snapraid to create a main volume of about 12TB.  Plenty for some on-site backups/redundancies.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the crazy part though.  I swapped the Nvidia Quadro P400 from my main server rig into this new box (while adding a 3060 to the other box for AI/Immich photo processing, more on this another time).  All of that resulted in a power load that basically matched what the Synology was using.  I&amp;rsquo;m calling this a big win overall.&lt;/p&gt;
&lt;h2 id=&#34;lnxlink&#34;&gt;LNXLink
&lt;/h2&gt;&lt;p&gt;The last thing I want to mention is a very handy piece of software if you&amp;rsquo;re running Linux on your desktop and want to get data into HomeAssistant: &lt;a class=&#34;link&#34; href=&#34;https://github.com/bkbilly/lnxlink&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LNXLink&lt;/a&gt;.  If you ever used &lt;a class=&#34;link&#34; href=&#34;https://github.com/LAB02-Research/HASS.Agent&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HASS.Agent&lt;/a&gt;or &lt;a class=&#34;link&#34; href=&#34;https://iotlink.gitlab.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IOTLink&lt;/a&gt; on Windows, this is basically the Linux equivalent.  All communication is sent over MQTT, which makes it very easy to import into HomeAssistant.  Versus before I was using Telegraf to export data to Influx and then had to define all these sensors to get data back into HomeAssistant.  Extremely convoluted and not easy to manage.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve cobbled together a &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/tree/main/roles/install/lnxlink&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;somewhat basic install role via Ansible&lt;/a&gt; that also allows me to dynamically set the configuration for each computer.  And I have it running on several of my LXC&amp;rsquo;s (as well as the main Proxmox hosts) reporting data back to HomeAssistant that then gets nicely displayed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homelab-remodel/homeassistant-dash.png&#34;
	width=&#34;1455&#34;
	height=&#34;764&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/homelab-remodel/homeassistant-dash_hu_456a28075e6fc941.png 480w, https://blog.fuzzymistborn.com/homelab-remodel/homeassistant-dash_hu_419e89aa1477fdcc.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;HA Dash&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;190&#34;
		data-flex-basis=&#34;457px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;On top of my Telegraf-Influx-HomeAssistant setup, I was running an app called &lt;a class=&#34;link&#34; href=&#34;https://github.com/adnanh/webhook/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Webhook&lt;/a&gt; that allowed me to execute scripts/commands on some of my hosts.  Things like rebooting the computer, running a bash script to display traffic information for my commute, starting/stopping a VM, etc.  LNXLink has a Bash module that lets you define commands that can be executed with a push of a button.  &lt;strong&gt;Obviously, be careful doing this since the commands can be executed via MQTT&lt;/strong&gt;.  But it removed yet another piece of software for me to keep up/manage.  And the icing on the cake is that the developer is super responsive and willing to add new features.  Really awesome piece of software.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve made a few other changes in my digital life over the past few weeks (moved off Arch to Fedora, got a new Framework laptop, started messing with AI/Immich) which maybe I&amp;rsquo;ll cover in more detail later.  But for now those are the big things that have sucked up my time lately in my #HomeLab.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Bye Bye Minio, Hello Restic Rest Server!</title>
        <link>https://blog.fuzzymistborn.com/restic-server-over-minio/</link>
        <pubDate>Thu, 06 Jul 2023 11:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/restic-server-over-minio/</guid>
        <description>&lt;p&gt;Previously, I wrote about &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/backup-restic-minio/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Minio&lt;/a&gt;, an S3 compatible object storage solution, as the backend for backing up my data locally using Restic.  And largely it worked great.  I never had an issue where data wouldn&amp;rsquo;t be sent or anything along those lines (which ultimately is what matters here).  But I had many, many issues when it came time to update.&lt;/p&gt;
&lt;h2 id=&#34;minio-issues&#34;&gt;Minio Issues
&lt;/h2&gt;&lt;p&gt;Admittedly, I was very infrequent with my updates (anywhere from 6 months to a year).  Largely that was because I&amp;rsquo;d forget I was running Minio as it 1) just kept working and 2) since I rarely log into my Synology box I&amp;rsquo;d forget about updates.  Plus, since I don&amp;rsquo;t keep my Synology docker-compose file in my infra repo, I don&amp;rsquo;t get automatic update notifications like I do with Rennovatebot.  This definitely is largely a &amp;ldquo;me&amp;rdquo; problem, but let&amp;rsquo;s talk about the updates themselves.&lt;/p&gt;
&lt;p&gt;Whenever I would update, I&amp;rsquo;d usually run into  a massive breaking change that would take hours (sometimes over multiple days) to resolve.  And this last time the breaking change was a doozey.  As best I understand it, they &lt;a class=&#34;link&#34; href=&#34;https://min.io/docs/minio/container/operations/install-deploy-manage/migrate-fs-gateway.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deprecated the underlying filesystem&lt;/a&gt; used by default with the Docker container sometime in 2020.  And as of a release in October 2022, the code was removed.  That&amp;rsquo;s fine, I usually don&amp;rsquo;t have an issue with deprecations.  However, what was absolutely maddening about this change is that there was no automated migration for users, and in fact, the ONLY way to update is to spin up a new instance of Minio and &lt;strong&gt;COPY ALL THE DATA&lt;/strong&gt; over with various commands (and basically going over HTTP).  You can&amp;rsquo;t just spin up a new instance and point it at the older folder structure/data.&lt;/p&gt;
&lt;p&gt;I also ran into a number of other issues trying to follow the documentation, namely the &lt;code&gt;mc&lt;/code&gt; binary isn&amp;rsquo;t included in the Minio server docker container, so I had to find a way to install the binary.  Then there were some version incompatibilities I had to deal with.  And then the final nail in the coffin was when I ran the &lt;code&gt;mc mirror&lt;/code&gt; command.  A number of errors popped up that gave me serious concerns as to whether the data was being transferred over.  That left me with 2 options: 1) spin up a new Minio instance and forget all the data, and maybe find myself in another upgrade hell situation in another year or 2) still forget about the data but find a new solution.  I chose #2 because fool me once, shame on me.  Fool me twice, I ain&amp;rsquo;t gonna let it get to thrice.&lt;/p&gt;
&lt;h2 id=&#34;minio-alternative---restic-rest-server&#34;&gt;Minio Alternative - Restic Rest Server
&lt;/h2&gt;&lt;p&gt;The solution I came across thanks to user @TheDragon on the Self-Hosted podcast Discord server is a &lt;a class=&#34;link&#34; href=&#34;https://github.com/restic/rest-server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;rest server&lt;/a&gt; created by the restic devs.  It is a very lightweight server that basically provides a way for data to be transferred over HTTP.  And while Minio wasn&amp;rsquo;t resource heavy, I didn&amp;rsquo;t really &lt;em&gt;need&lt;/em&gt; S3-compatible object storage for just backing up my data.  I just wanted an easy way to send my restic backups to a different host without having to use SSH/FTP.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s really easy to spin up.  Here&amp;rsquo;s my docker-compose:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restic-server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restic/rest-server:0.12.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restic-server&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/YOURMOUNTPOINT:/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;8000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yep, that&amp;rsquo;s it!  Once the server is up you create a user with &lt;code&gt;docker exec -it restic_server create_user myuser&lt;/code&gt; and pick a password.  It was also pretty easy to migrate my Autorestic configs as the Rest server is a &lt;a class=&#34;link&#34; href=&#34;https://autorestic.vercel.app/backend/available#rest-server&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;supported backend&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I did toy around with the idea of running the rest server on my main proxmox host and have the folder mounted over NFS.  However, upon reflection I realized that was probably a poor idea (and in fact when I tried it the logs kept nagging me that it was a bad idea).  If there ever was a disconnect (for whatever reason) between the host and my Synology the data wouldn&amp;rsquo;t get backed up.  Or well&amp;hellip;it would but on my host which isn&amp;rsquo;t what I want.  So instead I set up the rest server on my Synology.  To get update notifications I&amp;rsquo;m tracking the Github releases page and also left the docker-compose snippet in my Proxmox host&amp;rsquo;s config (without running it) so that way Rennovatebot will also find the changes.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts
&lt;/h2&gt;&lt;p&gt;Some other fun things for those who might be interested is that you can run the rest server in &amp;ldquo;append only&amp;rdquo; mode which prevents deletion/modification of existing backups.  Handy if you want to prevent any kind of ransomware infecting your backups.  Also, there&amp;rsquo;s a way to export Prometheus/Grafana data for you data nerds out there.&lt;/p&gt;
&lt;p&gt;And in terms of my old data, I left it on my Synology for now, and if I find myself needing it in the next few months I can spin up Minio for a minute to pull the data.  And after a few months, I&amp;rsquo;ll just delete the data.&lt;/p&gt;
&lt;p&gt;So if you&amp;rsquo;re using MInio &lt;em&gt;just&lt;/em&gt; for backups, take a look at the restic rest server.  It&amp;rsquo;s much simpler to spin up, works just as well, and (hopefully) shouldn&amp;rsquo;t be nearly as much of a PITA to update!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Permanently Mounting Cameras without Damaging House</title>
        <link>https://blog.fuzzymistborn.com/mounting-cameras/</link>
        <pubDate>Tue, 07 Mar 2023 23:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/mounting-cameras/</guid>
        <description>&lt;p&gt;I still intend to do a write up on my choices for cameras at the new place, but in the meantime I wanted to do a quick bit on how I mounted cameras outside.  At my old house, I&amp;rsquo;d drilled/screwed into the siding/soffit but I don&amp;rsquo;t like how that leaves holes if/when you move.  I was keen to find a solution that was solid without leaving lasting damage.  After some searching, I found a few ideas, including siding clips and aluminum strip slotted under the eaves.  The clips looked interesting, but I was worried about how they&amp;rsquo;d hold up in the wind.  I was intrigued by the aluminum strip idea and it looked pretty simple.  Credit to &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=UjWkB0UZM1M&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this video&lt;/a&gt; for the idea.&lt;/p&gt;
&lt;p&gt;All you need is some aluminum bar, and if you really want it to blend in, some spray paint that matches your siding/soffit color.  You&amp;rsquo;ll also need a saw and a drill, and screws/washers that fit your camera mount.  For me that was #8 machine screws.&lt;/p&gt;
&lt;p&gt;Figure out where you want to mount the cameras and measure the width of the eave.  After you cut down the strip, take the camera mount and trace the mounting holes.  Don&amp;rsquo;t worry about being too close to the edge, the aluminum should hold pretty well.  Drill through the aluminum (be patient and take your time here) and check your mount.  At this point I took the strip and spray painted it white.&lt;/p&gt;
&lt;p&gt;After you&amp;rsquo;re done, it should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/mounting-cameras/finished_product.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3072&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/mounting-cameras/finished_product_hu_6d407bd28410a7c9.jpg 480w, https://blog.fuzzymistborn.com/mounting-cameras/finished_product_hu_9e06d7c36b01f131.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Finished product&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I did find that after I had screwed everything through, I needed to cut the screws down to the nut, otherwise they stuck out too far/scratched the soffit.  Nothing a hack saw can&amp;rsquo;t solve, but again take your time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/mounting-cameras/finished_product2.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3072&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/mounting-cameras/finished_product2_hu_4e34601ca98e8e84.jpg 480w, https://blog.fuzzymistborn.com/mounting-cameras/finished_product2_hu_e34161cdceac0b14.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;I hate to cut the screws down a bit&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;When it came to mounting below the eaves, it was pretty easy.  Just stick one end in and then slide the other end in on an angle.  The hard part is getting the ethernet cable through after that.  It should be prety easy from there to adjust where the camera is pointing and get the view you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount1.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3072&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount1_hu_73947fc7d861a6cf.jpg 480w, https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount1_hu_7c6bf08314029529.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Mounted under roof&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s a closer look:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount2.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3072&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount2_hu_ba46e6e22315053a.jpg 480w, https://blog.fuzzymistborn.com/mounting-cameras/exterior_mount2_hu_60c153b1f8fa5612.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Closer shot&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;So far the cameras haven&amp;rsquo;t moved or fallen at all, and it gets &lt;em&gt;windy&lt;/em&gt; around here.  Haven&amp;rsquo;t seen if they&amp;rsquo;ll stay up in a hurricane or anything like that, but 20-30 mph winds are no problem.  If you want, you could use silicone or screws but I haven&amp;rsquo;t found that necessary.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>HomeAssistant App and TinyCam - Powerful Combination!</title>
        <link>https://blog.fuzzymistborn.com/hass-notification-open-cam/</link>
        <pubDate>Sun, 19 Feb 2023 23:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/hass-notification-open-cam/</guid>
        <description>&lt;p&gt;This is going to be a quick one, but I&amp;rsquo;m unreasonably excited about it.  Lately I&amp;rsquo;ve noticed that image-based notifications haven&amp;rsquo;t been always going through via Telegram.  Lots of errors in the logs about timed out connections, which I chalk up to the fact my internet is over a 5G router.  It&amp;rsquo;s not bad, but it&amp;rsquo;s not always stable/reliable.  I started to consider alternatives like Gotify (which I already use, except not for images) or even something Matrix.  But then I decided to take a closer look at an app I already have installed, the HomeAssistant companion app!&lt;/p&gt;
&lt;p&gt;The HomeAssistant companion app is way more than just a way to access HomeAssistant.  It can provide all kinds of sensor data about your phone back to HASS and also serve as a vehicle for notifications.  Not all of which need to be an actual message!  You can do all sorts of things, like turn Bluetooth on/off, set do not disturb mode, and even trigger other apps to do things (I believe this part is Android only, I don&amp;rsquo;t use iOS so apologies to those who do).&lt;/p&gt;
&lt;p&gt;When I saw that it was possible to alter the action when you &lt;a class=&#34;link&#34; href=&#34;https://companion.home-assistant.io/docs/notifications/notifications-basic/#opening-a-url&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;click the notification&lt;/a&gt; I was intrigued.  Then I saw that you could also call an Android intent to open up another app.  And somewhere I saw the idea to open up &lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=com.alexvas.dvr.pro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TinyCam&lt;/a&gt; and I had to dig in.  I&amp;rsquo;ve been using TinyCam as a quick and easy way to access my POE cameras as I have a mix of camera brands (post coming soon, promise).  I tried the BlueIris app and it&amp;rsquo;s OK, but the UI isn&amp;rsquo;t ideal for quickly seeing a camera feed.  TinyCam on the other hand literally just shows the camera feeds on the opening page.  Doesn&amp;rsquo;t get much simpler.&lt;/p&gt;
&lt;p&gt;I had a &amp;ldquo;ah-ha&amp;rdquo; moment realizing I could use the HomeAssistant  companion app to send a notification with a snapshot of the camera feed when motion is detected, and then when I click the notification, it takes me directly to that camera&amp;rsquo;s feed in TinyCam so I can see what&amp;rsquo;s going on.  I struggled for the better part of a day to figure out the right intent (hat tip to the HASS Discord server and @dshokouhi, as well as &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/tinycam/comments/xebr7y/comment/j1563l6/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;/u/nVIceman on Reddit&lt;/a&gt;) but I got it.  So now if there&amp;rsquo;s motion at my front door, I get a notification with the doorbell image and if I click the link, the doorbell camera feed opens in TinyCam.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;notify.mobile_app_fuzzy_phone&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Motion detected at the Front Door!&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/api/camera_proxy/camera.truthwatcher_front_door&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;clickAction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;intent:#Intent;action=android.intent.action.MAIN;component=com.alexvas.dvr.pro/com.alexvas.dvr.activity.LiveViewActivity;S.com.alexvas.dvr.intent.extra.shortcut.NAME=Front Door;end&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it.  All you&amp;rsquo;d need to do is change the last bit (after &amp;ldquo;NAME=&amp;rdquo;) to match the name of the camera in TinyCam.  If you wanted instead to open the camera directly without having to click a link, you could do something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;notify.mobile_app_fuzzy_phone&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;command_activity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;intent_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;android.intent.action.MAIN&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;intent_extras&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;com.alexvas.dvr.intent.extra.shortcut.NAME:Front Door&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;intent_package_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;com.alexvas.dvr.pro&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In closing, I&amp;rsquo;d encourage everyone to take a close look at the &lt;a class=&#34;link&#34; href=&#34;https://companion.home-assistant.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HomeAsssistant companion app docs&lt;/a&gt;.  It&amp;rsquo;s really impressive what it can do!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>MyQ - Local Garage Door Control</title>
        <link>https://blog.fuzzymistborn.com/local-myq-garage-door/</link>
        <pubDate>Thu, 16 Feb 2023 11:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/local-myq-garage-door/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/local-myq-garage-door/header.jpg" alt="Featured image of post MyQ - Local Garage Door Control" /&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EDIT 11/11/2023&lt;/strong&gt;: &lt;a class=&#34;link&#34; href=&#34;https://www.theverge.com/23949612/chamberlain-myq-smart-garage-door-controller-homebridge-integrations&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chamberlain has announced&lt;/a&gt; they&amp;rsquo;ve intentionally broken all third party integrations that don&amp;rsquo;t pay them, claiming they are preventing &amp;ldquo;unauthorized access.&amp;rdquo;  As a result, HomeAssistant is going to be &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/blog/2023/11/06/removal-of-myq-integration/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;removing its MyQ integration&lt;/a&gt; in the 2023.12 release.  Since this post, I&amp;rsquo;ve become aware of &lt;a class=&#34;link&#34; href=&#34;https://github.com/PaulWieland/ratgdo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ratgdo&lt;/a&gt;, which is an ESP based project which directly integrates with the garage opener and in effect emulates being a MyQ/Security 2.0 device.  I bought one and have had it installed for about a month, and quite frankly it&amp;rsquo;s awesome.  It allows for a lot more nuanced control (such as opening the garage to a set position, and also the number of times the door has opened/closed).  Plus it just looks a lot cleaner than the below solution.  At this point I would highly recommend Ratgdo over the below solution, but the below still works if you are interested.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, when we built our new house, the options for garage door opener were: MyQ, MyQ and MyQ (aka there were no options).  MyQ is made by Chamberlain (who also makes LiftMaster products), which basically is the garage door opener market.  There are a few other brands out there, but mostly all I see these days is Chamberlain.  Why don&amp;rsquo;t I like MyQ?  Well, putting aside that it&amp;rsquo;s a cloud-dependent garage door opener, I&amp;rsquo;m not a fan of Chamberlain&amp;rsquo;s business practices.  In the past, they&amp;rsquo;ve tweaked their API with the apparent purpose of preventing third party integrations like HomeAssistant.  And also, they&amp;rsquo;ve charged for integrating MyQ with Alexa and Google Home.  Which just feels&amp;hellip;.dirty.&lt;/p&gt;
&lt;p&gt;Personally I would have preferred a &amp;ldquo;dumb&amp;rdquo; garage door opener that I could then have smart-ified as I had before with a &lt;a class=&#34;link&#34; href=&#34;https://www.zwaveproducts.com/products/z-wave-garage-door-opener-remote-controller&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zwave-based GoControl/Linear opener&lt;/a&gt;.  But I didn&amp;rsquo;t feel like ripping out a perfectly good garage door opener and replacing it to the tune of a few hundred dollars.  So alternatives had to be found.  Unfortunately, Chamberlain has implemented something they call &amp;ldquo;Security 2.0.&amp;rdquo;  As I understand it, in &amp;ldquo;ye olden days,&amp;rdquo; when you hooked up a button to a garage door and pressed the button, it basically shorted the connection and that caused the door to open or close.  Security 2.0 adds &amp;ldquo;security&amp;rdquo; by sending a rotating code to the door.  I honestly don&amp;rsquo;t know any security this actually provides, but it does mean that the &lt;em&gt;only&lt;/em&gt; devices that can work to open/close a MyQ garage door have to be made by Chamberlains (bet you didn&amp;rsquo;t see that coming&amp;hellip;.).&lt;/p&gt;
&lt;p&gt;So how to work around it?  Well thankfully some clever people figured out that you can solder some wires to a cheap Security 2.0 button and hook it up to a smart relay (and the garage door).  Then all you need to do is trigger the relay, which &amp;ldquo;presses&amp;rdquo; the button, and then boom, open garage door!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what you need:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a Security 2.0 controller.  You can use a wireless remote if you want, or a button like &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/gp/product/B07W5RMN56/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt; for $10-12 on Amazon.  Don&amp;rsquo;t feel like soldering?  You can &lt;a class=&#34;link&#34; href=&#34;https://www.garadget.com/product/security-2-0-dry-contact-adapter/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;buy one from Garadget for&lt;/a&gt; $20ish (plus shipping).&lt;/li&gt;
&lt;li&gt;some kind of smart dry contact relay.  Personally I picked up a &lt;a class=&#34;link&#34; href=&#34;https://www.thesmartesthouse.com/products/zooz-z-wave-plus-s2-multirelay-zen16-with-3-dry-contact-relays-20-a-15-a-15-a&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zooz Zen16 Multirelay&lt;/a&gt; but something like a Shelly should work too.&lt;/li&gt;
&lt;li&gt;wire (doorbell wire is fine), solder, and a solder iron&lt;/li&gt;
&lt;li&gt;Optional (and highly recommended) - some kind of tilt sensor so you can monitor whether the garage door is open or close.  I used a &lt;a class=&#34;link&#34; href=&#34;https://www.thesmartesthouse.com/products/zooz-z-wave-plus-700-series-xs-tilt-shock-sensor-zse43&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zooz XS Tilt/Shock sensor&lt;/a&gt;.  Note that Zooz sells this as a kit along with the multirelay &lt;a class=&#34;link&#34; href=&#34;https://www.thesmartesthouse.com/products/diy-smart-garage-opener-kit-zooz-multirelay-ecolink-tilt-sensor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I forgot to take a picture of where exactly to solder, but here&amp;rsquo;s a good thread from the &lt;a class=&#34;link&#34; href=&#34;https://community.hubitat.com/t/cutting-out-myq-cloud-from-garage-door-control/101531&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hubitat forum&lt;/a&gt;.  As you can see next to the button there are 4 contacts.  You need to solder two wires to the board (IIRC you need to pick a side, so if holding the board vertically, either the top or the bottom).  Then connect more wire to the screw terminals.  Basically think of the button as a pass through.  You are going to use your smart relay to trigger the button, which then in turn will trigger the garage door.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-button.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3072&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-button_hu_8f4b0a732c875273.jpg 480w, https://blog.fuzzymistborn.com/local-myq-garage-door/myq-button_hu_8cee76c4de41813c.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Here’s what my button looked like reassmbled&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Take that to the garage and wire in your smart relay (the wires you soldered onto the button).  That will depend on what relay you picked.  For me, mine looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-relay.jpg&#34;
	width=&#34;3072&#34;
	height=&#34;4080&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-relay_hu_1bed601ea962b348.jpg 480w, https://blog.fuzzymistborn.com/local-myq-garage-door/myq-relay_hu_ad75cfdbbe5565de.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Zen16 wired up&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Last step is to wire the button with the wires coming off the &amp;ldquo;normal&amp;rdquo; button terminals into the garage door opener.  I just stuck mine on the top of the garage door opener as it gave me convenient access to power for the relay and my wire runs didn&amp;rsquo;t have to be that long.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-finishedproduct.jpg&#34;
	width=&#34;3072&#34;
	height=&#34;4080&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/local-myq-garage-door/myq-finishedproduct_hu_abf79d2aacd032ba.jpg 480w, https://blog.fuzzymistborn.com/local-myq-garage-door/myq-finishedproduct_hu_ab5fb08cf7564d17.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;All done&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;75&#34;
		data-flex-basis=&#34;180px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;At this point I&amp;rsquo;d suggest testing your relay to make sure it all works.  To get the garage door into HomeAssistant I used a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/cover.template/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Template cover&lt;/a&gt;, using the tilt sensor for the &lt;code&gt;value_template&lt;/code&gt; (and also throwing MyQ in there for the &amp;ldquo;opening&amp;rdquo; and &amp;ldquo;closing&amp;rdquo; as a &amp;ldquo;why not&amp;rdquo;) to track whether the door is open or closed.  Then the open/close is just a trigger to the relay.  Here&amp;rsquo;s my template:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;covers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;garage_door&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;garage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Garage Door&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;garage_door_template&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {% if states(&amp;#39;cover.garage_door_myq&amp;#39;) == &amp;#34;opening&amp;#34; or states(&amp;#39;cover.garage_door_myq&amp;#39;) == &amp;#34;closing&amp;#34; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {{ states(&amp;#39;cover.garage_door_myq&amp;#39;) | capitalize }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {% elif states(&amp;#39;binary_sensor.garage_door_tilt&amp;#39;) == &amp;#39;off&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          Closed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {% elif states(&amp;#39;binary_sensor.garage_door_tilt&amp;#39;) == &amp;#39;on&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          Open
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          N/A
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;open_cover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.turn_on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.garage_door_opener&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;close_cover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.turn_on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.garage_door_opener&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stop_cover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.turn_on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;target&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;switch.garage_door_opener&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I did need to do some adjusting to the Zen16 configuration.  I set the Switch Type to &amp;ldquo;Momentary&amp;rdquo; (not &amp;ldquo;Garage Door momentary&amp;rdquo; as that didn&amp;rsquo;t work for some reason) and set an auto turn off for the relay (I set mine to 1 second).  You may need to do something different.&lt;/p&gt;
&lt;p&gt;This was actually a pretty easy thing to set up, and it is so nice to have local control of my garage door and not be dependent on MyQ (while I guess still having access to MyQ if I still need it for whatever reason).&lt;/p&gt;
</description>
        </item>
        <item>
        <title>New House - New Smart Home Hardware!</title>
        <link>https://blog.fuzzymistborn.com/new-home-hardware/</link>
        <pubDate>Wed, 04 Jan 2023 11:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/new-home-hardware/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/new-home-hardware/header.jpg" alt="Featured image of post New House - New Smart Home Hardware!" /&gt;&lt;p&gt;I realize in hindsight I didn&amp;rsquo;t post much in 2022.  Well it&amp;rsquo;s 2023 now and I guess you could say I have a new year&amp;rsquo;s resolution to post more.  But in reality, the reason why I didn&amp;rsquo;t post much last year was because I was moving.  No, it didn&amp;rsquo;t take me all year to move.  But we decided to build a new house after searching a bit and the whole build process took about 9 months start to finish.  And while the build was happening, I had zero interest to make major changes to any of my home automation or networking setup.  Instead, I focused my time on planning out hardware in the new place as after about 5 years of a smart house I&amp;rsquo;d learned a few things.  I&amp;rsquo;m not at all close to done with getting everything set up automation wise, but I am 95% done with the installation.  I thought now would be a good time to start documenting the new gear.  This will be in two parts.  Part 1 will focus on the smart home gear and part 2 will focus on my networking setup.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to look at what I had in my old house, you can see the post &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s an image of all the stuff I&amp;rsquo;ve deployed (may be a few things missing, and things I&amp;rsquo;ve reused aren&amp;rsquo;t pictured)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/content/post/2023/new-home-hardware/header.jpg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;That’s a lot of switches….&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;thermostat&#34;&gt;Thermostat
&lt;/h1&gt;&lt;p&gt;In the old house, I ran an Ecobee 3 for the entire time I lived there and I was pretty happy with it.  While it&amp;rsquo;s cloud connected (and a few years ago Ecobee had more than it&amp;rsquo;s fair share of server outages), lately it&amp;rsquo;s been very reliable.  That being said, I did strongly consider going Zwave for the thermostat, specifically the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Honeywell-TH6320ZW2003-Thermostat-Comfort-Control/dp/B07HFL7R44/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Honeywell T6 Pro&lt;/a&gt;.  It can be had on eBay for pretty cheap and it doesn&amp;rsquo;t look terrible.  However, Ecobee has a few features based on their room sensors that brought me back to it.  Specifically, my favorite feature is the ability when creating a schedule to tell the Ecobee &amp;ldquo;only focus on the temperature/room sensors in these rooms&amp;rdquo; when determining the temperature of the house.  So in the evenings/at night, I only care about the bedrooms.  But during the day, I don&amp;rsquo;t care as much about the bedrooms bu worry more about the first floor/office.  I&amp;rsquo;m sure there was a way to create a similar functionality with Zwave and other temperature sensors but having it all integrated/automatic in Ecobee was too nice a benefit to pass up.&lt;/p&gt;
&lt;p&gt;Same goes for Ecobee being able to track things like HVAC maintenance, replacing the air filters, high/low humidity, etc.  All could be done in other ways, but it&amp;rsquo;s nice that they are just built into a good looking device with a functional app.  So I picked up an Ecobee Enhanced Thermostat which does not have any voice control (absolutely &lt;em&gt;fine&lt;/em&gt; by me, I kinda hated that in the Ecobee3) and it all works.&lt;/p&gt;
&lt;p&gt;My only gripe at the moment is that in HomeAssistant there&amp;rsquo;s a way to use Homekit to control the Ecobee so all the controls are local.  Very handy.  And in the old house I used that to pull the temperature/room sensors into HomeAssistant as it avoided any issues with cloud outages.  However, I have a bunch of he &amp;ldquo;old&amp;rdquo; room sensors and those do not seem to play nice with HomeKit and Ecobee.  They just show up as &amp;ldquo;unavailable.&amp;rdquo;  Hoping that gets fixed soon.&lt;/p&gt;
&lt;h1 id=&#34;smart-home-hub&#34;&gt;Smart Home Hub
&lt;/h1&gt;&lt;p&gt;I don&amp;rsquo;t have much to add here beyond what I said in my last post.  I remain a Google Home house/user.  This year HomeAssitant is focusing on voice (in fact, it&amp;rsquo;s the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/blog/2022/12/20/year-of-voice/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Year of the Voice&lt;/a&gt;).  I will be eager to see what they come up with and improve.  However, I find I rarely need to use voice control  as most things are handled by automations so I don&amp;rsquo;t know if I&amp;rsquo;ll switch any time soon.&lt;/p&gt;
&lt;p&gt;The main thing I enjoy using the Google hubs for is the ones that have screens.  Being able to cast things like my front doorbell camera video stream or weather/radar map when I wake up is super convenient.  &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CATT&lt;/a&gt; is your friend here.&lt;/p&gt;
&lt;h1 id=&#34;zwave&#34;&gt;Zwave
&lt;/h1&gt;&lt;p&gt;I&amp;rsquo;m still a big fan of Zwave devices, though I will admit that it&amp;rsquo;s role in my house is greatly reduced.  As part of my upgrade, I switched from the Aeotec 5th gen Zwave control stick to a Zooz 700 series stick.  There is an issue with the 700 series sticks requiring a firmware update, you can read more about that [here](&lt;a class=&#34;link&#34; href=&#34;https://github.com/kpine/zwave-js-server-docker/wiki/700-series-Controller-Firmware-Updates-%28Linux%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/kpine/zwave-js-server-docker/wiki/700-series-Controller-Firmware-Updates-(Linux)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Really what made me stick with Zwave was Zooz&amp;rsquo;s switches being only $20-30.  I really liked the ones I had in the old house (I left them there because I just didn&amp;rsquo;t feel like rewiring those AND the new house) so decided to stick with what worked.  As you can see in the main image above, the vast majority of the switches in my house are Zen71&amp;rsquo;s and Zen 72&amp;rsquo;s.  So far, no major issues.  They work well, they have a lot of handy configuration parameters, and if I do find I want some Zwave sensors I have a strong mesh network.&lt;/p&gt;
&lt;p&gt;I also got some Leviton ZW4SF fan speed control switches for the bedrooms.  I have not had a chance to use these much yet as by the time I moved in winter was coming, but from my quick testing they work great.  I&amp;rsquo;m really looking forward to being able to control fan speeds at the switch instead of with a pull chain.&lt;/p&gt;
&lt;p&gt;Two other sets of devices that are new and worth mentioning.  First is the &lt;a class=&#34;link&#34; href=&#34;https://www.thesmartesthouse.com/products/zooz-z-wave-plus-700-series-remote-switch-zen34-battery-powered&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zooz Zen34&lt;/a&gt;, a battery powered paddle switch.  I LOVE these things.  Despite having the full floor/electrical plans for my house for months AND meeting with the electrician before install, I failed to grasp that the placement of the switches in my kitchen&amp;hellip;well&amp;hellip;.sucks.  Basically there&amp;rsquo;s 3 sets of lights: island lights, kitchen surround, and breakfast nook.  Only the kitchen island has a 3-way switch and is controllable from the entrances to the room.  And the other two light switches are placed in inconvenient locations.  So to fix the problem, the Zooz paddle buttons let me add some additional &amp;ldquo;switches&amp;rdquo; to control the other lights (via Zwave group association) in the kitchen remotely.  They aren&amp;rsquo;t a completely perfect solution as you can tell they aren&amp;rsquo;t real switches, but they solve the problem well enough I can overlook that failing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/new-home-hardware/zen34_on-wall.png&#34;
	width=&#34;2537&#34;
	height=&#34;2341&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/new-home-hardware/zen34_on-wall_hu_baec16eff732348.png 480w, https://blog.fuzzymistborn.com/new-home-hardware/zen34_on-wall_hu_c6fef916c393ffe4.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Zen 34 on the wall (on the left)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;108&#34;
		data-flex-basis=&#34;260px&#34;
	
&gt; &lt;img src=&#34;https://blog.fuzzymistborn.com/new-home-hardware/zen34.png&#34;
	width=&#34;1890&#34;
	height=&#34;2277&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/new-home-hardware/zen34_hu_26f46a6d6e709504.png 480w, https://blog.fuzzymistborn.com/new-home-hardware/zen34_hu_bd655d1dcb93f26a.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Zen 34 off the wall&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;83&#34;
		data-flex-basis=&#34;199px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;The second device is the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Ring-Alarm-Keypad/dp/B07ZB2DFMB&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ring Alarm Panel (2nd gen)&lt;/a&gt;.  I haven&amp;rsquo;t a chance to play around with this a ton, but it&amp;rsquo;s a Zwave alarm panel.  It looks nice, is battery powered, and can do a whole host of things which will allow me to control the alarm system without a tablet.  I probably will post some more details later, but for now here&amp;rsquo;s a good &lt;a class=&#34;link&#34; href=&#34;https://github.com/ImSorryButWho/HomeAssistantNotes/blob/6f05b3f90a979f7118e7c688ce2d01b878227328/RingKeypadV2.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub write up&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://static.xtremeownage.com/blog/2022/home-assistant-alarm/#step-2-from-zwavejs-scan-the-qr-code&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;another blog post&lt;/a&gt; with how to get it to play nicely in HomeAssistant.&lt;/p&gt;
&lt;p&gt;In terms of sensors/other gear, I didn&amp;rsquo;t keep a ton from the old house as I really wanted to try to standardize as much as possible for the sake of consistency.  So I sold all my old contact/motion sensors and went with Zigbee ones (more below).  What I did keep was some flood/leak sensors and my Schlage door lock.  I even picked up another Schlage lock (which was &lt;em&gt;not&lt;/em&gt; easy to find even on Ebay) for my side garage door.  I looked at other options like Ultraloq but there just seemed to be a bunch of problems, most notably that the Zwave lock just&amp;hellip;.doesn&amp;rsquo;t do anything smart.  IMO really the only lock game in town is Schlage, and I&amp;rsquo;m hoping that the issues with stock are related to production issues and not Schlage getting out of the game.&lt;/p&gt;
&lt;h1 id=&#34;zigbee&#34;&gt;Zigbee
&lt;/h1&gt;&lt;p&gt;While Zwave saw a major drop in usage, Zigbee now plays a significantly increase role in my house.  That&amp;rsquo;s not to say I particularly like Zigbee over Zwave.  In a perfect world where money was no object, I&amp;rsquo;d only have Zwave.  However, there&amp;rsquo;s just so much more variety in the Zigbee world with some clever devices and just&amp;hellip;well&amp;hellip;they&amp;rsquo;re cheaper too.  For now, I&amp;rsquo;m sticking with my &amp;ldquo;run both, pick whatever device is cheapest and best for the job&amp;rdquo; strategy, and I haven&amp;rsquo;t been disappointed yet.  I really do think there are pros to running a blended network and very little downside.&lt;/p&gt;
&lt;p&gt;For my Zigbee controller, for a long time I&amp;rsquo;ve been using the Deconz Conbee II and had very few issues, other than the Deconz software which I fixed by &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/z2m-v-deconz/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;moving to Zigbee2MQTT&lt;/a&gt;.  As it&amp;rsquo;s replacement, I picked up the &lt;a class=&#34;link&#34; href=&#34;https://sonoff.tech/product/gateway-and-sensors/sonoff-zigbee-3-0-usb-dongle-plus-e/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Sonoff Zigbee 3.0 USB Dongle Plus-E&lt;/a&gt;.  This is different from the popular -P model as it uses a different chip, the EZSP.  You can see more of the differences on the Sonoff website.  I decided to go with the E model because the EZSP chipset is the &amp;ldquo;future&amp;rdquo; of Zigbee as it will support Matter/Thread.  The &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/skyconnect/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HomeAssistant SkyConnect&lt;/a&gt; uses the same chipset.  Unfortunately the EZSP chipset is still pretty early in it&amp;rsquo;s support in things like Zigbeee2MQTT and I&amp;rsquo;ve run into a few issues along the way.  It does seem to be getting better though.  Haven&amp;rsquo;t had any devices drop off my network in over a week!  If I was to go back and do it again I probably would have gotten the -P model of the Sonoff stick, but in the long run I&amp;rsquo;m sure the -E will be fine.&lt;/p&gt;
&lt;p&gt;For sensors, I went basically all Xiaomi Aqara.  I already had a number of the motion sensors and picked up some more, along with contact sensors.  The contact sensors are hands down the best, as demonstrated by &lt;a class=&#34;link&#34; href=&#34;https://www.kickstarter.com/projects/flirc/the-skip-1s-universal-remote-control-by-flirc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rob over at The Hook Up&lt;/a&gt;.  The motion sensors are&amp;hellip;.fine.  I wanted to get the newer Aqara P1 motion sensors as they have the ability to change the detection sensitivity and cooldown.  But I got one to test and it had horrible detection range.  Instead I bough the older model from &lt;a class=&#34;link&#34; href=&#34;https://cloudfree.shop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Cloudfree.shop&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also have been playing with the Aqara FP1, which is a mmWave presence detection device.  It&amp;rsquo;s actually good at detecting presence because unlike IR (used in most motion sensors) which requires a ton of movement, the FP1 can pick up on a tiny amount of movement and detect that someone is still in the room.  It&amp;rsquo;s not 100% accurate (curtains fluttering from AC running can trip it, for example) but it&amp;rsquo;s miles better than I had before.  Currently I&amp;rsquo;m testing them in my home office and family room.  With some further tweaking/placement work I&amp;rsquo;m sure I&amp;rsquo;ll get it to a good spot.  Note that &lt;a class=&#34;link&#34; href=&#34;https://www.aqara.com/us/news/article/1610997530217459712&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aqara at CES announced the FP2&lt;/a&gt;.  This device won&amp;rsquo;t run on ZIgbee but rather WiFi/Matter, so that&amp;rsquo;s a pro to some and a con to others.  Also note that you can&amp;rsquo;t get the FP1 in the US directly.  Cloudfree has it available as does a few stores on AliExpress in China.  I bought mine on AliExpress and had no issues.&lt;/p&gt;
&lt;p&gt;I had the &lt;a class=&#34;link&#34; href=&#34;https://www.ikea.com/us/en/p/fyrtur-black-out-roller-blind-smart-wireless-battery-operated-gray-50417464/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ikea Fyrtur&lt;/a&gt; blinds in the master bedroom in our old house and liked them well enough.  They&amp;rsquo;re a basic roller blind so they didn&amp;rsquo;t completely black out the room.  I was fully prepared to buy sets for all the bedrooms in the new house when I came across the new &lt;a class=&#34;link&#34; href=&#34;https://www.ikea.com/us/en/p/tredansen-black-out-cellular-blind-smart-wireless-battery-operated-white-50512456/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ikea Tredansen&lt;/a&gt; cellular blinds.  I gotta say I&amp;rsquo;m in love with these things.  They look like normal cellular blinds that you&amp;rsquo;d get from Lowes or HomeDepot and are full black out shades.  All the bedrooms have them (and I repurposed the Fyrtur&amp;rsquo;s in the office).  They open after we wake up automatically, close at sunset (or around 7pm if it&amp;rsquo;s in the summer), and will close earlier if it&amp;rsquo;s going to be a warm day (front bedrooms get a ton of direct sunlight).  Yes they&amp;rsquo;re expensive but such a wonderful product to have.  As an FYI the curtains do not come with screws (really annoying IMO).  I used #8 wood screws (I want to say 1.5 inches long but I can&amp;rsquo;t remember exactly) and they worked great.&lt;/p&gt;
&lt;p&gt;Finally, while as I said I really like the Zooz Zwave switches, I knew because I was going to be deploying a &lt;em&gt;ton&lt;/em&gt; of Zigbee devices I needed a good Zigbee mesh, which means powered devices.  I had some Sonoff Zigbee plug in outlets that worked as repeaters but again, I knew I needed more.  Thankfully Inovelli had just announced their new &lt;a class=&#34;link&#34; href=&#34;https://inovelli.com/products/blue-series-smart-2-1-switch-on-off-or-dimmer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Blue line of switches&lt;/a&gt; and I ordered a 10 pack.  And I gotta give it to Inovelli, they made a really nice switch.  While there was a defect in about 50% of the first production batch (only affected 2 of my 10), Inovelli was quick to get replacements out.  I love the LED strip along the side (which I plan to use with automations for things like showing if a door is locked, for example) and rewiring a 3 or a 4 way setup was far easier as I didn&amp;rsquo;t have to touch the other switches (for now).  I do plan to eventually swap the secondary switches for the &lt;a class=&#34;link&#34; href=&#34;https://inovelli.com/products/white-series-add-on-aux-switch&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Inovelli Whites&lt;/a&gt;.  Inovelli also is working on some cool new stuff, like &lt;a class=&#34;link&#34; href=&#34;https://community.inovelli.com/t/zigbee-matter-motion-switch-project-linus-blue-series/10904/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;switches with built in mmWave detection&lt;/a&gt; and also a &lt;a class=&#34;link&#34; href=&#34;https://inovelli.com/products/blue-series-fan-switch-zigbee-3-0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Blue series fan switch&lt;/a&gt;.  Ultimately while I paid a bit more for the Blue switches, it was worth it in my mind.&lt;/p&gt;
&lt;h1 id=&#34;sound-machines&#34;&gt;Sound Machines
&lt;/h1&gt;&lt;p&gt;Ok this one hurts a little bit.  I had this grand plan to use Volumio on a couple of Wyse 3040&amp;rsquo;s powered by POE, similar to what I had in &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/automations-for-kids/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;the old house&lt;/a&gt; with some Raspberry Pis and battery backup.  It was going to be this whole great thing that was locally controlled and bulletproof as it had worked flawlessly for years.&lt;/p&gt;
&lt;p&gt;Then my son spent a week at his grandparents where my nephew has one of those &amp;ldquo;ok to wake&amp;rdquo; clocks that has an actual clock on it.  And apparently my son learned what &amp;ldquo;7:00&amp;rdquo; was and that &lt;em&gt;that&lt;/em&gt; was an OK time to wake up and get out of bed (instead of various times between 5 and 7am despite my &amp;ldquo;red light&amp;rdquo; strategy in the old house).  So I began looking at various options.  Ultimately I decided to go with the Hatch Rest+ (1st gen) which were on sale for the holidays.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/new-home-hardware/hatch.png&#34;
	width=&#34;527&#34;
	height=&#34;527&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/new-home-hardware/hatch_hu_fbc2b3cfff5e79d2.png 480w, https://blog.fuzzymistborn.com/new-home-hardware/hatch_hu_5b6a6f0d0df8e82f.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Hatch Rest&amp;#43; Gen1&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;100&#34;
		data-flex-basis=&#34;240px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;As you can see, it has a built in clock, LED light, and sound machine, and it&amp;rsquo;s controllable over WiFi, not Bluetooth as the older models were.  AND it has a battery backup that can last a few hours in the event of a power outage.  So while I &lt;em&gt;could&lt;/em&gt; have built something custom again with Raspberry Pis, some LEDs, and all that, ultimately it just seemed easier to bite the bullet and pay for a polished product.&lt;/p&gt;
&lt;p&gt;What really sealed the deal is that there&amp;rsquo;s a &lt;a class=&#34;link&#34; href=&#34;https://github.com/dahlb/ha_hatch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HACS integration&lt;/a&gt; for HomeAssistant.  When I ordered the Rests, only the Gen 1s were supported, but recently the 2nd gen Rests are supported.  I don&amp;rsquo;t think any of the second gen features are all that compelling (other than maybe toddler lock but my solution there is just to put the clock up on a bookshelf that can&amp;rsquo;t be reached) so I didn&amp;rsquo;t mind saving some money.  Every now and then I have some weird issue where the integration doesn&amp;rsquo;t work and devices don&amp;rsquo;t turn on when I have automations set to do it, but I&amp;rsquo;m chalking that up to my internet (not the most stable).  And I found a workaround where I just reload the integration about 15-20 minutes before my kids wake up, go down for naps, or go to bed.&lt;/p&gt;
&lt;h1 id=&#34;doorbellcameras&#34;&gt;Doorbell/Cameras
&lt;/h1&gt;&lt;p&gt;I was going to talk about the new doorbell and camera setup, but given how long this post already is I&amp;rsquo;ll put this topic off to another time.&lt;/p&gt;
&lt;h1 id=&#34;othermisc&#34;&gt;Other/Misc.
&lt;/h1&gt;&lt;p&gt;Just a few other miscellaneous things that I picked up that are now smart.&lt;/p&gt;
&lt;p&gt;For home audio, I was tolerant of using the Google Homes as Chromecast devices for sound, but after a while that started to get glitchy.  The obvious big name here would be Sonos, but I 1) hate how expensive they are and 2) feel like it&amp;rsquo;s yet another closed ecosystem.  I know Ikea has their line of speakers but I saw them in person and they looked cheap.  Instead I went with some Denon HEOS speakers (the 150 to be precise).  I got 2 refurbished on eBay for pretty cheap.  Haven&amp;rsquo;t played with them a ton, but sound wise they&amp;rsquo;re stellar.  And I can use them in HomeAssistant, which I&amp;rsquo;m still exploring.  I did consider doing in-ceiling speakers all running back to a central amp/receiver but given how little I listen to music it felt like overkill.&lt;/p&gt;
&lt;p&gt;Naturally, just after the house went under contract, our washing machine started to make a weird sound and not spinning enough to dry our clothes.  Le sigh, it was only 5 years old.  Thankfully we&amp;rsquo;d excluded it from the purchase so we didn&amp;rsquo;t end up needing to buy a new one for the old house AND for the new house, but we still needed a new washer.  And while smartifying it wasn&amp;rsquo;t the primary goal, it was a nice benefit.  We went with the GE GFW850 and have been very happy with it so far.  There&amp;rsquo;s a custom HACS component so I can get notified when the washer is almost done/done, and have an automation set to constantly nag me until the door is opened and wash moved.&lt;/p&gt;
&lt;p&gt;The other appliances we chose to make smart was the dishwasher.  With kids, we end up running the dishwasher a lot, and the worst thing with our old dishwasher was that we&amp;rsquo;d set it on a delayed cycle.  That way we could add dishes until after we went to bed.  The only problem was that if you opened the door, you had to press start again, otherwise the delay timer wouldn&amp;rsquo;t start.  Nothing worse than coming downstairs in the morning to dishes that aren&amp;rsquo;t clean, especially if they&amp;rsquo;re needed for school/daycare.  Enter the Bosch 800 series dishwasher.  Now with a Aqara button next to the dishwasher, I can press the button and after we go to sleep the washer will turn on and run.  Really handy.&lt;/p&gt;
&lt;p&gt;I had been playing around with the idea of making some of the recessed lights in my house smart (as in the bulbs themselves) for color/ambience.  I tested a lot of options, including some Zigbee options.  Ultimately I decided I didn&amp;rsquo;t want to go down the smart bulb route as they were pretty expensive (~$30 a bulb, or more if you look at Hue).  That&amp;rsquo;s when I found the Phillips Wiz bulbs.  These are WiFi based bulbs, BUT they can be 100% locally controlled.  I still didn&amp;rsquo;t want them in my recessed lights for a number of reasons (such as not having the lights all turn on in sync) but for my kids bedrooms they are perfect.  I got the 100w ones so they&amp;rsquo;re nice and bright, and having color control is super handy.  Favorite usecase is at night if their door is opened the light turns on red, which makes it easier to see without destroying night vision.&lt;/p&gt;
&lt;p&gt;Lastly, despite my best efforts I now am a &amp;ldquo;proud&amp;rdquo; owner of a MyQ garage door opener.  It literally was the &lt;em&gt;only&lt;/em&gt; opener provided by the builder.  And man I hate it.  It took me probably 20 tries to get the damn thing connected to my WiFi network (using multiple devices even).  The good news is that while now it&amp;rsquo;s on my network and it&amp;rsquo;s hooked up to HomeAssistant, I don&amp;rsquo;t use it.  I have a more detailed post planned on this but basically there&amp;rsquo;s a Zwave relay and a dumb garage door button involved and I have complete local control of my garage door.  F U MyQ.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;OK wow this ended up longer than I was originally thinking.  Lots of fun new toys, LOTS of automating still to do.  Happy to answer any questions if you have them!&lt;/p&gt;
&lt;p&gt;And just for lulz, here&amp;rsquo;s all the dumb switches I&amp;rsquo;ve taken out.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/new-home-hardware/dumb_switches.jpg&#34;
	width=&#34;1644&#34;
	height=&#34;1238&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/new-home-hardware/dumb_switches_hu_5fc259aba2d196ed.jpg 480w, https://blog.fuzzymistborn.com/new-home-hardware/dumb_switches_hu_755b048c59ef2632.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Anybody want some dumb switches?&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;132&#34;
		data-flex-basis=&#34;318px&#34;
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>New Comment System - Giscus</title>
        <link>https://blog.fuzzymistborn.com/giscus-comments/</link>
        <pubDate>Thu, 29 Dec 2022 21:30:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/giscus-comments/</guid>
        <description>&lt;p&gt;Short post.  Just wanted to announce that the blog now has comments thanks to &lt;a class=&#34;link&#34; href=&#34;https://giscus.app/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Giscus&lt;/a&gt;.  I was inspired by Alex/IronicBadger talking about it in &lt;a class=&#34;link&#34; href=&#34;https://blog.ktz.me/dump-disqus-for-giscus/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;his blog&lt;/a&gt; and also on the &lt;a class=&#34;link&#34; href=&#34;https://selfhosted.show/86&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Self Hosted podcast&lt;/a&gt;.  I always wanted a comment system but did not want to use Disqus for a variety of reasons.  Alex&amp;rsquo;s lastest discovery was just icing on the cake.&lt;/p&gt;
&lt;p&gt;Anyway, Giscus uses Github Discussions to create comment threads on posts.  Since I already used Github for this blog, it was relatively easy to get set up.  So now there&amp;rsquo;s comments! Yay!&lt;/p&gt;
&lt;p&gt;Also, looking at how few articles I wrote this year I feel kinda sad.  But I was waiting to write a lot of things because I moved this year.  I wasn&amp;rsquo;t really do anything new for the past few months as I was in a holding pattern until I got into the new place.  Now that I&amp;rsquo;m here and getting settled, I&amp;rsquo;ll make some time to document the new toys and things I&amp;rsquo;ve got set up.  Expect more soon!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Revisiting BlueIris, Deepstack and Homeassistant</title>
        <link>https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/</link>
        <pubDate>Sat, 30 Jul 2022 12:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/header.png" alt="Featured image of post Revisiting BlueIris, Deepstack and Homeassistant" /&gt;&lt;p&gt;This is an updated post to my &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/object-detection-with-blueiris-and-deepstack/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;previous one&lt;/a&gt; on BlueIris and Deepstack.  The setup I described in that post worked for over two years.  However, I am in the process of moving and was looking to streamline things.  And also seeing if there was any way to improve my already functioning setup.  Back 2 years ago I had searched and searched for a way to get alert images from BlueIris to HomeAssistant but couldn&amp;rsquo;t figured out a way.  Last week, I decided to try another search of the interwebs to see if anybody had figured it out, and I stumbled across this thread &lt;a class=&#34;link&#34; href=&#34;https://community.home-assistant.io/t/blue-iris-motion-alerts-to-notification-with-image-in-home-assistant/363641/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  I fully recommend giving it a full read, though note that there have been changes since the initial post.  I&amp;rsquo;ll also point out a few things below that might help streamline things.&lt;/p&gt;
&lt;p&gt;This guide assumes a few things.  First, you have BlueIris setup.  Second, you have configured BlueIris to use MQTT to communicate to HomeAssistant.  Though the dev is not working on the integration anymore, I&amp;rsquo;ve found &lt;a class=&#34;link&#34; href=&#34;https://github.com/elad-bar/ha-blueiris&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt; to work the best.  The dev also has an excellent guide on how to &lt;a class=&#34;link&#34; href=&#34;https://github.com/elad-bar/ha-blueiris/blob/master/docs/blueiris-server.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;configure MQTT&lt;/a&gt; that&amp;rsquo;s worth a read.  Note you don&amp;rsquo;t NEED to use the HASS integration; you can configure most of what is discussed below just using the MQTT setting described in the documentation for the integration.  I have just found the integration to be easier to use.&lt;/p&gt;
&lt;h1 id=&#34;hardware&#34;&gt;Hardware
&lt;/h1&gt;&lt;p&gt;For the past 2 years, I&amp;rsquo;ve been running BlueIris on a dedicated box, specifically an HP EliteDesk G1 Mini, with an Intel i5-4590T and 8gb of RAM.  Overall it did&amp;hellip;.fine.  It could handle the cameras I was throwing at it (mostly Eufy indoor 2ks and a few Reolink 410&amp;rsquo;s), but whenever I would try to remote into it and open the BlueIris console, I would start hitting 100% CPU utilization and things were&amp;hellip;.slow.  That&amp;rsquo;s partly why I felt the need to separate Deepstack away from my BlueIris box because I was afraid if I started trying to run Deepstack on the i5-4590T things wouldn&amp;rsquo;t go well.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/elitedesk.png&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;As mentioned above, I&amp;rsquo;m moving into a new house (literally, it&amp;rsquo;s a new construction) which means I got to make some design decisions, including running conduit to many locations.  Which opens up the possibility of outdoor POE cameras and hardwired indoor cameras.  No more WiFi!  I realized though that there was no way the EliteDesk was going to be able to handle the significant increase in megapixels I was about to throw at it.  The current setup is 24 megapixels; the new house is probably going to be closer to 50 when I&amp;rsquo;m done.  I looked into buying an upgraded EliteDesk as I love the small form factor devices, perhaps a 6th gen i5-6500T.  The cost of one of those was around $200 on eBay and I figured for ~$100 more I could build myself a 10th gen, i5-10400 rig to match the hardware I have in my Proxmox server.  That way I have some hardware redundancy in case of failures.  I ended up going a bit over budget because I bought a new case and power supply but all in all I&amp;rsquo;m happy with my decision.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my hardware list:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Item&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;CPU&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pcpartpicker.com/product/X8snTW/intel-core-i5-10400-29-ghz-6-core-processor-bx8070110400&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Intel Core i5-10400 2.9 GHz 6-Core Processor&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Motherboard&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pcpartpicker.com/product/y8rRsY/msi-b560m-pro-vdh-micro-atx-lga1200-motherboard-b560m-pro-vdh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MSI B560M PRO-VDH Micro ATX LGA1200 Motherboard&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Memory&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pcpartpicker.com/product/2Bnypg/team-t-force-vulcan-z-16-gb-2-x-8-gb-ddr4-3200-cl16-memory-tlzgd416g3200hc16fdc01&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TEAMGROUP T-FORCE VULCAN Z 16 GB (2 x 8 GB) DDR4-3200 CL16 Memory&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Case&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pcpartpicker.com/product/7TBG3C/fractal-design-meshify-2-compact-atx-mid-tower-case-fd-c-mes2c-01&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fractal Design Meshify 2 Compact ATX Mid Tower Case&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Power Supply&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pcpartpicker.com/product/49VG3C/evga-supernova-gt-650-w-80-gold-certified-fully-modular-atx-power-supply-220-gt-0650-y1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EVGA SuperNOVA GT 650 W 80+ Gold Certified Fully Modular ATX Power Supply&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On a side note, I&amp;rsquo;m a huge fan of Fractal Design cases (literally every single case I&amp;rsquo;ve ever bought is a Fractal) and the Meshify 2 Compact doesn&amp;rsquo;t disappoint.  Easy to build in, looks great.&lt;/p&gt;
&lt;p&gt;After getting everything running, the CPU utilization now hovers around 5-10%, versus on the old hardware it was usually around 40-50%.  And best of all, the power utilization only went up maybe 20 watts overall.  That also includes the fact I added a spare 6TB HDD in the case so now I&amp;rsquo;m able to record directly to disk.  Before I was shifting archived footage off to my NAS.&lt;/p&gt;
&lt;h2 id=&#34;intel-gvt-g&#34;&gt;Intel gvt-g
&lt;/h2&gt;&lt;p&gt;On another brief sidenote, my first thought was to try to run Proxmox on the new setup to go along with the Proxmox server I already ran.  That way I could possibly migrate things over in the case of needed downtime or hardware failures.  I set it up, got the Windows VM running and successfully passed through the iGPU to the VM.  I started up BlueIris and everything &lt;em&gt;seemed&lt;/em&gt; to be working.  For about 24 hours I had no issues and I thought it was going to work.  Then suddenly out of the blue I started getting system lockups on both the VM and the Proxmox host.&lt;/p&gt;
&lt;p&gt;Ultimately, I do not recommend trying BlueIris in a VM and try to pass through the iGPU for QuickSync.  You can read more about the issues people have had with gvt-g &lt;a class=&#34;link&#34; href=&#34;https://blog.ktz.me/why-i-stopped-using-intel-gvt-g-on-proxmox/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  My experience with performance wasn&amp;rsquo;t as bad as IronicBadger&amp;rsquo;s was, but the system instability was a deal breaker.&lt;/p&gt;
&lt;h1 id=&#34;deepstack-setup&#34;&gt;Deepstack Setup
&lt;/h1&gt;&lt;h2 id=&#34;initial-configuration&#34;&gt;Initial Configuration
&lt;/h2&gt;&lt;p&gt;As I described in my previous post on Deepstack and BlueIris, what I was after was a way to get images of persons/cars being detected to my phone via HomeAssistant.  The other ways I had tried didn&amp;rsquo;t allow me to filter out the notifications so that I didn&amp;rsquo;t get alerts when I really didn&amp;rsquo;t care to get them (like when I&amp;rsquo;m leaving home).  So I worked out a somewhat convoluted approach in which:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BlueIris would detect motion and trigger an alert.&lt;/li&gt;
&lt;li&gt;HomeAssistant via MQTT would pick up on that trigger and in turn trigger an image scan with Deepstack using a custom component.&lt;/li&gt;
&lt;li&gt;If Deepstack determined there was in fact a person/car, it would then alert me.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While it was overly complicated, it did in fact work pretty well.  I reliably got alerts via Telegram whenever a person or car was detected.  I think my main problem with this approach was that there was some lag.  First the alert would have to go out via MQTT to HASS, then HASS would have to take a snapshot and send it to Deepstack, which then had to process it and return it to HASS, which then would send my the notification.  I&amp;rsquo;d say the overall time between motion event and alert was 5-8 seconds.  Not bad, but not great.&lt;/p&gt;
&lt;p&gt;Now that I finally had better hardware that I felt more comfortable running Deepstack and BlueIris at the same time, I started to play around.  Hat tip to Rob over at TheHookup on Youtube for a pretty detailed explanation of how to setup BlueIris and Deepstack.  I suggest giving this video a watch:&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/nLH9GEcdb9Y&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;This one is older (and somewhat outdated) but I think still worth a watch:&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/fwoonl5JKgo&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;I haven&amp;rsquo;t yet tried the substream recording/upgrading to higher res on motion because 1) HDDs are cheap and 2) the Eufy cams I&amp;rsquo;m running don&amp;rsquo;t have substreams so it doesn&amp;rsquo;t seem worth it.  Maybe with the new cams (I&amp;rsquo;ll be sharing which ones I&amp;rsquo;m going with later) I&amp;rsquo;ll start doing this.&lt;/p&gt;
&lt;h2 id=&#34;alert-settings&#34;&gt;Alert Settings
&lt;/h2&gt;&lt;p&gt;I won&amp;rsquo;t go through all the setup for Deepstack and BlueIris as I think that&amp;rsquo;s well covered in the video.  I also think Rob&amp;rsquo;s suggested settings for AI are pretty decent, though I turn off &amp;ldquo;Begin analysis with motion-leading image&amp;rdquo; to try to get the best snapshot of the person or car I can.  Here&amp;rsquo;s my typical settings:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-deepstack-settings.png&#34;
	width=&#34;718&#34;
	height=&#34;601&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-deepstack-settings_hu_599a3bc196423d8.png 480w, https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-deepstack-settings_hu_7a072f1d432675a6.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;AI Detection Settings&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;119&#34;
		data-flex-basis=&#34;286px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;You absolutely should tweak the settings and the confidence levels to fit your own needs.  Now to get the alert image into HASS, you need to go to the Alerts tab.  At the bottom, click &amp;ldquo;On alert&amp;hellip;&amp;rdquo;  Click the plus icon and click &amp;ldquo;Web request or MQTT&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts.png&#34;
	width=&#34;1502&#34;
	height=&#34;605&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts_hu_d2a5962281b47130.png 480w, https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts_hu_ff7448103cf82c6a.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Alert Setup&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;248&#34;
		data-flex-basis=&#34;595px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;For MQTT topic, I would recommend something like &lt;code&gt;BlueIris/image/&amp;amp;CAM&lt;/code&gt; where &lt;code&gt;&amp;amp;CAM&lt;/code&gt; will automatically be substituted by BlueIris to be the shorthand name for your camera (makes copying/pasting for multiple cameras easy).  I like to make sure all the images are under the same subtopic just for organizational purposes, but you could configure yours however you like.  The Post/payload must be &lt;code&gt;&amp;amp;ALERT_JPEG&lt;/code&gt; as that&amp;rsquo;s the secret sauce that tells BlueIris to send the alert image to MQTT in Base64 encoding.  I also enabled &lt;code&gt;MQTT retain message&lt;/code&gt; so the camera entity in HASS you&amp;rsquo;ll set up below always has an image to pull and you shouldn&amp;rsquo;t get any errors.  Here&amp;rsquo;s an example of what mine looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts-mqtt.png&#34;
	width=&#34;725&#34;
	height=&#34;353&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts-mqtt_hu_651862eed168c791.png 480w, https://blog.fuzzymistborn.com/blueiris-deepstack-revisited/blueiris-alerts-mqtt_hu_448b3aa85c61554a.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Alert Configuration&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;205&#34;
		data-flex-basis=&#34;492px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;You also can modify what profiles should the alert image get sent.  For example, I have a &amp;ldquo;Vacation/Alarm&amp;rdquo; profile where all my cameras (indoor and outdoor) send alerts, but a &amp;ldquo;Default&amp;rdquo; profile where indoor alert images are not processed.  Nobody wants pictures of them walking around in their underwear IMO&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Also, I highly suggest ordering these alerts so that the image is sent first.  If the alert triggers the motion sensor in HASS first you may not get the updated image.&lt;/p&gt;
&lt;h1 id=&#34;homeassistant-integration&#34;&gt;HomeAssistant Integration
&lt;/h1&gt;&lt;p&gt;Now that the hard part is done, the HASS integration is actually really simple.  All you really need to do is create an MQTT camera based on the topic you set above.  And specifically use the &lt;code&gt;b64&lt;/code&gt; encoding option.  Also, remember that &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/blog/2022/06/01/release-20226/#breaking-changes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;starting with 2022.09&lt;/a&gt;, all MQTT entities need to be under the &lt;code&gt;mqtt&lt;/code&gt; key in your &lt;code&gt;configuration.yaml&lt;/code&gt; file.  So your configuration may look something like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mqtt:
	camera:
		- topic: BlueIris/image/driveway
		  name: Alert Driveway
		  unique_id: driveway_alert
		  encoding: b64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Change the topic to match whatever you configured in BlueIris.  Restart HomeAssistant and you should be able to see a new camera entity showing the last alert image from BlueIris!  Now to send the image I&amp;rsquo;ve found the easiest way is to take a snapshot to my local disk and then send that image file to my notification app of choice, which is Telegram.  You could pick whatever you prefer without much issue.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m able to do a little more fine tuning on the HomeAssistant end, like rate-limiting the number of notifications I get to 1 ever few minutes (so my phone doesn&amp;rsquo;t melt from all the notifications).  Now my notification setup looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BlueIris would detect motion and triggers a scan with Deepstack&lt;/li&gt;
&lt;li&gt;If Deepstack determines there&amp;rsquo;s a person, the alert image is sent to MQTT and the motion sensor in HASS is triggered.&lt;/li&gt;
&lt;li&gt;HASS then notifies me.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The processing time here is more around 3 seconds (instead of the 5-8 before).  It&amp;rsquo;s not a huge improvement but it feels far less convoluted.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;I&amp;rsquo;m pleased with both the new hardware (it&amp;rsquo;s so much faster!) and the new way to get my alert images into HomeAssistant.  There wasn&amp;rsquo;t anything &amp;ldquo;wrong&amp;rdquo; with my previous setup as I don&amp;rsquo;t think the performance/speed improvement is all that great, but it does feel a lot cleaner and simpler than before.  Also feels easier to maintain should there be issues in the future.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Deconz v. Zigbee2MQTT</title>
        <link>https://blog.fuzzymistborn.com/z2m-v-deconz/</link>
        <pubDate>Tue, 24 May 2022 22:30:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/z2m-v-deconz/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/z2m-v-deconz/logo.png" alt="Featured image of post Deconz v. Zigbee2MQTT" /&gt;&lt;p&gt;I&amp;rsquo;m a big believer in both Zwave and Zigbee.  Both have their pros and cons.  Zwave in my opinion is a better technology because of the lack of interference and it propagates further/wider due to being a lower frequency.  However, the devices are more expensive and there&amp;rsquo;s less overall variety.  Zigbee on the other hand shares the same frequencies as Wifi (and other technologies) in the 2.4ghz band so interference can be an issue.  However, the devices are usually significantly cheaper and there&amp;rsquo;s a &lt;strong&gt;lot&lt;/strong&gt; more variety when it comes to devices.&lt;/p&gt;
&lt;p&gt;So instead of picking one and sticking to it, I run both in my house to play to the general strengths of both.  When it comes to Zigbee, I&amp;rsquo;m a big fan of the Xiaomi Aqara line of devices.  They&amp;rsquo;re cheap, they work great, and there&amp;rsquo;s a lot of nice devices.  My personally favorite are &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/dp/B07D19YXND&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;these button switches&lt;/a&gt; that I use all over the house to trigger various automations.&lt;/p&gt;
&lt;p&gt;For a hub, I&amp;rsquo;ve long used a &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/dresden-elektronik-ConBee-Universal-Gateway/dp/B07PZ7ZHG5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Conbee II&lt;/a&gt;.  There are a number of hubs out there but I&amp;rsquo;ve found the Conbee to be the best.  The Conbee is manufactured by a company called Phoscon/Dresden-Elektronik, who in turn make a controller software called &lt;a class=&#34;link&#34; href=&#34;https://github.com/dresden-elektronik/deconz-rest-plugin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deConz&lt;/a&gt; (Note: I may have the ownership part wrong, I tried researching but couldn&amp;rsquo;t find a definitive answer).  When I first started out, I figured why not use the software that&amp;rsquo;s made by the company that makes the hardware.  There&amp;rsquo;s probably good synergy there.  And I was right.  Sorta.&lt;/p&gt;
&lt;h1 id=&#34;deconz&#34;&gt;deConz
&lt;/h1&gt;&lt;p&gt;DeConz as software works fine.  It is able to interface with a good variety of devices and it controls them just fine.  What was not so wonderful was 1) pairings could be an absolute nightmare and 2) occasionally devices would drop off the network and require a repair.  And third, unless you had lights in your network in a group, EVERY TIME you logged in you&amp;rsquo;d have to click through 3 screens about setting up light groups.  Was a real PITA and I could never figure out how to turn that off.  The first two issues though were real pain points.  For example, pairing my &lt;a class=&#34;link&#34; href=&#34;https://www.ikea.com/us/en/p/fyrtur-blackout-roller-blind-wireless-battery-operated-gray-20417465/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ikea Fyrtur&lt;/a&gt; curtains took literally days and dozens of attempts to get paired.  And even then occasionally they would just stop responding for no apparent reason.&lt;/p&gt;
&lt;p&gt;I also found it can sometimes take a while for deConz to support new devices.  They do seem to want to take their time and get it right, but if you want the latest and greatest devices it can be frustrating at times.  And while it&amp;rsquo;s technically possible to run Over the Air updates on deConz, I struggled to get it to work and just gave up.&lt;/p&gt;
&lt;p&gt;In terms of integrating with HomeAssistant, it was really quite simple.  There&amp;rsquo;s an official integration, devices just show up, and it works fine.  To get the button events I had to use an even listener but that wasn&amp;rsquo;t a major problem.  I didn&amp;rsquo;t have an issue with this part of using deConz.&lt;/p&gt;
&lt;h1 id=&#34;zigbee2mqtt&#34;&gt;Zigbee2MQTT
&lt;/h1&gt;&lt;p&gt;I&amp;rsquo;m not really going to go into the &amp;ldquo;how to set up Zigbee2MQTT&amp;rdquo; because I think 1) it&amp;rsquo;s really pretty straightforward and 2) there are a lot of other posts/videos on how to do it.  So instead, I&amp;rsquo;m going to be focusing on my thoughts/impressions.&lt;/p&gt;
&lt;p&gt;I wanted to test out Zigbee2MQTT as an alternative to deConz for a while, particularly because I&amp;rsquo;d heard great things about the sheer number of devices it supported, including the new &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/dp/B09QKVMMTB/?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aqara P1 motion sensor&lt;/a&gt; I picked up off Amazon.  One evening, I decided I would give it a try.  And stupid me, I thought I could just stop deConz, start up Zigbee2MQTT, add the P1 sensor, try it all out and then go back to deConz without any issues.&lt;/p&gt;
&lt;p&gt;That&amp;hellip;.did not go according to plan.  I was able to set up Zigbee2MQTT just fine, got it all connected to the MQTT broker and everything worked fine.  Was done for the night, shut down Zigbee2MQTT, restarted deConz and started wrapping up for the evening.  When I noticed some of the motion sensors didn&amp;rsquo;t seem to be working because the lights weren&amp;rsquo;t turning on.  Went into deConz and&amp;hellip;.none of the devices were showing up.  Uh oh&amp;hellip;.&lt;/p&gt;
&lt;p&gt;Decided to bite the bullet since I was going to have to repair everything anyway and just switch everything over to Zigbee2MQTT.  That evening I got the bare essentials repaired and then got the rest repaired the following day, along with renaming things so my existing automations would continue to work.  It was painful with about 25 devices but not horribly so.  The biggest thing that made it easier was the pairing was &lt;strong&gt;so much easier&lt;/strong&gt; with Zigbee2MQTT than Deconz.  For starters, everything paired without much issue.  Including the Fyrtur blinds that I struggled so mightily with when using deConz.  Second, Zigbee2MQTT opens up pairing for 5 minutes and allows you to pair as many devices as you want/can in that time period.  deConz was one at a time, and like with the entry screens, the UI was cumbersome to navigate.&lt;/p&gt;
&lt;p&gt;The devices just showed up for me in HomeAssistant under the MQTT integration.  I do wish they were separated from some of my other MQTT-based devices, but they were easy to configure/rename so it&amp;rsquo;s a minor quibble.  And doing OTA updates via Zigbee2MQTT is a breeze.  Not many of my devices actually had an update to run&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;After a few days, I&amp;rsquo;m very happy I switched.  Devices that were giving me trouble with deConz are working just fine now with Zigbee2MQTT, with one issue regarding the humidity sensor I use in my shower along with a trend binary sensor to detect whether someone is showering.  I&amp;rsquo;m sure I&amp;rsquo;ll figure it out.&lt;/p&gt;
&lt;p&gt;In terms of &amp;ldquo;should I switch off deConz to Zigbee2MQTT&amp;rdquo; the answer is it depends.  I was kinda forced to repair everything so I figured why not make the switch, and my network is relatively small at 25 devices.  If deConz is working fine for you and you aren&amp;rsquo;t using unsupported devices, I don&amp;rsquo;t think there&amp;rsquo;s a super compelling reason to switch.  But if you are just starting out with Zigbee or find yourself wanting/needing to switch, then definitely give Zigbee2MQTT a go!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Valetudo on a Dreametech Vacuum</title>
        <link>https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/</link>
        <pubDate>Mon, 25 Apr 2022 23:00:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/logo.png" alt="Featured image of post Valetudo on a Dreametech Vacuum" /&gt;&lt;p&gt;For a while I&amp;rsquo;ve been using a trio of Eufy 30C Robovacuums to clean my house.  And they worked&amp;hellip;.fine.  They were your standard bump-and-turn variety of vacuum robot, meaning no floor mapping/LIDAR or other advanced features.  And like I said, they worked fine.  Until they didn&amp;rsquo;t.  I&amp;rsquo;ve already had to replace one under warranty and I had another die about 6 months after the warranty ended.  I thought about replacing it with another Eufy but given that I&amp;rsquo;ve gone through two in less than two years I wasn&amp;rsquo;t keen to drop another $200+ without exploring the alternatives.&lt;/p&gt;
&lt;p&gt;I had been curious about &lt;a class=&#34;link&#34; href=&#34;valetudo.cloud/&#34; &gt;Valetudo&lt;/a&gt; for a while.  It&amp;rsquo;s open source software that, in short, removes the cloud from your robot vacuum.  Meaning it&amp;rsquo;s entirely locally controlled.  Think of it as &lt;a class=&#34;link&#34; href=&#34;https://tasmota.github.io/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tasmota&lt;/a&gt; for robot vacuums.  However, Valetudo only works on robots in the Xiaomi ecosystem.  Roborock used to be the go-to, but they&amp;rsquo;ve apparently patched things in such a way that it&amp;rsquo;s not easy to root anymore.  They still make great vacuums, so I almost went with them, but instead I started looking at DreameTech.&lt;/p&gt;
&lt;h1 id=&#34;hardware&#34;&gt;Hardware
&lt;/h1&gt;&lt;p&gt;DreameTech uses the same underlying tech as Xiaomi/Roborock.  They make a number of robot vacuums.  The specific ones I have/looked at were the Dreametech &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/gp/product/B08HKYVRTG?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;D9&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/gp/product/B09997J3W6?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Z10 Pro&lt;/a&gt;.  There also is the L10 Pro but I did not get that one.  The main difference as best I can tell between the L10 and D9 is that there&amp;rsquo;s more memory, greater suction, and longer run time.  To me that was not worth the extra $200.&lt;/p&gt;
&lt;p&gt;Overall the Dreametech vacuums are leagues better than Eufy.  For starters, the LIDAR mapping works great.  I&amp;rsquo;m able to control which rooms the vacuum cleans and I know it will clean the whole room instead of hoping that every spot gets covered with many random passes.  I also can add &amp;ldquo;no go zones&amp;rdquo; where I don&amp;rsquo;t want the robot to go.  For example there&amp;rsquo;s tassles on the carpet or an area where I know the robot will get stuck.  Also as a result of the mapping, the Dreametech vacuums are also a lot more efficient.  The Eufy vacs used to run for ~1 hour.  The Dreametechs run for closer to 40 minutes.&lt;/p&gt;
&lt;h2 id=&#34;d9&#34;&gt;D9
&lt;/h2&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/D9.jpg&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The D9 is a great, basic vacuum.  It comes with LIDAR for room mapping, which works really well as discussed above.  It&amp;rsquo;s really a no-frills vacuum that you can get for ~$250 on Amazon.  It &lt;em&gt;does&lt;/em&gt; come with a mop attachment but&amp;hellip;it&amp;rsquo;s pretty lackluster.  Basically it just drags a wet cloth around your floor.  It can do an OK job but it won&amp;rsquo;t work any miracles.  My biggest knock on it is that it sometimes gets twitchy with Valetudo and loses the map data or drops the wifi connection.  But I think for the price, it&amp;rsquo;s great.&lt;/p&gt;
&lt;h2 id=&#34;z10&#34;&gt;Z10
&lt;/h2&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/Z10.jpg&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The Z10 is basically the same robot as the D9 with a few more bells and whistles.  The biggest extra features are the self-emptying bin and the object avoidance.  Honestly not sure that was worth the premium but&amp;hellip; #forscience.  Both features are nice to have (and the self-emptying part does save me some time) but neither are revolutionary game changers.&lt;/p&gt;
&lt;h1 id=&#34;installation&#34;&gt;Installation
&lt;/h1&gt;&lt;p&gt;Installing Valetudo on the Dreametech vacuums is both simple and tricky.  The first thing to know is that the most commonly used method to root the Dreametech vacuums was patched in September 2021.  However, from my experience no robot has yet shipped with the newer firmware.  For example, my Z10 Pro was produced in December 2021 and I had no issues rooting it.  This may change in the coming months so be aware.  Newer root methods may be available, open up a ticket with the Dustbuilder dev &lt;a class=&#34;link&#34; href=&#34;https://vaers.dontvacuum.me/otrs/customer.pl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oh, that&amp;rsquo;s one important thing to understand here: Valetudo is the software you use to control the robot.  To root the robot, you use &lt;a class=&#34;link&#34; href=&#34;https://builder.dontvacuum.me/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dustbuilder&lt;/a&gt;.  It took me a combination of the Valetudo instructions &lt;a class=&#34;link&#34; href=&#34;https://valetudo.cloud/pages/general/rooting-instructions.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; and the Dustbuilder FAQ &lt;a class=&#34;link&#34; href=&#34;https://builder.dontvacuum.me/dreame/faq.txt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; to figure the whole process out.  Below are some of my tips/experiences to help along the way.&lt;/p&gt;
&lt;p&gt;Also keep in mind you will need a UART adapter to flash the robot.  They&amp;rsquo;re pretty cheap on Amazon.  And also you&amp;rsquo;ll need a wifi device later, preferably one that also runs Linux.  I used a Pi for the job.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EDIT 7/15/2022&lt;/strong&gt;: Valetudo has revised and vastly improved the rooting instructions &lt;a class=&#34;link&#34; href=&#34;https://valetudo.cloud/pages/general/rooting-instructions.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  I&amp;rsquo;ll keep the below for posterity sake, but at this point I believe you can simply follow the Valetudo guide and not mine.  Most notably, the introduction of the &lt;a class=&#34;link&#34; href=&#34;https://github.com/Hypfer/valetudo-helper-httpbridge&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HTTP-Bridge helper&lt;/a&gt; avoids a lot of the pains I had.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once you have what you need, I would suggest starting with the Valetudo instructions.  You&amp;rsquo;ll need to pry open the robot (takes a decent amount of force but just take your time).  Connect the pins to the headers and to your computer.  Keep following the instructions until you get to the part where you need to login.  To get the password you&amp;rsquo;ll need the FULL serial number (meaning BOTH lines in the dustbin.  I used the calculator linked in the Valetudo docs.  Now we&amp;rsquo;ll need to switch over to the Dustbuilder site to get the firmware we need to continue.&lt;/p&gt;
&lt;p&gt;On the Dustbuilder site, pick your vacuum, provide a VALID email address (firmware will get emailed to you) and provide again the full serial number for the vacuum.  I suggest keeping the Patch DNS and Preinstall nano/curl/wget/htop/hexdump options selected.  And also select &amp;ldquo;Prepackage valetudo&amp;rdquo; obviously.  Click &amp;ldquo;Create Job&amp;rdquo; and wait a few minutes for the firmware to be built.  Download the firmware and move it to the device you&amp;rsquo;re using to root.  In my case, the Raspberry Pi.&lt;/p&gt;
&lt;p&gt;Now that you have the firmware, it&amp;rsquo;s time to start rooting.  But first, BACKUP THE VACUUM!  This will help you if you run into problems.  From the shell with the robot, execute the following command: &lt;code&gt;cd / ; tar cvf /tmp/backup.tar /mnt/private/ /mnt/misc/&lt;/code&gt;.  This will create a tarball of the needed files.&lt;/p&gt;
&lt;p&gt;Now comes the part that I found to be unclear/difficult and took me a while to work around.  First, you&amp;rsquo;ll want to install Python&amp;rsquo;s webserver module.  Run &lt;code&gt;python3 -m pip install --user uploadserver&lt;/code&gt; to install.  Next, you need to connect your computer/Pi to the vacuum via WiFi.  I used &lt;code&gt;raspi-config&lt;/code&gt; to find and connect to the correct SSID.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re connected, you&amp;rsquo;ll want to run the Python webserver to allow uploads.  &lt;code&gt;python3 -m uploadserver&lt;/code&gt; on the computer/Pi should be what you need.  Then on the ROBOT, type &lt;code&gt;curl -X POST http://&amp;lt;your-laptop-ip&amp;gt;&amp;gt;:8000/upload -F &#39;files=@/tmp/backup.tar&#39;.&lt;/code&gt;  Keep in mind, &lt;code&gt;your-laptop-ip&lt;/code&gt; is probably going to be something like &lt;code&gt;192.168.5.2&lt;/code&gt; or something like that.  That took me longer than I care to admit to figure out.  The backup tarball should now be on your Pi (double check with an &lt;code&gt;ls&lt;/code&gt; if you&amp;rsquo;re paranoid like me).&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to do something similar to move the Dustbuilder firmware tarball over to the robot.  I ran a Python webserver on the Pi in the directory where the firmware was located with &lt;code&gt;python3 -m http.server&lt;/code&gt;.  Then on the robot, change into the /tmp directory (&lt;code&gt;cd /tmp&lt;/code&gt;) and run &lt;code&gt;wget {url-of-firmware.tar.gz}&lt;/code&gt; where again the URL will be the IP of your computer/Pi along with the filename.  So for example &lt;code&gt;wget 192.168.5.2:8000/dustbuilder.tar.gz&lt;/code&gt;.  The file should be transferred over.  Next run &lt;code&gt;tar -xzvf {name-of-firmware.tar.gz}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Make sure the robot is docked/plugged in and then run &lt;code&gt;./install.sh&lt;/code&gt;.  This will run the root script and get your Valetudo.  As noted in the Valetudo docs, the robot will reboot after it&amp;rsquo;s done installing.  BE PATIENT THIS CAN TAKE A WHILE.  After the reboot, you&amp;rsquo;ll see the MOTD as described in the docs.  Hooray, success!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YOU ARE NOT DONE YET.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let me repeat that:  &lt;strong&gt;YOU ARE NOT DONE YET&lt;/strong&gt;.  The robot has two system partitions, meaning you need to root the robot AGAIN in order to fully gain control.  You&amp;rsquo;ll need to start back over at the step where you copied the Dustbuilder firmware over onto the robot and go from there again.  You don&amp;rsquo;t need to backup the robot again.  Done it a second time and the robot has rebooted again?  Congrats, you&amp;rsquo;ve now rooted your new robot vacuum and own it without the cloud!&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;From here, you&amp;rsquo;ll need to connect the robot to your wifi.  I suggest using your phone for this part.  There is an Android app available for Valetudo (I&amp;rsquo;m no aware of one for iOS, sorry).  But you shouldn&amp;rsquo;t need it.  Just connect to the robot&amp;rsquo;s Wifi SSID and go to either &lt;code&gt;192.168.5.1&lt;/code&gt; or &lt;code&gt;192.168.8.1&lt;/code&gt;.  From there you should be directed to the Valetudo config page where you can provide the wifi credentials.&lt;/p&gt;
&lt;p&gt;Now that you own the robot, you can easily get the robot to appear in HomeAssistant (just follow the Valetudo docs for this, and keep in mind you&amp;rsquo;ll need an MQTT broker).  I also highly recommend the &lt;a class=&#34;link&#34; href=&#34;https://github.com/TheLastProject/lovelace-valetudo-map-card&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Valetudo map card&lt;/a&gt;.  I played around with some customization where I can control what rooms gets cleaned on what day and how many passes to do but I&amp;rsquo;ll go into that in a later post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/Valetudo.png&#34;
	width=&#34;483&#34;
	height=&#34;904&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/Valetudo_hu_569dc118b5c222c6.png 480w, https://blog.fuzzymistborn.com/valetudo-dreametech-rooting-instructions/Valetudo_hu_afcb596216f03b09.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;A tease of my HASS setup&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;53&#34;
		data-flex-basis=&#34;128px&#34;
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ioniq 5 - My First EV</title>
        <link>https://blog.fuzzymistborn.com/ioniq-ev/</link>
        <pubDate>Thu, 14 Apr 2022 22:32:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/ioniq-ev/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/ioniq-ev/header.jpg" alt="Featured image of post Ioniq 5 - My First EV" /&gt;&lt;p&gt;Long before the current spike in gas prices, I was in search of a new car.  Generally I try to drive cars until they die, but the Mrs.&amp;rsquo;s car was approaching 150,000 miles and 10 years old so we figured it was time for a new one.  She really wants a truck for her next car, which we don&amp;rsquo;t need currently (and she wants an electric too!) so we figured we&amp;rsquo;d wait.  That put me in search of a new car for myself.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve loved my Hyundai Ioniq hybrid for years.  Sure it&amp;rsquo;s no muscle car but it gets me from A to B, gets great gas mileage (45-50 in the winter, 55+ in the summer) and is pretty roomy.  We started looking at another Ioniq hybrid when I saw the Ioniq 5, Hyundai&amp;rsquo;s new fully electric crossover.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/ioniq-ev/ioniq5.jpg&#34;
	width=&#34;1920&#34;
	height=&#34;1080&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/ioniq-ev/ioniq5_hu_59fe1cdbf03e9289.jpg 480w, https://blog.fuzzymistborn.com/ioniq-ev/ioniq5_hu_d887c9e1fb428824.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Hyundai Ioniq 5&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;At first, I was totally putoff by the retro look.  But after some reconsideration, it ended up on the top of my wanted list.  And eventually I finally got my hands on an Ioniq 5.  Granted, I was more interested in an SEL trim than a Limited, but the Limited is what became available.  And boy is it a sweet ride.  It&amp;rsquo;s loaded with all kinds of fun tech (heads up display on the windshield, 360 camera, phone-as-a-key) and&amp;hellip;yeah it&amp;rsquo;s all electric so no more gas.&lt;/p&gt;
&lt;p&gt;As a brief aside, two absolutely invaluable sites that aided my search were &lt;a class=&#34;link&#34; href=&#34;https://theevfinder.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;TheEVFinder&lt;/a&gt; and a [user-submitted dataset that tracks dealer markup over MSRP](&lt;a class=&#34;link&#34; href=&#34;https://datastudio.google.com/reporting/7a243d54-2a8d-44f3-a405-ce2a509c1c07/page/3KHiC&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;EV Dealer Markup Tracker&lt;/a&gt;).  That combo eventually led me to my car.&lt;/p&gt;
&lt;h2 id=&#34;technologytools&#34;&gt;Technology/Tools
&lt;/h2&gt;&lt;p&gt;Now having an EV is great, but it definitely comes with a few hiccups/requirements.  Below are some of the tools I&amp;rsquo;ve come across that help EV owners plan trips and keep track of the status of your car.&lt;/p&gt;
&lt;h3 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h3&gt;&lt;p&gt;First, there&amp;rsquo;s the all important HomeAssistant integration (naturally).  This is a custom integration you can find &lt;a class=&#34;link&#34; href=&#34;https://github.com/fuatakgun/kia_uvo/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  Unfortunately it&amp;rsquo;s not feature complete (at least not in the US) so important things like controlling charge percentages aren&amp;rsquo;t yet working.  Hopefully soon.  There is a &lt;a class=&#34;link&#34; href=&#34;https://github.com/dahlb/ha_kia_hyundai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;fork&lt;/a&gt; out there as well if you want to look at that.&lt;/p&gt;
&lt;p&gt;Another big limitation on this integration is on Hyundai&amp;rsquo;s end.  They limit the number of API calls that can be made to somewhere around 30/day in the US.  So the integration only does a hard pull every 4 hours by default and does not update during the evening (can be customized).  The lack of frequent updates does limit data resolution, particularly when it comes to charging the car.  But have to live with it.  As a result of this limitation I haven&amp;rsquo;t done a whole lot of automations yet.  Mainly just tracking the battery level and sending an alert if the battery runs low, or on Sunday evenings if the battery isn&amp;rsquo;t charge enough to get me through the week.&lt;/p&gt;
&lt;p&gt;That doesn&amp;rsquo;t mean I haven&amp;rsquo;t worked on creating a nice UI to view the car stats.  I did borrow most of the template from another user in the HASS forum, with some tweaks.  It does require a few custom cards: &lt;code&gt;custom:stack-in-card&lt;/code&gt; and &lt;code&gt;custom:bar-card&lt;/code&gt;.  I&amp;rsquo;ll have the dashboard YAML at the bottom of the post.  The other tweak I&amp;rsquo;ve done is creating a few sensors to track the car&amp;rsquo;s performance in miles per kilowatt hour.  It takes a bunch of &lt;code&gt;input_number&lt;/code&gt; entities and template sensors and I&amp;rsquo;m not really sure it&amp;rsquo;s worth the effort.  If someone is really interested in how I did it, please feel free to reach out and contact me and I&amp;rsquo;m happy to share.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/ioniq-ev/bluey.png&#34;
	width=&#34;471&#34;
	height=&#34;894&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/ioniq-ev/bluey_hu_84ebc29552d4a6dc.png 480w, https://blog.fuzzymistborn.com/ioniq-ev/bluey_hu_8ce80c530fa8d77c.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;My HASS Dashboard (yes, the car’s name is Bluey)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;52&#34;
		data-flex-basis=&#34;126px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;a-better-route-planner&#34;&gt;A Better Route Planner
&lt;/h3&gt;&lt;p&gt;While the charging infrastructure is OK, there are some definite gaps and going on a road trip is not nearly as easy as in a gas car.  This next tool is absolutely invaluable when it comes to planning said road trip.  A Better Route Planner (ABRP) is both an app and a website that, well, plans your route better.  You type in your start point and destination, along with your EV model and some basic charge information, and it&amp;rsquo;ll map out a route for you, including where to charge, for how long, and to what percentage.&lt;/p&gt;
&lt;p&gt;If you pay for &lt;a class=&#34;link&#34; href=&#34;https://abetterrouteplanner.com/premium/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Premium&lt;/a&gt;, you can take it one step further and have the app factor in real-time weather and traffic information, both of which can have a significant impact on an EV&amp;rsquo;s range.  It also adds some other useful perks, like charger availability and Android Auto/Carplay functionality.&lt;/p&gt;
&lt;p&gt;To go one step even further, you can pick up a Bluetooth Low Energy ODB2 plug that allows ABRP to read the actual remaining battery percentage.  This allows ABRP to recalculate your actual consumption (measured in miles per kWh) and re-estimate your charging needs.  There are a few models recommended by ABRP &lt;a class=&#34;link&#34; href=&#34;https://www.iternio.com/abrp-obd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  For the Ioniq, for some reason the Vgate one wouldn&amp;rsquo;t start back up when the car was off.  I ended up going with the ODBLink CX which has worked great (though is on the pricier side).  Note the big huge security warning with this though and make sure you&amp;rsquo;re OK with the ramifications.&lt;/p&gt;
&lt;h3 id=&#34;plugshare&#34;&gt;PlugShare
&lt;/h3&gt;&lt;p&gt;Now this next one isn&amp;rsquo;t necessarily unique, but I&amp;rsquo;ve found &lt;a class=&#34;link&#34; href=&#34;https://www.plugshare.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PlugShare&lt;/a&gt; to be one of the better tools for figuring out where plugs are located.  You can filter by all sorts of conditions and can see user reviews/check-ins to better determine if a charger is working or where it&amp;rsquo;s located.  In combination with ABRP I have been able to map my trips with relative ease.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Recently I put all these tools to the test when I took a 700 mile road trip.  Overall I was pretty pleased, though I will say ABRP was super conservative when it came to estimating my charging needs.  For instance, on basically every leg of my trip it indicated when I started that I would arrive with ~10% charge.  With one exception (first leg of the day when it was slightly chilly and I was going 70 MPH which was the speed limit), I arrived with way more left in the tank.  Sometimes to the tune of 30% extra.  While I&amp;rsquo;d rather it be conservative and have me charge more often to be safe, I did find this a bit annoying.  Perhaps after some further tweaking and refinement it&amp;rsquo;ll improve.  Still for now it&amp;rsquo;s the best tool I&amp;rsquo;ve found for the job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dashboard YAML:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;vertical-stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;cards&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;picture-entity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/local/ioniq5.png&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;device_tracker.bluey_location&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Bluey&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tap_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;none&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hold_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;none&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;card_mod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        ha-card {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          --ha-card-background: transparent;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          box-shadow: none;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;custom:stack-in-card&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;vertical&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;keep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;border_radius&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;box_shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;outer_padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cards&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;glance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;binary_sensor.bluey_plugged_in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Charger&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;binary_sensor.bluey_charging&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;EV Battery&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_range_by_ev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;custom:bar-card&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_ev_battery&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Percentage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:car-electric-outline&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#161616&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;severity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;25&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;100&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#006600&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;15&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;25&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#c1c100&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;15&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#660000&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_battery_capacity_remaining&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Capacity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:battery-charging&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#161616&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;77.4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;severity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#006600&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;50&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;78&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#c1c100&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;25&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;50&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#660000&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;25&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;glance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;binary_sensor.bluey_tire_pressure_all&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Tire Pressure&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_car_battery&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;12v Battery&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;binary_sensor.bluey_engine&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Engine Status&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;markdown&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;___&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;glance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_mileage_since_last_charge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Trip&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_comsumption&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Consumption&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_odometer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Odometer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;custom:button-card&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.bluey_last_update&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_last_changed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;styles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;grid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;grid-template-areas&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;i n l&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;% 45% 30%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;justify-self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;justify-self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;margin-right&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Last Updated:&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aspect_ratio&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tap_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;call-service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kia_uvo.force_update&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item>
        <item>
        <title>Controlling OPNsense Firewall Rules from HomeAssistant</title>
        <link>https://blog.fuzzymistborn.com/opnsense-firewall/</link>
        <pubDate>Tue, 14 Dec 2021 10:20:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/opnsense-firewall/</guid>
        <description>&lt;p&gt;I&amp;rsquo;ve been running &lt;a class=&#34;link&#34; href=&#34;https://opnsense.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OPNsense&lt;/a&gt; for a few months now and absolutely love it.  It can do basically everything I want/need and does it with a relatively easy to understand interface (with some exceptions).  It also has a good API.  I talked more about OPNsense in a &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/opnsense-wol/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;previous post&lt;/a&gt; so I&amp;rsquo;m not going to revisit a discussion again of OPNsense itself.  But in this post, we&amp;rsquo;re going to talk about being able to remote turn on and off firewall rules&amp;hellip;from HomeAssistant!&lt;/p&gt;
&lt;p&gt;I try to minimize my firewall rules as much as I can, and especially port forward rules that expose my network to the outside internet.  Thanks to the global pandemic, I&amp;rsquo;ve been working from home a few days a week.  Therefore I find I generally don&amp;rsquo;t need to remotely access my network as much as before.  However, every now and then I need to get in to fix something, so I leave SSH open (on a non-standard port and secured with SSH keys!) to a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Bastion_host&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bastion server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If I&amp;rsquo;m working from home though, I don&amp;rsquo;t need to leave open SSH (and would prefer not to even with all the security precautions in place).  I started toggling the port forward rule on/off manually but then I forgot one day and needed to get back in and couldn&amp;rsquo;t, which was infuriating.  So I started looking for a solution.  Here&amp;rsquo;s how I did it.&lt;/p&gt;
&lt;h2 id=&#34;opnsense-setup&#34;&gt;OPNsense Setup
&lt;/h2&gt;&lt;p&gt;First thing is we need to make some changes on OPNsense.  First, you need to install the &lt;code&gt;os-firewall&lt;/code&gt; plugin.  This plugin adds an &amp;ldquo;Automation&amp;rdquo; section to the Firewall menu in OPNsense.  There are two options, &amp;ldquo;Filter&amp;rdquo; and &amp;ldquo;Source NAT.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/opnsense1.png&#34;
	width=&#34;296&#34;
	height=&#34;587&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/opnsense1_hu_18bf83170b5db7f.png 480w, https://blog.fuzzymistborn.com/opnsense-firewall/opnsense1_hu_6aa1466a3d7a96c8.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Automation Menu&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;50&#34;
		data-flex-basis=&#34;121px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to assume you already have a port forwarding rule set up in &lt;code&gt;NAT-&amp;gt;Port Forward&lt;/code&gt;.  You&amp;rsquo;ll still need this part set up.  What&amp;rsquo;s going to change is that you will no longer need a rule under &lt;code&gt;Rules-&amp;gt;WAN&lt;/code&gt;  We&amp;rsquo;re going to replace that with a rule under &lt;code&gt;Automation-&amp;gt;Filter&lt;/code&gt; that will be toggleable from the OPNsense API thanks to the &lt;code&gt;os-firewall&lt;/code&gt; plugin.&lt;/p&gt;
&lt;p&gt;Click the plus icon in the bottom right corner and fill out the information as you need, depending on what you&amp;rsquo;re trying to accomplish.  Here&amp;rsquo;s my rule setup for allowing SSH:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/opnsense2.png&#34;
	width=&#34;897&#34;
	height=&#34;859&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/opnsense2_hu_80a55d7d0d7d5318.png 480w, https://blog.fuzzymistborn.com/opnsense-firewall/opnsense2_hu_315c089fe7c659e.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Example Rule&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;104&#34;
		data-flex-basis=&#34;250px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s very similar to how you would set up a normal firewall rule in OPNsense.  There are plenty of guides for how to manage/setup OPNsense firewall rules.  Personally I found &lt;a class=&#34;link&#34; href=&#34;https://homenetworkguy.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this site&lt;/a&gt; incredibly helpful.&lt;/p&gt;
&lt;p&gt;Note, you could do this for virtually any firewall rule.  It doesn&amp;rsquo;t necessarily need to be a port forward rule.&lt;/p&gt;
&lt;p&gt;The next step is you need to create a REST API token.  I went over this in &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/opnsense-wol/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;my WOL blog post&lt;/a&gt; so I&amp;rsquo;ll direct you there for how to do it.  You could even reuse the same API, just expand it&amp;rsquo;s permissions a bit if you wanted.  The only difference between the WOL role and this one is that you need to add the right privileges.  For the firewall, that&amp;rsquo;s &lt;code&gt;GUI:Firewall: Rules: API&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The last thing we need is the UUID from the firewall rule we set up in automation.  The easiest way to get this IMO is to go to &lt;code&gt;System-&amp;gt;Configuration-&amp;gt;Backups&lt;/code&gt; and click &amp;ldquo;Download configuration.&amp;rdquo;  Search for the name of your firewall rule and the UUID should be right there.&lt;/p&gt;
&lt;h2 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h2&gt;&lt;p&gt;Now that everything is set up in OPNsense, let&amp;rsquo;s move to HomeAssistant.  First off, I want to give a big thanks to &lt;a class=&#34;link&#34; href=&#34;https://forum.opnsense.org/index.php?topic=16943.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this post&lt;/a&gt; for basically laying out exactly what the API calls needed to be.  I just made modifications to make it work with HomeAssistant.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not going to explain a whole lot because I think it&amp;rsquo;s all relatively self-explanatory, but here are the various bits and pieces you&amp;rsquo;ll need to get set up.&lt;/p&gt;
&lt;p&gt;First is the REST Commands.  These are what make the API calls.  Substitute out the UUID from above and the IP address of your firewall.  You&amp;rsquo;ll also want to set the username/password to be the keypair you created above.  I store mine in secrets.yaml.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;rest_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ssh_rule_toggle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://OPNSENSE_URL/api/firewall/filter/toggleRule/UUID_OF_AUTOMATION_RULE&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ssh_rule_apply&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;http://OPNSENSE_URL/api/firewall/filter/apply&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;POST&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next is a binary sensor that will check to see if the firewall rule is enabled or disabled.  Again, swap out your firewalls IP address and the relevant UUID.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;binary_sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;SSH Firewall Rule&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scan_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;connectivity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;http://OPNSENSE_URL/api/firewall/filter/getRule/UUID_OF_AUTOMATION_RULE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret opnsense_key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ value_json.rule.enabled == &amp;#39;0&amp;#39; }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since you need two commands to enable/disable the firewall rule (one to toggle the rule on/off, the other to actually apply the change), I found it easier to create a simple script to call both commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;remote_ssh_firewall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Toggle Remote SSH&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sequence&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.ssh_rule_toggle&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.ssh_rule_apply&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And finally, a nice switch that you can both use in automations and also in the Lovelace UI to toggle the rule on/off.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;switches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;remote_ssh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Remote SSH&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ is_state(&amp;#39;binary_sensor.ssh_firewall_rule&amp;#39;, &amp;#39;on&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;turn_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;script.remote_ssh_firewall&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;turn_off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;script.remote_ssh_firewall&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:wan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here&amp;rsquo;s what the final result looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/hass1.png&#34;
	width=&#34;483&#34;
	height=&#34;130&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/opnsense-firewall/hass1_hu_8ec08c75ae7ba296.png 480w, https://blog.fuzzymistborn.com/opnsense-firewall/hass1_hu_b79c4886b4843fb.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Example Lovelace&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;371&#34;
		data-flex-basis=&#34;891px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;There you have it.  You can now automate enabling or disabling firewall rules in OPNsense as needed.  There are probably other ways to do this, such as with a VPN, but this works for me.  Hope someone finds it helpful!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I updated this post in November 2023.  Opnsense seems to have altered how rules are handled and I noticed that when the rule was &amp;ldquo;enabled&amp;rdquo; I was not able to get through the firewall, but if it was disabled I could get through.  I swapped my setup around and everything is working.  Not sure why or when the changed happened.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>My Love/Hate Relationship with Drone.io and CI</title>
        <link>https://blog.fuzzymistborn.com/drone-love-hate/</link>
        <pubDate>Thu, 18 Nov 2021 08:38:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/drone-love-hate/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/drone-love-hate/header.png" alt="Featured image of post My Love/Hate Relationship with Drone.io and CI" /&gt;&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;Let&amp;rsquo;s talk about Drone.  No, not this kind of drone&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone.jpg&#34;
	width=&#34;1024&#34;
	height=&#34;683&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone_hu_ae975f644f3744c3.jpg 480w, https://blog.fuzzymistborn.com/drone-love-hate/drone_hu_fd3c368500a5a8d.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;No not the flying drone&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;149&#34;
		data-flex-basis=&#34;359px&#34;
	
&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.drone.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This kind of Drone&lt;/a&gt;!  The &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Continuous_integration&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Continuous Integration&lt;/a&gt; kind.  The one that helps you with automatically doing all kinds of fun coding things.  Basically, Drone is a self-hosted alternative to something like &lt;a class=&#34;link&#34; href=&#34;https://github.com/features/actions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Actions&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://jenkins.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jenkins&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://travis-ci.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Travis CI&lt;/a&gt;.  Basically, if there&amp;rsquo;s something with your code that you want to run automatically after some action is taken, then CI is for you.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been playing around with Drone for about a week now, and while ultimately I&amp;rsquo;m pretty happy with it, I&amp;rsquo;m also incredibly frustrated by it.  My initial foray into continuous integration projects started a few months ago with GitHub Actions so I&amp;rsquo;m entirely willing to admit that it may be user/beginner error.  However, there are seemingly basic things that should &lt;em&gt;just work&lt;/em&gt; but don&amp;rsquo;t.  Other things that should be easily to set up but aren&amp;rsquo;t.  The number of times I wanted to pull hair out over something not working is beyond count.&lt;/p&gt;
&lt;h2 id=&#34;deploying&#34;&gt;Deploying
&lt;/h2&gt;&lt;p&gt;Setting up Drone is really very easy.  There are two basic parts: a &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/server/overview/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;server&lt;/a&gt; and a runner.  There are a number of &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/runner/overview/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;different runners available&lt;/a&gt; but I prefer Docker.  It&amp;rsquo;s possible to run the Drone server on a different machine from the Drone runner.  For instance, I run the server on my VPS, but the runner is on an machine at my house.  Obviously my hardware at home has beefier specs that the VPS so builds go much faster.  I&amp;rsquo;m not entirely sure &lt;em&gt;how&lt;/em&gt; the runner and server communicate but it did not require me creating any firewall rules on the server or at home.  And any kind of lag/delaying in triggering builds is hardly noticeable.&lt;/p&gt;
&lt;p&gt;I think the &lt;a class=&#34;link&#34; href=&#34;docs.drone.io/&#34; &gt;documentation&lt;/a&gt; here is actually pretty well done and there is&amp;rsquo;nt much that needs explaining.  Just follow the instructions and you should be up in no time.  The main limitation I ran into is that you can only tie the Drone server to one of the source control platforms (GitHub, Gitea, Gogs, etc.).  So if you have multiple places you use, you&amp;rsquo;ll need multiple instances of Drone.  Given Drone&amp;rsquo;s resource usage is basically non-existent, that shouldn&amp;rsquo;t be an issue.&lt;/p&gt;
&lt;p&gt;As an FYI, to get your account token which you&amp;rsquo;ll need for the API, just navigate to &lt;code&gt;https://YOUR_DRONE_SERVER/account&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;examples&#34;&gt;Examples
&lt;/h2&gt;&lt;p&gt;Things I&amp;rsquo;m doing with Drone:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Running a &lt;code&gt;yamlllint&lt;/code&gt; and where appropriate &lt;code&gt;ansiblelint&lt;/code&gt; on every commit;&lt;/li&gt;
&lt;li&gt;Building various docker containers and pushing to Docker Hub and GHCR;&lt;/li&gt;
&lt;li&gt;Running a config check on my HomeAssistant configuration files on every major HomeAssistant release (including the beta releases) so I can know ahead of time if my configuration needs fixing before I deploy the update;&lt;/li&gt;
&lt;li&gt;Building and deploying this blog, along with a staging site I can use for testing/debugging purposes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In reality, the sky&amp;rsquo;s the limit with automating like this.  One of the more difficult setups I achieved was automatically building a modified  &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/nextcloud-docker&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker container of Nextcloud&lt;/a&gt; that includes Samba and imagick.  I prefer the official Nextcloud image but it doesn&amp;rsquo;t ship with those packages installed so I needed to create it myself.  I didn&amp;rsquo;t want to have to manually trigger the build every time, so now, Drone runs a check script every 6 hours and using one of my new favorite tools, &lt;a class=&#34;link&#34; href=&#34;https://github.com/containers/skopeo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;skopeo&lt;/a&gt;, checks to see if there&amp;rsquo;s an updated Docker image and if there is, update the Dockerfile with an updated tag and tag a new release on GitHub.  That then triggers a new build of the docker image, which is pushed to DockerHub and GHCR.io, and then the images are deleted.  Again, that&amp;rsquo;s just one example (and I&amp;rsquo;d even say a fairly basic one) of what Drone can do.&lt;/p&gt;
&lt;h1 id=&#34;likesdislikes&#34;&gt;Likes/Dislikes
&lt;/h1&gt;&lt;h2 id=&#34;likes&#34;&gt;Likes
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s start off with the good, as there&amp;rsquo;s a lot of good things with Drone that I liked.  As you&amp;rsquo;ll notice though, some things that I liked I also ran into aspects that I disliked.&lt;/p&gt;
&lt;h3 id=&#34;use-any-docker-image&#34;&gt;Use Any Docker Image
&lt;/h3&gt;&lt;p&gt;Probably the handiest feature is you can literally use &lt;em&gt;any&lt;/em&gt; available Docker image/container to complete your task.  Drone has a &lt;a class=&#34;link&#34; href=&#34;plugins.drone.io/&#34; &gt;number of plugins&lt;/a&gt; available (frustratingly the page doesn&amp;rsquo;t support HTTPS for some reason&amp;hellip;.) but I found that in the end it was often easier to just build/do it all myself.  Sometimes that meant a lot of trial and error, and teaching myself more bash scripting like nested if/else statements.  But regardless of how you do it, the point is you probably can do it with Drone given the flexibility what container you use.&lt;/p&gt;
&lt;h3 id=&#34;more-flexibility&#34;&gt;More Flexibility
&lt;/h3&gt;&lt;p&gt;Drone lets you use bash to your hearts content.  So you can use the &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/steps/#commands&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;commands&lt;/code&gt; portion&lt;/a&gt; of your pipeline to run basically any command you want.  Including referencing bash scripts you may have in your git repo.  Note however that if you cannot use the &lt;code&gt;commands&lt;/code&gt; option with a Drone plugin.  As soon as you execute a &lt;code&gt;command&lt;/code&gt; the plugin basically becomes a normal Docker container with no other special instructions.&lt;/p&gt;
&lt;h3 id=&#34;triggering-builds-via-api&#34;&gt;Triggering Builds via API
&lt;/h3&gt;&lt;p&gt;As discussed below, I ran into some limitations when it came to triggering or limiting my builds.  Using the API (and of course, using HomeAssistant to set off the trigger, thus automating my automations) was very handy.  Triggering a build is pretty easy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-i &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://drone.example.com/api/repos/USER/REPO/builds&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization: Bearer YOUR_TOKEN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To add variable, add a &lt;code&gt;?YOUR_VAR=test&lt;/code&gt; after &lt;code&gt;/builds&lt;/code&gt; like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-i &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://drone.example.com/api/repos/USER/REPO/builds?VAR=test&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization: Bearer YOUR_TOKEN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dislikes&#34;&gt;Dislikes
&lt;/h2&gt;&lt;p&gt;That&amp;rsquo;s not to say that Drone is perfect.  I really struggled with some things that in my opinion should be really straightforward (or better documented).&lt;/p&gt;
&lt;h3 id=&#34;cron&#34;&gt;Cron
&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s start with an easy one.  Drone includes the ability to trigger builds based on a &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/trigger/#by-cron&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;cron schedule&lt;/a&gt; from the GUI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone-cron.png&#34;
	width=&#34;410&#34;
	height=&#34;470&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone-cron_hu_ba156726ae04b6fa.png 480w, https://blog.fuzzymistborn.com/drone-love-hate/drone-cron_hu_f7e057d637fb0aca.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Drone Crone UI Screen&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;87&#34;
		data-flex-basis=&#34;209px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Notice, however, that there&amp;rsquo;s no way to create a custom schedule beyond the defaults.  Also, you can&amp;rsquo;t set the time the cron triggers.  By default it&amp;rsquo;s midnight UTC.  Oh, and you can&amp;rsquo;t set the timezone from the GUI either&amp;hellip;I had to mount &lt;code&gt;/etc/localtime&lt;/code&gt; as a volume for it to set it to my local timezone.&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; create a custom schedule, however it &lt;em&gt;must&lt;/em&gt; be done via the &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/api/cron/cron_create/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;API&lt;/a&gt;.  Which isn&amp;rsquo;t hard, but it&amp;rsquo;s an annoying limitation that just shouldn&amp;rsquo;t exist.  Here&amp;rsquo;s an example call you can use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST https://drone.example.com/api/repos/USER/REPO/cron &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization: Bearer YOUR_DRONE_TOKEN&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--data &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;EXAMPLE&amp;#34;, &amp;#34;expr&amp;#34;: &amp;#34;* 0 */6 * * *&amp;#34;, &amp;#34;branch&amp;#34;: &amp;#34;main&amp;#34; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note the cron scheduling includes seconds as an option so it&amp;rsquo;s 6 asterisks instead of the usual 5.  So seconds, minutes, hours, day of month, month, and day of week.  Once it&amp;rsquo;s created, you can see the schedule along with when the next execution will be.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone-cron2.png&#34;
	width=&#34;974&#34;
	height=&#34;231&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/drone-love-hate/drone-cron2_hu_3e1fa8e5c3c102d7.png 480w, https://blog.fuzzymistborn.com/drone-love-hate/drone-cron2_hu_c2d03f7ec04af5c2.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Drone Crone UI Screen&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;421&#34;
		data-flex-basis=&#34;1011px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;triggering-builds&#34;&gt;Triggering Builds
&lt;/h3&gt;&lt;p&gt;Something that I ran into was some limitations when it came to both &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/conditions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;conditions&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/trigger/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;triggers&lt;/a&gt;.  The most frustrating limitation is that while you can have multiple conditions, ALL conditions must be true in order for the step to be performed.  If you want to evaluate conditions separately, you&amp;rsquo;ll probably need to create extra pipelines.  Which then introduces a problem of how do you limit the triggering of the various pipelines?  I found this a hard problem to solve, though it was something that could be worked around.&lt;/p&gt;
&lt;p&gt;Something to keep in mind/that bit me for a while if you&amp;rsquo;re adding &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/configuration/#multiple-pipelines&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;multiple pipelines&lt;/a&gt;: the &lt;code&gt;---&lt;/code&gt; between your pipelines is 100% necessary.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pipeline&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;backend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;golang&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;go build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;go test&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;&amp;lt;-----YOU NEED THIS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;pipeline&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;frontend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;npm install&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;npm test&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Another slightly annoying limitation with triggers is while it support triggers based on &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/trigger/#by-event&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;tags&lt;/a&gt;, there&amp;rsquo;s no support for releases.&lt;/p&gt;
&lt;h3 id=&#34;environmental-variables&#34;&gt;Environmental Variables
&lt;/h3&gt;&lt;p&gt;Drone has a lot of different ways to handle/import variables.  There are several ways to import/use &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/secret/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;secrets&lt;/a&gt;, including into plugin settings or as &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/steps/#environment&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;environmental&lt;/a&gt; variables.  Another trick is that you can add variables as you would normally in bash with something like &lt;code&gt;var=Test&lt;/code&gt; and calling &lt;code&gt;$var&lt;/code&gt; in your commands.&lt;/p&gt;
&lt;p&gt;The frustration is that it&amp;rsquo;s not possible to share variables across pipelines (so you have to import it every time).  What I ended up doing a number of times is piping the variable to an &lt;code&gt;.env&lt;/code&gt; file and then sourcing it every stage as needed.  Again, there&amp;rsquo;s a solution here, it just isn&amp;rsquo;t always obvious or easy to get to (and sometimes feels like a kludge).&lt;/p&gt;
&lt;h3 id=&#34;git-pushes&#34;&gt;Git Pushes
&lt;/h3&gt;&lt;p&gt;Oh. My. God.  This was probably the most frustrating thing I dealt with when setting up Drone.  There&amp;rsquo;s an official &lt;a class=&#34;link&#34; href=&#34;http://plugins.drone.io/appleboy/drone-git-push/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Git Push&lt;/a&gt; plugin available but with a combination of some long standing issues like &lt;a class=&#34;link&#34; href=&#34;https://github.com/appleboy/drone-git-push/issues/40&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/appleboy/drone-git-push/issues/44&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt; I just could not get the plugin to work nicely with committing back to GitHub with SSH.  I even tried something like &lt;a class=&#34;link&#34; href=&#34;https://discourse.drone.io/t/how-can-i-set-host-ssh-key/4636&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt; where I would add the SSH key as an environmental variable but I kept hitting &lt;code&gt;fatal: could not read Username for &#39;https://github.com&#39;: terminal prompts disabled&lt;/code&gt;.  Also, I could not figure out how to push git &lt;code&gt;tags&lt;/code&gt; with the official plugin which is something I needed.&lt;/p&gt;
&lt;p&gt;The solution ended up being surprisingly simple.  So simple I&amp;rsquo;m shocked that it&amp;rsquo;s not included in the documentation anywhere.  Since Drone uses HTTPS to clone the GitHub repo, the easiest way to do a commit back is over HTTPS as well.  All you need is to generate a &lt;a class=&#34;link&#34; href=&#34;https://github.com/settings/tokens/new&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Personal Access Token&lt;/a&gt; for GitHub (I have not tested/tried this with Gitea or the other options so YMMV) with the &lt;code&gt;public_repo&lt;/code&gt; scope.  Add the token as a secret in Drone, and then do something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;generate tag&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;alpine/git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;GH_API_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from_secret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;push_api_key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;git remote add github https://YOUR_USERNAME:$GH_API_KEY@github.com/USER/REPO.git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;git tag -a 0.0.1 -m &amp;#34;Release v. 0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;git push -u github main 0.0.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can modify the above to also push git commits or really any other &lt;code&gt;git&lt;/code&gt; based action.  Again, I don&amp;rsquo;t understand why this isn&amp;rsquo;t documented given how common a problem pushing with SSH is.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;In the end, I think a large part of the problem is that the documentation could be clarified.  For example, &lt;a class=&#34;link&#34; href=&#34;https://docs.drone.io/pipeline/docker/syntax/trigger/#by-action&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; it says &amp;ldquo;Action support varies by event and SCM provider&amp;rdquo; but fails to explain where I might find out more about what the SCM providers might support.  Another recent issue that I noticed is that Harness moved the GitHub repo for Drone to their own.  I&amp;rsquo;m not sure if they also closed down the Issues section or if that was done before, but now a bunch of links on the Drone forum to various issues just 404.  Kinda sucks losing that.&lt;/p&gt;
&lt;p&gt;There also are some who have issues with the licensing of Drone.  The Drone Server is open sourced under an &lt;a class=&#34;link&#34; href=&#34;https://github.com/harness/drone/blob/master/LICENSE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Apache2 license&lt;/a&gt; while the Runners appear to be &lt;a class=&#34;link&#34; href=&#34;https://github.com/drone-runners/drone-runner-docker/blob/master/LICENSE.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;propriety/not open source&lt;/a&gt;.  Personally, I don&amp;rsquo;t mind this part as much as it&amp;rsquo;s still self-hostable and free though I do understand the concerns.  If you only want to use open source software, there&amp;rsquo;s an &lt;a class=&#34;link&#34; href=&#34;woodpecker-ci.org/&#34; &gt;alternative&lt;/a&gt; that forked Drone and appears to be under active development.  Can&amp;rsquo;t say I&amp;rsquo;m a fan of the name (Woodpecker? really?).&lt;/p&gt;
&lt;p&gt;This turned out to be way longer than intended, and it may seem like I really don&amp;rsquo;t like Drone.  In fact, I both love and hate Drone.  The flexibility it offers is awesome, it has a simple and clean UI that&amp;rsquo;s relatively easy to navigate, and I personally am a fan of YAML.  There&amp;rsquo;s just a couple of pain points that honestly just&amp;hellip;shouldn&amp;rsquo;t be pain points.  They seem so simple to fix.  And I wish I could program in GO but I cannot help.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Using Renovate-Bot to Manage Infrastructure</title>
        <link>https://blog.fuzzymistborn.com/using-renovatebot/</link>
        <pubDate>Tue, 09 Nov 2021 11:01:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/using-renovatebot/</guid>
        <description>&lt;p&gt;Combined with using &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/ansible-intro-basics&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;, I&amp;rsquo;ve also begun using &lt;a class=&#34;link&#34; href=&#34;https://github.com/renovatebot/renovate/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Renovate-Bot&lt;/a&gt; to update my &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;infrastructure&lt;/a&gt; GitHub repo.  My main use case is to update the tags on my Docker containers.  I&amp;rsquo;ll be honest and I&amp;rsquo;ve barely scratched the surface of what Renovate-Bot can do.  But having tried various means of notifying and updating me of updated docker containers and I&amp;rsquo;ve found Renovate-Bot to be the best.  Below are the solutions I&amp;rsquo;ve tried and the pros/cons of each.&lt;/p&gt;
&lt;h1 id=&#34;updating-docker-containers&#34;&gt;Updating Docker Containers
&lt;/h1&gt;&lt;h2 id=&#34;watchtower&#34;&gt;Watchtower
&lt;/h2&gt;&lt;p&gt;There are many ways to update your docker containers.  One of the more popular approaches is to tag your containers using &lt;code&gt;latest&lt;/code&gt; and then run &lt;a class=&#34;link&#34; href=&#34;https://github.com/containrrr/watchtower&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Watchtower&lt;/a&gt;.  Watchtower is another docker container that can run on a predefined period and will automatically update the containers you specify.  This approach has a ton of appeal.  It&amp;rsquo;s the most &amp;ldquo;set and forget&amp;rdquo; approach and ensures you&amp;rsquo;re always running the latest container version.  However, the main drawback (and it bit me many times) is an upgraded latest container that breaks/doesn&amp;rsquo;t work.  Nothing like waking up in the morning to find several of your critical containers have stopped functioning.  With Docker it&amp;rsquo;s relatively easy to roll back and get back up and running, but sometimes that can be a pain.  Particularly if a database is involved and the updated version is incompatible with earlier versions.&lt;/p&gt;
&lt;h2 id=&#34;diun&#34;&gt;DIUN
&lt;/h2&gt;&lt;p&gt;After Watchtower, I moved on to&lt;a class=&#34;link&#34; href=&#34;https://crazymax.dev/diun/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DIUN (Docker Image Update Notifier)&lt;/a&gt;.  DIUN can also run on a pre-defined schedule and was the solution I ran for a long time.  It&amp;rsquo;s a really well-developed tool and is highly flexible and customizable.  Basically it monitors the various Docker container registries (such as Docker Hub and the GitHub Container Registry) on a cron-based schedule.  If it detects a new container image it can send a notification to any of a number of notification services (Telegram, Slack, Gotify, etc).&lt;/p&gt;
&lt;p&gt;My annoyance with DIUN isn&amp;rsquo;t really DIUN&amp;rsquo;s fault.  DIUN tracks updates based on whether the hash of the container has changed.  If you&amp;rsquo;re running the &lt;code&gt;latest&lt;/code&gt; I ran into some containers where DIUN would say the container was updated but in fact it wasn&amp;rsquo;t.  Mostly this would happen with multi-arch containers.  Eventually I got tired of getting notifications telling me there was an update when there wasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I could solve most of the issues by moving to a different tag (such as a semver appropriate one like &lt;code&gt;4.4&lt;/code&gt; or something like &lt;code&gt;stable&lt;/code&gt;) but sometimes the only tag available for an image is &lt;code&gt;latest&lt;/code&gt;.  Also, by pinning to a specific version unless I was paying close attention I would miss that a container had moved to, let&amp;rsquo;s say &lt;code&gt;4.5&lt;/code&gt; instead of &lt;code&gt;4.4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ultimately I still run DIUN for a few images that don&amp;rsquo;t have good tags available and just run &lt;code&gt;latest&lt;/code&gt;.  It&amp;rsquo;s not ideal but it works for the few where that&amp;rsquo;s a problem.&lt;/p&gt;
&lt;h2 id=&#34;renovate-bot&#34;&gt;Renovate-Bot
&lt;/h2&gt;&lt;p&gt;By far the best solution I have found is Renovate-Bot.  Renovate is like Dependabot on GitHub in that it automatically can update dependencies as specified.  What makes it better than Dependabot is it is way more flexible. It supports a ton of languages and backends (GitHub, Gitea, Gitlab, etc.).  Really I&amp;rsquo;ve only begun to understand a tiny fraction of what it can do and I&amp;rsquo;m very much impressed.  I mean, just check out all the &lt;a class=&#34;link&#34; href=&#34;https://docs.renovatebot.com/configuration-options&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;configuration options&lt;/a&gt;!  Best of all, it&amp;rsquo;s free and open source.&lt;/p&gt;
&lt;p&gt;My usecase is to manage the version tags of my Docker containers.  Renovate-Bot automatically creates pull requests that detail the version it would update to and in some cases a link to or a description of the changes based on the changelog.  Then I just have to merge the PR, pull it down to my local repo and then push the update out to the appropriate server.  It took a little work to get my configuration right to track the versions but once I got it it really just works.  And best of all, I don&amp;rsquo;t have to monitor all the various containers/repos to be notified when there&amp;rsquo;s an update.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/using-renovatebot/example-pr.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;There are &lt;a class=&#34;link&#34; href=&#34;https://docs.renovatebot.com/getting-started/running/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;many ways&lt;/a&gt; to run Renovate-Bot.  Basically you can either self-host it (yes there&amp;rsquo;s a Docker container) or run it via Renovate&amp;rsquo;s service.  Personally I&amp;rsquo;m using the &lt;a class=&#34;link&#34; href=&#34;https://github.com/marketplace/renovate&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub App&lt;/a&gt; option instead of GitHub Actions but I&amp;rsquo;ve been exploring self-hosting it eventually.  Maybe once I deploy &lt;a class=&#34;link&#34; href=&#34;https://www.drone.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Drone&lt;/a&gt; and some more CI stuff I&amp;rsquo;ll get around to it.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;In the end, there&amp;rsquo;s no &amp;ldquo;right&amp;rdquo; or &amp;ldquo;wrong&amp;rdquo; way to manage container updates (though I&amp;rsquo;d argue Watchtower is borderline on the &amp;ldquo;wrong&amp;rdquo; way TBH).  I know some people have scripts that notify them via Discord or Telegram and they can respond and have the bot update the container.  I know other people just run &lt;code&gt;latest&lt;/code&gt; and update as they remember in one big update with a &lt;code&gt;docker-compose pull &amp;amp;&amp;amp; docker-compose up -d&lt;/code&gt;.  In the end, you&amp;rsquo;ll need to figure out what&amp;rsquo;s best for you.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ansible - Swiss Army Knife of the Homelab</title>
        <link>https://blog.fuzzymistborn.com/ansible-intro-basics/</link>
        <pubDate>Tue, 09 Nov 2021 10:13:58 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/ansible-intro-basics/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/ansible-intro-basics/header.png" alt="Featured image of post Ansible - Swiss Army Knife of the Homelab" /&gt;&lt;p&gt;For the past 6 months or so I have slowly fallen in love with a tool called &lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible&lt;/a&gt;.  In fact, pretty much every computer in my possession is controlled and managed by Ansible.  I wanted to do a writeup on my usecases/setup for Ansible, which also will lead to another post shortly on using something called Renovate-Bot to help upkeep some of my code.  Together my setup has pretty much become self-maintaining.  Though admittedly that hasn&amp;rsquo;t stopped me from continuing to make improvement/tweaks.&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;What is Ansible?  SImply put, Ansible is a tool that allows you configure and manage practically any computer device that you can SSH into.  It&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;very well documented&lt;/a&gt; and has an extensive community supporting it.  Best of all, it doesn&amp;rsquo;t require installing any special software on the target machine other than Python.  It may require you to install certain modules on the target machine to run certain modules but that&amp;rsquo;s all documented.  I use Ansible for two related reasons.  First, I use it as a combination of personal wiki/knowledgebase.  It&amp;rsquo;s nice not to have to remember &amp;ldquo;how the heck did I set up Wireguard again&amp;rdquo; or &amp;ldquo;what&amp;rsquo;s that application I used to do X?&amp;rdquo;.  Second, I use it as a form of backup.  It&amp;rsquo;s not really itself a backup but I have the vast majority of my setup in Ansible, meaning should I need to rebuild a server I can do it quickly with pretty much two commands.&lt;/p&gt;
&lt;p&gt;Ansible is kind of like a Swiss Army knife.  It can be used to do pretty much anything you can think of.  Maybe &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=TVq88JeJbw4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;some of them aren&amp;rsquo;t the greatest ideas&lt;/a&gt; but the point is it&amp;rsquo;s incredibly flexible.  As you can see from my &lt;a class=&#34;link&#34; href=&#34;https://www.github.com/FuzzyMistborn/infra&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Infrastructure GitHub repo&lt;/a&gt;, I have a number of roles that are dedicated to individual server setups (like copying over specific bash scripts or installing needed packages).  I also have a number of roles that can automatically install and configure applications, like Restic/Autorestic or Syncthing just the way I need.&lt;/p&gt;
&lt;p&gt;In addition to roles you create yourself, as I said above the Ansible community is fairly awesome.  Chances are someone has already written a role to do many of the things you&amp;rsquo;re trying to accomplish.  You can find may of them on &lt;a class=&#34;link&#34; href=&#34;https://galaxy.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible Galaxy&lt;/a&gt; or just be searching Google/DuckDuckGo and finding some GitHub repos.  There&amp;rsquo;s also others who have their entire infrastructure code available on GitHub like mine that you can poke through to see what&amp;rsquo;s possible/people are doing.&lt;/p&gt;
&lt;h1 id=&#34;setting-up-ansible&#34;&gt;Setting up Ansible
&lt;/h1&gt;&lt;p&gt;I don&amp;rsquo;t want to go into a ton of detail on the actual setup of Ansible.  There&amp;rsquo;s tons of good guides out there, like this one by &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=goclfp6a2IQ&amp;amp;list=PL2_OBreMn7FqZkvMYt6ATmgC0KAGGJNAN&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jeff Geerling&lt;/a&gt; and this one that I used on &lt;a class=&#34;link&#34; href=&#34;https://www.learnlinux.tv/getting-started-with-ansible/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LearnLinuxTv&lt;/a&gt;.  Honestly, a guide on Ansible would be&amp;hellip;.much longer than I&amp;rsquo;m prepared to write.  There&amp;rsquo;s a lot to learn, and I&amp;rsquo;m by no means an expert, but once you get the basic idea it&amp;rsquo;s pretty easy to go from there.&lt;/p&gt;
&lt;p&gt;There are a number of ways to &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;install Ansible&lt;/a&gt;.  It&amp;rsquo;s available in most package repositories and also as a Python package on PyPi.  Depending on your distribution I&amp;rsquo;d suggest installing via &lt;code&gt;pip&lt;/code&gt; because there&amp;rsquo;s a fair number of releases a year and the packages can be woefully behind (looking at you Ubuntu/Debian).  Again, the main requirement here is Python.&lt;/p&gt;
&lt;p&gt;Beyond that, I would suggest you start by reading/watching a few guides to understand the basics of how Ansible operates.  The basic gist of it is that you create various &lt;code&gt;Playbooks&lt;/code&gt; which can run a number of &lt;code&gt;tasks&lt;/code&gt; or &lt;code&gt;roles&lt;/code&gt;.  Tasks are the basiic building blocks of Ansible.  You use individual modules like&lt;code&gt;copy&lt;/code&gt; or &lt;code&gt;template&lt;/code&gt;to accomplish your goals.  A role is basically a set of pre-packaged tasks; you can use it as a shorthand to call a series of tasks you want to use in a variety of places.&lt;/p&gt;
&lt;p&gt;Probably the most important part of Ansible to learn is &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;variables&lt;/a&gt;.  Variables allow you to reuse text over and over again easily and also to be able to use a role on multiple devices and override the variable as necessary.  For example, let&amp;rsquo;s say in general I want to create a user named &lt;code&gt;fuzzy&lt;/code&gt; so I set a &lt;code&gt;{{main_username}}&lt;/code&gt; variable as &lt;code&gt;fuzzy&lt;/code&gt;.  But on one machine I want the user created to be named &lt;code&gt;elmo&lt;/code&gt;.  All I&amp;rsquo;d need to do is set the default on that one machine to &lt;code&gt;elmo&lt;/code&gt; and I&amp;rsquo;m all set.  Figuring out and setting variables and your defaults is probably the biggest thing to focus on in my opinion.&lt;/p&gt;
&lt;h1 id=&#34;infrastructure-as-code&#34;&gt;Infrastructure As Code
&lt;/h1&gt;&lt;p&gt;Once you get your Ansible playbooks the way you like, if you&amp;rsquo;re feeling brave open source your code to give back to the community.  I&amp;rsquo;m a fan of the &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Infrastructure_as_code&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Infrastructure as Code&lt;/a&gt; movement.  As I mentioned above, I have my entire Ansible setup available on a public GitHub repo.  I love the Ansible community and love how open it is and how much people are willing to help and provide examples.  Having my repo available is my way of giving back/saying thank you.  But wait you might say.  Fuzzy, what about your SSH keys!  Your usernames and passwords! Surely you don&amp;rsquo;t have those publicly available.&lt;/p&gt;
&lt;p&gt;Why yes, yes I do.  Welllll&amp;hellip;..sorta.  If you feel like to crack Ansible&amp;rsquo;s AES256 bit encryption, have at it.  &lt;a class=&#34;link&#34; href=&#34;https://www.atpinc.com/blog/what-is-aes-256-encryption&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;It might take you a while&lt;/a&gt;.  To do this, you&amp;rsquo;ll need to set up &lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/user_guide/vault.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ansible Vault&lt;/a&gt;.  Here&amp;rsquo;s a &lt;a class=&#34;link&#34; href=&#34;https://blog.ktz.me/secret-management-with-docker-compose-and-ansible/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;well-written guide&lt;/a&gt; I followed to set up my vault.&lt;/p&gt;
&lt;p&gt;Now, not going to hide the fact that I&amp;rsquo;ve been burned before.  One night, I was up late.  I had made a ton of changes and wanted to commit the changes to GitHub before going to bed.  I ran the commit and started to head up to bed.  As I&amp;rsquo;m walking upstairs I get a ping from GitHub.  &amp;ldquo;Oh hey, we just noticed your SSH keys to connect to GitHub were published on GitHub.&amp;rdquo;  Then another one from Cloudflare stating they&amp;rsquo;d come across an API key.  Crappppppppp.  I&amp;rsquo;d forgotten to encrypt my Ansible vault prior to committing it to the repo.  And being GitHub there&amp;rsquo;s really no good way to delete a commit absent nuking the entire repo.  So at 1am that&amp;rsquo;s what I had to do.  And since I couldn&amp;rsquo;t exactly leave my setup running with the literal keys to the kingdom (SSH keys, passwords, etc) having been exposed, I spent the next 2 and a half hours changing every password/SSH key that had leaked.  It was NOT an experience that I care to repeat.&lt;/p&gt;
&lt;p&gt;As a result I took two main actions.  First, I triple checked my &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/git-vault-check.sh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pre-commit Git script &lt;/a&gt;to make sure it worked by checking if my Ansible vault is encrypted before I can actually commit to GitHub.  Second, I make a point of only decrypting my vault when I need to make changes.  Admittedly when the oops happened I was making a lot more changes than I am now that required me being in the vault, but now my default is to encrypt the vault whenver I&amp;rsquo;m done for the evening.  Don&amp;rsquo;t be me, learn from my mistake.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;Apologies if this post is a little all over the place, but I really just wanted to write up on Ansible and just how much I enjoy using it.  It&amp;rsquo;s really change my life when it comes to my home lab and combined with Proxmox I&amp;rsquo;m really happy with the state of things.  It&amp;rsquo;s not a tool for everyone but I encourage everyone to at least check it out.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Universal, Synced Retrogaming Setup</title>
        <link>https://blog.fuzzymistborn.com/retrogaming-sync-frontend/</link>
        <pubDate>Thu, 04 Nov 2021 04:32:58 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/retrogaming-sync-frontend/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/retrogaming-sync-frontend/header.jpg" alt="Featured image of post Universal, Synced Retrogaming Setup" /&gt;&lt;p&gt;And now for something entirely different!  While I&amp;rsquo;m not the biggest gamer, I do appreciate playing games from time to time, both retro games and more modern games.  I&amp;rsquo;m very very excited to be picking up a &lt;a class=&#34;link&#34; href=&#34;https://www.steamdeck.com/en/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SteamDeck&lt;/a&gt; and am lucky enough to be getting one in December.  I also have a computer hooked up to my TV and my desktop&lt;/p&gt;
&lt;h2 id=&#34;retroarch&#34;&gt;RetroArch
&lt;/h2&gt;&lt;p&gt;The dominant program in the retrogaming space is &lt;a class=&#34;link&#34; href=&#34;https://github.com/libretro/retroarch&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RetroArch&lt;/a&gt; which utilizes the &lt;code&gt;libretro&lt;/code&gt; API.  RetroArch has tons of &amp;ldquo;cores&amp;rdquo;, or emulators, which can emulate pretty much any gaming system you can think of.  Basically every retro gaming front end/program that I&amp;rsquo;m aware of/have tried relies on RetroArch as a backend to actually play the game.  I&amp;rsquo;m not going to cover much of installing/configuring RetroArch itself as that&amp;rsquo;s a whole post in and of itself.  I use Ansible to modify a few of the basic settings I want (like hiding certain menu options) and downloading the cores I prefer but beyond that RetroArch &amp;ldquo;just works.&amp;rdquo;&amp;quot;&lt;/p&gt;
&lt;h2 id=&#34;frontends&#34;&gt;Frontends
&lt;/h2&gt;&lt;p&gt;There&amp;rsquo;s a number of frontends you could use to select and play your games which can utilize RetroArch as a backend.  Things like &lt;a class=&#34;link&#34; href=&#34;https://lakka.tv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Lakka&lt;/a&gt;. &lt;a class=&#34;link&#34; href=&#34;https://batocera.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Batocera&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.recalbox.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Recalbox&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://retropie.org.uk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RetroPie&lt;/a&gt; are popular options.  All have limitations however.  Lakka/Batocera/Recalbox use stripped down OS&amp;rsquo;s that don&amp;rsquo;t allow much flexibility in terms of installing other software (like syncthing as discussed below) which I found to be a dealbreaker.  RetroPie is really meant to run on a Raspberry Pi and while there&amp;rsquo;s a &lt;a class=&#34;link&#34; href=&#34;https://github.com/MizterB/RetroPie-Setup-Ubuntu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;script to install it on Ubuntu&lt;/a&gt; I&amp;rsquo;m not the biggest fan of the RetroPie UI as it&amp;rsquo;s not internally consistent and settings aren&amp;rsquo;t grouped together.  The above solutions may work for you so I&amp;rsquo;d suggest checking them out but ultimately were not what I was after.&lt;/p&gt;
&lt;h3 id=&#34;retroarch-1&#34;&gt;RetroArch
&lt;/h3&gt;&lt;p&gt;The easiest solution here would be to use the default/built in GUI in RetroArch.  And it&amp;rsquo;s&amp;hellip;.fine.  There&amp;rsquo;s a few different themes (I like the now-default &amp;ldquo;Ozone&amp;rdquo; theme) and you can do a fair amount of tweaking of the &lt;code&gt;retroarch.cfg&lt;/code&gt; file once you find the right setting (or change it in the UI).  Honestly it would work in a pinch but it just didn&amp;rsquo;t &amp;ldquo;wow&amp;rdquo; me by any means.&lt;/p&gt;
&lt;p&gt;RetroArch uses &lt;code&gt;playlists&lt;/code&gt; to create lists of games you can play.  I found a &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/config_retroarch/templates/create_playlist.py.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;python script&lt;/a&gt; that can generate the playlists for you and then I manually pulled the appropriate game art into the &lt;code&gt;thumbnails&lt;/code&gt; directory.  But I found that to be a pain to do&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/retroarch.png&#34;
	width=&#34;1506&#34;
	height=&#34;1089&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/retroarch_hu_62f19b232ea81320.png 480w, https://blog.fuzzymistborn.com/retrogaming-sync-frontend/retroarch_hu_d7ef591d62218118.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;RetroArch Frontend (using Ozone)&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;138&#34;
		data-flex-basis=&#34;331px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;The biggest issue for me was that I also wanted to be able to easily open/play some of my Steam games (either directly or via SteamLink) or something like Minecraft.  There&amp;rsquo;s no way to do that from the RetroArch UI (or at least not easily that I could find), which meant I&amp;rsquo;d have to pull out a keyboard to launch them.  Not ideal.  So I went off in search of alternatives.&lt;/p&gt;
&lt;h3 id=&#34;pegasus&#34;&gt;Pegasus
&lt;/h3&gt;&lt;p&gt;I found a few options in this space.  &lt;a class=&#34;link&#34; href=&#34;https://www.launchbox-app.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Launchbox&lt;/a&gt; is Windows only (boo) so was out.  &lt;a class=&#34;link&#34; href=&#34;https://github.com/tkashkin/GameHub/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GameHub&lt;/a&gt; was a real contender but it didn&amp;rsquo;t seem to have the ability to go true &amp;ldquo;full screen.&amp;rdquo;  I decided to keep looking.&lt;/p&gt;
&lt;p&gt;After searching a bit more, I stumbled across &lt;a class=&#34;link&#34; href=&#34;https://pegasus-frontend.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Pegasus-Frontend&lt;/a&gt; which literally checked every box for me.  It allows for launching third party apps like SteamLink or the Minecraft launcher.  It has some nice &lt;a class=&#34;link&#34; href=&#34;https://pegasus-frontend.org/tools/themes/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;themes&lt;/a&gt;.  And it easily integrated with RetroArch/retro games.&lt;/p&gt;
&lt;p&gt;Figuring out the configuration was a bit tricky.  The files are saved to &lt;code&gt;~/.config/pegasus-frontend&lt;/code&gt; and specifically a &lt;code&gt;settings.txt&lt;/code&gt; and &lt;code&gt;game_dirs.txt&lt;/code&gt; file, as well as a &lt;code&gt;metadata&lt;/code&gt; folder.  Note that you&amp;rsquo;ll want to create individual folders inside the &lt;code&gt;metadata&lt;/code&gt; folder with a &lt;code&gt;metadata.pegasus.txt&lt;/code&gt; per folder.  So for example, I have:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pegasus-frontend/
└── metadata/
    └── roms/
        |-─ atari2600/
			├── metadata.pegasus.txt
			└── media (optional)
		|── nes/
			├── metadata.pegasus.txt
			└── media (optional)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Steam games are automatically imported.  To get retro games automatically added I used &lt;a class=&#34;link&#34; href=&#34;https://github.com/muldjord/skyscraper&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Skyscraper&lt;/a&gt;.  Configuration is a bit beyond the scope of this post but you can take a look at my Skycraper &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/config_pegasus/templates/config.ini.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;config file&lt;/a&gt; and the &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/config_pegasus/templates/scrape.sh.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bash script&lt;/a&gt; I use to scrape/import the media into Pegasus.  Basically I run that bash script and everything gets generated.  Note that the &lt;code&gt;launch&lt;/code&gt; command in the &lt;code&gt;config.ini&lt;/code&gt; file is the key as that is used to call RetroArch and launch the games.  You can customize RetroArch to exit when you close the game, which then takes you right back to Pegasus.&lt;/p&gt;
&lt;p&gt;Like I said above, Pegasus has a lot of themes.  The default one is pretty nice.  I really liked the GameOS theme though.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus.png&#34;
	width=&#34;1000&#34;
	height=&#34;419&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus_hu_ea5bbea1405712a5.png 480w, https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus_hu_ee9daa1f4d1d94d2.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Pegasus Main Screen&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;238&#34;
		data-flex-basis=&#34;572px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus2.png&#34;
	width=&#34;1000&#34;
	height=&#34;419&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus2_hu_6899a63ead34e7a0.png 480w, https://blog.fuzzymistborn.com/retrogaming-sync-frontend/pegasus2_hu_f5e033813f1a4237.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Game Menu&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;238&#34;
		data-flex-basis=&#34;572px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;syncthing&#34;&gt;Syncthing
&lt;/h2&gt;&lt;p&gt;Now we have a nice way to view/find the games, how do we get the games themselves onto the various devices and ideally sync save files/progress so I can stop playing on one device and pick up playing on another right where I left off.&lt;/p&gt;
&lt;p&gt;The easiest solution to this problem would be a simple network share using Samba or NFS.  This way you don&amp;rsquo;t use up storage on the device and everything is easily accessible.  There&amp;rsquo;s a few issues with this approach though.  First and most importantly, with something like the SteamDeck where I can be on the move and off my WiFi network I would lose access to the games/save files.  Second, a potential issue, particularly if you&amp;rsquo;re using a Raspberry Pi using an SD card, would be data corruption.  Using a network share there&amp;rsquo;s a chance the file may get corrupted and synced back to the central storage location.  This is probably pretty unlikely but it&amp;rsquo;s possible.&lt;/p&gt;
&lt;p&gt;I came across a solution that I like which is using &lt;a class=&#34;link&#34; href=&#34;https://syncthing.net&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;syncthing&lt;/a&gt;.  Credit for this idea goes to Jay from &lt;a class=&#34;link&#34; href=&#34;https://www.learnlinux.tv/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LearnLinuxTV&lt;/a&gt;.  Syncthing is a binary written in GO which is highly customizable and efficient in syncing data between multiple devices.  And it solves the two issues above because it syncs the data directly to the other device and also allows for one way sync (so no bitrot/corruption issue).&lt;/p&gt;
&lt;p&gt;Syncthing is supposed to &amp;ldquo;just work&amp;rdquo; and be able to detect other devices running syncthing and allow you to share folders easily.  Personally I could never get the automatic detection to work (possibly because of my VLAN/firewall rules), which is fine because it&amp;rsquo;s possible to set it up with IP addresses.&lt;/p&gt;
&lt;p&gt;To make this easier, I created a &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/tree/main/roles/install_syncthing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;syncthing Ansible role&lt;/a&gt; that 1) installs/updates syncthing as a GO binary directly and 2) creates a configuration file you can customize to pre-define shares.  I didn&amp;rsquo;t want to rely on a PPA/package manager because those can be notoriously out of date.  For configuration, syncthing uses an XML file for configuration so it&amp;rsquo;s pretty easy to modify the file, reload syncthing and the settings will be updated.  What I do is sync the games folder one way from my NAS/server to my desktop/TV box/SteamDeck and then sync save files between all the devices.  Now all my save files are synced up so I can pick up right where I left off on any device.  And it all happens seamlessly.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;In the end I now have a unified way to view and play basically all my games.  It took me probably longer to figure out how to do all this than I care to admit but I&amp;rsquo;m pretty happy with the result.  Really excited for my SteamDeck and looking forward to playing with it once I get it (which I guess now is February&amp;hellip;.).&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Backing up your data with Restic (&#43; Autorestic) and Minio</title>
        <link>https://blog.fuzzymistborn.com/backup-restic-minio/</link>
        <pubDate>Thu, 02 Sep 2021 08:38:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/backup-restic-minio/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;Note: See update &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/restic-server-over-minio/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  I no longer use or recommend Minio with Restic.  There&amp;rsquo;s a better option!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Having a good backup strategy has always been important to avoid data loss but is now even more important in this day and age of constant ransomware stories in the news.  Despite your best efforts to avoid clicking anything, all it takes is one slipup or mistake and your data can be lost.  I&amp;rsquo;ve long hunted for a good backup strategy and I think I&amp;rsquo;ve finally settled on a pretty good option utilizing Restic (plus a wrapper called Autorestic, more below) backing up data to my Synology NAS and to Backblaze&amp;rsquo;s B2 Cloud Storage.&lt;/p&gt;
&lt;h1 id=&#34;backup-strategies&#34;&gt;Backup Strategies
&lt;/h1&gt;&lt;p&gt;Before getting too far into the weeds, let&amp;rsquo;s talk basics about backup strategies.  For a long time, the advice has been 1 is none, two is one, and three is good.  IE having one copy of your data is as good as having none, two copies means you really have just one, and three is a good start.  This advice can be summarized with the 3-2-1 backup strategy, where you have three copies of your data on two different media with one being offsite.  I think this generally is sound advice to follow, though personally I don&amp;rsquo;t think two different forms of media is as important for home/personal use.  Let&amp;rsquo;s be honest, how many of you have tape backups of your data?  I bet more than 90% of people just have the data backed up to hard drives.  So&lt;/p&gt;
&lt;p&gt;Recently, Backblaze wrote a &lt;a class=&#34;link&#34; href=&#34;https://www.backblaze.com/blog/whats-the-diff-3-2-1-vs-3-2-1-1-0-vs-4-3-2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;fantastic article&lt;/a&gt; arguing that it may be time to rethink the 3-2-1 strategy because ransomware is growing more clever and is going after backups.  So you don&amp;rsquo;t want your backups to be accessible and be offline.  The article discuss a 3-2-1-1-0 and 4-3-2 strategies.  Personally I follow a sort of hybrid where I have four copies of my data backed up to 3 different devices, one of which is offsite and an extra copy that&amp;rsquo;s stored offsite AND offline (so I guess 4-3-1-1?).  I have the &amp;ldquo;live&amp;rdquo; copy of my data, plus a copy backed up regularly to my Synology and to B2, and then most of my most important data gets backed up to an external HDD that lives in my office desk drawer.  The external drive only comes home once a month for an update and then goes straight back to the office.&lt;/p&gt;
&lt;h1 id=&#34;restic&#34;&gt;Restic
&lt;/h1&gt;&lt;p&gt;At first my solution was to use &lt;a class=&#34;link&#34; href=&#34;https://www.duplicati.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Duplicati&lt;/a&gt;.  It offered a GUI plus configurable backups that were incremental and on a scheduled basis.  But I had so many issues with it where my backup database would get corrupted and I&amp;rsquo;d have to wipe everything and restart.  Or the backups would fail silently and I&amp;rsquo;d get no warning about it.  There&amp;rsquo;s some ways to work around it but overall it&amp;rsquo;s not a tool I would recommend.&lt;/p&gt;
&lt;p&gt;For a while I switched to  doing &lt;code&gt;rsync&lt;/code&gt; backups of my data to various places but there were numerous issues with this strategy.  If my data got encrypted then it would just get copied over to the backup and overwrite the &amp;ldquo;good&amp;rdquo; data.  I had no version control.  And it was horribly inefficient.  I tried to solve some of the issues by making tarballs of my data but then I ran into storage issues because there was no deduplication of the data so I was exponentially increasing the amount of space required to backup my data as I went.  Eventually I stumbled onto &lt;a class=&#34;link&#34; href=&#34;https://restic.readthedocs.io/en/stable/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Restic&lt;/a&gt; and it basically solved all my issues.  There&amp;rsquo;s a few other options in this space, &lt;a class=&#34;link&#34; href=&#34;https://www.borgbackup.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BorgBackup&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://kopia.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kopia&lt;/a&gt; as other popular solutions.&lt;/p&gt;
&lt;p&gt;What I like about Restic is that it supports a wide variety of backup methods, such as local disks, SFTP, and S3 Object Storage.  It also encrypts all your backups and supports incremental backups, though it does not support compression (yet, maybe someday).  You can set up retention policies so you can manage how long your data is backed up, and importantly forget and prune unneeded data.  During a forget/prune, Restic will go through your data and repack it so that it only keeps the data it needs and forgets the snapshots it no longer needs.  Overall I&amp;rsquo;ve been very impressed with the performance.  I have about 500GB of data backed up via Restic (to both the Synology and B2) and prunes take at most a half hour on my largest datasets.  Most of the time it&amp;rsquo;s minutes.&lt;/p&gt;
&lt;h2 id=&#34;autorestic&#34;&gt;Autorestic
&lt;/h2&gt;&lt;p&gt;This next part is entirely optional, but I think it makes the Restic usage experience much simpler.  &lt;a class=&#34;link&#34; href=&#34;https://autorestic.vercel.app/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Autorestic&lt;/a&gt; is a wrapper for Restic that makes the configuration and basic commands very easy to execute.  There&amp;rsquo;s TONS of options out there for Restic wrappers, such as &lt;a class=&#34;link&#34; href=&#34;https://github.com/nils-werner/crestic&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Crestic&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/maxkueng/restique&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;restique&lt;/a&gt;.  Pick one that works for you and has the features you want.  But the rest of this guide is for using Autorestic.&lt;/p&gt;
&lt;p&gt;Follow the installation guide for Autorestic &lt;a class=&#34;link&#34; href=&#34;https://autorestic.vercel.app/installation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  Then you&amp;rsquo;ll need to create a configuration guide.  The documentation is pretty good here, and feel free to poke around my Github Infra repo and take a look at my autorestic config files, like &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/ad580ebef65fcf7ebdb6b40faf33028ed0062c2f/group_vars/adonalsium.yml#L298-L429&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt;.  The basic idea is there&amp;rsquo;s a &lt;code&gt;backend&lt;/code&gt; (S3, local, SFTP etc) and a &lt;code&gt;location&lt;/code&gt; which is the location of the data you&amp;rsquo;re backing up to a backend.  You can have multiple backends and backup a location to multiple backends (though you can only have a single file location/path per location).  You set the backup password and that&amp;rsquo;s pretty much it.  You can further configure to run some hook scripts (such as calling Healthchecks.io), setting up a retention policy, and excluding files/directories&lt;/p&gt;
&lt;p&gt;As I mentioned above, I backup my data to my Synology (using Minio) and Backblaze&amp;rsquo;s B2 service.  I found these options easier to configure than either setting up a storage mount (which would make it easier for ransomware to encrypt) to use local storage or even SFTP which required sharing SSH keys which can be a PITA.&lt;/p&gt;
&lt;h1 id=&#34;minio&#34;&gt;Minio
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://min.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Minio&lt;/a&gt; is an S3 compatible object storage app that can be run in Docker, and thus on the Synology NAS.  This is now much easier on DSM7, the latest version of the DSM software as it ships with a fairly recent version of Docker.  I would highly encourage you to install &lt;code&gt;docker-compose&lt;/code&gt; on the Synology &lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/compose/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;see the docs here&lt;/a&gt; as Synology&amp;rsquo;s Docker GUI is&amp;hellip;.well&amp;hellip;bad.  It&amp;rsquo;s functional but to change things (like the &lt;code&gt;command&lt;/code&gt; variable needed for Minio) you have to delete and recreate the container from the GUI.  Docker-Compose just makes it all simpler and easier.  Here&amp;rsquo;s my docker-compose for Minio:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#34;2&amp;#34;
services:
  minio:
    image: minio/minio
    container_name: minio
    volumes:
      - /volume1/Minio:/data
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      - MINIO_ROOT_USER=YOUR_USER
      - MINIO_ROOT_PASSWORD=YOUR_PASSWORD
    command:
      [&amp;#39;server&amp;#39;, &amp;#39;/data&amp;#39;, &amp;#39;--address&amp;#39;, &amp;#39;0.0.0.0:9000&amp;#39;, &amp;#39;--console-address&amp;#39;, &amp;#39;0.0.0.0:9001&amp;#39;]
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once you set up Minio, you can access it at &lt;code&gt;YOUR_SYNOLOGY_IP:9000&lt;/code&gt; in your web browser.  Login with your root user/password (this is what you use for your AWS_ACCESS_KEY_ID and SECRET_ACCESS_KEY for &lt;a class=&#34;link&#34; href=&#34;https://autorestic.vercel.app/backend/available#s3--minio&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Autorestic&lt;/a&gt;).  Alternatively, Alex/IronicBadger has a post &lt;a class=&#34;link&#34; href=&#34;https://blog.ktz.me/access-a-synology-nas-with-traefik-on-dsm7/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; for setting up a reverse proxy (using Traefik) to access Minio.  I prefer the IP address but to each their own.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s it!  You now have an S3 compatible object storage location on your Synology NAS.  Makes backup pretty easy if you ask me!&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;I&amp;rsquo;ve been running this setup for about 4 months and so far it&amp;rsquo;s been rock solid.  I&amp;rsquo;ve had to restore data a few times and the data has been there just as I needed it.  And because the backups are incremental my B2 storage bill is around $2/month for about 500gb of storage.  $2 well spent for some peace of mind over ransomware.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Using Wireguard to Tunnel All Traffic through a VPS to Home</title>
        <link>https://blog.fuzzymistborn.com/vps-reverse-proxy-tunnel/</link>
        <pubDate>Thu, 26 Aug 2021 20:38:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/vps-reverse-proxy-tunnel/</guid>
        <description>&lt;p&gt;In my last post, I discussed how I was moving off of Cloudflare and also moving to Caddy.  After about a month of completing that switchover, I&amp;rsquo;m sticking to it.  Still have a few issues with the way Caddy does things but overall it works.&lt;/p&gt;
&lt;p&gt;In this post I want to discuss my Caddy setup, particular how I am not directly exposing my homelab/server to the internet but instead am routing all the traffic through a VPS.  Conceptually it&amp;rsquo;s pretty simple, but it took me a while to actually implement.  There&amp;rsquo;s many solutions out there for implementing a similar setup and there may be a simpler way to do what I&amp;rsquo;m doing but my way works so I&amp;rsquo;m not messing with it.&lt;/p&gt;
&lt;h1 id=&#34;overview&#34;&gt;Overview
&lt;/h1&gt;&lt;p&gt;So why route everything through the VPS?  A few reasons.  First, I don&amp;rsquo;t have to expose my home server to the internet.  That means that there are no ports open on my home firewall, particularly not ports 80/443.  Second, I don&amp;rsquo;t have to reveal my home IP address to the whole world being a DNS record.  And finally, I don&amp;rsquo;t have to worry about a dynamic DNS updater failing and losing access to my services should my IP address change.  In essence, this provides me with a lot of the same benefits of Cloudflare but without being on Cloudflare.  The downside is that it&amp;rsquo;s more complicated and has some more running parts, any of which could break and would bring down remote access to my apps, but I think the benefits are worth it.&lt;/p&gt;
&lt;p&gt;So how do I do it?  Here&amp;rsquo;s an image that explains it:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/vps-reverse-proxy-tunnel/reverse_proxy_setup.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Basically traffic comes into the VPS, gets routed by a Caddy server running on the VPS down a Wireguard tunnel to a server running on my LAN in a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/DMZ_%28computing%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DMZ&lt;/a&gt;.  The DMZ server also runs a Caddy server and routes the traffic to the appropriate app server.  For the record, yes, I know I could have used something like &lt;a class=&#34;link&#34; href=&#34;https://github.com/slackhq/nebula&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nebula&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://tailscale.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tailscale&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://www.zerotier.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Zerotier&lt;/a&gt; and built a mesh network where everything was interconnected.  However, two things kept me from going down that path.  First, I didn&amp;rsquo;t want to to have to set up/manage multiple connections to the VPS.  More things that could possibly break.  Second, I wanted to route everything through a single, well-hardened and secured server before crossing into my home network.  And third, many of the mesh VPN options out there are either not open source or require you to use a proprietary server as the &amp;ldquo;main&amp;rdquo; hub.  Nebula is an exception on both counts and I highly recommend reading &lt;a class=&#34;link&#34; href=&#34;https://theorangeone.net/posts/nebula-intro/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this post&lt;/a&gt; if you&amp;rsquo;re interested in setting up Nebula, but it still was overkill for my needs as I just wanted a single tunnel/connection to worry about.&lt;/p&gt;
&lt;h1 id=&#34;setup&#34;&gt;Setup
&lt;/h1&gt;&lt;p&gt;Now that we&amp;rsquo;ve talked about the why, let&amp;rsquo;s talk about the how.  For this you&amp;rsquo;ll need a VPS, a reverse proxy (the examples below will be in Caddy but NGINX would work just fine too as would Traefik I suspect), and &lt;a class=&#34;link&#34; href=&#34;https://www.wireguard.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wireguard&lt;/a&gt;.  Not sure I&amp;rsquo;ve really ever mentioned Wireguard on this blog before but it&amp;rsquo;s amazing.  If you&amp;rsquo;re still using OpenVPN just&amp;hellip;.stop.  Wireguard is a hell of a lot more efficient and far easier to set up.  There are tons of tools for configuring it and loads of GUIs you can chose.  For this though I&amp;rsquo;m configuring it all manually.&lt;/p&gt;
&lt;h2 id=&#34;wireguard-setup&#34;&gt;Wireguard Setup
&lt;/h2&gt;&lt;p&gt;Installing Wireguard is fairly straightforward, just follow the instructions on the &lt;a class=&#34;link&#34; href=&#34;https://www.wireguard.com/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wireguard page&lt;/a&gt; or check out one of the many, many blog posts/guides out there like &lt;a class=&#34;link&#34; href=&#34;https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-20-04&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt;.  Once it&amp;rsquo;s installed, we need to create the tunnel.  For that, you&amp;rsquo;ll need two sets of public/private keys.  &lt;a class=&#34;link&#34; href=&#34;https://www.wireguard.com/quickstart/#key-generation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Generating them&lt;/a&gt; is pretty simple, the hardest part is keeping track of which key goes where.  Hopefully the below example configuration files help make that clear.  You&amp;rsquo;ll need to save the files in &lt;code&gt;/etc/wireguard&lt;/code&gt;.  Personally I saved mine as &lt;code&gt;wg0.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;VPS Wireguard Conf:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = PRIVATE_VPS_KEY

[Peer]
PublicKey = PUBLIC_DMZ_KEY
AllowedIPs = 10.10.10.10/32
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;DMZ Wireguard Conf:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Interface]
Address = 10.10.10.10/32
PrivateKey = PRIVATE_DMZ_KEY
DNS = 9.9.9.9, 149.112.112.112

[Peer]
PublicKey = PUBLIC_VPS_KEY
Endpoint = VPS_IP_ADDRESS:51820
AllowedIPs = 10.10.10.1/32
PersistentKeepalive = 25
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Probably don&amp;rsquo;t need the DNS entries but figured it couldn&amp;rsquo;t hurt.  You definitely want the PersistentKeepAlive to ensure that the connection remains open and doesn&amp;rsquo;t close/nothing gets blocked.  You can change the IP address (in my case 10.10.10.1/24) to any private IP address range you want, but I liked the IP of the DMZ being 10.10.10.10.  Easy to remember/type.  I also limited the IP addresses to just those on the tunnel, otherwise you run into issues where DNS won&amp;rsquo;t resolve, no internet, etc.  Plus, it&amp;rsquo;s the only traffic you need to route.&lt;/p&gt;
&lt;p&gt;Once you created your config files on both servers, run &lt;code&gt;sudo systemctl enable wg-quick@wg0.service&lt;/code&gt; and &lt;code&gt;sudo systemctl start wg-quick@wg0.service&lt;/code&gt;.  You can check the status with &lt;code&gt;sudo systemctl status wg-quick@wg0.service&lt;/code&gt; and also trying to ping each end of the tunnel (so from the VPS &lt;code&gt;ping 10.10.10.10&lt;/code&gt; and on the DMZ &lt;code&gt;ping 10.10.10.1&lt;/code&gt;).  You should see successful pings.  If not, check your firewall rules.&lt;/p&gt;
&lt;p&gt;To ensure that the Wireguard tunnel stays up, I modified a script I found that pings the IP address of the VPS on Wireguard (in my case, 10.10.10.1).  If that fails 3 times, it reboots the Wireguard systemd service.  That obviously won&amp;rsquo;t help if the VPS is offline but it would help with any temporary odd blips.  I added a cronjob to run the script every 5 minutes.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash
# Modified from https://mullvad.net/en/help/running-wireguard-router/
# and https://wiki.r-selfhosted.com/guides/virtual-private-networks/wireguard/
# ping Wireguard gateway to test for connection
# if no contact, restart!

PING=/bin/ping
## DEBIAN
SERVICE=/usr/sbin/service

tries=0
while [[ $tries -lt 3 ]]
do
    if $PING -c 1 10.10.10.1
    then
            echo &amp;#34;wg works&amp;#34;
            exit 0
    fi
    echo &amp;#34;wg fail&amp;#34;
    tries=$((tries+1))
done
echo &amp;#34;wg failed 3 times - restarting tunnel&amp;#34;
## DEBIAN
$SERVICE wg-quick@wg0 restart
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;caddyreverse-proxy-setup&#34;&gt;Caddy/Reverse Proxy Setup
&lt;/h2&gt;&lt;p&gt;Getting the Wireguard tunnel working was probably 90% of the battle for me, so I&amp;rsquo;m not going to heavily detail the reverse proxy part.  Plus it will depend on what reverse proxy you&amp;rsquo;re using.  If you have questions feel free to &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/about-me/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;contact me&lt;/a&gt; and I&amp;rsquo;m happy to try to help/discuss!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/ambition/templates/Caddyfile.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;example Caddyfile&lt;/a&gt; on my Infra GitHub repo.  The basic gist would be the same in NGINX, basically all you do is tell the reverse proxy to send the traffic to the DMZ server&amp;rsquo;s Wireguard IP address.  On the DMZ Server, here&amp;rsquo;s my &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/honor/templates/Caddyfile.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Caddyfile&lt;/a&gt;.  The DMZ Caddy Server listens on port 80 at the URL you want, and then redirects the traffic to the appropriate server on the LAN.&lt;/p&gt;
&lt;p&gt;As you can see, I terminate SSL on the VPS and route everything internally using HTTP.  Some I know prefer to terminate SSL on the homeserver/DMZ, which is valid but I just found it simpler/more straightforward to do it on the VPS.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;Now there are some downsides to this approach.  The biggest one I ran into was that Fail2Ban no longer worked when running on the individual app servers on my LAN.  The reason was that Fail2Ban would attempt to ban the correct external IP address but iptables only cared about the Wireguard IP address.  IE Fail2Ban would add 100.40.39.38 to the banned iptables list, but iptables would only see traffic coming from 10.10.10.10 or 192.168.50.10 so the ban wouldn&amp;rsquo;t be effective.  To get Fail2Ban working I had to implement &lt;code&gt;rsyslog&lt;/code&gt; to send the various logs up to the VPS and then run Fail2Ban on the VPS.  It works but it still feels like a hack and it would have been much simpler if I could have just kept running Fail2Ban on the individual servers.  I&amp;rsquo;m intrigued by something like &lt;a class=&#34;link&#34; href=&#34;https://crowdsec.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CrowdSec&lt;/a&gt; but haven&amp;rsquo;t had a chance to implement it yet.&lt;/p&gt;
&lt;p&gt;The other thing to keep in mind is you&amp;rsquo;ll need to configure some of your apps to handle a trusted proxy, otherwise the IP address it will see is that of the DMZ server or the Wireguard tunnel.&lt;/p&gt;
&lt;p&gt;This approach really works best if you aren&amp;rsquo;t funnelling tons of traffic through the VPS.  Not because the VPS can&amp;rsquo;t handle it from a performance perspective but because most VPS providers cap your data.  Linode, for example, allows 1TB a month on the $5 tier.  For me that&amp;rsquo;s plenty but if you&amp;rsquo;re routing lots of say Jellyfin/Plex traffic through it you may want to consider a different approach (or directly sending heavy bandwidth apps directly to your LAN).&lt;/p&gt;
&lt;p&gt;Overall, despite some struggles to get this set up, it&amp;rsquo;s been rock solid for me and I really like the way it&amp;rsquo;s running.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Switching DNS Providers and Reverse Proxies - What could go wrong?</title>
        <link>https://blog.fuzzymistborn.com/caddy-linode-changes/</link>
        <pubDate>Wed, 04 Aug 2021 08:32:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/caddy-linode-changes/</guid>
        <description>&lt;p&gt;So this post is going to be a bit different than usual.  No tutorial or guide, more of a discussion of some changes I&amp;rsquo;ve made on the backend to host this blog and some of my other self-hosted services.  Recently I&amp;rsquo;ve started using Ansible to deploy all my servers (you can see my setup &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;).  I didn&amp;rsquo;t convert my Linode VPS instance to Ansible because I didn&amp;rsquo;t want to screw up how I had things.  But as I detailed below, I wanted to switch my DNS servers for my domains off Cloudflare.  I wanted to test the setup before making any permanent changes so I spun up a second Linode VPS.  And since I was doing &lt;em&gt;that&lt;/em&gt; I figured why not just Ansibile-ize it?&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s how I got here, but why the change?  Let me explain.&lt;/p&gt;
&lt;h1 id=&#34;cloudflaredns-servers&#34;&gt;Cloudflare/DNS Servers
&lt;/h1&gt;&lt;p&gt;I&amp;rsquo;ve been a big fan of Cloudflare for a long time.  They provide a tremendous product with great value for home users, including a CDN, DDoS protection, free SSL certs, and DNS servers just to name a few things.  Pretty much since my early days of self-hosting things, they have been my go-to.  I appreciated that I could point my domains to my home IP address and everything would be proxied/anonymized.  It may not really have gotten me any protection but it made me feel better.  I also appreciated that I had a level of DDoS protection from bots.&lt;/p&gt;
&lt;p&gt;But as they say, if the product is free, you are the product.  Now that arguably may not be true in Cloudflare&amp;rsquo;s case (I expect their goal is to convince people to tell their bosses to switch to Cloudflare at work and make money from the enterprise sector), but I&amp;rsquo;ve steadily grown more uncomfortable with the sheer amount of dominance that Cloudflare has over things.  Also, with Cloudflare handling the SSL certs and providing the CDN, it means that Cloudflare decrypts all traffic to its servers before reencrypting it when it leaves.  From a privacy standpoint, I slowly became less and less comfortable with this concept as well.  Not that there have been &lt;em&gt;any&lt;/em&gt; reports of Cloudflare doing anything nefarious with data but it just didn&amp;rsquo;t sit right with me anymore in this era of &amp;ldquo;big data.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So what is the alternative?  Well, there are a few.  My basic requirements were 1) free, 2) support DNS-01 ACME challenge for Let&amp;rsquo;s Encrypt/ZeroSSL certs, and 3) support an API of some kind to allow dynamic DNS updates in case my home IP address changes (ideally with OPNsense as that&amp;rsquo;s what I use).  There were a few options out there that fit the bill.  Ultimately I ended up switching to Linode&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://www.linode.com/docs/guides/dns-manager/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DNS Manager&lt;/a&gt;.  Linode uses Cloudflare for DDoS mitigation, load balancing and distributed name servers.  But as best I can tell, NOT it&amp;rsquo;s CDN so my traffic isn&amp;rsquo;t proxied through Cloudflare&amp;rsquo;s servers.&lt;/p&gt;
&lt;p&gt;Adding a domain to Linode is super easy and I found the documentation here perfectly clear.  The major downside I&amp;rsquo;ve found with Linode is that it&amp;rsquo;s slower than Cloudflare to propagate DNS changes.  With Cloudflare, I would create a new CNAME entry for example and it would be available in less than 5 minutes.  Linode seems to only update their records every 15 minutes or so, which in the grand scheme of things is fine.  I mean, how often do you really switch your DNS entries?  Linode also doesn&amp;rsquo;t support DNSSEC yet but for my purposes that&amp;rsquo;s fine.&lt;/p&gt;
&lt;p&gt;So far I&amp;rsquo;ve switched this domain and another off Cloudflare to Linode and have had zero issues.  So I don&amp;rsquo;t see any reason to switch back.&lt;/p&gt;
&lt;h1 id=&#34;nginxreverse-proxy&#34;&gt;NGINX/Reverse Proxy
&lt;/h1&gt;&lt;p&gt;So that was the DNS change.  While I was doing that I figured why not check out different reverse proxies (have I mentioned I&amp;rsquo;m a bit of a technomasochist?).  The main contenders I considered were Traefik and Caddy.  I know many people over on the Selfhosted subreddit &lt;em&gt;love&lt;/em&gt; Traefik and sing its praises.  It&amp;rsquo;s particularly great if you run lots of Docker containers as it handles reverse proxying to those really easily just by adding some environmental variables to the container in question.  I&amp;rsquo;d tried Traefik before and just&amp;hellip;couldn&amp;rsquo;t wrap my head around it.  Plus I found the configuration by labels just confusing as heck (and potentially making for a long docker-compose file!).  I also found the documentation sorely lacking and unfortunately when I was trying it the devs had just upgraded from v1 to v2, making a number of breaking changes and the guides out there on the internet hadn&amp;rsquo;t been updated.  Overall, just very frustrating for me.  That left Caddy.&lt;/p&gt;
&lt;p&gt;Caddy also had a major update from v1 to v2 last year and from what I can gather it was not a smooth update for all and there are still some things that aren&amp;rsquo;t quite there yet (I&amp;rsquo;ll explain more below).  And the &lt;a class=&#34;link&#34; href=&#34;https://caddyserver.com/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;documentation&lt;/a&gt; still is not very clear on all things.  But overall, I have found it to be remarkably simple to set up.  The feature I&amp;rsquo;m loving the most so far is that a lot of the defaults are things I already want, like some basic HTTP headers.  I don&amp;rsquo;t have to declare them every single time.&lt;/p&gt;
&lt;p&gt;For example, here is my NGINX config for Healthchecks:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
    listen         80;
    server_name    hc.fuzzymistborn.com;
    return         301 https://$host$request_uri;
}

server {

        listen 443 ssl;
        server_name hc.fuzzymistborn.com;

        ssl_certificate      /etc/nginx/ssl/cert.pem;
        ssl_certificate_key  /etc/nginx/ssl/key.pem;
        ssl_client_certificate /etc/nginx/ssl/cloudflare.crt;
        ssl_verify_client on;
        ssl_prefer_server_ciphers on;

    location / {

        proxy_pass http://healthchecks:8000/;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $remote_addr;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &amp;#34;upgrade&amp;#34;;

    }

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Yes, there&amp;rsquo;s probably something wrong in there but you&amp;rsquo;ll see my point when you look at my Caddyfile:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hc.fuzzymistborn.com

reverse_proxy localhost:8000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ok, not quite the full file (again, I&amp;rsquo;ll explain later) but you see what I mean but how much simpler it is.  Caddy 1) by defaults upgrades everything from HTTP to HTTPS, 2) can handle the SSL cert generation if needed, and 3) takes care of most of the headers for you.  In some cases I still needed to add &lt;code&gt;X-Real-IP&lt;/code&gt; and &lt;code&gt;X-Forwarded-Proto&lt;/code&gt; but that can easily be handled.  Once you wrap your head around the principles of Caddy it&amp;rsquo;s easy to see the allure and simplicity of it (and the much much shorter config file!).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not all sunshine and daisies though.  Here are some of my issues with Caddy.  First, if I was to define each subdomain like in my example above, it would fetch SSL certs for &lt;em&gt;each&lt;/em&gt; subdomain.  Not very efficient, and while I don&amp;rsquo;t have that many subdomains, it&amp;rsquo;s enough that I don&amp;rsquo;t want to deal with it.  To get around that, I wanted to use a wildcard cert.  To do that, you need to utilize the &lt;a class=&#34;link&#34; href=&#34;https://caddyserver.com/docs/caddyfile/patterns#wildcard-certificates&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;handlers and host matchers&lt;/a&gt;, so my actual config looks more like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;*.fuzzymistborn.com {

        @hc host hc.fuzzymistborn.com
        handle @hc {
                reverse_proxy localhost:8000
        }

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which then brings me to my second issue.  For some reason I&amp;rsquo;m not very clear on, Caddy in v2 decided to ditch using &lt;a class=&#34;link&#34; href=&#34;https://github.com/go-acme/lego&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LEGO&lt;/a&gt; for it&amp;rsquo;s DNS authentication and switched to &lt;a class=&#34;link&#34; href=&#34;https://github.com/libdns/libdns&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;libdns&lt;/a&gt; which is missing a LOT of providers that LEGO supports, including Linode in my case.  The previous plugin is &lt;a class=&#34;link&#34; href=&#34;https://github.com/caddy-dns/lego-deprecated&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;still available&lt;/a&gt; and can be installed but I found the documentation confusing on how exactly to implement it.  Instead, I just decided to use LEGO (which btw is probably my favorite name for something as it&amp;rsquo;s for generating Let&amp;rsquo;s Encrypt (LE) certs and it&amp;rsquo;s written in GO, so LEGO is amazing) and pull the certs manually.  I then configured LEGO via a cronjob to renew the certs.  So I &amp;ldquo;lost&amp;rdquo; one of the main benefits of Caddy over NGINX.&lt;/p&gt;
&lt;p&gt;A third issue is that Caddy is compartmentalized, meaning to get certain features you need to download/compile it into the binary.  Things like DNS resolvers aren&amp;rsquo;t built into the default but must be added.  It&amp;rsquo;s all relatively simple and I understand the reasoning behind it (makes it simpler to develop) but from an enduser it&amp;rsquo;s confusing and at times frustrating.  For example, the DNS providers have to be individually added instead of in a single library/plugin.&lt;/p&gt;
&lt;p&gt;Overall I&amp;rsquo;m not entirely sold on the benefits of Caddy over NGINX.  I like having a single, clean, simple config file and now that I&amp;rsquo;ve figured some things out I appreciate the defaults/basic structure.  But it was not simple and there are some definite quirks.  Honestly I&amp;rsquo;m not sure if I&amp;rsquo;ll stick with it or switch back to NGINX as there is more documentation/support out there for NGINX than there is for Caddy.  If you&amp;rsquo;re curious, you can see my Caddyfile over on my Ansible infra Github repo &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/infra/blob/main/roles/ambition/templates/Caddyfile.j2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s next for me is to set up some kind of VPN tunnel between my VPS and homelab so I don&amp;rsquo;t need to expose my homelab to the outside world, probably using something like &lt;a class=&#34;link&#34; href=&#34;https://github.com/slackhq/nebula&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nebula&lt;/a&gt;, though I have been playing around with a Wireguard tunnel too.  Once I get that going, I&amp;rsquo;ll switch my last personal domain off Cloudflare.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Using WakeOnLan with Opnsense and HomeAssistant</title>
        <link>https://blog.fuzzymistborn.com/opnsense-wol/</link>
        <pubDate>Fri, 28 May 2021 08:38:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/opnsense-wol/</guid>
        <description>&lt;p&gt;Note: Significant hat tip here to &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/user/abstractbarista/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;/u/abstractbarista&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/homeassistant/comments/bxniet/turn_on_lg_webos_tv_across_subnets_via_opnsense/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this guide&lt;/a&gt;.  Most of the steps below come from their guide.  The main differences being 1) little bit improved layout/format (subjective) and 2) I figured out how to do a call to just wake a single device.&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Wake-on-LAN&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WakeOnLAN&lt;/a&gt; is one of those things that you love to hate.  When it works, it&amp;rsquo;s magical.  When it doesn&amp;rsquo;t it&amp;rsquo;s beyond frustrating.  My biggest annoyance is with my network setup, I have multiple VLANs/subnets, and WOL doesn&amp;rsquo;t really like to be routed across subnets for reasons I only barely understand so I&amp;rsquo;m not going to try to explain.  To get around this, my solution for a long time was to have a Raspberry Pi Zero on the subnet I wanted with the &lt;code&gt;wakeonlan&lt;/code&gt; package.  I then set up SSH keys and added it to HomeAssistant, along with a script I could call via a &lt;code&gt;shell_command&lt;/code&gt;.  It worked great but having to poke firewall rules, having SSH keys on HomeAssistant, etc always made me a little uncomfortable.&lt;/p&gt;
&lt;p&gt;My bigger problem was that I needed a Pi Zero on the same subnet which usually wasn&amp;rsquo;t a problem.  However I&amp;rsquo;ve been playing around with a homelab (my old retired server) but I didn&amp;rsquo;t want it running 24/7 wasting power when I only use it sporadically.  Instead of having to shut it down/turn it back on (requiring me to trudge down to my basement) I figured I&amp;rsquo;d try using WOL and just suspending the server when I&amp;rsquo;m not using it.  Well I don&amp;rsquo;t have a Wifi network for my Homelab VLAN so I can&amp;rsquo;t use a Pi Zero, and I really didn&amp;rsquo;t want to use a full Pi for something as simple as WOL.&lt;/p&gt;
&lt;p&gt;Enter Opnsense.  I&amp;rsquo;ve been running Opnsense as my firewall for about 2 months now and I have to say I love it.  Coming from an Edgerouter the difference is just night and day.  The main thing I&amp;rsquo;m really loving is all the plugins and tools that are available.  You can do so much on your router if you run Opnsense/PFsense (depending on which is your cup of tea, not getting into the debate between the two here) it really is worth it.  I discovered Opnsense has a WOL plugin and found it worked great.  Worst case I could just log into Opnsense, go to the WOL service and wake up my homelab server.  But that&amp;rsquo;s just too much effort when you can get it into HomeAssistant!&lt;/p&gt;
&lt;h1 id=&#34;opnsense-setup&#34;&gt;Opnsense Setup
&lt;/h1&gt;&lt;p&gt;Opnsense has a REST API that you can call prettily easily, particularly when combined with HomeAssistant&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/rest_command/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;REST API command integration&lt;/a&gt;.  The documentation for the &lt;a class=&#34;link&#34; href=&#34;https://wiki.opnsense.org/development/api/plugins/wol.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WOL API&lt;/a&gt; on Opnsense is&amp;hellip;.lacking.  However, the Reddit post from /u/abstractbarista linked above got me 90% of the way there.  Their solution was simply to wake all devices.  I wanted to target mine since I have a few that I like to sleep/wake up so I kept digging a bit.  Here&amp;rsquo;s the basic steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the &lt;code&gt;os-wol&lt;/code&gt; plugin in Opnsense by going to &lt;code&gt;System-&amp;gt;Firmware-&amp;gt;Plugins&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;Services-&amp;gt;Wake on Lan&lt;/code&gt; and click the plus icon in the bottom right corner next to &amp;ldquo;Wake All&amp;rdquo;, and add your device/MAC address along with the interface.  I think this step is optional given the later steps but it can&amp;rsquo;t hurt to add.&lt;/li&gt;
&lt;li&gt;Next step is creating a REST API token.  You could use an existing Opnsense user but I&amp;rsquo;d suggest creating a separate one just for HASS.  Go to &lt;code&gt;System-&amp;gt;Access-&amp;gt;Users-&amp;gt;Add&lt;/code&gt;.  Pick a username (doesn&amp;rsquo;t matter) and enter a stupidly long/secure password (you&amp;rsquo;ll probably never need it).  Leave everything else as default. Click &amp;ldquo;Save and go back&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;By default the user can&amp;rsquo;t do anything.  You&amp;rsquo;ll need to give it permission to access to the API.  Edit the user and scroll down to &amp;ldquo;Effective Privileges&amp;rdquo;.  Click the edit button and search for &amp;ldquo;Services: Wake On Lan&amp;rdquo;.  Select it and then save.  Then scroll down and create an API key by clicking the plus button.  You&amp;rsquo;ll be prompted to download a txt file that will have the user/key you&amp;rsquo;ll need later.  Save this somewhere for now.  Click Save at the bottom.&lt;/li&gt;
&lt;li&gt;Depending on how you have your firewall rules set up, you probably need to create one to allow HomeAssistant to connect to the REST API on Opnsense.  I&amp;rsquo;m assuming you know how to create firewall rules for your network, but the specific rule you need is to allow traffic from your HomeAssitant instance to &amp;ldquo;This Firewall&amp;rdquo; on either HTTP or HTTPS (depending on whether you have HTTPS enabled on Opnsense).  Congrats, you&amp;rsquo;re done with the setup on Opnsense.  The rest is easy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;homeassistant-setup&#34;&gt;HomeAssistant Setup
&lt;/h1&gt;&lt;p&gt;As mentioned above, HomeAssistant has a REST Command integration.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rest_command:
  wake_device:
      url: &amp;#39;http://OPNSENSE_URL/api/wol/wol/set&amp;#39;
      method: POST
      payload: &amp;#39;{&amp;#34;wake&amp;#34;:{&amp;#34;interface&amp;#34;: &amp;#34;INTERFACE&amp;#34;,&amp;#34;mac&amp;#34;: &amp;#34;DEVICE_MAC&amp;#34;}}&amp;#39;
      content_type:  &amp;#39;application/json&amp;#39;
      username: !secret opnsense_user
      password: !secret opnsense_key
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There are a few things to note here.  First, the Opnsense URL should be either HTTP or HTTPS depending on your setup.  If you use HTTPS you may need to add &lt;code&gt;verify_ssl: false&lt;/code&gt;.  The &lt;code&gt;/api/wol/wol/set&lt;/code&gt; is the part that matters/shouldn&amp;rsquo;t change.  Second, to find the value for the interface, you&amp;rsquo;ll need to go to &amp;ldquo;Interfaces&amp;rdquo; in Opnsense and figure out the designation for the interface where the device you&amp;rsquo;re trying to wake up is.  Just click on the interface and look at the URL.  You should see something like &lt;code&gt;/interfaces.php?if=opt5&lt;/code&gt;.  &lt;code&gt;opt5&lt;/code&gt; is what you want.  The device MAC is self explanatory.  For username and password, put the user/key from the txt file you downloaded during step 4 above.  Restart HomeAssistant and you now have a new service call, &lt;code&gt;rest_command.wake_device&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;From here, you can use the command however you want.  Personally I combine it along with a template switch and binary ping sensor so I can put my desktop to sleep/wake it up with a switch.  Totally up to you where you want to go from here.&lt;/p&gt;
&lt;p&gt;Hope someone finds this useful, and again major thanks to /u/abstractbarista for the inspiration and most of the heavy lifting!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Home Automations for Kids</title>
        <link>https://blog.fuzzymistborn.com/automations-for-kids/</link>
        <pubDate>Wed, 28 Apr 2021 04:32:58 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/automations-for-kids/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/automations-for-kids/header.jpeg" alt="Featured image of post Home Automations for Kids" /&gt;&lt;p&gt;No, this is not and article on how to get your kids to want to create your home automations for you.  Sorry.  But I&amp;rsquo;ve been meaning for a long time to document some of the home automations things I do to make life easier with a baby/toddler.  Hope you find these helpful and perhaps give you some ideas of your own!&lt;/p&gt;
&lt;p&gt;As inspiration, a popular baby item is the &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/Hatch-Baby-Night-Light-Machine/dp/B06XMRCC94&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hatch Baby Rest&lt;/a&gt;, which is a sound machine, night light, and time-to-rise/ok-to-wake clock all built into one.  It&amp;rsquo;s pretty reasonably priced at $60 and is &amp;ldquo;smart&amp;rdquo; in that you can control it from your smartphone.  However, I have two issues with the device.  1) it uses Bluetooth, which can be a notoriously fickle beast, and 2) because it&amp;rsquo;s Bluetooth, it means no Home Assistant control!  There&amp;rsquo;s an $80 version that&amp;rsquo;s WiFi enabled &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/Hatch-Baby-Machine-Monitor-Nightlight/dp/B07WFXGNGF&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; but again it&amp;rsquo;s not in HomeAssistant.  So where&amp;rsquo;s the fun in that when you can DIY something yourself that&amp;rsquo;s infinitely more customizable?&lt;/p&gt;
&lt;h1 id=&#34;sound-machine&#34;&gt;Sound Machine
&lt;/h1&gt;&lt;h2 id=&#34;introduction&#34;&gt;Introduction
&lt;/h2&gt;&lt;p&gt;My very first automation set up was a smart sound machine.  For a while we were using a dumb sound machine which worked fine.  The first one ran on batteries and we churned through them.  We upgraded to a plugged in one but then it was well&amp;hellip;annoying to have to turn on the sound machine like a caveman.  To make a smart sound machine, I ultimately settled upon a Raspberry Pi running &lt;a class=&#34;link&#34; href=&#34;https://volumio.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Volumio&lt;/a&gt;.  This is a pretty nifty piece of software that is a great option if you want high quality sound.  I wasn&amp;rsquo;t particularly interested in that aspect of it, but it checks the boxes of 1) Runs on a Pi and 2) has a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/volumio/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HomeAssistant component&lt;/a&gt; that allows us to do what we need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parts Needed:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raspberry Pi&lt;/strong&gt; (a 3B or 3B+ will do.  So would a 4 but that is overkill), along with a power supply&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speaker with a 3.5mm headphone jack&lt;/strong&gt; (and a cable to connect the Pi to the speaker)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional (but strongly recommended): Door/contact sensor.&lt;/strong&gt;  Useful for being the trigger to turn the sound machine on/off, but can use voice controls if needed.  Zwave/Zigbee/433mhz all would work here depending on your setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional: Raspberry Pi UPS.&lt;/strong&gt;  I picked &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/Makerfocus-Raspberry-2500mAh-Lithium-Battery/dp/B01MQYX4UX&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt; but there are a few drawbacks.  1) it&amp;rsquo;s got some stupidly bright LEDs that I&amp;rsquo;ve had to cover with electrical tape and 2) it&amp;rsquo;s design is such that if the battery is completely drained and power is restored, the Pi won&amp;rsquo;t boot back up without manual intervention.  I can live with that since if the power is out for that long and the Pi dies, I&amp;rsquo;ve got bigger issues.  I also struggled to find a case that would work, ultimately deciding to leave the Pi naked.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;volumio-setup&#34;&gt;Volumio Setup
&lt;/h2&gt;&lt;p&gt;The build here is really pretty simple.  Take a Pi, get an SD card, flash it with your flashing program of choice (I like &lt;a class=&#34;link&#34; href=&#34;https://www.balena.io/etcher/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BalenaEtcher&lt;/a&gt; personally), insert the SD card and start up the Pi.  The Volumio &lt;a class=&#34;link&#34; href=&#34;https://cdn.volumio.org/wp-content/uploads/2019/01/Quick-Start-Guide-Volumio.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Getting Started Guide&lt;/a&gt; is pretty well done and should get you set up so the Pi is on your network (WiFi works fine for our purposes, you&amp;rsquo;ll just need to follow the steps to get the Pi on your network).  There&amp;rsquo;ll be a setup guide, you should be able to just stick to the defaults.&lt;/p&gt;
&lt;p&gt;If you want to use a network drive you can add it during the setup.  But I&amp;rsquo;d suggest the following instead in case your internet/power goes out.  Enable SSH following &lt;a class=&#34;link&#34; href=&#34;https://volumio.github.io/docs/User_Manual/SSH.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;these instructions&lt;/a&gt;.  What white noise you want to use/works best for your kid is up to you.  Mine likes ocean noises.  Save the file to &lt;code&gt;/data/INTERNAL&lt;/code&gt; using your SFTP program of choice (I like FileZilla).&lt;/p&gt;
&lt;p&gt;When you navigate to the IP address of the Pi an you&amp;rsquo;ll see a screen like this (versions may have different versions):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio1.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Unfortunately it&amp;rsquo;s been a while since I set these up so I can&amp;rsquo;t recall all the settings I needed to change, but the file we loaded to the Pi should appear in &amp;ldquo;Music Library&amp;rdquo;.  You can tweak some of the other settings to your liking.  The one that you need to change is in &amp;ldquo;General Playback Options.&amp;rdquo;  Scroll down till you get to &amp;ldquo;Playback Mode&amp;rdquo; and make sure it&amp;rsquo;s on &amp;ldquo;Continuous&amp;rdquo; and not &amp;ldquo;Single.&amp;rdquo;  Otherwise the track will just play once and not repeat (which is something you&amp;rsquo;ll want for white noise).  I also set the startup volume to 80% but you&amp;rsquo;ll want to tweak based on your setup/what works for you.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio2.png&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Next let&amp;rsquo;s set up a playlist.  Click on &amp;ldquo;Music Library&amp;rdquo; and &amp;ldquo;Internal.&amp;rdquo;  You should see the file you loaded up.  If you click the 3 dot icon on the far right side, you should see an option to add to playlist.  Create a new playlist (call it what you want, I called mine &amp;ldquo;Whitenoise&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio3.png&#34;
	width=&#34;1031&#34;
	height=&#34;793&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio3_hu_32b13ba8f334a1dd.png 480w, https://blog.fuzzymistborn.com/automations-for-kids/volumio3_hu_e11240f0835b50ba.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Volumio Music Library&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;130&#34;
		data-flex-basis=&#34;312px&#34;
	
&gt; &lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio4.png&#34;
	width=&#34;1046&#34;
	height=&#34;794&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/automations-for-kids/volumio4_hu_9ddae4d08854f471.png 480w, https://blog.fuzzymistborn.com/automations-for-kids/volumio4_hu_c741396b8edfefc2.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;Volumio Song&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;131&#34;
		data-flex-basis=&#34;316px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I suggest playing the playlist to test that everything is working on the Volumio side.  Including making sure the track repeats.&lt;/p&gt;
&lt;h2 id=&#34;hass-setup&#34;&gt;HASS Setup
&lt;/h2&gt;&lt;p&gt;Assuming everything is working on the Volumio side, let&amp;rsquo;s move to HASS.  Open your HASS instance, go to Integrations and click the add button and search for Volumio.  Input the IP address of your Volumio instance and everything should get set up for you.  This will create a &lt;code&gt;media_player&lt;/code&gt; entity for you.  Personally I found a switch easier (will allow easier automations and voice controls), so I set up a template switch like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  - platform: template
    switches:
      kid_sound_machine:
        friendly_name: &amp;#34;Kid Sound Machine&amp;#34;
        value_template: &amp;#34;{{ is_state(&amp;#39;media_player.kid_sound_machine&amp;#39;, &amp;#39;playing&amp;#39;) }}&amp;#34;
        turn_on:
          service: media_player.select_source
          data:
            entity_id: media_player.kid_sound_machine
            source: Whitenoise
        turn_off:
          service: media_player.media_pause
          data:
            entity_id: media_player.kid_sound_machine
        icon_template: mdi:cast-connected
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The above switch will be on if Volumio is playing and off otherwise.  Toggling the switch will call the &lt;code&gt;media_player.select_source&lt;/code&gt; service call.  You&amp;rsquo;ll need to alter the entity_id to match your device and the source to be the name of your playlist.  Alter the entity_id for the turn_off call as well and you should be good and ready to automate!&lt;/p&gt;
&lt;p&gt;How exactly you want to automate is up to you so I&amp;rsquo;m not going to share any automation code.  But here&amp;rsquo;s what I have setup.  For starters, I have a &amp;ldquo;bedtime&amp;rdquo; script that gets triggered by a Zigbee Aqara button (my toddler loves to push it) that does a random TTS saying &amp;ldquo;Goodnight&amp;rdquo; and dims the lights while we read books.  The script pauses until the door to the kid&amp;rsquo;s bedroom is closed, and then it shuts off the lights and turns on the sound machine.  If we open the door in the middle of the night, the light turns on very dim so we can see but not blind anybody (and again shuts off if the door is closed).  It doesn&amp;rsquo;t shut the sound machine off.  In the morning (i.e. between 5:30 and 8:00am), if the door is opened the sound machine shuts off and the light slowly ramps up to full brightness.&lt;/p&gt;
&lt;p&gt;I have a slightly different setup for naptime.  During the daytime, if the door is closed and the light in the kiddo&amp;rsquo;s room is still on, the sound machine doesn&amp;rsquo;t turn on, though the automation loops every couple of seconds to check if the light is off.  Once the light is off, the sound machine turns on.  I did put a check for naptimes to not turn the sound machine off/turn on the lights during the day if the sound machine changed within the last 15 minutes, using this template: &lt;code&gt;{{ ((as_timestamp(now()) - as_timestamp(states.switch.kid_sound_machine.last_changed)) / 60 | float ) &amp;gt; 15 }}&lt;/code&gt;.  That way we can go if needed right after putting kiddo down.  Outside of that, if the door is opened and the sound machine is on, the sound machine shuts off and the same slow light ramp up as the morning runs.&lt;/p&gt;
&lt;p&gt;Honestly the setup has been fairly bulletproof (even when grandparents visit/watch the kiddo while mom and dad go out for a date) and has made things just a little easier for bedtime and in the morning.&lt;/p&gt;
&lt;h3 id=&#34;misc-thoughts&#34;&gt;Misc. Thoughts
&lt;/h3&gt;&lt;p&gt;Note in some circumstances I ran into issues where when I connected the Pi and the speaker to the same power plug I was getting ground feedback which was REALLY painful to hear.  Ultimately just doing some finagling and I resolved this, so if you run into the issue try different cords/power supplies/adapters/plugs etc.  Originally I was planning on using Bluetooth for the connection from the Pi to the speaker but&amp;hellip;see my thoughts on Bluetooth and it being temperamental.&lt;/p&gt;
&lt;h1 id=&#34;ok-to-wake-clock&#34;&gt;Ok to Wake Clock
&lt;/h1&gt;&lt;p&gt;This one is fairly new as my toddler started getting out of bed in the middle of the night and we wanted to try to find a way to get him to stay in bed.  And also for some naps when he doesn&amp;rsquo;t sleep we wanted a way to signal to him when it is ok to get out of bed.  So I designed a series of automations that 1) will turn the light red when he gets out of bed in the middle of the night (doubles as a night light) and 2) will turn the light red an hour before a time we set and then green when the time hits.  Then for naptime there&amp;rsquo;s a timer that when there&amp;rsquo;s less than 10 minutes left turns the light red, and then when the timer hits zero goes green.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t say it&amp;rsquo;s completely successful as my toddler has still gotten out of bed on multiple ocassions and pounded on his door until we go in and tuck him back into bed.  But there have been a few times where he&amp;rsquo;s gotten out of bed, the light has gone red and he&amp;rsquo;s gotten back in so I&amp;rsquo;m going to call it a win.  Hey, you take your victories with toddlers where you can!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parts Needed:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bed sensor&lt;/strong&gt; (previously covered &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/esp8266-projects/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;, based on guide &lt;a class=&#34;link&#34; href=&#34;https://medium.com/the-smarter-home/smart-bed-7de9ad55276e&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Some kind of smart LED bulb&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional: Door sensor&lt;/strong&gt; (but you already have one for the sound machine right?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hass-entity-setup&#34;&gt;HASS Entity Setup
&lt;/h2&gt;&lt;p&gt;Initially I used some &lt;code&gt;input_selects&lt;/code&gt; to set the wakeup times, but I recently switched to using &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/input_datetime/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;input_datetime&lt;/code&gt;&lt;/a&gt; instead and it&amp;rsquo;s much nicer.  I created 2: one for &amp;ldquo;normal&amp;rdquo; wakeup times and the other for custom wakeup times in case I need to change something on the fly and don&amp;rsquo;t want to change the &amp;ldquo;normal&amp;rdquo; time.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;input_datetime:
  toddler_wake:
    name: &amp;#34;Time&amp;#34;
    has_date: false
    has_time: true

  toddler_custom_wake:
    name: &amp;#34;Time&amp;#34;
    has_date: false
    has_time: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I also created an &lt;code&gt;input_boolean&lt;/code&gt; to toggle the custom time on/off.&lt;/p&gt;
&lt;p&gt;To control the color of the light, I created a fairly complicated template sensor:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  - platform: template
    sensors:
      toddler_wake_trigger:
        friendly_name: &amp;#39;Trigger&amp;#39;
        value_template: &amp;gt;
          {% if (state_attr(&amp;#39;input_datetime.toddler_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) - 3600) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) &amp;lt;= states(&amp;#39;sensor.time&amp;#39;) &amp;lt; state_attr(&amp;#39;input_datetime.toddler_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) %}
            Red
          {% elif (state_attr(&amp;#39;input_datetime.toddler_wake&amp;#39;, &amp;#39;timestamp&amp;#39;)) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) &amp;lt;= states(&amp;#39;sensor.time&amp;#39;) &amp;lt; (state_attr(&amp;#39;input_datetime.toddler_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) + 600) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) %}
            Green
          {% else %}
            off
          {%- endif %}
      toddler_wake_custom_trigger:
        friendly_name: &amp;#39;Trigger&amp;#39;
        value_template: &amp;gt;
          {% if ((state_attr(&amp;#39;input_datetime.toddler_custom_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) - 3600) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) &amp;lt;= states(&amp;#39;sensor.time&amp;#39;) &amp;lt; state_attr(&amp;#39;input_datetime.toddler_custom_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false)) and states(&amp;#39;input_boolean.caw_wakeup_custom&amp;#39;) == &amp;#39;on&amp;#39;  %}
            Red
          {% elif (state_attr(&amp;#39;input_datetime.toddler_custom_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) &amp;lt;= states(&amp;#39;sensor.time&amp;#39;) &amp;lt; (state_attr(&amp;#39;input_datetime.toddler_custom_wake&amp;#39;, &amp;#39;timestamp&amp;#39;) + 600) | timestamp_custom(&amp;#39;%H:%M&amp;#39;, false) ) %}
            Green
          {% else %}
            off
          {%- endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To explain, if the time is between 1 hour of the time set by the &lt;code&gt;input_datetime&lt;/code&gt; and the current time, the sensor state is Red.  I use the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/time_date/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Time&amp;amp;Date&lt;/a&gt; integration but you could also substitute in &lt;code&gt;now&lt;/code&gt; if you wanted.  If the current time is equal to or greater than the time set (up to 10 minutes) then the state is Green.  Otherwise it&amp;rsquo;s off.  I use this sensor state to drive a series of automations to turn the light to Red/Green/Off depending on if the kiddo is out of bed when he shouldn&amp;rsquo;t be.  I&amp;rsquo;ll have a copy of my NodeRed flows at the end of the post so you can see what I&amp;rsquo;m doing.&lt;/p&gt;
&lt;p&gt;The other thing I have is a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/timer/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;timer&lt;/a&gt; that controls naptime.  When the door is closed during the day, an automation calls the &lt;code&gt;timer.start&lt;/code&gt; service with a duration set by an &lt;code&gt;input_select&lt;/code&gt;, though I subtract 10 minutes off.  When the timer ends, an event is generated by HASS that you can then trigger off of, which I use to set the light to red for 10 minutes and then turn green.&lt;/p&gt;
&lt;h2 id=&#34;lovelace-setup&#34;&gt;Lovelace Setup
&lt;/h2&gt;&lt;p&gt;For my dashboard, I relied on the awesome &lt;a class=&#34;link&#34; href=&#34;https://github.com/GeorgeSG/lovelace-time-picker-card&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Time Picker Card&lt;/a&gt;, with a final product that looks like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/ok-to-wake1.png&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Simple but functional.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;If you have any other great parenting automations I&amp;rsquo;d love to hear!  This post turned out to be longer than I anticipated and I may have left some things out.  If you are at all interested in more information on my setup, please feel free to hit me up on Discord, Reddit, or open a Github issue on my blog&amp;rsquo;s repo.  But overall these automations have assisted me in parenting by handling menial tasks (like controlling lights and sound machines) so I can focus on the kiddo.&lt;/p&gt;
&lt;h2 id=&#34;automation&#34;&gt;Automation
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s my NodeRed flow for the Ok To Wake part:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automations-for-kids/ok-to-wake2.png&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[{&amp;#34;id&amp;#34;:&amp;#34;c70c60fa.07d298&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;time-range-switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;lat&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;lon&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;startTime&amp;#34;:&amp;#34;19:00&amp;#34;,&amp;#34;endTime&amp;#34;:&amp;#34;05:45&amp;#34;,&amp;#34;startOffset&amp;#34;:0,&amp;#34;endOffset&amp;#34;:0,&amp;#34;x&amp;#34;:570,&amp;#34;y&amp;#34;:4400,&amp;#34;wires&amp;#34;:[[&amp;#34;bf7349b0.84f1a8&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;50d4e1aa.35ce68&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-call-service&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Nightlight Red 50%&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;debugenabled&amp;#34;:false,&amp;#34;service_domain&amp;#34;:&amp;#34;light&amp;#34;,&amp;#34;service&amp;#34;:&amp;#34;turn_on&amp;#34;,&amp;#34;entityId&amp;#34;:&amp;#34;light.toddler_lamp&amp;#34;,&amp;#34;data&amp;#34;:&amp;#34;{\&amp;#34;color_name\&amp;#34;:\&amp;#34;red\&amp;#34;,\&amp;#34;brightness_pct\&amp;#34;:\&amp;#34;50\&amp;#34;,\&amp;#34;transition\&amp;#34;:\&amp;#34;1\&amp;#34;}&amp;#34;,&amp;#34;dataType&amp;#34;:&amp;#34;json&amp;#34;,&amp;#34;mergecontext&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location_type&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;mustacheAltTags&amp;#34;:false,&amp;#34;x&amp;#34;:950,&amp;#34;y&amp;#34;:4420,&amp;#34;wires&amp;#34;:[[]]},{&amp;#34;id&amp;#34;:&amp;#34;580415a.1f37fec&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-call-service&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Nightlight Off&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;debugenabled&amp;#34;:false,&amp;#34;service_domain&amp;#34;:&amp;#34;light&amp;#34;,&amp;#34;service&amp;#34;:&amp;#34;turn_off&amp;#34;,&amp;#34;entityId&amp;#34;:&amp;#34;light.toddler_lamp&amp;#34;,&amp;#34;data&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;dataType&amp;#34;:&amp;#34;json&amp;#34;,&amp;#34;mergecontext&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location_type&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;mustacheAltTags&amp;#34;:false,&amp;#34;x&amp;#34;:930,&amp;#34;y&amp;#34;:4460,&amp;#34;wires&amp;#34;:[[]]},{&amp;#34;id&amp;#34;:&amp;#34;bf7349b0.84f1a8&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;payload&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;},{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;off&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:2,&amp;#34;x&amp;#34;:675,&amp;#34;y&amp;#34;:4400,&amp;#34;wires&amp;#34;:[[&amp;#34;50d4e1aa.35ce68&amp;#34;],[&amp;#34;580415a.1f37fec&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;8c020bf5.2132b8&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server-state-changed&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Toddler Door&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;exposeToHomeAssistant&amp;#34;:false,&amp;#34;haConfig&amp;#34;:[{&amp;#34;property&amp;#34;:&amp;#34;name&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;},{&amp;#34;property&amp;#34;:&amp;#34;icon&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;}],&amp;#34;entityidfilter&amp;#34;:&amp;#34;binary_sensor.door_toddler_bedroom&amp;#34;,&amp;#34;entityidfiltertype&amp;#34;:&amp;#34;exact&amp;#34;,&amp;#34;outputinitially&amp;#34;:false,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;haltifstate&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;outputs&amp;#34;:1,&amp;#34;output_only_on_state_change&amp;#34;:true,&amp;#34;for&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;forType&amp;#34;:&amp;#34;num&amp;#34;,&amp;#34;forUnits&amp;#34;:&amp;#34;minutes&amp;#34;,&amp;#34;ignorePrevStateNull&amp;#34;:true,&amp;#34;ignorePrevStateUnknown&amp;#34;:false,&amp;#34;ignorePrevStateUnavailable&amp;#34;:false,&amp;#34;ignoreCurrentStateUnknown&amp;#34;:false,&amp;#34;ignoreCurrentStateUnavailable&amp;#34;:false,&amp;#34;x&amp;#34;:250,&amp;#34;y&amp;#34;:4400,&amp;#34;wires&amp;#34;:[[&amp;#34;12a622ef.49a37d&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;12a622ef.49a37d&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Sound&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;switch.toddler_sound_machine&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:410,&amp;#34;y&amp;#34;:4400,&amp;#34;wires&amp;#34;:[[&amp;#34;c70c60fa.07d298&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;e04cfc1b.c8318&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server-state-changed&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Toddler out of bed&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;exposeToHomeAssistant&amp;#34;:false,&amp;#34;haConfig&amp;#34;:[{&amp;#34;property&amp;#34;:&amp;#34;name&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;},{&amp;#34;property&amp;#34;:&amp;#34;icon&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;}],&amp;#34;entityidfilter&amp;#34;:&amp;#34;binary_sensor.toddler_bed_sensor&amp;#34;,&amp;#34;entityidfiltertype&amp;#34;:&amp;#34;exact&amp;#34;,&amp;#34;outputinitially&amp;#34;:false,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;haltifstate&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;outputs&amp;#34;:1,&amp;#34;output_only_on_state_change&amp;#34;:true,&amp;#34;for&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;forType&amp;#34;:&amp;#34;num&amp;#34;,&amp;#34;forUnits&amp;#34;:&amp;#34;minutes&amp;#34;,&amp;#34;ignorePrevStateNull&amp;#34;:true,&amp;#34;ignorePrevStateUnknown&amp;#34;:true,&amp;#34;ignorePrevStateUnavailable&amp;#34;:true,&amp;#34;ignoreCurrentStateUnknown&amp;#34;:true,&amp;#34;ignoreCurrentStateUnavailable&amp;#34;:true,&amp;#34;x&amp;#34;:270,&amp;#34;y&amp;#34;:4500,&amp;#34;wires&amp;#34;:[[&amp;#34;ad0c136a.3b262&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;1a97fdb0.6f7e1a&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;payload&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;},{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;off&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:2,&amp;#34;x&amp;#34;:515,&amp;#34;y&amp;#34;:4500,&amp;#34;wires&amp;#34;:[[&amp;#34;ee3c11ad.ab3f4&amp;#34;],[&amp;#34;7a9130e7.19b018&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;3c1cf6ba.8db91a&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server-events&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Naptime Over&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;event_type&amp;#34;:&amp;#34;timer.finished&amp;#34;,&amp;#34;exposeToHomeAssistant&amp;#34;:false,&amp;#34;haConfig&amp;#34;:[{&amp;#34;property&amp;#34;:&amp;#34;name&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;},{&amp;#34;property&amp;#34;:&amp;#34;icon&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;}],&amp;#34;waitForRunning&amp;#34;:true,&amp;#34;x&amp;#34;:250,&amp;#34;y&amp;#34;:4700,&amp;#34;wires&amp;#34;:[[&amp;#34;4ca59a1d.91eb04&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;4ca59a1d.91eb04&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;payload.entity_id&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;timer.toddler_nap&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:1,&amp;#34;x&amp;#34;:390,&amp;#34;y&amp;#34;:4700,&amp;#34;wires&amp;#34;:[[&amp;#34;6ff4e0f4.16a788&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;ad0c136a.3b262&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Sound&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;switch.toddler_sound_machine&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:430,&amp;#34;y&amp;#34;:4500,&amp;#34;wires&amp;#34;:[[&amp;#34;1a97fdb0.6f7e1a&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;6a0240f6.f4479&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-call-service&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Nightlight Red 20%&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;debugenabled&amp;#34;:false,&amp;#34;service_domain&amp;#34;:&amp;#34;light&amp;#34;,&amp;#34;service&amp;#34;:&amp;#34;turn_on&amp;#34;,&amp;#34;entityId&amp;#34;:&amp;#34;light.toddler_lamp&amp;#34;,&amp;#34;data&amp;#34;:&amp;#34;{\&amp;#34;color_name\&amp;#34;:\&amp;#34;red\&amp;#34;,\&amp;#34;brightness_pct\&amp;#34;:\&amp;#34;20\&amp;#34;,\&amp;#34;transition\&amp;#34;:\&amp;#34;1\&amp;#34;}&amp;#34;,&amp;#34;dataType&amp;#34;:&amp;#34;json&amp;#34;,&amp;#34;mergecontext&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location_type&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;mustacheAltTags&amp;#34;:false,&amp;#34;x&amp;#34;:950,&amp;#34;y&amp;#34;:4560,&amp;#34;wires&amp;#34;:[[]]},{&amp;#34;id&amp;#34;:&amp;#34;813a29ca.756498&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server-state-changed&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Toddler Normal Wake&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;exposeToHomeAssistant&amp;#34;:false,&amp;#34;haConfig&amp;#34;:[{&amp;#34;property&amp;#34;:&amp;#34;name&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;},{&amp;#34;property&amp;#34;:&amp;#34;icon&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;}],&amp;#34;entityidfilter&amp;#34;:&amp;#34;sensor.toddler_wake_trigger&amp;#34;,&amp;#34;entityidfiltertype&amp;#34;:&amp;#34;exact&amp;#34;,&amp;#34;outputinitially&amp;#34;:false,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;haltifstate&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;outputs&amp;#34;:1,&amp;#34;output_only_on_state_change&amp;#34;:true,&amp;#34;for&amp;#34;:0,&amp;#34;forType&amp;#34;:&amp;#34;num&amp;#34;,&amp;#34;forUnits&amp;#34;:&amp;#34;minutes&amp;#34;,&amp;#34;ignorePrevStateNull&amp;#34;:false,&amp;#34;ignorePrevStateUnknown&amp;#34;:false,&amp;#34;ignorePrevStateUnavailable&amp;#34;:false,&amp;#34;ignoreCurrentStateUnknown&amp;#34;:false,&amp;#34;ignoreCurrentStateUnavailable&amp;#34;:false,&amp;#34;x&amp;#34;:280,&amp;#34;y&amp;#34;:4560,&amp;#34;wires&amp;#34;:[[&amp;#34;552e2175.3a42e&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;92f176f0.e80ea&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Custom Off&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;off&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;input_boolean.toddler_wakeup_custom&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:630,&amp;#34;y&amp;#34;:4560,&amp;#34;wires&amp;#34;:[[&amp;#34;f66c8284.fe6128&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;f66c8284.fe6128&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;payload&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;Red&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;},{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;Green&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:2,&amp;#34;x&amp;#34;:745,&amp;#34;y&amp;#34;:4560,&amp;#34;wires&amp;#34;:[[&amp;#34;6a0240f6.f4479&amp;#34;],[&amp;#34;d8bef19b.c0597&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;d8bef19b.c0597&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-call-service&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Nightlight Green 30%&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;debugenabled&amp;#34;:false,&amp;#34;service_domain&amp;#34;:&amp;#34;light&amp;#34;,&amp;#34;service&amp;#34;:&amp;#34;turn_on&amp;#34;,&amp;#34;entityId&amp;#34;:&amp;#34;light.toddler_lamp&amp;#34;,&amp;#34;data&amp;#34;:&amp;#34;{\&amp;#34;color_name\&amp;#34;:\&amp;#34;green\&amp;#34;,\&amp;#34;brightness_pct\&amp;#34;:\&amp;#34;30\&amp;#34;,\&amp;#34;transition\&amp;#34;:\&amp;#34;1\&amp;#34;}&amp;#34;,&amp;#34;dataType&amp;#34;:&amp;#34;json&amp;#34;,&amp;#34;mergecontext&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;output_location_type&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;mustacheAltTags&amp;#34;:false,&amp;#34;x&amp;#34;:960,&amp;#34;y&amp;#34;:4620,&amp;#34;wires&amp;#34;:[[]]},{&amp;#34;id&amp;#34;:&amp;#34;1dd70335.de05dd&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server-state-changed&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Toddler Custom Wake&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;exposeToHomeAssistant&amp;#34;:false,&amp;#34;haConfig&amp;#34;:[{&amp;#34;property&amp;#34;:&amp;#34;name&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;},{&amp;#34;property&amp;#34;:&amp;#34;icon&amp;#34;,&amp;#34;value&amp;#34;:&amp;#34;&amp;#34;}],&amp;#34;entityidfilter&amp;#34;:&amp;#34;sensor.toddler_wake_custom_trigger&amp;#34;,&amp;#34;entityidfiltertype&amp;#34;:&amp;#34;exact&amp;#34;,&amp;#34;outputinitially&amp;#34;:false,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;haltifstate&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;outputs&amp;#34;:1,&amp;#34;output_only_on_state_change&amp;#34;:true,&amp;#34;for&amp;#34;:0,&amp;#34;forType&amp;#34;:&amp;#34;num&amp;#34;,&amp;#34;forUnits&amp;#34;:&amp;#34;minutes&amp;#34;,&amp;#34;ignorePrevStateNull&amp;#34;:false,&amp;#34;ignorePrevStateUnknown&amp;#34;:false,&amp;#34;ignorePrevStateUnavailable&amp;#34;:false,&amp;#34;ignoreCurrentStateUnknown&amp;#34;:false,&amp;#34;ignoreCurrentStateUnavailable&amp;#34;:false,&amp;#34;x&amp;#34;:280,&amp;#34;y&amp;#34;:4620,&amp;#34;wires&amp;#34;:[[&amp;#34;7faf5a5f.a5726c&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;7aa5433f.5e89ac&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Custom On&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;input_boolean.toddler_wakeup_custom&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:630,&amp;#34;y&amp;#34;:4620,&amp;#34;wires&amp;#34;:[[&amp;#34;c1edd371.4f068&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;c1edd371.4f068&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;payload&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;Red&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;},{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;Green&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:2,&amp;#34;x&amp;#34;:745,&amp;#34;y&amp;#34;:4620,&amp;#34;wires&amp;#34;:[[&amp;#34;6a0240f6.f4479&amp;#34;],[&amp;#34;d8bef19b.c0597&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;2468b11d.f25156&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;delay&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;pauseType&amp;#34;:&amp;#34;delay&amp;#34;,&amp;#34;timeout&amp;#34;:&amp;#34;10&amp;#34;,&amp;#34;timeoutUnits&amp;#34;:&amp;#34;minutes&amp;#34;,&amp;#34;rate&amp;#34;:&amp;#34;1&amp;#34;,&amp;#34;nbRateUnits&amp;#34;:&amp;#34;1&amp;#34;,&amp;#34;rateUnits&amp;#34;:&amp;#34;second&amp;#34;,&amp;#34;randomFirst&amp;#34;:&amp;#34;1&amp;#34;,&amp;#34;randomLast&amp;#34;:&amp;#34;5&amp;#34;,&amp;#34;randomUnits&amp;#34;:&amp;#34;seconds&amp;#34;,&amp;#34;drop&amp;#34;:false,&amp;#34;x&amp;#34;:670,&amp;#34;y&amp;#34;:4700,&amp;#34;wires&amp;#34;:[[&amp;#34;d8bef19b.c0597&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;7a9130e7.19b018&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-render-template&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Green?&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;template&amp;#34;:&amp;#34;{{ state_attr(&amp;#39;light.toddler_lamp&amp;#39;, &amp;#39;rgb_color&amp;#39;) != (0,255,0) }}&amp;#34;,&amp;#34;resultsLocation&amp;#34;:&amp;#34;result&amp;#34;,&amp;#34;resultsLocationType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;templateLocation&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;templateLocationType&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;x&amp;#34;:620,&amp;#34;y&amp;#34;:4520,&amp;#34;wires&amp;#34;:[[&amp;#34;deb18a84.7afe4&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;deb18a84.7afe4&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;result&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;True&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:1,&amp;#34;x&amp;#34;:715,&amp;#34;y&amp;#34;:4520,&amp;#34;wires&amp;#34;:[[&amp;#34;6a0240f6.f4479&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;ee3c11ad.ab3f4&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-render-template&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Checks&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;template&amp;#34;:&amp;#34;{{ states(&amp;#39;binary_sensor.door_toddler_bedroom&amp;#39;) == &amp;#39;off&amp;#39; and ( states(&amp;#39;sensor.toddler_wake_trigger&amp;#39;) == &amp;#39;off&amp;#39; and states(&amp;#39;sensor.toddler_wake_custom_trigger&amp;#39;) == &amp;#39;off&amp;#39; ) }}&amp;#34;,&amp;#34;resultsLocation&amp;#34;:&amp;#34;result&amp;#34;,&amp;#34;resultsLocationType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;templateLocation&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;templateLocationType&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;x&amp;#34;:620,&amp;#34;y&amp;#34;:4480,&amp;#34;wires&amp;#34;:[[&amp;#34;6bd1c50f.179e34&amp;#34;]]},{&amp;#34;id&amp;#34;:&amp;#34;6bd1c50f.179e34&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;switch&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;property&amp;#34;:&amp;#34;result&amp;#34;,&amp;#34;propertyType&amp;#34;:&amp;#34;msg&amp;#34;,&amp;#34;rules&amp;#34;:[{&amp;#34;t&amp;#34;:&amp;#34;eq&amp;#34;,&amp;#34;v&amp;#34;:&amp;#34;True&amp;#34;,&amp;#34;vt&amp;#34;:&amp;#34;str&amp;#34;}],&amp;#34;checkall&amp;#34;:&amp;#34;true&amp;#34;,&amp;#34;repair&amp;#34;:false,&amp;#34;outputs&amp;#34;:1,&amp;#34;x&amp;#34;:715,&amp;#34;y&amp;#34;:4480,&amp;#34;wires&amp;#34;:[[&amp;#34;580415a.1f37fec&amp;#34;]],&amp;#34;l&amp;#34;:false},{&amp;#34;id&amp;#34;:&amp;#34;552e2175.3a42e&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Sound&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;switch.toddler_sound_machine&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:450,&amp;#34;y&amp;#34;:4560,&amp;#34;wires&amp;#34;:[[&amp;#34;92f176f0.e80ea&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;7faf5a5f.a5726c&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Sound&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;switch.toddler_sound_machine&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:450,&amp;#34;y&amp;#34;:4620,&amp;#34;wires&amp;#34;:[[&amp;#34;7aa5433f.5e89ac&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;6ff4e0f4.16a788&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;api-current-state&amp;#34;,&amp;#34;z&amp;#34;:&amp;#34;b06c555f.69395&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Sound&amp;#34;,&amp;#34;server&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;version&amp;#34;:1,&amp;#34;outputs&amp;#34;:2,&amp;#34;halt_if&amp;#34;:&amp;#34;on&amp;#34;,&amp;#34;halt_if_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;halt_if_compare&amp;#34;:&amp;#34;is&amp;#34;,&amp;#34;override_topic&amp;#34;:false,&amp;#34;entity_id&amp;#34;:&amp;#34;switch.toddler_sound_machine&amp;#34;,&amp;#34;state_type&amp;#34;:&amp;#34;str&amp;#34;,&amp;#34;state_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_payload&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;entity_location&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;override_data&amp;#34;:&amp;#34;none&amp;#34;,&amp;#34;blockInputOverrides&amp;#34;:false,&amp;#34;x&amp;#34;:510,&amp;#34;y&amp;#34;:4700,&amp;#34;wires&amp;#34;:[[&amp;#34;2468b11d.f25156&amp;#34;,&amp;#34;6a0240f6.f4479&amp;#34;],[]]},{&amp;#34;id&amp;#34;:&amp;#34;63517380.eb951c&amp;#34;,&amp;#34;type&amp;#34;:&amp;#34;server&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;Home Assistant&amp;#34;,&amp;#34;legacy&amp;#34;:false,&amp;#34;addon&amp;#34;:false,&amp;#34;rejectUnauthorizedCerts&amp;#34;:false,&amp;#34;ha_boolean&amp;#34;:&amp;#34;y|yes|true|on|home|open&amp;#34;,&amp;#34;connectionDelay&amp;#34;:true,&amp;#34;cacheJson&amp;#34;:true}]
&lt;/code&gt;&lt;/pre&gt;</description>
        </item>
        <item>
        <title>New Blog, Who Dis?</title>
        <link>https://blog.fuzzymistborn.com/new-blog-who-dis/</link>
        <pubDate>Sat, 10 Apr 2021 01:58:58 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/new-blog-who-dis/</guid>
        <description>&lt;p&gt;So for the past year, my blog has been run on the &lt;a class=&#34;link&#34; href=&#34;https://ghost.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ghost&lt;/a&gt; blogging platform.  And I really liked it.  It was simple, it worked, and I liked the look.  Why change you might ask?  Well&amp;hellip;first I have a problem where I constantly find myself wanting to tinker, even if there&amp;rsquo;s a perfectly working thing.  It can always be better right?  Also, Ghost just released a major update (v4) which indicates, at least to me, they&amp;rsquo;re taking the platform in a different direction from just being a blog platform.  Specifically they&amp;rsquo;re catering more to people who want to create newsletters/have subscriptions/generate revenue which&amp;hellip;.isn&amp;rsquo;t why I blog.  I blog for fun and to document things that I do so others can learn/benefit from my suffering&amp;hellip;err&amp;hellip;.experience.  And when I upgraded there was this big huge &amp;ldquo;subscribe&amp;rdquo; button in the middle of the header (which even more annoyingly 404&amp;rsquo;d when clicked):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/new-blog-who-dis/ghost-subscribe.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I don&amp;rsquo;t want to sound like I&amp;rsquo;m hating on Ghost, the platform is great and works very well.  The direction they&amp;rsquo;re heading just isn&amp;rsquo;t for me.  Sooo&amp;hellip;.new shiney time!&lt;/p&gt;
&lt;p&gt;Enter &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo&lt;/a&gt;.  It&amp;rsquo;s a static-site generator, which basically means it creates the webpages based on flat files.  There&amp;rsquo;s no database or running programs or anything.  You can find the entire source code for all the posts in &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/blog&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this Github repo&lt;/a&gt;.  Which I find pretty cool.  Particularly because a few of my posts seem to be popular but in some cases may be out of date or could be improved.  So if you spot something that&amp;rsquo;s incorrect or needs to be updated, please open up &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/blog/issues&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;an issue&lt;/a&gt; on the blog Github repo, or better yet, make &lt;a class=&#34;link&#34; href=&#34;https://github.com/FuzzyMistborn/blog/pulls&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a PR&lt;/a&gt; to correct it!  Also feel free to suggest topics for me to cover by opening an issue, and I&amp;rsquo;ll post some of my ideas on there as well and I welcome feedback.&lt;/p&gt;
&lt;p&gt;Bear with me over the next few weeks as I fix up some things and may make some other changes or other improvements.  I hope this will make things better in the long run but for now there may be some growing pain.&lt;/p&gt;
&lt;p&gt;Also, thanks to this blog post for detailing how to migrate from Ghost to Hugo: &lt;a class=&#34;link&#34; href=&#34;https://blog.jimdhughes.com/migrating-my-blog-from-ghost-to-hugo/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://blog.jimdhughes.com/migrating-my-blog-from-ghost-to-hugo/&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Controlling Eufy Security Devices with ioBroker</title>
        <link>https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/</link>
        <pubDate>Mon, 28 Dec 2020 22:55:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/header.png" alt="Featured image of post Controlling Eufy Security Devices with ioBroker" /&gt;&lt;blockquote&gt;
&lt;p&gt;Note: I don&amp;rsquo;t or recommend Eufy&amp;rsquo;s hardware anymore.  I think Amcrest or Reolink are more compelling options that actually have working RTSP (even over WiFi) for just a bit more money.  Also, if you still want to use Eufy, you don&amp;rsquo;t need to use ioBroker anymore.  See this &lt;a class=&#34;link&#34; href=&#34;https://github.com/fuatakgun/eufy_security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub repo&lt;/a&gt; for more info.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I think should be obvious, I&amp;rsquo;m very big on HomeAssistant.  It&amp;rsquo;s a great piece of software and does many many many things well.  However, I bought a Eufy Doorbell camera over a year and a half ago and genuinely love it.  It has great set of features (local person detection, fast notifications, quick loading of streams in app, 2k video quality) but it lacked a HomeAssistant integration.  I created a repo to document the API but Eufy changed things around and it grew well beyond my skill to understand.  There&amp;rsquo;s a working integration for HomeAssistant but it&amp;rsquo;s limited to getting still images of last motion activity and creating a 3 minute RTMP stream from the camera (limitation of the API, not the integration).&lt;/p&gt;
&lt;p&gt;But then there&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://github.com/bropat/ioBroker.eufy-security/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this &amp;ldquo;adapter&amp;rdquo;&lt;/a&gt; for &lt;a class=&#34;link&#34; href=&#34;https://www.iobroker.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ioBroker&lt;/a&gt;.  I will admit to not knowing much about ioBroker other than what you can glean from their website and some Googling.  It&amp;rsquo;s a predominantly German IoT platform that in many ways is similar to HomeAssistant.  It is able to connect to &lt;a class=&#34;link&#34; href=&#34;https://www.iobroker.net/#en/adapters&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a lot of popular smart home devices&lt;/a&gt;.  And again, most importantly for my purposes, thanks to the work of @bropat it&amp;rsquo;s able to control my Eufy Doorbell camera (and other Eufy indoor cameras).&lt;/p&gt;
&lt;p&gt;In this post I will walk you through how to install ioBroker via Docker, set up the EufySecurity adapter, and then connect to it via HomeAssistant.&lt;/p&gt;
&lt;h1 id=&#34;iobroker-setup&#34;&gt;ioBroker Setup
&lt;/h1&gt;&lt;p&gt;This guide is for setting up ioBroker in Docker.  If you&amp;rsquo;re running HassOS, &lt;del&gt;you&amp;rsquo;ll need to look elsewhere because there&amp;rsquo;s no way to run ioBroker currently inside of HassOS.  Maybe someday.  But for now, you&amp;rsquo;ll need to use another machine to run the container.&lt;/del&gt;  Check out @MaxW&amp;rsquo;s HassOS add-on: &lt;a class=&#34;link&#34; href=&#34;https://github.com/MaxWinterstein/homeassistant-addons/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/MaxWinterstein/homeassistant-addons/&lt;/a&gt;.  Note that it&amp;rsquo;s EXPERIMENTAL.  You have been warned.&lt;/p&gt;
&lt;p&gt;For the Docker image, we&amp;rsquo;ll be using &lt;a class=&#34;link&#34; href=&#34;https://github.com/buanet/docker-iobroker&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/buanet/docker-iobroker&lt;/a&gt;.  This seems to be the &amp;ldquo;official&amp;rdquo; image and it works well enough for me.  Here is my docker-compose:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;iobroker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;buanet/iobroker:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;iobroker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8081:8081&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8082:8082&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Web Server&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;8087:8087&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Rest API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/home/fuzzy/docker/iobroker:/opt/iobroker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;LANGUAGE=&amp;#34;en_US:en&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adjust the volume mount path (in my case &lt;code&gt;/home/fuzzy/docker/iobroker&lt;/code&gt;) to whatever suits your purposes.&lt;/p&gt;
&lt;p&gt;There are a lot more things you can set via Docker environmental variables (see the Github page for more details) but this is the bare minimum that will get a container spun up and working.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;docker-compose up -d iobroker&lt;/code&gt; and the image should download and start.  Go to http://yourip:8081 and you should see this screen:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker1.png&#34;
	width=&#34;1714&#34;
	height=&#34;1264&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker1_hu_421e281c0bf49383.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker1_hu_738b3f989672deaf.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;135&#34;
		data-flex-basis=&#34;325px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Click that you agree to the terms and click &amp;ldquo;Agree.&amp;rdquo;  Then enter your information or click &amp;ldquo;close&amp;rdquo; (this won&amp;rsquo;t really matter for purpose of EufySecurity but if you want to mess around with ioBroker feel free to fill it out &amp;ldquo;correctly&amp;rdquo;).  You&amp;rsquo;ll then be taken to an &amp;ldquo;instance&amp;rdquo; page.  Ignore this for now and click on &amp;ldquo;Adapters&amp;rdquo; in the left-hand column.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker2.png&#34;
	width=&#34;1701&#34;
	height=&#34;1258&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker2_hu_526f30ce3e039a7c.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker2_hu_36ebcb0fcd4f99b1.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;135&#34;
		data-flex-basis=&#34;324px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Then click on &amp;ldquo;filter&amp;rdquo; and search for &amp;ldquo;Simple Restful API&amp;rdquo;.  Click the blue 3 dots and then the plus sign in the bottom left corner.  Let it install/add the instance.  You can ignore the settings page that appears after installation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-1.png&#34;
	width=&#34;849&#34;
	height=&#34;459&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-1_hu_7344dfe866430e7e.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-1_hu_b36a5ce9069d31f8.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;184&#34;
		data-flex-basis=&#34;443px&#34;
	
&gt; &lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-2.png&#34;
	width=&#34;890&#34;
	height=&#34;517&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-2_hu_38a7d3a1c9856054.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker3-2_hu_a5eddc29c002b902.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;172&#34;
		data-flex-basis=&#34;413px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Go back to the adapters page.  I also installed the &amp;ldquo;WEB server&amp;rdquo; adapter which will let you pull the last image from the eufy-security adapter into HASS, so this step is optional if you want to continue using the current HASS integration.&lt;/p&gt;
&lt;p&gt;But this time click on the Github icon in the top left corner.  Click &amp;ldquo;Custom&amp;rdquo; and then enter the URL of the ioBroker EufySecurity Github: &lt;a class=&#34;link&#34; href=&#34;https://github.com/bropat/ioBroker.eufy-security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/bropat/ioBroker.eufy-security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker4.png&#34;
	width=&#34;1148&#34;
	height=&#34;946&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker4_hu_793a33a88c177927.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker4_hu_de020fd08d071523.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;121&#34;
		data-flex-basis=&#34;291px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;You should now have the EufySecurity adapter installed.  Go back again to the adapters page and you should see a EufySecurity box.  Click on the blue circle with 3 dots and then click the plus button in the bottom left corner (exactly the same steps as we did to add the Restful API adapter).  It will create an instance for you.  Here you will want to fill in your information to set up the adapter.  You can change the polling interval (I have mine set to 5 minutes instead of the default 10) and the max camera livestream duration (default is 30 but I believe the API should support up to 3 minutes or 180 seconds).  Click &amp;ldquo;Save and Close&amp;rdquo; and you should see the circle next to &amp;ldquo;eufy-security.0&amp;rdquo; turn green eventually (may start red then go yellow and eventually green).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker5.png&#34;
	width=&#34;619&#34;
	height=&#34;46&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker5_hu_99007626aab6cf83.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker5_hu_d2e18253b5c98283.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;1345&#34;
		data-flex-basis=&#34;3229px&#34;
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;hass-integration&#34;&gt;HASS Integration
&lt;/h1&gt;&lt;p&gt;Now the fun part!  Integrating with HASS.  For this you&amp;rsquo;ll need to dig around a bit in the &amp;ldquo;Objects&amp;rdquo; page of ioBroker.  Look for a &amp;ldquo;folder&amp;rdquo; called eufy-security.0.  Expand that folder and you should see a list of all your cameras available via the adapter.  They&amp;rsquo;re listed by ID/Serial Number but also have the name you set up in the app.  You&amp;rsquo;ll need the serial number to get things into HASS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker6.png&#34;
	width=&#34;1542&#34;
	height=&#34;888&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker6_hu_88ccb98698242f0e.png 480w, https://blog.fuzzymistborn.com/controlling-eufy-security-devices-with-iobroker/iobroker6_hu_81d1c25ec3083d8e.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;173&#34;
		data-flex-basis=&#34;416px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the guard mode.  Hat tip to &lt;a class=&#34;link&#34; href=&#34;https://community.home-assistant.io/t/eufy-camera-integration/121758/425&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@MaxW on the HASS forum&lt;/a&gt; for this part.  For each camera you want to track the guard mode status of, create a RESTful sensor in the &lt;code&gt;sensor:&lt;/code&gt; portion of your HASS configuration.yaml file.  For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Eufy Doorbell Guard Mode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://IOBROKER_SERVER_IP:8087/getPlainValue/eufy-security.0.CAMERA_SERIAL_NUMBER.station.guard_mode&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scan_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;-&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {% set v = value | replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#34;&amp;#34;)|int  %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ {0: &amp;#34;Away&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          1: &amp;#34;Home&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          2: &amp;#34;Schedule&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          3: &amp;#34;Custom1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          4: &amp;#34;Custom2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          5: &amp;#34;Custom3&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          47: &amp;#34;Geofence&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          63: &amp;#34;Disarmed&amp;#34;}[v] | default(&amp;#34;Unknown state:&amp;#34; + (value|urlencode)) }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the Server IP address and camera serial number to match your server/camera&lt;/p&gt;
&lt;p&gt;This will get you the current status (at least, it polls every 10 seconds so close enough) of the guard mode of each camera.  To change the status, you&amp;rsquo;ll need to create a rest command.  Here&amp;rsquo;s an example config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;rest_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;eufy_doorbell_disarmed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://IOBROKER_SERVER_IP:8087/set/eufy-security.0.CAMERA_SERIAL_NUMBER.station.guard_mode?value=GUARD_MODE_VALUE&amp;amp;ack=false&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the Server IP, Camera Serial Number, and Guard Mode as appropriate. You&amp;rsquo;ll also want to make as many commands as you want to be able to change to.&lt;/p&gt;
&lt;p&gt;Now there&amp;rsquo;s two options for how to change the settings.  First, you could create a template switch that would go back and forth between two modes.  That&amp;rsquo;s good enough for my use case as all I really want is &amp;ldquo;motion detection on&amp;rdquo; and &amp;ldquo;motion detection off.&amp;rdquo;  So here&amp;rsquo;s my template switch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;switches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;eufy_doorbell&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Front Door - Guard Mode&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:doorbell-video&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ is_state(&amp;#39;sensor.eufy_doorbell_guard_mode&amp;#39;, &amp;#39;Home&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;turn_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.eufy_doorbell_home&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;turn_off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.eufy_doorbell_disarmed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The other option I could see is creating an &lt;code&gt;input_select&lt;/code&gt; and then an automation to fire depending on which input you selected.  Whatever floats your boat.  I may go down the &lt;code&gt;input_select&lt;/code&gt; route eventually but for now the switch does the job well enough.&lt;/p&gt;
&lt;p&gt;The final step is if you want to pull the last motion image into HASS.  This is where the WEB Server comes into play.  Here&amp;rsquo;s my camera config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;camera&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;generic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Eufy Doorbell&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;still_image_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;http://IOBROKER_SERVER_IP:8082/eufy-security.0/CAMERA_SERIAL_NUMBER.jpg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;del&gt;I&amp;rsquo;m working on a way to get the RTMP stream into HASS.  I&amp;rsquo;ve figured out how to get the URL (via the RestfulAPI) but I haven&amp;rsquo;t quite cracked the camera part yet.  The URL I get back has quotes and that doesn&amp;rsquo;t seem to work in HASS.&lt;/del&gt;  Edit: Got it working!  Hat tip to @dezmui for cracking the quotes part and the camera part.  Here&amp;rsquo;s how to do it:&lt;/p&gt;
&lt;p&gt;Add the following as another rest sensor for any stream you want.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Eufy Doorbell Stream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://IOBROKER_SERVER_IP:8087/getPlainValue/eufy-security.0.CAMERA_SERIAL_NUMBER.cameras.CAMERA_SERIAL_NUMBER.livestream&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scan_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;-&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {% if (value) is not none and (value) != &amp;#39;error: datapoint &amp;amp;quot;Livestream URL&amp;amp;quot; not found&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {{ value.replace(&amp;#39;&amp;#34;&amp;#39;, &amp;#34;&amp;#34;) }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        No Stream
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then this as a camera component (and you also need to enable &lt;code&gt;stream:&lt;/code&gt; in your configuration.yaml!).  Note that this is very similar to the above camera setup, we just added the stream_source as an option.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;camera&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;generic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Eufy Doorbell&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;still_image_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;http://IOBROKER_IP:8082/eufy-security.0/CAMERA_SERIAL_NUMBER.jpg&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;stream_source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.eufy_doorbell_stream&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now to start and stop the stream (subject to the limitation that the stream will time out based on what you have your setting in ioBroker set to), use the rest_commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;rest_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;eufy_start_stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://IOBROKER:8087/toggle/eufy-security.0.CAMERA_ID.cameras.CAMERA_ID.start_stream&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;eufy_stop_stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://IOBROKER:8087/toggle/eufy-security.0.CAMERA_ID.cameras.CAMERA_ID.stop_stream&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restart HASS and then add this to your Lovelace:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;camera_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;camera.eufy_doorbell&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;camera.eufy_doorbell&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Camera&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;picture-glance&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;double_tap_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;call-service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.eufy_start_stream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hold_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;call-service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rest_command.eufy_stop_stream&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Should work!&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;So there you have it.  Now you can control much of the functionality of EufySecurity cameras via HomeAssistant.  Not all functionality is supported but @bropat seems to be doing a great job fixing things and keeping on top of it.&lt;/p&gt;
&lt;p&gt;What is not working for me (yet) is doorbell motion events/button pushes (even via MQTT).  Those are less important to me as my main thing was controlling when the doorbell camera would detect motion or not, but I&amp;rsquo;m sure @bropat will keep working on it.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Post-Dark Sky Weather (Part 2) - Acurite and RTL433</title>
        <link>https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/</link>
        <pubDate>Sat, 14 Nov 2020 02:35:09 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/header.jpg" alt="Featured image of post Post-Dark Sky Weather (Part 2) - Acurite and RTL433" /&gt;&lt;p&gt;Continuing on my last post regarding the &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/&#34; &gt;end of DarkSky&lt;/a&gt;, I promised I&amp;rsquo;d follow up on the other part of how I am getting weather data into HomeAssistant.  I&amp;rsquo;ve always been interested in having my own personal weather station to get hyper-accurate local weather conditions, namely temperature and wind speed.  I was always off put by the need for one of those monitor stations because it restricted where and how I could see the data.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/dark-sky-part2-1.png&#34;
    alt=&#34;Pretty, but not great for HomeAssistant uses!&#34; width=&#34;400&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Pretty, but not great for HomeAssistant uses!&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Instead I wanted the ability to get the data into HomeAssistant.  Thankfully there are a lot of great options out there.  Two options I considered were &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/ECOWITT-Gateway-Temperature-Humidity-Pressure/dp/B07JLRFG24&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ecowitt GW1000&lt;/a&gt; as well as an &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/Ambient-Weather-WiFi-Station/dp/B01N5TEHLI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ambient Weather station&lt;/a&gt;.  Both seem like good options.  What put me off was the wifi connection which in some cases required a cloud connection, which I try to avoid when there&amp;rsquo;s a good non-cloud alternative.&lt;/p&gt;
&lt;p&gt;Thankfully I found an inexpensive, non-cloud version with the Acurite &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B00SN1WHEU?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5-in-1 Weather Station&lt;/a&gt;.  The beauty of this device is that it communicates via 433mhz, which is a fairly common standard.  You could use a weather station like I have pictured above, or you could grab a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Software-defined_radio&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Software Defined Radio&lt;/a&gt; (SDR) (more on this below) and thanks to some open source software, intercept and decode the signals and get the information easily into HomeAssistant.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/dark-sky-part2-2.png&#34;
    alt=&#34;Won&amp;rsquo;t win any awards for design&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Won&amp;rsquo;t win any awards for design&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;rtl_433&#34;&gt;RTL_433
&lt;/h2&gt;&lt;p&gt;As mentioned above, you&amp;rsquo;ll need a SDR in order to pick up on the signals.  These are pretty easy to find on Amazon.  I used &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B011HVUEME?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this one&lt;/a&gt;, but really any should do the trick.  I tested things out on a Raspberry Pi for development purposes, but really any Linux box will work.  Connect the small set of antenna to the Y splitter and connect the USB cable to the computer to get started.  Then you&amp;rsquo;ll need the software to decode the signals.&lt;/p&gt;
&lt;p&gt;Thankfully, someone has already done all the work in decoding the signals for the Acurite. &lt;a class=&#34;link&#34; href=&#34;https://github.com/merbanan/rtl_433/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RTL_433&lt;/a&gt; is an absolute gem of open source software that is incredibly powerful.  It may seem super complicated to a novice, but you don&amp;rsquo;t need much to get everything set up.  Here&amp;rsquo;s the commands you need to enter into terminal to get RTL_433 compiled and set up:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# packages needed to compile rtl_433
apt-get update
apt-get install -y rtl-sdr librtlsdr-dev librtlsdr0 git automake libtool cmake

# Pull RTL_433 source code from GIT, compile it and install it
git clone https://github.com/merbanan/rtl_433.git
cd rtl_433/
mkdir build
cd build
cmake ../
make
make install
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To test things out, you can just run the &lt;code&gt;rtl_433&lt;/code&gt; command and see what happens.  More than likely you&amp;rsquo;ll just see a bunch of noise and intercept pretty much every signal on the 433mhz spectrum, which is&amp;hellip;.a lot.  But use this to make sure you can see signals from your Acurite weather station.  You can further narrow down the types of signals picked up by using the presets incorporated into the RTL_433 library.  Specifically, this is the command I use to only pick up on signals from Acurite 5-in-1 weather stations: &lt;code&gt;rtl_433 -C si -M newmodel -R 40&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re sure you can see the signals, it&amp;rsquo;s time to work on getting the information into HomeAssistant.  The easiest way to do it is via MQTT.  I&amp;rsquo;m going to assume you have an MQTT broker/server already set up with HomeAssistant (if you don&amp;rsquo;t, just Google it and there&amp;rsquo;s plenty of guides out there).  I tried the example &lt;a class=&#34;link&#34; href=&#34;https://github.com/merbanan/rtl_433/blob/master/examples/rtl_433_mqtt_hass.py&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MQTT to HASS script&lt;/a&gt; in the RTL_433 repo, but just couldn&amp;rsquo;t get it to work.  Instead, I used &lt;a class=&#34;link&#34; href=&#34;https://github.com/mverleun/RTL433-to-mqtt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this script&lt;/a&gt; which was recommended by a friend.  All you need to do is save the &lt;code&gt;config.py.example&lt;/code&gt; and &lt;code&gt;rtl2mqtt.py&lt;/code&gt; files to a folder, modify the &lt;code&gt;config.py&lt;/code&gt; file to include the MQTT topic and other information, and potentially modify line 14 of the  &lt;a class=&#34;link&#34; href=&#34;https://github.com/mverleun/RTL433-to-mqtt/blob/ffd6c925afc9f36ed4114f2a1c1e4a8b78392b6d/src/rtl2mqtt.py#L14&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;rtl2mqtt.py&lt;/code&gt; file&lt;/a&gt;.  Mine is this: &lt;code&gt;rtl_433_cmd = &amp;quot;/usr/local/bin/rtl_433 -C si -M newmodel -R 40 -R 41 -F json&amp;quot;&lt;/code&gt; (the -R 41 will make sense when you review the &amp;ldquo;Bonus Topic&amp;rdquo; below).&lt;/p&gt;
&lt;p&gt;Again, the exact method doesn&amp;rsquo;t really matter, so long as you can find a way to get the data from RTL_433 to HomeAssistant.&lt;/p&gt;
&lt;h2 id=&#34;homeassistant-setup&#34;&gt;HomeAssistant Setup
&lt;/h2&gt;&lt;p&gt;So now that we (hopefully) have the information running from RTL_433 to MQTT, the final step is to incorporate the sensors into HomeAssistant.  You&amp;rsquo;ll need to create a number of &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/sensor.mqtt/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MQTT sensors&lt;/a&gt;.  The exact format will depend on your MQTT topic that RTL_433 is sending the data to.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the way I have the 5 sensors imported into HomeAssistant (goes in your &lt;code&gt;configuration.yaml&lt;/code&gt; file).  Note that I convert things to Imperial from Metric, hence the conversion calculations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rtl_433/Acurite-5n1/1606/temperature_C&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Acurite Outside Temp&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;°F&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temperature&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Acu_Outside_Temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ (value | float * 1.8 + 32) | round(2) }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rtl_433/Acurite-5n1/1606/humidity&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Acurite Outside Humidity&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;humidity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Acu_Outside_Humidity&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ value }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rtl_433/Acurite-5n1/1606/wind_avg_km_h&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Acurite Outside Windspeed&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mph&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:weather-windy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Acu_Outside_Windspeed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ (value | float * 0.621371)| round(2) }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rtl_433/Acurite-5n1/1606/wind_dir_deg&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Acurite Outside Wind Direction&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;°&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:compass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Acu_Outside_Winddirection&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        {{ value | round(0) }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mqtt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_topic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rtl_433/Acurite-5n1/1606/rain_mm&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Acurite Outside Rain Total&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;in&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:weather-rainy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Acu_Outside_Rain_Total&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ (value | float * 0.03937) | round(2)  }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This should be fine for everything but the rain sensor, which collects the rain on a cumulative basis.  So if you want tracking that actually makes sense (i.e. a daily or monthly tracking), I would suggest using the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/utility_meter/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Utility Meter&lt;/a&gt; integration.  It&amp;rsquo;s really easy to set up, just add the following your &lt;code&gt;configuration.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;utility_meter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;acurite_outside_rain_today&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Rain Today&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.acurite_outside_rain_total&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cycle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;daily&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;acurite_outside_rain_month&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Rain This Month&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.acurite_outside_rain_total&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cycle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;monthly&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll now have a daily and monthly rain sensor that will automatically reset daily or monthly (on the 1st of the month).  Incorporating these into HomeAssistant then is totally up to you!&lt;/p&gt;
&lt;p&gt;My only other suggestion might be to create a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/statistics/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;statistics sensor&lt;/a&gt; to try to somewhat level out the wind speed readings.  Otherwise it&amp;rsquo;s liable to look like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/dark-sky-part2-3.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;With the statistics sensor, you get a graph more like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/post-dark-sky-weather-part-2/dark-sky-part2-4.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s my sensor entry (again goes under &lt;code&gt;sensor:&lt;/code&gt; in &lt;code&gt;configuration.yaml&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;statistics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.acurite_outside_windspeed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Recent Windspeed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sampling_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max_age&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;minutes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;precision&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;bringing-it-all-together&#34;&gt;Bringing it all together
&lt;/h2&gt;&lt;p&gt;So if you followed my last blog post, you know I concluded I need to use a hodgepodge of weather services in order to match the information that was available via DarkSky.  If you want a weather entity that combines all of this information together, take a look at &lt;a class=&#34;link&#34; href=&#34;https://github.com/xannor/hass_weather_template&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/xannor/hass_weather_template&lt;/a&gt;.  It&amp;rsquo;s a great little custom component that lets me merge all my weather entities together so I get the best of all the worlds:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;weather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;weather_template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;weather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;combined_weather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;temperature_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.acurite_outside_temp&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;temperature_unit_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ state_attr(&amp;#39;sensor.acurite_outside_temp&amp;#39;, &amp;#39;unit_of_measurement&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;condition_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ states(&amp;#39;weather.nws&amp;#39;) }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% elif states(&amp;#39;weather.nws&amp;#39;) == &amp;#39;unavailable&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ states(&amp;#39;weather.accuweather&amp;#39;) }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;humidity_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.acurite_outside_humidity&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;wind_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.acurite_outside_windspeed&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;wind_bearing_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.acurite_outside_wind_direction&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;attribution_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Weather provided by Acurite 5-1 Outdoor Sensor, the National Weather Service, and Accuweather&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;visibility_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;visibility&amp;#39;) }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            Unavailable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;forecast_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ state_attr(&amp;#39;weather.accuweather&amp;#39;, &amp;#39;forecast&amp;#39;)[0] | to_json }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;bonus-topic&#34;&gt;Bonus Topic
&lt;/h2&gt;&lt;p&gt;Well since I&amp;rsquo;m already discussing RTL_433 Acurite stuff, I might as well toss in a recommendation for &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B004QJVU78?psc=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;these Refrigerator/Freezer temperature sensors&lt;/a&gt;, also made by Acurite and that also work on 433mhz.  I have 2 sets as I have a fridge/freezer in my garage and have had a few instances where the door in the garage fridge has been left accidentally open and we&amp;rsquo;ve had to toss everything inside.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Weather in a post DarkSky world</title>
        <link>https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/</link>
        <pubDate>Mon, 09 Nov 2020 14:53:38 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/header.jpeg" alt="Featured image of post Weather in a post DarkSky world" /&gt;&lt;p&gt;Back on April 1st, DarkSky &lt;a class=&#34;link&#34; href=&#34;https://blog.darksky.net/dark-sky-has-a-new-home/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;announced&lt;/a&gt; that it had been purchased by Apple and would be shutting down both it&amp;rsquo;s Android app and API.  The API will continue to function &amp;ldquo;through the end of 2021,&amp;rdquo; but there are no new signups permitted.&lt;/p&gt;
&lt;p&gt;This is extremely disappointing as DarkSky had a fantastic API and very generous limits for free use (1k a day, so you could easily pull updates every 10-15 minutes without issue).  It also was super accurate.  Once the API goes away, it will be sorely missed as there&amp;rsquo;s no solution like it out there that I have found that 1) has a free API and 2) is mostly accurate, and 3) has as much information available.  While I know I still have over a year left before the API goes away, since it IS going away I figured I needed to start exploring my alternative options.&lt;/p&gt;
&lt;p&gt;The main things I was looking for were: 1) weather forecast for the next couple of days, 2) cloud cover (use this for a few spots were I don&amp;rsquo;t have light sensors but want some kind of threshold for my motion senor lights), 3) precipitation (ie is it raining/how much), and 4) high/low temperature and a bonus for wind chill/apparent temp.&lt;/p&gt;
&lt;h1 id=&#34;options-out-there&#34;&gt;Options out there
&lt;/h1&gt;&lt;p&gt;Pulling up the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/#weather&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;list of HomeAssistant weather integrations&lt;/a&gt;, there seem like a decent number of options.  A few require hardware though (like Ecobee, Neatmo, and Ambient) so not for everyone.  A few are also international only/don&amp;rsquo;t focus on the USA which further limits the options.  The ones I ended up trying were: 1) AccuWeather, 2) OpenWeatherMap, and 3) the National Weather Service.  None are as good as DarkSky and in the end I&amp;rsquo;ve had to cobble together multiple services to accomplish what DarkSky easily accomplished.&lt;/p&gt;
&lt;h2 id=&#34;accuweather&#34;&gt;Accuweather
&lt;/h2&gt;&lt;p&gt;AccuWeather is a great service (it&amp;rsquo;s the weather app I use on my phone).  However, the API is extremely limited (only &lt;strong&gt;50&lt;/strong&gt; calls a day, or twice an hour) and extremely limited information/sensors.  In terms of the data provided and what I needed, it hits most of the boxes.  However, the lack of long-term weather forecast (limited to only current weather unless you want to further limit your updates to once an hour) and the limited updates kinda kills it for me.  If it allowed just 50 more calls a day (100) so I could update every 15 minutes I might go for it.  The lowest paid tier is $25/month which is way too expensive for what I need.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/dark-sky-part1-1.png&#34;
    alt=&#34;Sensors available&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Sensors available&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Opinion: Accuweather is a viable, though extremely limited, option due to the API limitations.&lt;/p&gt;
&lt;h2 id=&#34;openweathermap&#34;&gt;OpenWeatherMap
&lt;/h2&gt;&lt;p&gt;This one seemed like it would be the solution.  Open data with a decent API (60 calls a minute!).  It also has a few different ways of configuring it:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/dark-sky-part1-2.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Per the docs, the mode options are &amp;ldquo;&lt;code&gt;hourly&lt;/code&gt; for a three-hour forecast, &lt;code&gt;daily&lt;/code&gt; for daily forecast, or &lt;code&gt;freedaily&lt;/code&gt; for a five-day forecast with the free tier.&amp;rdquo;  I chose &amp;ldquo;free daily&amp;rdquo; as I really was looking for a long-term forecast, which also generated a lot of sensors similar to what DarkSky used to provide.  I like that things seem to update frequently but I&amp;rsquo;ve also run into issues where sensors appear to get stuck (for instance, it says the cloud coverage here has been at 0% for 19 hours, which is possible but I doubt it considering I see a few clouds out right now).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/dark-sky-part1-3.png&#34;
    alt=&#34;Many more sensor this time&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Many more sensor this time&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Opinion: Like the extra API calls though question the data accuracy.&lt;/p&gt;
&lt;h2 id=&#34;national-weather-service&#34;&gt;National Weather Service
&lt;/h2&gt;&lt;p&gt;This one is great if all you are looking for is a forecast.  Ultimately a lot of the data used to power the other weather services out there comes from NOAA/NWS so it&amp;rsquo;s fun to get the data straight from the source.  However, as the integration stands right now, there are no sensors associated with it, though you can create your own with some templates as the raw data is all there.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/weather-in-a-post-darksky-world/dark-sky-part1-4.png&#34;
    alt=&#34;This is all you get&amp;hellip;.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;This is all you get&amp;hellip;.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s an example of a high and low temperature sensor you can create:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sensors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nws_high_temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;High Temperature&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temperature&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;°F&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;high_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; and state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[0].daytime == true %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[0].temperature }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% elif states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[1].temperature }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            Unavailable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nws_low_temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Low Temperature&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temperature&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;°F&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unique_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;low_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; and state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[0].daytime == false %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[0].temperature }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% elif states(&amp;#39;weather.nws&amp;#39;) != &amp;#39;unavailable&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            {{ state_attr(&amp;#39;weather.nws&amp;#39;, &amp;#39;forecast&amp;#39;)[1].temperature }}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            Unavailable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Again, it&amp;rsquo;s possible to make sensors but it requires some extra work. I also have run into some issues where on start up I get errors and every now and then the API goes down or there are issues.&lt;/p&gt;
&lt;p&gt;Opinion: Best for forecast, but terrible for sensors and has some reliability issues.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;So which one did I pick?  As I mentioned above, I chose to create a frankenstein solution built on a few of these options, combined with my own weather station in my back yard.  I chose the NWS integration for the forecast, and I created a few sensors based on the data as well (high/low temperature and chance of rain).  I then used OpenWeatherMap for some of the sensors I was looking for (cloud cover, precipitation type), though now that I&amp;rsquo;m looking at Accuweather again I might switch to that one instead.  Just as a quick aside, how none of the integrations offered a high/low temperature sensor is mind boggling to me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll have another post up soon regarding my weather station and how I brought all of these pieces together.  Unfortunately, my quest for a DarkSky replacement led me to realize there was no adequate replacement and I had to roll my own.  I truly wish I could say that there was a 1-1 replacement, or even something that was 75% as good.  But in reality, DarkSky was a rare gem and is going to be sorely missed when it goes away.&lt;/p&gt;
&lt;p&gt;#RIPDarkSky&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Improving Amazon Package Tracking with Tasker</title>
        <link>https://blog.fuzzymistborn.com/improving-amazon-package-tracking-with-tasker/</link>
        <pubDate>Sun, 06 Sep 2020 01:10:09 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/improving-amazon-package-tracking-with-tasker/</guid>
        <description>&lt;p&gt;First off, I am a HUGE fan of the &lt;a class=&#34;link&#34; href=&#34;https://github.com/moralmunky/Home-Assistant-Mail-And-Packages/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mail and Packages&lt;/a&gt; custom component.  Major hat tip to @moralmonkey and @firstof9 for all their work getting this running and improving it constantly.  Especially @firstof9.  Whenever I find a bug/something isn&amp;rsquo;t working right he&amp;rsquo;s incredibly responsive and works hard to fix it.  I find it incredibly handy to know when packages and mail might arrive that day so it&amp;rsquo;s nice to have HomeAssistant track it for me.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t go into details of how to set up the component in general since I think the process is fairly well explained &lt;a class=&#34;link&#34; href=&#34;https://github.com/moralmunky/Home-Assistant-Mail-And-Packages/wiki&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;in the wiki&lt;/a&gt;.  The short version of how it works is that it periodically scans your email inbox for email messages from the various carriers, looking for specific messages about packages being out for delivery.  You can then fire off various automations (such as a notification) when the sensor values change.&lt;/p&gt;
&lt;h2 id=&#34;amazon-packages&#34;&gt;Amazon Packages
&lt;/h2&gt;&lt;p&gt;For a long time, I was content with just having USPS, UPS and FedEx package tracking.  Since all three rely on email notifications for package updates, it worked fine for me.  However, recently (last month or so) Amazon has expanded their own delivery services to my area.  Amazon unfortunately handles their delivery messages differently.  They only send out an app notification for &amp;ldquo;out for delivery&amp;rdquo; and &amp;ldquo;almost there&amp;rdquo; updates, followed by a &amp;ldquo;your package was delivered&amp;rdquo; email along with a photo of the package on your doorstep/wheverever the Amazon driver dropped it.  The latest beta version of the component is able to process the delivered message but can only do a &amp;ldquo;best guess&amp;rdquo; for when a package is out for delivery based on the initial &amp;ldquo;your package will arrive on x date&amp;rdquo; in the shipping email.&lt;/p&gt;
&lt;p&gt;I came up with a workaround using one of my favorite Android apps, &lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tasker&lt;/a&gt;, and a plugin app for Tasker, &lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=com.joaomgcd.autonotification&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AutoNotification&lt;/a&gt;.  Both apps are paid (but IMO well worth the price) and this won&amp;rsquo;t work on iOS (sorry).  My setup uses NodeRed and the &lt;a class=&#34;link&#34; href=&#34;https://github.com/zachowj/hass-node-red&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Node-Red custom component&lt;/a&gt;.  There&amp;rsquo;s probably a way to achieve this with HASS automations but I&amp;rsquo;m not sure how.  It also requires either a NabuCasa subscription or having your HASS instance be accessible from outside your home network since it relies on webhooks.  Also, the Amazon Shopping app has to be installed for the notifications to be received in the first place.&lt;/p&gt;
&lt;h3 id=&#34;tasker-setup&#34;&gt;Tasker Setup
&lt;/h3&gt;&lt;p&gt;Let&amp;rsquo;s start with getting Tasker set up.  First step is to set up a webhook.  You can do this with NodeRed via a node or you can set up an &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;automation in HASS&lt;/a&gt;.  As detailed below, I did mine in NodeRed.  Once you get your unique webhook ID, save it to a text file somewhere as you&amp;rsquo;ll need it shortly.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://gist.github.com/FuzzyMistborn/2a3e231d50edfc5c724b9fc5123c01ed&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;a link to the XML files&lt;/a&gt; you should be able to just import into Tasker.  Save them to your phone, open up Tasker, and long press on &amp;ldquo;Profiles.&amp;rdquo;  That should open up a menu where you can click &amp;ldquo;Import Profile.&amp;rdquo;  Browse to the right profile and import it.  Check out &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/tasker/comments/7g7694/how_to_import_a_file_into_tasker_a_quick_easy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this guide&lt;/a&gt; if you need help.&lt;/p&gt;
&lt;p&gt;Note that for my HTTP calls in the task, my URL is &lt;code&gt;%HA_ADDR/api/webhook/%NR_WEBHOOK&lt;/code&gt;.  Tasker allows you to use variables.  Global variables (which can be used in all tasks) are in ALL CAPS.  I use variables because it makes it very simple to change in case I ever need to change my HASS URL and/or the webhook ID.  Otherwise I&amp;rsquo;d have to change a bunch of tasks which would be a PITA.  If you don&amp;rsquo;t want to do this you can simply modify the URL to match your HASS instance URL and the webhook ID.  So something like &lt;code&gt;https://hass.yourdomain.com/api/webook/YOUR_WEBOOK&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Provided you&amp;rsquo;ve given both Tasker and AutoNotification the correct permissions (I found AutoNotification to be a bit tricky to get set correctly, I suggest running some tests to make sure it&amp;rsquo;s working), that should be all you need to do.  You should not need to change anything else.&lt;/p&gt;
&lt;h3 id=&#34;nodered-setup&#34;&gt;NodeRed Setup
&lt;/h3&gt;&lt;p&gt;Like I indicated above, you&amp;rsquo;ll need to have the Node-Red custom component installed.  The reason is that the below code uses the integration to create and update custom sensors.  There&amp;rsquo;s probably a way to create sensors in HASS via automations but I&amp;rsquo;m not familiar with how to do that.&lt;/p&gt;
&lt;p&gt;Note that I went in and modified the entity_ids of the sensors once they were created to &lt;a class=&#34;link&#34; href=&#34;https://smarthome.weyl.casa/developer-tools/state#&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;sensor.mail_amazon_packages_nearby&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;sensor.mail_amazon_packages_delivering&lt;/code&gt;.  You don&amp;rsquo;t have to do this step but you&amp;rsquo;d need to modify the templates in the NR setup to match.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what your result should look like (the code to import is below):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/improving-amazon-package-tracking-with-tasker/image.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Just to explain.  When a webhook is received, if it&amp;rsquo;s an &amp;ldquo;out for delivery&amp;rdquo; or &amp;ldquo;nearby&amp;rdquo; notification it is sent via the first switch node to the correct path to then add 1 to the existing sensor value and then update the sensor.  Once a package is delivered, it subtracts 1 from the sensor.  I had to add a check on the subtraction because sometimes I wouldn&amp;rsquo;t receive an &amp;ldquo;out for delivery&amp;rdquo; or &amp;ldquo;nearby&amp;rdquo; notification for every package and I didn&amp;rsquo;t want negative values.  Finally, there&amp;rsquo;s a reset node to trigger at midnight so everything starts off at 0.&lt;/p&gt;
&lt;p&gt;From here you can modify your notifications to be whatever you want.  I have a trigger node on mine to delay things by a minute as sometimes I have multiple packages delivered at the same time and didn&amp;rsquo;t want 5 notifications when it&amp;rsquo;s really just one delivery.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;33f49d42.466b7a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ha-entity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Amazon Nearby&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Mail Amazon Packages Nearby&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;device_class&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;unit_of_measurement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;package(s)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;stateType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;attributes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resend&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;inputOverride&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;allow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;880&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4260&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b43c5eca.57be58&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Add 1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.mail_amazon_packages_nearby&amp;#39;) | int + 1 }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;530&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4260&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;33f49d42.466b7a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;e3aaae46.d1ab3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;690&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4b7d0e4.83c8bf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;33f49d42.466b7a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a76f2d8.99415d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Amazon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload.amazon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nearby&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;out for delivery&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delivered&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;370&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b43c5eca.57be58&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a6adb473.794bb&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;54b61769.9755f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2bd4738b.515f9c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4b7d0e4.83c8bf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ha-entity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Amazon Delivery&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Mail Amazon Packages Delivery&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;device_class&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;unit_of_measurement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;package(s)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;stateType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;attributes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resend&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;inputOverride&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;allow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;890&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4340&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a6adb473.794bb&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Add 1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;sensor.mail_amazon_packages_delivering&amp;#39;) | int + 1 }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;530&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4340&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4b7d0e4.83c8bf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;120197bc.91df2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;schedex&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;passthroughunhandled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;suspended&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;lat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;lon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ontime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0:00&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ontopic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onpayload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onrandomoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offtime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offtopic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offpayload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offrandomoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;thu&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;sat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;sun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;530&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;e3aaae46.d1ab3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;54b61769.9755f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Subtract 1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{% if states(&amp;#39;sensor.mail_amazon_packages_delivering&amp;#39;) | int &amp;gt; 0 %}\n  {{ states(&amp;#39;sensor.mail_amazon_packages_delivering&amp;#39;) | int - 1 }}\n{% else %}\n  0\n{% endif %}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4380&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c4aae13.3acb2a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c4aae13.3acb2a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Set to 0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4380&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4b7d0e4.83c8bf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2bd4738b.515f9c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Subtract 1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{% if states(&amp;#39;sensor.mail_amazon_packages_nearby&amp;#39;) | int &amp;gt; 0 %}\n  {{ states(&amp;#39;sensor.mail_amazon_packages_nearby&amp;#39;) | int - 1 }}\n{% else %}\n  0\n{% endif %}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4220&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;28e5988a.c3dda&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;28e5988a.c3dda&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Set to 0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4220&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;33f49d42.466b7a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;460d5c63.ba0554&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ha-webhook&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1fe83a7f.e0f0b6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;webhookId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;payloadLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;payloadLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;headersLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;headersLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;230&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a76f2d8.99415d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Home Assistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;legacy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rejectUnauthorizedCerts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ha_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;y|yes|true|on|home|open&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;connectionDelay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;cacheJson&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;This is definitely a niche thing but I know some people out there like their packages tracked and so far over the course of a week this has been rock solid for me.  I hope you find it useful!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Object Detection with BlueIris and Deepstack</title>
        <link>https://blog.fuzzymistborn.com/object-detection-with-blueiris-and-deepstack/</link>
        <pubDate>Wed, 26 Aug 2020 18:59:08 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/object-detection-with-blueiris-and-deepstack/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/object-detection-with-blueiris-and-deepstack/header.jpeg" alt="Featured image of post Object Detection with BlueIris and Deepstack" /&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: See &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/blueiris-deepstack-revisited&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;revised post here&lt;/a&gt;.  Below is being left for posterity, but is not longer what I would recommend.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I previously mentioned, I recently ditched my Wyze cams and moved over to Eufy cams for indoor.  I also decided to buy some outdoor cams to mount and watch my front door and driveway in real time.  However, I got tired of getting lots of false alerts due to trees/bushes moving in the wind, bugs flying by the camera at night, etc.  So I started to explore ways of weeding out the false positive alerts and only getting alerts when there actually was a person at my door or a car in my driveway.  Went through a few set ups but I&amp;rsquo;ve found one that has been working terrifically for a few days so wanted to share.&lt;/p&gt;
&lt;h2 id=&#34;what-youll-need&#34;&gt;What You&amp;rsquo;ll Need:
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Video Camera -&lt;/strong&gt; Inside I use my Eufy cams, and outside I picked up these &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07DC2GM5K/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Reolink RLC-410W&amp;rsquo;s&lt;/a&gt;.  I wanted to do POE but due to house design issues I couldn&amp;rsquo;t run the necessary wiring.  So far the 410W&amp;rsquo;s are working great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVR Software&lt;/strong&gt; - I use BlueIris, but really any NVR software should be able to work, so long as you can use it to trigger the AI software to analyze the camera snapshot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI Software&lt;/strong&gt; - There&amp;rsquo;s a LOT of options out there, some of which are local and some of which rely on various cloud setups.  Personally I wanted to only use local processing.  I know several people who use the &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/dp/B07S214S5Y/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Coral USB Accelerator&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/blakeblackshear/frigate&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Frigate&lt;/a&gt; (which uses TensorFlow).  I personally settled on using &lt;a class=&#34;link&#34; href=&#34;deepstack.cc/&#34; &gt;Deepstack&lt;/a&gt; which I have found to be fairly accurate and when configured correctly not overkill on my server.  Though I&amp;rsquo;m sure if I figured out a way of adding some kind of Coral-like device the processing would get significantly faster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HomeAssistant&lt;/strong&gt; - This really should go without saying at this point&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;approach-1&#34;&gt;Approach #1
&lt;/h2&gt;&lt;p&gt;Initially, I was inspired for this project by this video by Rob over at TheHookUp.&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/fwoonl5JKgo&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;In a nutshell, his set up using BlueIris to take a snapshot when motion is detected on the lower definition substream of his camera, which is then processed by Deepstack to determine if there&amp;rsquo;s a person.  If there is, it triggers recording in full 4k resolution.  The goal for Rob was to limit the recording in 4k since it would chew up a lot of HDD space quickly to record in 4k 24/7.&lt;/p&gt;
&lt;p&gt;I followed this approach at first and was very impressed at how simple it was.  And it worked.  However, I quickly ran into a limitation for my own use case.  I wasn&amp;rsquo;t concerned with my cameras all recording at full quality (the Eufy ones don&amp;rsquo;t have a substream) but I wanted a snapshot sent to my phone when the camera detected a person (or a car) at the front door or in the driveway.&lt;/p&gt;
&lt;p&gt;What I had set up based on the above approach was 1) BlueIris would detect motion and take a snapshot, 2) the AITools application would send the snapshot over to Deepstack, 3) if Deepstack indicated it was a person/car, AITools would then trigger the camera, which 4) would send an MQTT alert to HomeAssistant to take a snapshot of the stream.  The result was, as you might expect, that often times the person would no longer be in the frame by the time HomeAssistant took a snapshot due to the lag of DeepStack processing (even though it was only a few seconds).  So that forced me back to the drawing board.&lt;/p&gt;
&lt;h2 id=&#34;approach-2&#34;&gt;Approach #2
&lt;/h2&gt;&lt;p&gt;When I would check the log in AITools I would see that Deepstack was pretty accurately detecting that there was a person/car.  The only other way to get images out of AITools was via Telegram.  But the downside here was that there was no way to filter out snapshots when I didn&amp;rsquo;t want them (ie when the front door is opened by me to go get the mail).  Plus it put a decent amount more stress on my CPU since it would send a LOT of images to Deepstack to be processed.&lt;/p&gt;
&lt;p&gt;So basically what I wanted was a way to have BlueIris detection motion, send a trigger to HomeAssistant, which would then (depending on certain conditions I might want to set) take a snapshot and send the snapshot to Deepstack, which would then return the same image if it detected a person/car.  So no more middleman and trying to get the images synced up.&lt;/p&gt;
&lt;p&gt;To do this, I found this &lt;a class=&#34;link&#34; href=&#34;https://github.com/robmarkcole/HASS-Deepstack-object&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;custom component&lt;/a&gt;.  There&amp;rsquo;s also one that can detect faces but I have not given that a go.  The instructions on the GitHub page for installing Deepstack via Docker and getting everything set up are pretty well done.  Just a few comments/things I&amp;rsquo;ve discovered:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;There&amp;rsquo;s a few different versions of the Deepstack container.  The GitHub page examples all use the &lt;code&gt;noavx&lt;/code&gt; tag, versus the &lt;code&gt;latest&lt;/code&gt; tag supports AVX.  You can determine if your computer supports AVX with &lt;code&gt;grep avx /proc/cpuinfo&lt;/code&gt; in Linux.  HOWEVER, I couldn&amp;rsquo;t get the &amp;ldquo;latest&amp;rdquo; image to work properly as activation seemed broken.  The &lt;code&gt;noavx&lt;/code&gt; image works fine so that&amp;rsquo;s what I went with.  There&amp;rsquo;s also &lt;code&gt;cpu-x3-beta&lt;/code&gt; or &lt;code&gt;gpu-x3-beta&lt;/code&gt; which supposedly include a number of improvements, but based on reports I&amp;rsquo;ve seen the processing is currently a LOT slower.  Deepstack is in the process of open sourcing the software so hopefully when that process is complete we&amp;rsquo;ll see improved versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I would also highly suggest playing around with the Deepstack UI built by Rob Markcole, which you can find &lt;a class=&#34;link&#34; href=&#34;https://github.com/robmarkcole/deepstack-ui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  It will help you set up the entities in HomeAssistant since you can see how adjusting the x/y coordinates will affect image processing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re running BlueIris, then I would suggest checking out the custom component &lt;a class=&#34;link&#34; href=&#34;https://github.com/elad-bar/ha-blueiris&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  You can get might higher quality streams into HomeAssistant this way (over the MJPEG one I had set up), and you can easily get various alerts set up (without having to define them all in YAML).  Note for the alerts you&amp;rsquo;ll want to refer to the BlueIris manual located &lt;a class=&#34;link&#34; href=&#34;https://github.com/elad-bar/ha-blueiris/blob/master/docs/blueiris-server.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  This also lets you use BlueIris&amp;rsquo;s profiles, which was something I hadn&amp;rsquo;t used too much before but absolutely am now to help control when alerts are sent to HomeAssistant and thus limiting the amount of logic in HASS/NodeRed that&amp;rsquo;s required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think Rob mentions it in his video, but I would encourage you to set the motion sensitivity of the cameras to pretty high, since any false positive alerts &lt;em&gt;should&lt;/em&gt; be sifted out by Deepstack.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Not a lot of &amp;ldquo;how to&amp;rdquo; in this post since I think the documentation is pretty well explained.  I intended this more as an explanation of how easy it is to set up AI-based object detection in your home and boost the accuracy of your motion alerts.&lt;/p&gt;
&lt;p&gt;Overall, this was a pretty easy project to set up.  It took some tweaking of the motion sensitivity of the camera and getting all the alerts set up but overall the result is that I no longer get false positives of &amp;ldquo;someone at the door&amp;rdquo; when there really isn&amp;rsquo;t.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Eufy Indoor 2K (including Pan/Tilt) Camera Review</title>
        <link>https://blog.fuzzymistborn.com/eufy-indoor-cam-review/</link>
        <pubDate>Fri, 03 Jul 2020 18:17:12 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/eufy-indoor-cam-review/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/eufy-indoor-cam-review/header.jpg" alt="Featured image of post Eufy Indoor 2K (including Pan/Tilt) Camera Review" /&gt;&lt;p&gt;As I noted in &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/&#34; &gt;one of my first posts&lt;/a&gt;, I have used the Wyze V2 indoor cams for almost 2 years.  I started off with the cameras flashed to the custom &lt;a class=&#34;link&#34; href=&#34;https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dafang-Hacks firmware&lt;/a&gt; which worked OK.  I was using &lt;a class=&#34;link&#34; href=&#34;https://blueirissoftware.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Blue Iris&lt;/a&gt; as my NVR and I saw a lot of disconnects/breaks in the recording.  Eventually Wyze released a &lt;a class=&#34;link&#34; href=&#34;https://support.wyzecam.com/hc/en-us/articles/360026245231-Wyze-Cam-RTSP&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;custom firmware version&lt;/a&gt; that supported RTSP.  However, after more than a year development on the firmware has gone no where.  I still saw tons of drops/disconnects while recording and the picture quality was just ehh.  I know there are many people out there who have had lots of success with the RTSP firmware, but from what I&amp;rsquo;ve seen usually it&amp;rsquo;s people running only 1 or 2 cameras.  I was running 6 and even after expanding my WiFi network capability by adding a dedicated wireless access point I still had drops.  I had more luck using MotionEye to record but then there was no sound.&lt;/p&gt;
&lt;p&gt;To be clear, the Wyze Cam v2 was remarkable.  It was the first decent camera that sold for $20 ($25 with shipping) and I had no issue recommending them to friends and family looking for a cheap way to get cameras in their house.  They even could be mounted outside and fared fairly well all things considered.  The streaming quality was pretty decent for the price and the free cloud storage (with the 12 second clips) supplemented by an SD card was pretty awesome.  But after 2 years the limitations (and no progress on the RTSP end or getting the camera integrated into HomeAssistant) really was getting to me.&lt;/p&gt;
&lt;p&gt;Then in March I saw an article about Eufy releasing an indoor 2K pan and tilt and a stationary camera.  The retail prices were announced at $49 and $39 respectively, but pre-orders saw about a 25% discount bringing the prices down to pretty much the same prices as the WyzeCam v2 and WyzeCam Pan.  I know and like the Eufy brand after being very pleased with my doorbell cam so I was interested in giving them a go.  So I went a bit crazy and ordered enough to replace every Wyzecam in my house.&lt;/p&gt;
&lt;h2 id=&#34;general-featuresthoughts&#34;&gt;General Features/Thoughts
&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s start with the obvious question: did the RTSP work better on the Eufy cam? &lt;strong&gt;YES&lt;/strong&gt;.  A million times yes.  I&amp;rsquo;ve had all 6 cameras streaming to Blue Iris without a single drop (or at least one that&amp;rsquo;s noticeable) for almost 2 weeks.  That alone makes the camera worth it.  In terms of picture quality, it&amp;rsquo;s mostly a tie with maybe a small nod towards the Eufy.  I definitely don&amp;rsquo;t think it&amp;rsquo;s &amp;ldquo;2K&amp;rdquo; in terms of quality but the color temps feel a bit more normal and it&amp;rsquo;s easier to make out facial features.&lt;/p&gt;
&lt;p&gt;Other vast improvements I&amp;rsquo;ve noticed over the Wyze cam are 1) the app/stream is very quick to load and rarely fails, 2) the speaker quality for the two way talk is pretty decent, and 3) more importantly the microphone is significantly better on the Eufy cam than the Wyze.  Another benefit of the Eufy cams is the on-board AI that is able to detect persons, pets and crying.  Wyze introduced person detection (though was forced to pull it when the company they used got bought by Apple) but from what I&amp;rsquo;ve gathered it was just OK.  The Eufy detection is pretty much spot on, though occasionally I get a notification about a pet being detected when my son is playing with his stuffed animals.  I&amp;rsquo;m sure that will get better with time.&lt;/p&gt;
&lt;p&gt;Some other things I&amp;rsquo;ve noticed that differentiate the cameras.  First, an SD card is required in order to receive notifications on the Eufy.  I was planning on using an SD card anyway so this wasn&amp;rsquo;t a big deal.  I also appreciated the ability to rate-limit the notifications so I wouldn&amp;rsquo;t get constant notifications when motion was detected (anywhere from no cooldown to 5 minutes).  Pairing the Eufy cam to my wifi network was a much simpler process than with the Wyze.  Sometimes I would have issues getting a Wyze cam connected but I had no issues with the Eufy.  Perhaps because the Eufy pairing process uses bluetooth instead of a QR code the camera scans.&lt;/p&gt;
&lt;p&gt;Recording is also very easy to set up and you can simultaneously record to an SD card as well as to an NVR via RTSP (I do this because sometimes it&amp;rsquo;s easier to find the clip I want on the camera without having to go into my NVR software).  Video scrubbing on the Eufy app is infinitely superior to the Wyze experience.  On the Wyze I&amp;rsquo;d so often be unable to find the spot I needed because it would take forever to load the footage (and oftentimes would just flat out fail to load).  So far no issues on the Eufy, and as an added bonus there&amp;rsquo;s a clear way to tell when the camera has detected motion/sound (yellow bar as opposed to the general blue).&lt;/p&gt;
&lt;h2 id=&#34;indoor-2k-camera&#34;&gt;Indoor 2K Camera
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review1.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review1_hu_2369d63f96191aea.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review1_hu_c3d74b7b5a1efab5.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review2.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review2_hu_691f76e29939be38.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review2_hu_970b07944312b871.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review3.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review3_hu_b66d6434531c477b.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review3_hu_a31a79559eccd08d.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review4.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review4_hu_c48a017472ae0cd5.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review4_hu_48245fde047d3957.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review5.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review5_hu_8bb9b03f2f476160.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review5_hu_2e60ee5c0cdde2b8.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review6.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;1500&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review6_hu_6df7a736bfa80aa9.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review6_hu_1d82fd88eeee9ce6.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I just wanted to include a few thoughts that are particular to each camera as there are some slight differences to note.  The Eufy camera is slightly bigger than the Wyze thanks to the larger stand that doesn&amp;rsquo;t compact like the Wyze stand can.  But that&amp;rsquo;s not a huge deal to me.  The stand also isn&amp;rsquo;t as adjustable it&amp;rsquo;s flexible enough that I don&amp;rsquo;t think it&amp;rsquo;ll be a big problem.  Unlike the Wyze, the mount is not magnetic so if you want to mount the Eufy cam on a wall you&amp;rsquo;ll need to use the included mounting plate with screws.  Somewhat limiting but also not a huge deal.&lt;/p&gt;
&lt;h2 id=&#34;pantilt-camera&#34;&gt;Pan/Tilt Camera
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review7.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;1500&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review7_hu_b3ee57206f49f196.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review7_hu_fd89883a22b89932.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review8.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;2667&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review8_hu_389cbb350910490e.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review8_hu_41504ec8349c811a.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;74&#34;
		data-flex-basis=&#34;179px&#34;
	
&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review9.jpg&#34;
	width=&#34;2000&#34;
	height=&#34;1500&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review9_hu_6834ec5060f6cf79.jpg 480w, https://blog.fuzzymistborn.com/eufy-indoor-cam-review/eufy-review9_hu_55a2e1e9e52cd49b.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t actually have a Wyze Pan to compare the Eufy one too but I don&amp;rsquo;t have a ton to say about the Eufy pan that hasn&amp;rsquo;t been said above.  There&amp;rsquo;s a standard mounting plate in the box that lets you screw into most available wall mounting solutions which is nice.  The camera motor is virtually silent (my kid never reacts when I move the camera around at night even before he falls asleep), versus I&amp;rsquo;ve read some complaints about the Wyze Pan motor being a bit loud.  Another cool feature of the Eufy is that when the camera is off the lens rotates back into the body (which also exposes the SD card slot, btw) so it&amp;rsquo;s easy to tell that the camera is off.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;Overall I love the Eufy cams and I don&amp;rsquo;t see myself going back to the Wyze cams unless the V3 is something remarkable (no, there&amp;rsquo;s no official word on if/when a V3 is coming).  I loved the Wyze cams but they&amp;rsquo;re long in the tooth at this point and the hardware limitations are obvious at this point.  The fact that it can&amp;rsquo;t handle RTSP but the Eufy can is I think indicative of this issue.  My gripes with the Eufy are pretty small (no truly working HomeAssistant integration, limited ability to control the notification schedule) but other than that they&amp;rsquo;re great and even for slightly more expensive than the Wyze cam at $15 I think it&amp;rsquo;s money well spent.  Though I would expect there to be frequent discounts on the cameras in true Anker/Eufy style once they get past the initial roll out).&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Adventures in Individually Addressable LEDs</title>
        <link>https://blog.fuzzymistborn.com/individually-addressable-leds/</link>
        <pubDate>Fri, 19 Jun 2020 19:28:58 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/individually-addressable-leds/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/individually-addressable-leds/header.png" alt="Featured image of post Adventures in Individually Addressable LEDs" /&gt;&lt;p&gt;So as I mentioned in my previous post about desk detection, I recently redid my office and installed some cabinets.  The lighting was OK but I really wanted some extra light (and at times, pizazz!) and had seen a lot of people talking about individually addressable LEDs.  So I decided to start off with a small project and see how it went.  I also was tired of dealing with my outside solar-powered pathway lights that only worked half the time and just looked eh so decided to install some LED strips outside.&lt;/p&gt;
&lt;p&gt;I learned a LOT from both projects and interestingly though I tried to wire them the same they both ended up with different set ups because I used different software on the ESP boards.  This one is going to be quite long and have a lot of pictures/diagrams/links to videos.&lt;/p&gt;
&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;Ok, so let&amp;rsquo;s start with the obvious question.  What is an individually addressable LED?  There are two kinds of LEDs out there.  The first is the ones you see with a remote that can change to lots of colors, but the entire strip is a single color.  Individually addressable are, surprise, strips where each individual LED can be a different color or on/off.  This is what you see when you see light shows like this on peoples house for the holidays:&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/3V245QDDXqU&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Now I&amp;rsquo;m not saying setting up a show like that is easy (that&amp;rsquo;s a whole other category than what I&amp;rsquo;m doing here).  For most home automation projects you&amp;rsquo;ll want individually addressable LEDs.  They&amp;rsquo;re cheap, easy to use (once you figure it out), and can be controlled by an ESP8266/ESP32.  Plus, they&amp;rsquo;re lots of fun!&lt;/p&gt;
&lt;h2 id=&#34;hardware&#34;&gt;Hardware
&lt;/h2&gt;&lt;p&gt;There are a lot of options when it comes to individually addressable LEDs.  Dr. Zzs does a terrific breakdown of the different types and the things you should consider.  It&amp;rsquo;s geared more towards an outdoor LED display (and goes into more than just the hardware, we&amp;rsquo;ll get to the rest of it below) but there&amp;rsquo;s some good info on the LEDs themselves in here:&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/tXvtxwK3jRk&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;You may have already seen this next one because Dr. Zzs mentions/links to it in his video but here&amp;rsquo;s a great rundown of the different varieties of LEDs (warning, it&amp;rsquo;s somewhat technical but makes for a great watch):&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/QnvircC22hU&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;And just one more for good measure that&amp;rsquo;s also holiday-ish focused but has a lot of useful info:&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/_UiqrnRiqpk&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;In summary, here are the things to consider:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Strings versus strips2) 5v versus 12v3) Power supply4) If strips, what kind of waterproofing (personal suggestion is &amp;lt;IP30 for anything inside and IP65 for outside (IP67 is kinda overkill and harder to work with).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For my project I ended up using WS2812B 5v strips.  I did end up getting a set of 5v bulbs, but we&amp;rsquo;ll get to why in a bit.  Here&amp;rsquo;s the rest of what you&amp;rsquo;ll need&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B081CSJV2V/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;ESP8266 NodeMCU (3-pack)&lt;/strong&gt;&lt;/a&gt; - $13.99 (Assuming you don&amp;rsquo;t already have from a previous project)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Electrical wire&lt;/strong&gt; - Anywhere from 18-22 gauge wire is fine.  The higher gauge/thinner wire (like 22 gauge) works for small projects.  If you&amp;rsquo;re doing a large or outdoor project, get lower/thicker gauge wire (like 18 gauge)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B01712N5C4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Soldering iron&lt;/strong&gt;&lt;/a&gt; - $15.99 (optional depending on how you chose to resolve the problem I&amp;rsquo;ll explain below with data wire corruption).&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B01EV70C78/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Jumper cables&lt;/strong&gt;&lt;/a&gt; - $6.98 (this should be plenty for several projects and gives you options for male-male, female-female, and male-female connectors)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LEDs!&lt;/strong&gt; I&amp;rsquo;m not going to make any particular recommendations here since there&amp;rsquo;s a ton.  Just search on eBay, Amazon, or AliExpress and you&amp;rsquo;ll find a ton.  I&amp;rsquo;ve bought Chinly, Alitove, and BTF-Lighting and all are good.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power Supply&lt;/strong&gt; - As Dr. Zzs explained, the size of your power supply will be dictated by how many LEDs you want to power.  His &amp;ldquo;Zzimple rule&amp;rdquo; of 50 LEDs per amp is decent though know you want to do white light at higher brightness, budget for more amps (maybe more like 30 LEDs per amp).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For my outdoor project, I added the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B018HHMBW2/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Waterproof outdoor box&lt;/strong&gt;&lt;/a&gt; - $22.99.  I like this one, though it&amp;rsquo;s HUGE.  There are smaller sizes (I got the large) so get whatever size you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aluminum Cord channel&lt;/strong&gt; - ~$35.00 for 10m of channel.  You pick what you like best.  Just be aware that there are differing levels of &amp;ldquo;diffusion&amp;rdquo; (ie how hard is it to see the individual LEDs).  How strong a diffuser you want will depend on your use case and personal preferences.  I like the Muzata ones I got, you find what works for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;software&#34;&gt;Software
&lt;/h2&gt;&lt;p&gt;There are two popular options for controlling LEDs: &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/p/9b58593b-af89-4beb-9d97-9b362912b0fc/esphome.io/&#34; &gt;ESP Home&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/Aircoookie/WLED/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WLED&lt;/a&gt;.  Both require flashing the ESP board with custom firmware (ESP Home is a bit easier here but WLED can use the ESP flasher software so it&amp;rsquo;s not that much of an advantage and both integrate very painlessly as integrations in HomeAssistant (as simple as entering the IP address of the ESP board) so don&amp;rsquo;t let that drive your decision.  I&amp;rsquo;ve used both and here&amp;rsquo;s my 2 cents.&lt;/p&gt;
&lt;h3 id=&#34;esp-home&#34;&gt;ESP Home
&lt;/h3&gt;&lt;p&gt;ESP Home is absolutely fantastic for doing a LOT of things with ESP boards, &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/esp8266-projects/&#34; &gt;as I&amp;rsquo;ve covered before&lt;/a&gt;.  It&amp;rsquo;s strength is its flexibility and simplicity.  But that&amp;rsquo;s also a drawback for LEDs, depending on your use case.  If you want a lot of fun light effects, then while ESP Home has a &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/light/index.html#light-effects&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;number of effects&lt;/a&gt;, they aren&amp;rsquo;t quite as much fun as WLED&amp;rsquo;s without some effort.  But if all you&amp;rsquo;re looking for is a simple LED setup I think ESP Home is perfect.  For my office setup it was really great because I got to use the same ESP board that I use for detecting brightness.  If I&amp;rsquo;d wanted to use WLED I would have needed 2 separate ESP boards since I wanted individual strip control and WLED can only use a single data pin (D4).  More on this below (sorry for being a tease).&lt;/p&gt;
&lt;p&gt;I suggest using the &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/light/fastled.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;FastLED&lt;/a&gt; library though some people claim better results with the &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/light/neopixelbus.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NeoPixelBus&lt;/a&gt; library.  Both worked fine for me so pick whichever you prefer.&lt;/p&gt;
&lt;p&gt;One other tip, you can set up &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/light/partition.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;light partitions&lt;/a&gt;&amp;rdquo; which essentially are different segments of lights.  That took me a bit to find but was very useful.&lt;/p&gt;
&lt;h3 id=&#34;wled&#34;&gt;WLED
&lt;/h3&gt;&lt;p&gt;WLED is brilliant.  Absolutely brilliant.  There are &lt;a class=&#34;link&#34; href=&#34;https://github.com/Aircoookie/WLED/wiki/List-of-effects-and-palettes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SO MANY EFFECTS&lt;/a&gt; it&amp;rsquo;s hard to find which one is my favorite.  WLED has an Android app that&amp;rsquo;s very easy to use and WLED allows syncing of the controller with other WLED controllers so you can have the same effects running on different strips, all controlled from one spot.  Handy for light shows.  You also can sync with Alexa and Hue natively which is also useful for some (not for me).&lt;/p&gt;
&lt;p&gt;The main drawback to WLED IMO is that you can only use a single data pin (D4) without recompliling the code yourself (at least that&amp;rsquo;s my understanding, please someone correct me if I&amp;rsquo;m wrong!).  It also has so many bells/whistles that for a simple LED strip it&amp;rsquo;s kinda overkill.&lt;/p&gt;
&lt;h3 id=&#34;which-one&#34;&gt;Which one?
&lt;/h3&gt;&lt;p&gt;Again, I think both have their use cases.  Want a fun light show with cool effects to impress your friends?  Go with WLED.  Looking for simplicity?  ESP Home is the way to go.&lt;/p&gt;
&lt;h1 id=&#34;wiring-it-up&#34;&gt;Wiring it Up
&lt;/h1&gt;&lt;p&gt;This is definitely the most complicated part and the part I struggled the most with.  Maybe you&amp;rsquo;re better at understanding electrical wiring than I am but it just took me a lot of time to wrap my head around some of the concepts/how to wire things.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s 3 wires you need to deal with.  5 volts (usually red), ground (usually white) and data (I see it normally as green).  Below is a wiring diagram for a basic setup.&lt;/p&gt;
&lt;figure&gt;&lt;a href=&#34;LED---Simple-Wiring.png&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/LED---Simple-Wiring.png&#34;
    alt=&#34;Basic LED wiring setup&#34; width=&#34;500&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;
      &lt;p&gt;Basic LED wiring setup&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A few notes here.  First, &lt;strong&gt;DO NOT TRY TO POWER YOUR LEDS OFF OF USB POWER TO THE ESP BOARD&lt;/strong&gt;.  You will let out the magic smoke and will have a dead board (ask me how I know&amp;hellip;).  You can power the ESP board off your power supply by connecting it the 5v wire to the VIN pin on the ESP and ground to a ground pin on the ESP.  Second, I have the data wire running off D4.  Remember for WLED that&amp;rsquo;s a requirement, but for ESP Home you aren&amp;rsquo;t restricted to just D4 (there&amp;rsquo;s a few limitations but a few of them will work).  Third, you may have noticed the &amp;ldquo;&amp;lt;2 feet&amp;rdquo; comment next to the data wire.  This is because if your data wire is too long (basically 2ish feet on 5v), the data signal can get corrupted and the result will be flickering/screwy LEDs.&lt;/p&gt;
&lt;p&gt;The Hook Up has a pretty good technical explanation of what the issue is and a solution using a logic level shifter (jump to about 1:30 into the video):&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/UWb2i6BHx1g&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a wiring diagram:&lt;/p&gt;
&lt;figure&gt;&lt;a href=&#34;LED---Logic-Level-Shifter.png&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/LED---Logic-Level-Shifter.png&#34;
    alt=&#34;LEDs with a logic level shifter&#34; width=&#34;600&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;
      &lt;p&gt;LEDs with a logic level shifter&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;As explained in the video, the logic level shifter boosts the output of the data wire to 5 volts.  To do that, you need to take a 3.3v wire and ground, along with the data wire, and feed it into one end of the logic level shifter.  The output then is 5v that you feed back to the main line and then the data wire goes off and can be very long (my outside wire run is ~25 feet without issues).&lt;/p&gt;
&lt;p&gt;As an FYI in case you&amp;rsquo;re splitting your data wire, I found it was best to split the wire BEFORE you feed into the logic level shifter.  I initially had mine done afterwards and i ran into problems. &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07F7W91LC/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This&lt;/a&gt; was the board I used.  Your results may vary.&lt;/p&gt;
&lt;p&gt;For my indoor set of LEDs I really didn&amp;rsquo;t want to have to solder the pins to the logic level shifter board so I took a different path based on a Dr. ZZs&amp;rsquo;s video.  Basically instead of a logic level shifter, if you use an LED wired near the ESP board it acts very similar to the logic level shifter in boosting the voltage on the data wire.  Jump to 11:00 in the video for an explanation/visual demo.&lt;/p&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/ZFO_QOBG9Bs&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;I&amp;rsquo;m a visual person so again here&amp;rsquo;s a wiring diagram for you to look at.&lt;/p&gt;
&lt;figure&gt;&lt;a href=&#34;LED---Sacrificial-Pixel.png&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/LED---Sacrificial-Pixel.png&#34;
    alt=&#34;Wiring with a sacrificial pixel&#34; width=&#34;600&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;
      &lt;p&gt;Wiring with a sacrificial pixel&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Note that WLED allows you to turn off the first LED in settings (probably for this reason).  For ESP Home I set up a light partition to handle.&lt;/p&gt;
&lt;p&gt;Also, to stress using the proper wire gauge, don&amp;rsquo;t be like me.  Otherwise you end up with this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/charred-wires.jpg&#34;
    alt=&#34;Oops.&#34; width=&#34;400&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Oops.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&#34;results&#34;&gt;Results
&lt;/h1&gt;&lt;p&gt;Here&amp;rsquo;s my final result for the outside project:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;a href=&#34;outdoor-box.jpg&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/outdoor-box.jpg&#34;
    alt=&#34;Yes the wiring in the box is ugly (and I can probably cut it) but it works so I&amp;rsquo;m leaving it alone&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;
      &lt;p&gt;Yes the wiring in the box is ugly (and I can probably cut it) but it works so I&amp;rsquo;m leaving it alone&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;a href=&#34;outside-led.jpg&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/outside-led.jpg&#34; width=&#34;300&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;a href=&#34;outside-lights.jpg&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/outside-lights.jpg&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;And inside:&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;a href=&#34;inside-leds-cropped.png&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/inside-leds-cropped.png&#34;
    alt=&#34;Here&amp;rsquo;s an example of the wiring with sacrificial pixels&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;
      &lt;p&gt;Here&amp;rsquo;s an example of the wiring with sacrificial pixels&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;a href=&#34;inside-sac-pixel.jpg&#34;&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/individually-addressable-leds/inside-sac-pixel.jpg&#34; width=&#34;300&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;These were not easy projects for me, but ultimately I learned a LOT.  I&amp;rsquo;m debating expanding the outdoor LED setup for a holiday display but not sure I want to take on that hassle/headache.  I do think my next project is going to be under the bed LEDs that come on when the SO or I get out of bed at night (turn on dim red for night vision).  I mean, I already have the ESP board just sitting there waiting&amp;hellip;.hahaha.&lt;/p&gt;
&lt;p&gt;Hope this is useful to some who are considering taking on an LED project of their own.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Desk Detection with ESP8266&#39;s</title>
        <link>https://blog.fuzzymistborn.com/desk-detection-with-esp8266s/</link>
        <pubDate>Sat, 13 Jun 2020 18:31:21 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/desk-detection-with-esp8266s/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/desk-detection-with-esp8266s/header.jpg" alt="Featured image of post Desk Detection with ESP8266&#39;s" /&gt;&lt;p&gt;This is a bit of a tease since part of this project was to install individually addressable LED strips (WS2812B&amp;rsquo;s) under the cabinets I recently installed in the office and I&amp;rsquo;m waiting to write that part up until I finish a more complicated outside install.  But I still think it&amp;rsquo;s useful to discuss how I&amp;rsquo;m detecting whether I am at my desk to turn on the LEDs or not.&lt;/p&gt;
&lt;p&gt;Since I didn&amp;rsquo;t want the LEDs on all the time unless I was sitting at my desk I needed to figure out a way to detect whether I was sitting at my desk or not.&lt;/p&gt;
&lt;h2 id=&#34;attempt-1&#34;&gt;Attempt #1
&lt;/h2&gt;&lt;p&gt;For my first attempt, I decided to try the capacitive sensors I&amp;rsquo;d been using for &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/esp8266-projects/&#34; &gt;bed detection&lt;/a&gt;.  Those worked&amp;hellip;.OK.  I started with 2 and eventually made 4 (actually 8 total as I made 4 for my spouse&amp;rsquo;s desk as well).  Benefit here was that I already had a spare ESP32 lying around to use (and there are 8 touch-enabled pins on the ESP32) and making the sensor mats isn&amp;rsquo;t incredibly difficult so I really didn&amp;rsquo;t have much to lose by trying.&lt;/p&gt;
&lt;p&gt;But no matter how much I tweaked them (changing placement, adjusting the sensitivity, etc) I couldn&amp;rsquo;t get them to work reliably.  Sometimes I got false positives when the chair was in a certain spot, other times I&amp;rsquo;d be sitting/not moving but the sensor would turn off anyway.  After a few days I decided I needed to take another approach.&lt;/p&gt;
&lt;h2 id=&#34;brainstorming-other-ideas&#34;&gt;Brainstorming Other Ideas
&lt;/h2&gt;&lt;p&gt;Did some searching and found 2 other solutions that people had tried.  The first is to use a contact sensor (like a door sensor).  The idea is that when you sit in the chair you&amp;rsquo;d push the sensors close enough to each other that the sensor would turn on.  I didn&amp;rsquo;t like this solution because neither my spouse&amp;rsquo;s desk chair nor mine would have made this easy due to the design. Also, neither one has a lot of up/down if we&amp;rsquo;re seated or not so it didn&amp;rsquo;t seem like it would work well.&lt;/p&gt;
&lt;p&gt;The other solution, and the one I finally settled on, was to use an &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07RGB4W8V&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HC-SR04 ultrasonic sensor&lt;/a&gt;, like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/desk-detection-with-esp8266s/desk-detection1.png&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;This little guy sends out an ultrasonic ping at a pre-defined period (potentially every few miliseconds if you really wanted) and detects how far away an object is from it (I think it has a range limit of about 2 meters).&lt;/p&gt;
&lt;h2 id=&#34;setting-things-up&#34;&gt;Setting Things Up
&lt;/h2&gt;&lt;p&gt;So the setup here is really easy.  You&amp;rsquo;ll need the following (and may already have some of the parts around if you&amp;rsquo;ve done any other ESP-based projects):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;An ESP8266 or ESP32&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An ultrasonic sensor.  I used the HC-SR04.  They&amp;rsquo;re fairly cheap (about $7-9 on Amazon for 5 can be easily found).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jumper wires&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power adapter/micro usb cable to power the ESP.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it!  I used ESP Home for this and followed the &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/sensor/ultrasonic.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;instructions on the site&lt;/a&gt; to wire it.  It&amp;rsquo;s pretty simple.  VCC to VIN (5 volts), ground to ground, and then TRIG/ECHO to a data/GPIO pin of your choice (I used D5 and D6).&lt;/p&gt;
&lt;p&gt;Turning to the code, here&amp;rsquo;s my config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ultrasonic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;trigger_pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;D6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;echo_pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;D5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Ultrasonic Sensor&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;1s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;desk&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;binary_sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Desk Sensor&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lambda&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|-&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      if (id(desk).state &amp;lt; 0.75 ) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        return true;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      } else {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;        return false;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delayed_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;2s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delayed_off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;5s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The actual sensor is what measures the distance.  I have it update every 1 second which I find to be fast enough for me.  I also filter out small changes (anything less than 0.1m in change will not be reported to HomeAssistant, that&amp;rsquo;s what the deta line is for).  I also created a binary sensor to report on/off depending if the distance is below a certain level.  For me, I found 0.75 was fairly accurate though I still may need to tweak a bit.  I further filtered this to delay the &amp;ldquo;on&amp;rdquo; by 2 seconds to just make sure there wasn&amp;rsquo;t a whacky one-off reading and similarly 5 second delayed off to make weed out any small movements I might make.&lt;/p&gt;
&lt;p&gt;I then added the sensors to HomeAssistant via the ESP Home integration (supppppper easy) and then created some automations to turn the lights on/off.&lt;/p&gt;
&lt;p&gt;For the installation I just used some mounting putty and electrical wire to run the USB cable around the edge of the desk.  Finished result is that you can&amp;rsquo;t even really see it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/desk-detection-with-esp8266s/desk-detection2.jpg&#34;
    alt=&#34;Not the prettiest install but it works&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Not the prettiest install but it works&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Ease of project:&lt;/strong&gt; 9/10.  The first iteration with the under-mat sensors was a lot more complicated (requiring soldering/long wire runs and making the mats).  The ultrasonic sensor by contrast was incredibly easy and simple to do.  Probably the easiest ESP project to date.&lt;/p&gt;
&lt;p&gt;Next up is either a summary of my experiences with individually addressable LEDs and ESP boards (with both WLED and ESP Home) or a write up on my new Eufy indoor cams.  But since I&amp;rsquo;m still waiting on my order of the pan/tilt cams I may delay doing a review of the Eufy cams until I have both (brief review: it&amp;rsquo;s muuuuuuch better than the Wyze cam in a lot of areas and equal in all the rest with no drawbacks).&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Setting up NodeRed</title>
        <link>https://blog.fuzzymistborn.com/setting-up-nodered/</link>
        <pubDate>Fri, 05 Jun 2020 00:34:40 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/setting-up-nodered/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/setting-up-nodered/header.png" alt="Featured image of post Setting up NodeRed" /&gt;&lt;p&gt;As mentioned in &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/what-software-do-i-run/&#34; &gt;one of my first posts&lt;/a&gt;, I love &lt;a class=&#34;link&#34; href=&#34;https://nodered.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NodeRed&lt;/a&gt; and use it for virtually all of my automations.  It&amp;rsquo;s a visual automation editor that I find much easier to use than the YAML-based automation system in HomeAssistant.  If you&amp;rsquo;re a visual person like me (and even if you aren&amp;rsquo;t) you may find NodeRed simpler to use.  I also much prefer the easy debugging my automations that was difficult to do in HomeAssistant.&lt;/p&gt;
&lt;p&gt;In this post I&amp;rsquo;m going to go through how to install it, install some basic palettes, and how the integration with HomeAssistant works.  Let&amp;rsquo;s get to it.&lt;/p&gt;
&lt;h1 id=&#34;installation&#34;&gt;Installation
&lt;/h1&gt;&lt;h2 id=&#34;docker&#34;&gt;Docker
&lt;/h2&gt;&lt;p&gt;Installing NodeRed is really easy.  I run it in Docker and below is my Docker-Compose file that you can use.  If you aren&amp;rsquo;t already using Docker or Docker-Compose I&amp;rsquo;ll point you &lt;a class=&#34;link&#34; href=&#34;https://www.linode.com/docs/applications/containers/how-to-use-docker-compose/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodered&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;container_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nodered&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;nodered/node-red&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;./nodered:/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;1880:1880&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;TZ=America/New_York&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s all you need.  Run &lt;code&gt;docker-compose up -d nodered&lt;/code&gt; (while you&amp;rsquo;re in the directory where the &lt;code&gt;docker-compose.yaml&lt;/code&gt; file is located) and then open your browser.  Type in &lt;code&gt;http://YOUR_IP_ADDRESS:1880&lt;/code&gt; and you should be greeted with a page that looks like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/setting-up-nodered/NodeRed.png&#34;
    alt=&#34;Your new NodeRed install&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Your new NodeRed install&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;If you aren&amp;rsquo;t, a possible issue is ownership of the NodeRed folder.  Run &lt;code&gt;sudo chown -R YOUR_USER:YOUR_GROUP /path/to/your/nodred/dir&lt;/code&gt;.  If you don&amp;rsquo;t know what I mean by user/group see &lt;a class=&#34;link&#34; href=&#34;https://www.howtogeek.com/howto/ubuntu/see-which-groups-your-linux-user-belongs-to/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this article&lt;/a&gt;.  Restart the container and you should be all set.&lt;/p&gt;
&lt;h2 id=&#34;npm-install&#34;&gt;NPM Install
&lt;/h2&gt;&lt;p&gt;Don&amp;rsquo;t want to use Docker?  That&amp;rsquo;s fine.  You&amp;rsquo;ll just need to follow the instructions over on the NodeRed website &lt;a class=&#34;link&#34; href=&#34;https://nodered.org/docs/getting-started/local&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  In a nutshell, you&amp;rsquo;ll need to install node.js and then run this command:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo npm install -g --unsafe-perm node-red
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then all you need to do is run &lt;code&gt;node-red&lt;/code&gt; from terminal and NodeRed will start.  You&amp;rsquo;ll probably want to run it in screen or create some kind of systemd process to run NodeRed in the background as you want it running all the time (otherwise no automations!).&lt;/p&gt;
&lt;h2 id=&#34;home-assistant-add-on&#34;&gt;Home Assistant Add-On
&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s also possible to install NodeRed if you&amp;rsquo;re running &amp;ldquo;Home Assistant&amp;rdquo; (formerly known as &amp;ldquo;Hass.io&amp;rdquo;).  Check out more information &lt;a class=&#34;link&#34; href=&#34;https://github.com/hassio-addons/addon-node-red&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;next-steps&#34;&gt;Next Steps
&lt;/h1&gt;&lt;p&gt;So now we have NodeRed installed and running.  Let&amp;rsquo;s figure out what everything is.  If you&amp;rsquo;re a visual person, check out this video by &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=SuoSXVqjyfc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The Hook Up&lt;/a&gt; (2 years old but still pretty accurate though some things have changed).&lt;/p&gt;
&lt;p&gt;On the left side of the screen are all the different &amp;ldquo;node&amp;rdquo; types you can use.  A node is a thing that you can do to execute a function/command depending.  You&amp;rsquo;ll see more on this later&lt;/p&gt;
&lt;p&gt;At the top you have something called &amp;ldquo;Flow 1.&amp;rdquo;  Each &amp;ldquo;page&amp;rdquo; in NodeRed is called a &amp;ldquo;flow,&amp;rdquo; but personally I think it&amp;rsquo;s easier to just think of them as pages.&lt;/p&gt;
&lt;p&gt;On the right side is an info bar and also very importantly a debug panel button and the deploy button.  The info bar is useful when you click on a node to get some information about how the node can be used/what features it has.  The debug panel (bug icon next to the &amp;ldquo;&lt;em&gt;i&amp;rdquo;&lt;/em&gt; is useful for debugging your automations and seeing where you have problems.  Finally the &amp;ldquo;deploy&amp;rdquo; button is what &amp;ldquo;saves&amp;rdquo; everything.  You can configure the deploy type by clicking the arrow next to &amp;ldquo;deploy.&amp;rdquo;  I would suggest switching the deploy style to &amp;ldquo;Modified Nodes.&amp;rdquo;  The default of &amp;ldquo;Full&amp;rdquo; will literally redeploy every single node in NodeRed.  So if you&amp;rsquo;re running a timer, it will reset the node every time you hit deploy.  Instead, if you do &amp;ldquo;modified nodes&amp;rdquo; it will only deploy the nodes you actually changed.  This makes more sense to me, but the decision is yours.&lt;/p&gt;
&lt;h2 id=&#34;useful-palettes&#34;&gt;Useful palettes
&lt;/h2&gt;&lt;p&gt;There are TONS of palettes out there that let you do all sorts of crazy things.  To install a node, all you need to do is click the 3 lines in the top right corner and then &amp;ldquo;Manage palette.&amp;rdquo;  Click on &amp;ldquo;Install&amp;rdquo; and from there you can search for an install a module/palette.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/setting-up-nodered/NodeRed-Palettes.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Personally I&amp;rsquo;ve found a few very useful.  Here&amp;rsquo;s a list with a brief description of what they do and why I like it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;node-red-contrib-home-assistant-websocket&lt;/code&gt; - We&amp;rsquo;ll get to this one more in a minute, but this is what you need to connect HomeAssistant and NodeRed.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;node-red-contrib-schedex&lt;/code&gt; - This node acts similar to a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/docs/automation/trigger/#time-trigger&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;time trigger&lt;/a&gt; in HomeAssistant but also lets you add an off time as well as use sunrise/sunset as a time (or golden hour, dawn/dusk, and a whole host of other times of day) along with offsets if you need to adjust the time slightly.  I use this one a lot to run automations at certain times of day/days of the week.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;node-red-contrib-time-range-switch&lt;/code&gt; - Time Range is similar to a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/docs/scripts/conditions/#time-condition&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;time&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/docs/scripts/conditions/#sun-condition&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;sun&lt;/a&gt; condition in HomeAssistant.  When an input is passed in it checks to see if the time of day is within the parameters you set (such as between 12pm and 3pm, or sunrise to sunset).  If yes, you can set the output to go one way.  If no, then the output can be sent another way.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;node-red-contrib-weekday&lt;/code&gt; - Similar to Time Range but this one is for days of the week.  If an input comes in and the day is one that you select (say Monday-Friday), the output can be routed one way, and if it&amp;rsquo;s outside of that it can be routed another way.&lt;/p&gt;
&lt;p&gt;What about &lt;code&gt;node-red-contrib-bigtimer&lt;/code&gt;?  I know a lot of people swear by BigTimer.  Personally I found it way too cumbersome and complicated for my purposes.  There&amp;rsquo;s so many outputs/things you can do that I was just overwhelmed and felt the 3 time/date palettes above were much easier to work with/use.&lt;/p&gt;
&lt;h1 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h1&gt;&lt;p&gt;Let&amp;rsquo;s get NodeRed talking to HomeAssistant.  Go to Manage Palettes and install, and search for &lt;code&gt;node-red-contrib-home-assistant-websocket&lt;/code&gt;.  Then click &amp;ldquo;install.&amp;rdquo;  A popup box will show up asking you to read the documentation.  Just click &amp;ldquo;install&amp;rdquo; again.  You should see a notification that a bunch of new nodes were added to NodeRed.  If you scroll all the way to the bottom on the left side, you should now see something like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/setting-up-nodered/NR-hass-nodes.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Before we get into what each node does, we need to configure NodeRed to talk to HomeAssistant.  Pick any HomeAssistant node, click and drag it onto the grid.  Then double click on the node and you&amp;rsquo;ll see a screen that looks like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/setting-up-nodered/NR-hass-setup.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Click the pencil button next to &amp;ldquo;Add new server.&amp;rdquo;  If you&amp;rsquo;re running HomeAssistant/HASS.IO then click the &amp;ldquo;I use the Home Assistant Add-on&amp;rdquo; option.  Otherwise fill out the base URL (I&amp;rsquo;d suggest using your local server IP/port even if you have have HomeAssistant publicly accessible).  You also will need to get a Long Lived Access Token (see below image).  Once you have that, click &amp;ldquo;Add&amp;rdquo; and you&amp;rsquo;re set.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/setting-up-nodered/NR-hass-LLAT.png&#34;
    alt=&#34;Scroll all the way to the bottom of your profile in HomeAssistant and click &amp;lsquo;Create Token.&amp;rsquo; Name it, then copy the value to the &amp;lsquo;Access Token&amp;rsquo; line in NodeRed&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Scroll all the way to the bottom of your profile in HomeAssistant and click &amp;lsquo;Create Token.&amp;rsquo; Name it, then copy the value to the &amp;lsquo;Access Token&amp;rsquo; line in NodeRed&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now that we have HASS and NodeRed talking, let&amp;rsquo;s go through some of the nodes.  Personally I don&amp;rsquo;t use the Webhook, Fire Event, Get Entities, Get History or API nodes.  I&amp;rsquo;m sure they have use but I haven&amp;rsquo;t found a need for them.  Here&amp;rsquo;s a quick use case for the other nodes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Events: all&lt;/strong&gt; -&amp;gt; Useful for picking up on events like &lt;code&gt;deconz&lt;/code&gt;, &lt;code&gt;zwave.node_event&lt;/code&gt;, and others.  I don&amp;rsquo;t use this one a ton but it&amp;rsquo;s super useful when you need it.  Only has an output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Events: state&lt;/strong&gt; -&amp;gt; Probably one of my most used nodes.  You can pick an &lt;code&gt;entity_id&lt;/code&gt; to target, or you can do a substring or regex to use more than one entity at a time.  You also can make the node act like a true/false if you put a state, OR you can leave the &amp;ldquo;if state&amp;rdquo; field blank and it will output whenever the state changes.  This is the man way I trigger my automations in NodeRed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trigger: state&lt;/strong&gt; -&amp;gt; Very similar to the Events: state node, but has the added benefit that you can set constraints on it.  For example, if you have a temperature sensor and you only want it to trigger when the temperature is between 70 and 72 degrees just set the constraints appropriately it will output only when those conditions are met.  You also can add additional constraints for &lt;em&gt;other&lt;/em&gt; entities.  So if you want the automation to trigger, but only when the temperature sensor is between 70 and 72 AND you aren&amp;rsquo;t home, you can do that with the trigger: state node.  You also can set different outputs depending on the state&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Poll state&lt;/strong&gt; -&amp;gt; useful if you want to check the state of an entity and trigger if the value changes.  I don&amp;rsquo;t find a ton of use for this since most of my sensors update regularly but if you have some that are slow to update, it can be useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Call service&lt;/strong&gt; -&amp;gt; the main way to do something with HomeAssistant.  This will probably be the node at the end of your automation.  It&amp;rsquo;s basically the same thing as the &amp;ldquo;action&amp;rdquo; in HomeAssistant YAML automations, so think of it that way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current state&lt;/strong&gt; -&amp;gt; I use this mostly like the conditions in HomeAssistant YAML automations.  You can use it to check the value of an entity and to send the flow one way if it&amp;rsquo;s true and another way if it&amp;rsquo;s false.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get Template&lt;/strong&gt; -&amp;gt; I often use this node similarly to the current state node.  Basically you can use it to run a template in HomeAssistant and use that output of that template in your automation.  I like to use template nodes to replace strings of current state nodes as you can do &lt;code&gt;{{ state(&#39;input_boolean.number1&#39;) == &#39;on&#39; and state(&#39;input_boolean.number2&#39;) == &#39;on&#39;&lt;/code&gt; instead of doing 2 different current state nodes.  One thing I do with template nodes is I usually change the results output to &lt;code&gt;msg.results&lt;/code&gt;.  That way I can keep the value of the &lt;code&gt;msg.payload&lt;/code&gt; but then also have the output from the template in case I need to use that later.  Also, if you&amp;rsquo;re using the template node to evaluate conditions of entities so the result is true/false, you&amp;rsquo;ll want to put a switch node after it so you can filter out if the statement is true/false depending on which you want.  The node will always output no matter what.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wait until&lt;/strong&gt; -&amp;gt; A handy one to use if you want to trigger an automation but then wait a bit before continuing.  Example I have is that when the house door to my garage is opened it sets off an automation but then waits 5 minutes to see if my car starts.  If it does, then the automation continues and opens the garage door.  If it doesn&amp;rsquo;t then the automation stops.  You can customize how long for the timeout (0 is no timeout).&lt;/p&gt;
&lt;h2 id=&#34;nodered-integration&#34;&gt;NodeRed Integration
&lt;/h2&gt;&lt;p&gt;There is a &lt;a class=&#34;link&#34; href=&#34;https://github.com/zachowj/hass-node-red&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NodeRed Custom Component&lt;/a&gt; for HomeAssistant that provides a few more features, most notably the ability to turn some things on/off in NodeRed from HomeAssistant as well as create sensors in HomeAssistant.  This has some interesting use cases that I&amp;rsquo;m still exploring so I would encourage you to install and take a look.  You can read more about it in the &lt;a class=&#34;link&#34; href=&#34;https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/custom_integration/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;documentation here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;other-useful-nodes&#34;&gt;Other Useful Nodes
&lt;/h2&gt;&lt;p&gt;There&amp;rsquo;s a lot of other really useful nodes in NodeRed that I use all the time.  The debug and inject nodes are absolutely invaluable for testing out new automations to make sure they work without having to wait for the automations to trigger on their own.  The link in/out nodes are extremely useful for reusing bits of automation or service calls without having to repeat them over and over again.  And the switch and change nodes are equally useful in causing my automations to split/move around in different ways depending on the value that&amp;rsquo;s received.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;The above really is just scratching the surface of what NodeRed can do.  I&amp;rsquo;m a visual person so I find it much easier to use that the HomeAssistant automation system, though I&amp;rsquo;m glad I learned that as it does help with figuring out service calls for NodeRed.  I think the main thing I really like with NodeRed is the ease I can reuse things without having to write out hundreds of lines of YAML.  I would strongly encourage you to try out NodeRed.  You can easily set it up and use it in parallel with the HomeAssistant automations as you slowly transition things over.  So you have nothing to lose!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>MergerFS &#43; SnapRAID - Perfection?</title>
        <link>https://blog.fuzzymistborn.com/mergerfs/</link>
        <pubDate>Tue, 02 Jun 2020 01:09:20 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/mergerfs/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/mergerfs/header.jpg" alt="Featured image of post MergerFS &#43; SnapRAID - Perfection?" /&gt;&lt;p&gt;Recently I&amp;rsquo;ve begun listening to the &lt;a class=&#34;link&#34; href=&#34;https://selfhosted.show/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Self-Hosted podcast&lt;/a&gt;.  One of the hosts, Alex, is a huge fan of &lt;a class=&#34;link&#34; href=&#34;https://github.com/trapexit/mergerfs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MergerFS&lt;/a&gt;.  He&amp;rsquo;s written about it a few times as the &amp;ldquo;Perfect Media Server&amp;rdquo; solution.  You can here him talk about it &lt;a class=&#34;link&#34; href=&#34;https://selfhosted.show/5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; or read one of his write ups &lt;a class=&#34;link&#34; href=&#34;https://blog.linuxserver.io/2016/02/02/the-perfect-media-server-2016/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://blog.linuxserver.io/2017/06/24/the-perfect-media-server-2017/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://blog.linuxserver.io/2019/07/16/perfect-media-server-2019/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  For the record he does also really like ZFS, but his write up of MergerFS and SnapRAID intrigued me for 2 reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The ability to increase the size of the data array easily after you&amp;rsquo;ve already created it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ability to use drives of different sizes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;zfsmergerfs&#34;&gt;ZFS/MergerFS
&lt;/h3&gt;&lt;p&gt;Originally I was using ZFS and it was&amp;hellip;.fine.  I created my drive pool using Raid-Z (3 drives, 1 parity disk) and mounted it and&amp;hellip;.never really gave it a second thought.  I know I wasn&amp;rsquo;t using a lot of the more fun features of ZFS but that really wasn&amp;rsquo;t what I was after, I just wanted the ability to pool drives into an array and have a parity disk for &amp;ldquo;backup&amp;rdquo; (&lt;a class=&#34;link&#34; href=&#34;https://blog.storagecraft.com/5-reasons-raid-not-backup/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RAID IS NOT BACKUP&lt;/a&gt; but it&amp;rsquo;s a nice security blanket).&lt;/p&gt;
&lt;p&gt;But I slowly was reaching max capacity on my array and realized I was going to have trouble expanding the array.  And by trouble I meant &amp;ldquo;uhhhh&amp;hellip;.&amp;rdquo;.  ZFS pool expansion has been on the &amp;ldquo;coming soon&amp;rdquo; list &lt;a class=&#34;link&#34; href=&#34;https://www.freebsdfoundation.org/blog/openzfs-raid-z-online-expansion-project-announcement/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;since 2017&lt;/a&gt; but I haven&amp;rsquo;t seen any progress.  One solution would be to create a new array and either add it to my server (which I don&amp;rsquo;t have room for) or transfer the data over (requiring another computer).  Honestly neither option was super appealing to have to do on an even infrequent basis.  Also, ZFS is complicated because you need to buy matching drives which adds to the cost/complexity.&lt;/p&gt;
&lt;p&gt;So I decided to look into MergerFS and SnapRAID.  The install is really easy (and well laid out in the above linked-to posts).  Essentially, it&amp;rsquo;s 1) install MergerFS, 2) figure out the drive serial IDs, 3) create directories for the mount points (including one for the &amp;ldquo;usable&amp;rdquo; mount point, 4) edit fstab to mount the drives, and 5) run &lt;code&gt;mount -a&lt;/code&gt;.  That&amp;rsquo;s it.  You can add and remove drives from the mount fairly easily as well so it&amp;rsquo;s really very flexible.  Which is great for a media server because I can slowly add HDDs in or replace dead ones instead of being constrained by the limitations of ZFS.&lt;/p&gt;
&lt;h3 id=&#34;snapraid&#34;&gt;SnapRAID
&lt;/h3&gt;&lt;p&gt;For parity, &lt;a class=&#34;link&#34; href=&#34;https://www.snapraid.it/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SnapRAID&lt;/a&gt; is pretty cool too.  It&amp;rsquo;s not instantaneous parity like ZFS so technically if you have data loss between backups intervals you&amp;rsquo;re screwed.  But here&amp;rsquo;s actually where another advantage of MergerFS comes into play.  All the data for a file is stored on a single disk.  So if your HomeMovies.mkv file is on Disk 1 and Disks 2, 3 and 4 fail&amp;hellip;.no worries, your home movies are fine.  Unlike with something like ZFS where if you exceed the fault tolerance of the array (&lt;em&gt;i.e.&lt;/em&gt; you&amp;rsquo;re running RAID-Z/RAID5 and lose 1 disk, or RAID-Z2 and lose 2 disks, etc) you lose ALL the data of the array.  Pretty sweet.&lt;/p&gt;
&lt;p&gt;Setting up SnapRAID was a bit more complicated than MergerFS because I had some issues initially with &lt;a class=&#34;link&#34; href=&#34;https://github.com/Chronial/snapraid-runner&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SnapRunner&lt;/a&gt; but those issues worked themselves out over time and now it&amp;rsquo;s all fine and dandy.  Again, I used Alex&amp;rsquo;s guide to build SnapRAID and run SnapRunner so I would point you there for a how to.&lt;/p&gt;
&lt;h3 id=&#34;data-transfer&#34;&gt;Data Transfer
&lt;/h3&gt;&lt;p&gt;This is more of a &amp;ldquo;lulz&amp;rdquo; bit but because I was out of space in my server (no more SATA/power connectors) I needed a way to transfer data over.  Recently I&amp;rsquo;d upgraded my desktop motherboard/CPU and I had it lying around still.  So I did the drive swap and set up the spare &amp;ldquo;computer&amp;rdquo; and transferred the data over.  Took a day or two to transfer the few TBs of data and then I retired the setup, but overall it went well and now I have all my data on the new array of disks and can expand it as needed without having to do this again, which is a relief.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/mergerfs/frankenserver.png&#34;
    alt=&#34;Frankenserver&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Frankenserver&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So that&amp;rsquo;s now how I&amp;rsquo;m doing my storage in my server.  MergerFS+SnapRAID ftw.  I would highly recommend it over ZFS for most people building a home server array.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ESPs ESPs everywhere!</title>
        <link>https://blog.fuzzymistborn.com/esp8266-projects/</link>
        <pubDate>Wed, 27 May 2020 16:47:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/esp8266-projects/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/esp8266-projects/header.jpg" alt="Featured image of post ESPs ESPs everywhere!" /&gt;&lt;p&gt;Ohhhh ESP8266.  How I have grown to love thee.  For a long time I was resistant to using them because I didn&amp;rsquo;t know how to solder and it just seemed to complicated to me.  But I stumbled across a project (linked below) to create bed detection for super cheap and I was intrigued enough to give it shot.  Being stuck at home thanks to COVID-19 also helped me want to find some projects to keep me busy.  I also started to mess around with &lt;a class=&#34;link&#34; href=&#34;https://github.com/ct-Open-Source/tuya-convert&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tuya-Convert&lt;/a&gt; and flashing some ESP8266-based smart plugs with &lt;a class=&#34;link&#34; href=&#34;https://github.com/arendst/Tasmota/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tasmota&lt;/a&gt; which made me realize how simple and easy working with ESP8266&amp;rsquo;s is.&lt;/p&gt;
&lt;p&gt;My ESP8266 of choice is the NodeMCU.  There are other options out there, like the popular Wemo D1 Mini.  The Wemo D1 is a lot smaller than the NodeMCU but requires soldering the pins on.  Being a solder newbie I wasn&amp;rsquo;t comfortable with this option so I stuck with the NodeMCU and so far have been very happy with them.&lt;/p&gt;
&lt;h2 id=&#34;parts&#34;&gt;Parts
&lt;/h2&gt;&lt;p&gt;Because I find it useful to link out to the products (and include pricing), here&amp;rsquo;s what I ended up buying.  All links are to Amazon (note that these are straight links with no commission or anything to me).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B081CSJV2V/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;ESP8266 NodeMCU (3-pack)&lt;/strong&gt;&lt;/a&gt; - $13.99&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07Q576VWZ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;ESP32 NodeMCU (2-pack)&lt;/strong&gt;&lt;/a&gt; - $14.99&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07TFF9FTM/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;22 gauge electrical wire&lt;/strong&gt;&lt;/a&gt; - $15.39 (this should be plenty for several projects)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B01712N5C4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Soldering iron&lt;/strong&gt;&lt;/a&gt; - $15.99 (yes I didn&amp;rsquo;t own a soldering iron before this.  Bad nerd.)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B01N1FKS4L&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Lux sensors (10 pack)&lt;/strong&gt;&lt;/a&gt; - $8.99 (read more below on why these)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B00HJ6ACY2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;SW420 Vibration sensors (5 pack)&lt;/strong&gt;&lt;/a&gt; - $5.99&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B01EV70C78/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Jumper cables&lt;/strong&gt;&lt;/a&gt; - $6.98 (this should be plenty for several projects and gives you options for male-male, female-female, and male-female connectors)&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B0725RDKDL/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Boxes (5 pack)&lt;/strong&gt;&lt;/a&gt; - $8.99 (I looked a while for something that would work, this was the best I could find.  Required some minor dremmel work to put holes in for the cords/sensors but they work great)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;setting-up-esp-home&#34;&gt;Setting up ESP Home
&lt;/h2&gt;&lt;p&gt;There&amp;rsquo;s a few options for flashing ESP8266/ESP32.  As mentioned above, Tasmota is one.  I like Tasmota for pre-built switches/plugs/outlets/other devices.  But for custom built things I felt that I wanted something a little easier to work with.  The other popular solution out there is &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ESP Home&lt;/a&gt;.  Both work well with HomeAssistant, but I found ESP Home to be a bit easier (it can be set up as an integration and all you need is the IP address of the device) and the configuration is via YAML.  The ESP Home website has a lot of useful information/configs for different sensors, including a pretty cool list of &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/guides/diy.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DIY projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://esphome.io/guides/getting_started_command_line.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Installing ESP Home is really easy&lt;/a&gt;.  All you need to do is run &lt;code&gt;pip3 install esphome&lt;/code&gt;.  That&amp;rsquo;s it.  I also would also suggest installing the dashboard with &lt;code&gt;pip3 install tornado esptool&lt;/code&gt;.  Then to pull up the dashboard, run &lt;code&gt;esphome PATH_TO_ESPHOME_DIR dashboard&lt;/code&gt; (replace &amp;ldquo;PATH_TO_ESPHOME_DIR&amp;rdquo; with a path of your choosing.  Mine is /home/fuzzy/esphome for example).  Usually I like installing things in Docker, but because the first time you flash a device via a USB cable and my server is in the basement, I figured I&amp;rsquo;d forgo Docker this time.&lt;/p&gt;
&lt;p&gt;If you install the dashboard, flashing new devices is as easy as clicking the plus icon on the right side, naming the device, selecting what kind of device, providing the WiFi information (SSID/password), and that&amp;rsquo;s it.  If you don&amp;rsquo;t have the dashboard, it&amp;rsquo;s also pretty easy as there&amp;rsquo;s a &amp;ldquo;wizard&amp;rdquo; to walk you through the process (see the ESP Home docs for this as it&amp;rsquo;s pretty self-explanatory).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d suggest flashing a generic ESP Home install without any sensors.  Once you do the first flash you can then update over the air (OTA) which I found far more convenient.&lt;/p&gt;
&lt;p&gt;With ESP Home being set up, let&amp;rsquo;s jump into some simple projects!&lt;/p&gt;
&lt;h2 id=&#34;ambient-light-sensors&#34;&gt;Ambient Light Sensors
&lt;/h2&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp1.jpg&#34;
    alt=&#34;Light sensor box. Had to drill out an end for the light sensor to poke through but not the worst&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Light sensor box. Had to drill out an end for the light sensor to poke through but not the worst&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp2.jpg&#34;&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp3.jpg&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;I have a bunch of Dome ZWave motion sensors that are supposed to be able to detect light levels.  However, only about 20% of them actually work reliably for the light detection, most are stuck at 0 lux.  I&amp;rsquo;ve really enjoyed having motion sensors turn the lights on/off in rooms as I walk through, but there are some rooms that get enough light generally during the day that I don&amp;rsquo;t need the lights on.  I&amp;rsquo;d seen things like the &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/cookbook/bruh.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bruh Multisensor&lt;/a&gt; that got me interested in this as an option.&lt;/p&gt;
&lt;p&gt;Bruh&amp;rsquo;s video in the above link is a pretty good description of the parts involved.  However, I had a hard time tracking down the exact parts he used because a bunch of the links 404&amp;rsquo;d.  I also wasn&amp;rsquo;t a fan of the TEMT6000 because again, soldering newb.  So I went looking. &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07B94Q1C8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;My first option&lt;/a&gt; looked like it would work.  However, upon receiving it and trying to wire it up using the Bruh guide, I realized that the values I was getting out of the sensor didn&amp;rsquo;t make sense (pitch black and bright light were only about 2 lux different).  Turns out that version only had Digital Out (DO) and what I needed was an option that supported Analog Out (AO).  A bunch more searching and I found one that had an AO pin and was presoldered.  Perfect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A limitation of this sensor is that it maxes out at 200 lux so if you want to detect light variations in really bright rooms this probably won&amp;rsquo;t work.  For my purposes it&amp;rsquo;s fine.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp4.png&#34;
    alt=&#34;You need the AO pin (circled in red)&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;You need the AO pin (circled in red)&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Wiring up the sensor is as simple as taking some jumper wires, connecting ground to a ground pin on the NodeMCU, VCC to a 3.3v pin on the NodeMCU, and AO to AO on the NodeMCU.  Below is a wiring guide for the NodeMCU.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp5.png&#34;
    alt=&#34;Wire to the pins boxed in red&#34; width=&#34;500&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Wire to the pins boxed in red&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Once it&amp;rsquo;s wired up, time to configure the code in ESP Home.  Power up the NodeMCU, edit your YAML file by adding the below code at the end of the file, click &amp;ldquo;Save,&amp;rdquo; and then &amp;ldquo;Upload.&amp;rdquo;  Once it&amp;rsquo;s done flashing you should have a working light sensor.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;adc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;A0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Room Brightness&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;lambda&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|-&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          return 200-(x / 10000.0) * 2000000.0;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the name to match whatever you want.&lt;/p&gt;
&lt;p&gt;You can adjust the update_interval to be faster or slower.  For me, I found 60 seconds to be fast enough but adjust to whatever suits your purposes.  You also technically can manually adjust the sensitivity with the screw on the sensor board, but I didn&amp;rsquo;t find this made a whole lot of difference so I left it alone.&lt;/p&gt;
&lt;p&gt;Adding the sensor as mentioned above is as simple as going to the Integrations page in HomeAssistant, clicking the plus/add button, searching for ESP Home, entering the IP address and a sensor will be automatically added to HomeAssistant.  You don&amp;rsquo;t really need a box/container but I found it nice to make it look &amp;ldquo;clean&amp;rdquo; and hide the LED lights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ease of project:&lt;/strong&gt; 9/10&lt;/p&gt;
&lt;p&gt;Only difficulty with this one was tracking down the right sensor and drilling the holes in the boxes for the sensor to poke through.  Other than that it doesn&amp;rsquo;t get much simpler.&lt;/p&gt;
&lt;h2 id=&#34;dryer-vibration-sensor&#34;&gt;Dryer Vibration Sensor
&lt;/h2&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp6.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I&amp;rsquo;ve always wanted some kind of laundry automation to tell me when the washer/dryer are done so I remember to move the wash to the dryer and fold the clothes in the dryer.  My issue was that I have an electric dryer meaning I couldn&amp;rsquo;t just use a normal smart plug with energy monitoring.  I looked into energy detection using clamps &lt;a class=&#34;link&#34; href=&#34;https://shelly.cloud/shelly-energy-meter-with-contactor-control-wifi-smart-home-automation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;like this&lt;/a&gt; but at $50+ I didn&amp;rsquo;t think it was worth it.  I also tried the Xiaomi Aqara vibration sensor but I couldn&amp;rsquo;t get it to reliable detect vibration when the dryer was running so gave up on that approach.&lt;/p&gt;
&lt;p&gt;Then I stumbled across &lt;a class=&#34;link&#34; href=&#34;https://github.com/rmooreID/Home-Assistant-Appliance-Monitor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this solution&lt;/a&gt; which uses an ESP8266 and an SW-420 vibration sensor.  Since the sensors were cheap ($5 for 5!) and I was going to have a spare ESP8266 lying around after my light sensor project, I figured what the heck, might as well pick some up and give it a go.&lt;/p&gt;
&lt;p&gt;Wiring it up was again very straightforward.  Ground to ground, VCC to a 3.3v pin, and D0 to one of the pins labelled D0-8.  When you&amp;rsquo;re setting up ESPHome you can either convert the D pin to GPIO (refer to the above image for the pin layout on the NodeMCU) or just put in D whatever (ie D1, D2, D7, etc).&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the code (based on the above GitHub):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;binary_sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpio&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;GPIO16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Dryer Vibration&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;vibration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delayed_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;15ms&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delayed_off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;10s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hit save, upload, and wait for the new image to be flashed to the ESP8266 and you should be set to go.  Adding to HomeAssistant is similarly easy.  But here&amp;rsquo;s where I started running into problems.&lt;/p&gt;
&lt;p&gt;First I wanted to have a sensor that had a state of &amp;ldquo;Running&amp;rdquo; or &amp;ldquo;Not Running.&amp;rdquo;  Simple, create a template sensor and can even customize the icon depending on state.  Great.  However I started noticing that the vibration sensor was sometimes not detecting vibration for periods of time or fluctuating back/forth.  Also when the dryer door was opened/closed it would detect vibration.  Not ideal.&lt;/p&gt;
&lt;p&gt;I played with a number of solutions to solve this problem.  First, placement of the sensor is crucial.  Turn your dryer on and try to find a spot where the vibration seems higher and place the sensor there.  Next, you can adjust the sensitivity of the sensor using a screwdriver and turning the little screw.  For me I found that I had to turn up the sensitivity pretty high to get it to work.&lt;/p&gt;
&lt;p&gt;That solves some of the problems, but I still had issues with the door opening/closing.  My solution was to adjust my template sensor to require the binary vibration sensor to have last changed more than 30 seconds ago before the template sensor updates.  So if the vibration sensor is &amp;ldquo;on&amp;rdquo; for 30 seconds it would change, or &amp;ldquo;off&amp;rdquo; for 30 seconds it would change.  Any changes inside 30 seconds (like the door opening/closing) wouldn&amp;rsquo;t cause the template sensor to adjust.  I also spent a LOT of time adjusting the filter values in ESP Home before settling on what I did (15ms on, 10s off).  You&amp;rsquo;ll just need to play around with the different options to find what works for you.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my working template sensor for HomeAssistant:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dryer_running&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Dryer Running&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sensor.time&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if ((as_timestamp(now()) - as_timestamp(states.binary_sensor.dryer_vibration.last_changed)) &amp;gt; 30 | int ) and states(&amp;#39;binary_sensor.dryer_vibration&amp;#39;) == &amp;#39;on&amp;#39;  %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            Running
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            Not Running
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% if states(&amp;#39;binary_sensor.dryer_vibration&amp;#39;) == &amp;#39;on&amp;#39; %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            mdi:tumble-dryer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% else %}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            mdi:tumble-dryer-off
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          {% endif %}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp7.png&#34;
    alt=&#34;(Almost) finished product in HASS. Likely will remove everything but the Status sensors eventually.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;(Almost) finished product in HASS. Likely will remove everything but the Status sensors eventually.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now when the washer or dryer go from &amp;ldquo;Running&amp;rdquo; to &amp;ldquo;Not Running&amp;rdquo; the spouse and I get pings on our phone.  Handy.&lt;/p&gt;
&lt;p&gt;(I did washer sensing using a &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/gp/product/B07XC7SKZK&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tuya-converted power monitoring smart plug&lt;/a&gt; and the status template sensor is based on the watts being used by the washer).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ease of project:&lt;/strong&gt; 6.5/10&lt;/p&gt;
&lt;p&gt;Again, very easy to wire.  But the difficulty in getting it to work perfectly makes this slightly more complicated.  And it&amp;rsquo;s still not perfect (there are a few false positive alerts that the washer/dryer is done), but given that the price was super cheap ($7 for the washer plug, $4 for the ESP8266 and $5 for the vibration sensors) it was worth it.&lt;/p&gt;
&lt;h2 id=&#34;bed-sensors&#34;&gt;Bed Sensors
&lt;/h2&gt;&lt;p&gt;Following &lt;a class=&#34;link&#34; href=&#34;https://medium.com/the-smarter-home/smart-bed-7de9ad55276e&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this guide&lt;/a&gt; I built a half decent bed sensor.  This was my first experience soldering &lt;em&gt;anything&lt;/em&gt; and it was surprisingly easy.  The guide is pretty good at walking through what you need (&lt;strong&gt;note the need for an ESP32 and NOT an ESP8266&lt;/strong&gt;.  I missed that fact at first and had to wait for the ESP32 to be delivered).  Making the sensor plates was pretty easy and the wiring is also pretty straightfoward once you get the soldering done.  I would suggest writing down which plate you&amp;rsquo;re wiring to which pin so you aren&amp;rsquo;t like me and trying to figure out which plate is which after you installed everything (oops).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/esp8266-projects/esp8.png&#34;
    alt=&#34;Sigh. Jumble of wires.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Sigh. Jumble of wires.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I&amp;rsquo;ve only had this up for a night but&amp;hellip;it seems to work well.  You&amp;rsquo;ll need to tweak the threshold setting to get it working but so far it&amp;rsquo;s pretty accurate.  I&amp;rsquo;ll update this post if I find any other issues.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really excited to have this one set up because I got tired of the spouse and I sitting in bed reading or watching TV and the lights turning off on us.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ease of project:&lt;/strong&gt; 7.75/10&lt;/p&gt;
&lt;p&gt;Because it requires soldering I had to knock a bit off.  It also involved a bit of effort to make the panels and also some tweaking to figure out the optimal settings.  I also have an issue with the idea that this is a &amp;ldquo;$5 smart bed.&amp;rdquo;  It is if you happen to have all the parts already lying around.  But if you don&amp;rsquo;t, it&amp;rsquo;s more like $40/50.  Still not that bad (and I have a spare ESP32 for another project, likely outdoor pathway lighting) but definitely not $5.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;So that&amp;rsquo;s a few things you can use ESP8266 for.  Honestly the options seem pretty much limitless.  My next project is going to be LEDs for my office and outside pathway lights, but I&amp;rsquo;ve also got my eyes on &lt;a class=&#34;link&#34; href=&#34;https://adonno.com/salt-level-sensor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this project&lt;/a&gt; to monitor salt levels in my water softner.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Alarm Control via HomeAssistant using Tasker, Join, and SleepAsAndroid</title>
        <link>https://blog.fuzzymistborn.com/automated-alarm-control/</link>
        <pubDate>Wed, 27 May 2020 03:06:16 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/automated-alarm-control/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/automated-alarm-control/header.jpg" alt="Featured image of post Alarm Control via HomeAssistant using Tasker, Join, and SleepAsAndroid" /&gt;&lt;h1 id=&#34;introduction&#34;&gt;Introduction
&lt;/h1&gt;&lt;p&gt;There&amp;rsquo;s a million different ways of handling alarms to make sure you get up in the morning.  Some people turn on the radio.  Others need the lights to turn on bright.  Still others need literal klaxons blaring in their ears.  For me none of those options will work because usually I&amp;rsquo;m getting up early before my spouse to go for a run.  So anything loud won&amp;rsquo;t work.  A pretty good solution for me is using &lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=com.urbandroid.sleep&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SleepAsAndroid&lt;/a&gt; tied to my Garmin watch so when my alarm goes off it first vibrates my watch.  If I don&amp;rsquo;t turn the alarm off in ~2 minutes for some reason then it starts up with the progressively increasing in volume alarm sound.&lt;/p&gt;
&lt;p&gt;Since I run, there are days when I don&amp;rsquo;t want to run such as when it&amp;rsquo;s too cold or pouring rain.  I try to look at the weather forecast but sometimes the rain is scattered or it turns out not to be as cold as forecasted.  So I wanted a way to automatically turn my early alarm off and turn on a later alarm, allowing me to sleep in.  I also just wanted a way to adjust my alarm without having to pull out my phone, and with the recent COVID-19 outbreak adjust my alarm on the fly depending on my work schedule has proven useful.&lt;/p&gt;
&lt;p&gt;There are 3 basic parts to this: 1) the ability to toggle an individual days alarm on/off, as well as the next day&amp;rsquo;s alarm, and then turn on a standard &amp;ldquo;sleep in&amp;rdquo; alarm, 2) the ability to turn off the next day&amp;rsquo;s alarm and set a custom alarm time, 3) the ability to turn on &amp;ldquo;vacation mode&amp;rdquo; and disable all the alarms and turn on an extra-late sleep in alarm (just in case!).&lt;/p&gt;
&lt;p&gt;The below solution works for me and could probably be adjusted to work for you fairly easily.  So far it&amp;rsquo;s been fairly bulletproof with some minor tweaks, but I would strongly suggest you test it carefully before you become 100% reliant on it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Things we need (other than HomeAssistant and NodeRed):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=com.joaomgcd.join&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Join&lt;/strong&gt;&lt;/a&gt; - similar to apps like Pushbullet, this one is made by the same dev as Tasker.  As a result, it has a unique feature we&amp;rsquo;ll need which is the ability to call Tasker activities remotely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Tasker&lt;/strong&gt;&lt;/a&gt; - a super handy app for any Android user.  If you don&amp;rsquo;t have it, it&amp;rsquo;s worth the few dollars as it can pretty much do&amp;hellip;.anything.  And the dev is always adding new features. &lt;strong&gt;This is Android only; sorry iOS users.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**&lt;a class=&#34;link&#34; href=&#34;https://play.google.com/store/apps/details?id=com.urbandroid.sleep&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SleepAsAndroid&lt;/a&gt; ** (any alarm app should work, so long as it supports some way of being controlled by Tasker, such as via intents)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;homeassistant-setup&#34;&gt;HomeAssistant Setup
&lt;/h1&gt;&lt;p&gt;HomeAssistant is relatively simple and requires a number of input_booleans, input_numbers, and a template sensor (optional).  Below is the code you can copy in your &lt;code&gt;configuration.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;input_number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarmhour_custom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Hour&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:timer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarmminutes_custom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Minutes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;mdi:timer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;55&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_custom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_disable_next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Skip Next Alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;input_boolean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_mon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Monday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_tue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Tuesday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_wed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Wednesday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_thu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Thursday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_fri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Friday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_sat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Saturday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_sun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Sunday&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_vacation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Vacation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_custom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_disable_next&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Skip Next Alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;work_home&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  	&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pandemic Mode&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# aka Work from Home&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sensors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alarm_time_custom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;friendly_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{{ &amp;#34;%0.02d:%0.02d&amp;#34; | format(states(&amp;#34;input_number.alarmhour_custom&amp;#34;) | int, states(&amp;#34;input_number.alarmminutes_custom&amp;#34;) | int) }}&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The sensor is optional because I only use it to visually display my alarm time in Lovelace (see below).  I use a custom card called &lt;a class=&#34;link&#34; href=&#34;https://github.com/benct/lovelace-multiple-entity-row&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Multiple  Entity Row&lt;/a&gt; and I think it&amp;rsquo;s nice but not necessary for the core functionality we&amp;rsquo;ll discuss.  Similarly optional, the &amp;ldquo;Pandemic Mode&amp;rdquo; is my COVID-19 addition that automatically turns off my early alarm at 8pm the day before.  Eventually it will be converted to a &amp;ldquo;work from home&amp;rdquo; mode.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/alarms-hass.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here&amp;rsquo;s my Lovelace code, if you want to copy it as well:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;badges&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cards&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_mon&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_tue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_wed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_thu&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_fri&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_sat&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_sun&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_header_toggle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Normal Alarms&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;sensor.alarm_time_custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;input_boolean.alarm_custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;icon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;mdi:alarm&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Enable Custom Alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;toggle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;custom:multiple-entity-row&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;input_number.alarmhour_custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;input_number.alarmminutes_custom&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_header_toggle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Custom Alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_disable_next&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.alarm_vacation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;input_boolean.work_home&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;show_header_toggle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Special Alarms&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;entities&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Alarm&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s pretty much it for HomeAssistant, except for one more piece, which is Join.&lt;/p&gt;
&lt;h1 id=&#34;join&#34;&gt;Join
&lt;/h1&gt;&lt;p&gt;As mentioned above, Join is a Pushbullet-like service that is very useful for this situation mainly for the Tasker calls.  Since this post is already going to be incredibly long I&amp;rsquo;m not going to go through all the details of setting up Join on your phone.  I would suggest checking out the dev&amp;rsquo;s website &lt;a class=&#34;link&#34; href=&#34;https://joaoapps.com/join/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; as I think it&amp;rsquo;s fairly self explanatory.&lt;/p&gt;
&lt;p&gt;Once it&amp;rsquo;s set up on your phone, we&amp;rsquo;ll need to get things working with HomeAssistant.  Check out the integration page &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/joaoapps_join/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  Again, I think the docs are fairly self-explanatory here.  The key things you need to find are your Join API key and device id.  I would suggest just using a single &lt;code&gt;device_id&lt;/code&gt; instead of the &lt;code&gt;device_ids&lt;/code&gt; or &lt;code&gt;device_names&lt;/code&gt; options.  Here&amp;rsquo;s the relevant portion of my &lt;code&gt;configuration.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;joaoapps_join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;YOUR_JOIN_API_KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;device_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;YOUR_DEVICE_ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;YOUR_DEVICE_NAME&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you reboot HomeAssistant, you should have a bunch of new services.  The key one we&amp;rsquo;ll need is &lt;code&gt;joaoapps_join.YOUR_DEVICE_NAME_send_tasker&lt;/code&gt;.  More on this later.&lt;/p&gt;
&lt;h1 id=&#34;tasker&#34;&gt;Tasker
&lt;/h1&gt;&lt;p&gt;If you haven&amp;rsquo;t used Tasker before, it&amp;rsquo;s really an amazing Android app that can do all kinds of things.  Tasker has a bit of a learning curve, and setting it up is again outside the scope of this post.  Just check out the &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/tasker&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;subreddit&lt;/a&gt; or one of &lt;a class=&#34;link&#34; href=&#34;https://www.androidauthority.com/how-to-use-tasker-199872/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;these&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.howtogeek.com/170484/how-to-use-tasker-to-automate-your-android-phone/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;articles&lt;/a&gt; for help.&lt;/p&gt;
&lt;p&gt;Instead of copying the code into this post, see this &lt;a class=&#34;link&#34; href=&#34;https://gist.github.com/FuzzyMistborn/e334f7923d8f35bba705903edae0d866&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gist&lt;/a&gt;.  You shouldn&amp;rsquo;t need to make any changes to the code as it&amp;rsquo;s very generic, so long as you&amp;rsquo;re using SleepAsAndroid.  If you&amp;rsquo;re using a different alarm app you&amp;rsquo;ll need to change the tasks to match your alarm app.  You should still be able to use the trigger from Join without much change.  Here&amp;rsquo;s what it should like when copied in.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/tasker.png&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now what does this all do?  Let&amp;rsquo;s just take the Normal Alarm Toggle profile as an example.  When Join receives the Tasker Command &amp;ldquo;Alarm&amp;rdquo; along with the variables of &lt;code&gt;alarmday&lt;/code&gt; and &lt;code&gt;alarmtoggle&lt;/code&gt; (which we&amp;rsquo;ll get to/will come from NodeRed) it will then use a shell command to toggle the alarm on a specific day on/off.  See the &lt;a class=&#34;link&#34; href=&#34;http://sleep.urbandroid.org/documentation/developer-api/intents-and-content-providers/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SleepAsAndroid API documentation&lt;/a&gt; for how I figured this part out.  Don&amp;rsquo;t worry if you don&amp;rsquo;t understand any of that, again you shouldn&amp;rsquo;t have to do anything other than import the &lt;a class=&#34;link&#34; href=&#34;https://gist.github.com/FuzzyMistborn/e334f7923d8f35bba705903edae0d866&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;xml file&lt;/a&gt;.  How to import?  Open up Tasker, long press on the bottom edge and then click &amp;ldquo;Import Project.&amp;rdquo;  Find where you saved the xml file and import it. &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/tasker/comments/7g7694/how_to_import_a_file_into_tasker_a_quick_easy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Here&amp;rsquo;s a walk through&lt;/a&gt; if that doesn&amp;rsquo;t make sense.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/tasker_add1.png&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;h1 id=&#34;sleepasandroid&#34;&gt;SleepAsAndroid
&lt;/h1&gt;&lt;p&gt;For SleepAsAndroid you&amp;rsquo;ll need 2 alarms for every day: &amp;ldquo;mon&amp;rdquo; and another called &amp;ldquo;monsleep,&amp;rdquo;  &amp;ldquo;tue&amp;rdquo; and &amp;ldquo;tuesleep&amp;rdquo; (&lt;strong&gt;note the name is important to work with the Tasker code above so follow this naming convention&lt;/strong&gt;).  You&amp;rsquo;ll also want to create an alarm called &amp;ldquo;Vacation.&amp;rdquo;  Set the alarm times to whatever you want, that&amp;rsquo;s entirely up to you!  Again not going into the finer details of setting up SleepAsAndroid here.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/sleepasandroid.jpg&#34;
    alt=&#34;Note that in this example, my Wednesday alarm is turned off, but &amp;lsquo;wedsleep&amp;rsquo; is turned on.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Note that in this example, my Wednesday alarm is turned off, but &amp;lsquo;wedsleep&amp;rsquo; is turned on.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/sleepasandroid_off.jpg&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;You also may need to enable Tasker in the SleepAsAndroid app.  Go to Settings-&amp;gt;Services and look for Tasker.  I can&amp;rsquo;t remember if this is a requirement (I don&amp;rsquo;t think it is) so you can try without it first and then enable later if things aren&amp;rsquo;t working for you.&lt;/p&gt;
&lt;h1 id=&#34;nodered&#34;&gt;NodeRed
&lt;/h1&gt;&lt;p&gt;Now finally the fun part!  This one could probably be simplified a bit on the NodeRed end but it works for me so it&amp;rsquo;s one of those &amp;ldquo;if it ain&amp;rsquo;t broke don&amp;rsquo;t fix it&amp;rdquo; deals.  Basically what it does is whenever an alarm &lt;code&gt;input_boolean&lt;/code&gt; changes, it runs through a bunch of checks and changes the data/payloads using some templates to get the data correct and then sends the Tasker command via Join.  You may wonder why there are some rate limiting nodes: after some testing I discovered that Join/Tasker can&amp;rsquo;t handle a flood of requests all at once (most notably when turning vacation mode on/off) so some alarms weren&amp;rsquo;t being turned on/off correctly.  Putting in the rate limits fixed those problems.  So this isn&amp;rsquo;t instantaneous but it shouldn&amp;rsquo;t impact anything.&lt;/p&gt;
&lt;p&gt;You will need to modify a few of the nodes to call the correct Join service.  Everything else should be plug-n-play.  The part in the bottom left corner is the reset that restores the normal alarm at a preset time of 11am.  I picked this time kind of arbitrarily.  My thought process was that if I used an earlier time I might inadvertently reset my alarm so it triggers again (ie I wake up earlier than normal I don&amp;rsquo;t want my alarm to go off twice!).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/node_red.png&#34;
	width=&#34;1216&#34;
	height=&#34;572&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/node_red_hu_8979c126a359409f.png 480w, https://blog.fuzzymistborn.com/automated-alarm-control/node_red_hu_d27578856b65a04a.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;NodeRed Flows&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;212&#34;
		data-flex-basis=&#34;510px&#34;
	
&gt; &lt;img src=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/node_red2.png&#34;
	width=&#34;493&#34;
	height=&#34;428&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/node_red2_hu_d433b25939ce4904.png 480w, https://blog.fuzzymistborn.com/automated-alarm-control/node_red2_hu_f46625c87ee9ca67.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;NodeRed Node&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;115&#34;
		data-flex-basis=&#34;276px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;The NodeRed code is at the bottom of the post.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;Phew.  It may seem complicated (and let me tell you it was a pain to figure out all the bits and pieces, most notably the Tasker/Join bits), but you really should be able to use the code without much modification.  The end result is a simple to control morning alarm system that you can use various automations (such as based on special calendar events/holidays, or other triggers) to easily modify your alarm schedule.&lt;/p&gt;
&lt;p&gt;Hope you enjoyed.  Feel free to message me over on Reddit (&lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/automated-alarm-control/reddit.com/user/fuzzymistborn&#34; &gt;/u/FuzzyMistborn&lt;/a&gt;) if you have questions or run into issues!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;7f30fabd.1fe11c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;comment&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Alarm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;70&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;740&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5001a29f.98b48c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server-state-changed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Alarm Change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;exposeToHomeAssistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;haConfig&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityidfilter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityidfiltertype&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;substring&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputinitially&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;haltifstate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_only_on_state_change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5163d1d5.eb669&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;37479bd2.d12044&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_mon, input_boolean.alarm_tue, input_boolean.alarm_wed, input_boolean.alarm_thu, input_boolean.alarm_fri, input_boolean.alarm_sat, input_boolean.alarm_sun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;510&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;920&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4628cf9a.9406d8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;790891a8.3b6418&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;data.entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_mon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_tue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_wed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_thu&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_fri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_sat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_sun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_disable_next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_custom&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;290&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2dbfb2f7.fcacae&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;34d9e1be.312416&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5cea82b2.b77f1c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;34d9e1be.312416&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;395&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;940&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;37479bd2.d12044&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;627c2fbc.2766f8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;627c2fbc.2766f8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation On&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_mon, input_boolean.alarm_tue, input_boolean.alarm_wed, input_boolean.alarm_thu, input_boolean.alarm_fri, input_boolean.alarm_sat, input_boolean.alarm_sun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;510&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;960&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4628cf9a.9406d8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;90ffc709.75d6b8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Tomorrow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{(as_timestamp(now())+ (86400)) | timestamp_custom(\&amp;#34;%a\&amp;#34;,true) | lower}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1a91437a.275f6d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;541013ae.45db2c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Enable Next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_{{result}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1030&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;57999dbf.ed9304&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Disable Next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_{{result}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1030&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;860&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1a91437a.275f6d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;915&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;541013ae.45db2c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;57999dbf.ed9304&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a3c555f8.a571d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Alarm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Alarm Vacation {{payload}}\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;940&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4628cf9a.9406d8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pauseType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeoutUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;nbRateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;second&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomFirst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomLast&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;635&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;940&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a3c555f8.a571d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9e45cc70.640eb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;data.entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;re&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;day&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;data.entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;440&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1939c7cc.46762&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;500b1ff.cdf906&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;620&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;90ffc709.75d6b8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1f231516.02baab&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1f231516.02baab&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Turn off Skip&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_disable_next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;810&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;900&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1939c7cc.46762&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Alarm Change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Alarm setvar=:={{day}}=:={{payload}}\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3bb7480c.5bbf48&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;663722e9.652aec&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Sleep Enable&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Alarm setvar=:={{day}}sleep=:=true\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;final&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1050&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;720&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;71ae75ef.9db39c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Sleep Disable&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Alarm setvar=:={{day}}sleep=:=false\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;final&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1060&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;760&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9dd3ef67.fcb088&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;935&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;740&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;663722e9.652aec&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;71ae75ef.9db39c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f461cc00.ec2b38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Custom Off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_custom, input_boolean.alarm_disable_next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;390&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b8c812bf.f6607&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Today&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ (as_timestamp(now())) | timestamp_custom(\&amp;#34;%a\&amp;#34;,true) | lower }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8b7339e2.38cc5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c4eb19ca.8e677&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Reenable Alarm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_{{result}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;380&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2dbfb2f7.fcacae&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Custom&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_custom&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;440&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;500b1ff.cdf906&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3bb7480c.5bbf48&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Alarm Check&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states(&amp;#39;input_boolean.alarm_custom&amp;#39;) == \&amp;#34;off\&amp;#34; and states(&amp;#39;input_boolean.alarm_vacation&amp;#39;) == \&amp;#34;off\&amp;#34; }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;810&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c354d9be.949cb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8b7339e2.38cc5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;220&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c4eb19ca.8e677&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;66de9a0b.b4bf5c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1120&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a76aa273.8a0f8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a76aa273.8a0f8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;895&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1120&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;73f26c6d.a40db4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4a0a3830.0b41a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ states.input_number.alarmhour_custom.state | int }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;790&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;e515bb17.f964c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;e515bb17.f964c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Minute&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;          {% if states.input_number.alarmminutes_custom.state | int == 0 %}\n            00\n          {% elif states.input_number.alarmminutes_custom.state | int == 5 %}\n            05\n          {% else %}\n            {{ states.input_number.alarmminutes_custom.state | int }}\n          {% endif %}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;minute&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;910&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c5042d57.e7d9f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c5042d57.e7d9f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Custom Alarm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Custom setvar=:={{hour}}=:={{minute}}\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;final&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1060&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;500b1ff.cdf906&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5cea82b2.b77f1c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;650&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;4a0a3830.0b41a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;421f472e.7f727&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;66de9a0b.b4bf5c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5ca46a08.9a68f4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;421f472e.7f727&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8d0081eb.831bb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8d0081eb.831bb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;895&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;73f26c6d.a40db4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;73f26c6d.a40db4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Alarm&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;joaoapps_join&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;send_tasker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{ \&amp;#34;command\&amp;#34;: \&amp;#34;Alarm Vacation Custom {{payload}}\&amp;#34; }&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dc1752fe.9078f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;schedex&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Restore Sleep In&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;suspended&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;lat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;lon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ontime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;11:00&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ontopic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onpayload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;onrandomoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offtime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offtopic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offpayload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;offrandomoffset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;thu&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;sat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;sun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;110&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1020&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b8c812bf.f6607&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f461cc00.ec2b38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2f8f5337.51397c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pauseType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeoutUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;nbRateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;30&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;second&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomFirst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomLast&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;875&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;740&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9dd3ef67.fcb088&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5163d1d5.eb669&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;delay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pauseType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;rate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;timeoutUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;nbRateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rateUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;second&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomFirst&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomLast&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;randomUnits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;195&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;840&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;790891a8.3b6418&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c354d9be.949cb8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;915&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2f8f5337.51397c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5ca46a08.9a68f4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1160&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f8830245.577a38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f8830245.577a38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Tomorrow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{(as_timestamp(now())+ (86400)) | timestamp_custom(\&amp;#34;%a\&amp;#34;,true) | lower}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;940&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1160&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9fdadc80.b6388&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9fdadc80.b6388&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b06c555f.69395&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Enable Next&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.alarm_{{result}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1090&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1160&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Home Assistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;legacy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rejectUnauthorizedCerts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ha_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;y|yes|true|on|home|open&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;connectionDelay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;cacheJson&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item>
        <item>
        <title>Automating Vacation Mode</title>
        <link>https://blog.fuzzymistborn.com/automating-vacation-mode/</link>
        <pubDate>Mon, 18 May 2020 20:28:46 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/automating-vacation-mode/</guid>
        <description>&lt;p&gt;Last week I wrote up about &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/&#34; &gt;how to set up vacation mode for your lights easily&lt;/a&gt;.  This week we&amp;rsquo;re going to complete the loop a bit and automate turning on vacation mode. &lt;strong&gt;Note this setup requires an Ecobee thermostat&lt;/strong&gt;.  It&amp;rsquo;s a popular thermostat so this may be of some use to folks.  I like the Ecobee vacation mode because it allows me to set up a permanent hold whenever I&amp;rsquo;m not at home for an extended period of time, which usually coincides with me being on vacation/away from home.  Thanks to HomeAssistant you can set up a vacation on your Ecobee from a Google Calendar or other supported calendar (I used CalDAV).&lt;/p&gt;
&lt;p&gt;Now you can set up a vacation from either the app or on the Ecobee website.  So you may be asking &amp;ldquo;why do this?&amp;rdquo;  The answer is I&amp;rsquo;m lazy and I hate having to open another app/webpage when I already put vacations in my calendar.  So why not automate it at that point?&lt;/p&gt;
&lt;h2 id=&#34;calendar&#34;&gt;Calendar
&lt;/h2&gt;&lt;p&gt;There are two main calendar options: &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/caldav/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CalDAV&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/calendar.google/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Calendar&lt;/a&gt;.  The HASS documentation is pretty decent for these so I&amp;rsquo;m not going to spend a lot of time on how to set them up.  For our purposes it doesn&amp;rsquo;t matter which one you use, just use whichever one you use/are most comfortable with.&lt;/p&gt;
&lt;p&gt;Once you get your calendars imported, find the &lt;code&gt;entity_id&lt;/code&gt; for your vacation calendar.  I find it useful to have a separate calendar for vacation but you could also use another calendar and just use a search/regex to pull out your vacation entities.  Either way, look for a &lt;code&gt;calendar.&lt;/code&gt; entry in your states page of HASS and use that for the below automations.&lt;/p&gt;
&lt;h2 id=&#34;automation&#34;&gt;Automation
&lt;/h2&gt;&lt;p&gt;Since I use NodeRed the below is how I got things to work.  I&amp;rsquo;ll share an automation for HomeAssistant that &lt;em&gt;should&lt;/em&gt; work but I don&amp;rsquo;t make any promises.  Here&amp;rsquo;s a visual of what the flow looks like (code will be towards the end of the post).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;automated-vacation-mode1.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The first node is simply a trigger node to start the flow when the calendar in HomeAssistant goes from &amp;ldquo;off&amp;rdquo; to &amp;ldquo;on&amp;rdquo; (ie the calendar event is starting).  You will need to change the &lt;code&gt;entity_id&lt;/code&gt; to match your calendar&amp;rsquo;s name.&lt;/p&gt;
&lt;p&gt;The next 5 flows use templates to set the various variables we will need later when calling the &lt;code&gt;ecobee.create_vacation&lt;/code&gt; service call in HomeAssistant.  You will need to adjust the calendar name in each node to match your own calendar name.  For the Function node, you will need to adjust the &lt;code&gt;entity_id&lt;/code&gt; of the thermostat to yours and also adjust the temperature presets (can be in Celsius or Fahrenheit).  You&amp;rsquo;ll need to do the same in the Create Vacation service node.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it.  Now whenever the calendar reaches an event on your vacation calendar, the Ecobee vacation mode will automatically be set for you.  I then use proximity to trigger a flow/automation to turn on my vacation &lt;code&gt;input_boolean&lt;/code&gt; when I get more than 20 miles from home and the Ecobee is in vacation mode.  And then same works in reverse (when I go under 20 miles and the &lt;code&gt;input_boolean&lt;/code&gt; is on, it turns off the &lt;code&gt;input_boolean&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;nodered-code-export&#34;&gt;NodeRed Code Export
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;455725fe.32e6a4&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;comment&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Mode&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;860&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;760&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ceef80b3.bd2ec&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;trigger-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacay Start&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;exposeToHomeAssistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;haConfig&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;calendar.vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityidfiltertype&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exact&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;constraints&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;yi1ia7zhq3q&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;targetType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;this_entity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;targetValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;current_state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;new_state.state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorValueDatatype&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ywqkg3b9vvn&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;targetType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;this_entity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;targetValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;previous_state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;old_state.state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorValueDatatype&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;comparatorValue&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;constraintsmustmatch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;customoutputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputinitially&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;850&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9409550f.7ac018&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;57cb7aa3.2f8224&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Create Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ecobee&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;create_vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{\&amp;#34;entity_id\&amp;#34;:\&amp;#34;climate.ecobee\&amp;#34;,\&amp;#34;vacation_name\&amp;#34;:\&amp;#34;{{payload.vacation_name}}\&amp;#34;,\&amp;#34;cool_temp\&amp;#34;:\&amp;#34;78\&amp;#34;,\&amp;#34;heat_temp\&amp;#34;:\&amp;#34;66\&amp;#34;,\&amp;#34;start_date\&amp;#34;:\&amp;#34;{{payload.start_date}}\&amp;#34;,\&amp;#34;start_time\&amp;#34;:\&amp;#34;{{payload.start_time}}\&amp;#34;,\&amp;#34;end_date\&amp;#34;:\&amp;#34;{{payload.end_date}}\&amp;#34;,\&amp;#34;end_time\&amp;#34;:\&amp;#34;{{payload.end_time}}\&amp;#34;}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9409550f.7ac018&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacay Name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ state_attr(&amp;#39;calendar.vacation&amp;#39;, &amp;#39;message&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;vacay_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1110&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;740&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2a3c6979.d3f7e6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2a3c6979.d3f7e6&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Start Date&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.vacation&amp;#39;, &amp;#39;start_time&amp;#39;)) | timestamp_custom(\&amp;#34;%Y-%m-%d\&amp;#34;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;start_date&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f1e211f.564267&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f1e211f.564267&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Start Time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.vacation&amp;#39;, &amp;#39;start_time&amp;#39;)) | timestamp_custom(\&amp;#34;%H:%M:%S\&amp;#34;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;start_time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1110&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;227d98a3.b79e78&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;227d98a3.b79e78&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;End Date&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.vacation&amp;#39;, &amp;#39;end_time&amp;#39;)) | timestamp_custom(\&amp;#34;%Y-%m-%d\&amp;#34;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;end_date&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;740&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c292db2d.1b8f38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c292db2d.1b8f38&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-render-template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;End Time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;template&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.vacation&amp;#39;, &amp;#39;end_time&amp;#39;)) | timestamp_custom(\&amp;#34;%H:%M:%S\&amp;#34;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;end_time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;resultsLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;templateLocationType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;780&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cf86984c.4d0d18&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cf86984c.4d0d18&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;function&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f89809b5.67a0a8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Set Payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;func&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;newmsg = {}\n\nnewmsg.payload = { \&amp;#34;entity_id\&amp;#34;: \&amp;#34;climate.ecobee\&amp;#34;, \&amp;#34;vacation_name\&amp;#34;: (msg.vacay_name), \&amp;#34;cool_temp\&amp;#34;:\&amp;#34;78\&amp;#34;, \&amp;#34;heat_temp\&amp;#34;:\&amp;#34;62\&amp;#34;, \&amp;#34;start_date\&amp;#34;: (msg.start_date), \&amp;#34;start_time\&amp;#34;: (msg.start_time), \&amp;#34;end_date\&amp;#34;: (msg.end_date), \&amp;#34;end_time\&amp;#34;: (msg.end_time) }\n\nreturn newmsg;\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;noerr&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1310&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;57cb7aa3.2f8224&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Home Assistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;legacy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rejectUnauthorizedCerts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ha_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;y|yes|true|on|home|open&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;connectionDelay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;cacheJson&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;homeassistant-automation&#34;&gt;HomeAssistant Automation
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Ecobee Create Vacation&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;trigger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;calendar.YOUR_CALENDAR&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ecobee.create_vacation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data_template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;climate.YOUR_THERMOSTAT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;vacation_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ state_attr(&amp;#39;calendar.YOUR_CALENDAR&amp;#39;, &amp;#39;message&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cool_temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;78&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;heat_temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;62&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;start_date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.YOUR_CALENDAR&amp;#39;, &amp;#39;start_time&amp;#39;)) | timestamp_custom(&amp;#39;%Y-%m-%d&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;start_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.YOUR_CALENDAR&amp;#39;, &amp;#39;start_time&amp;#39;)) | timestamp_custom(&amp;#39;%H:%M:%S&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;end_date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.YOUR_CALENDAR&amp;#39;, &amp;#39;end_time&amp;#39;)) | timestamp_custom(&amp;#39;%Y-%m-%d&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;end_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{{ as_timestamp(state_attr(&amp;#39;calendar.YOUR_CALENDAR&amp;#39;, &amp;#39;end_time&amp;#39;)) | timestamp_custom(&amp;#39;%H:%M:%S&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change &amp;ldquo;YOUR_THEROMSTAT&amp;rdquo; and &amp;ldquo;YOUR_CALENDAR&amp;rdquo; to match accordingly&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Easy Smart Vacation Mode Lighting with HomeAssistant</title>
        <link>https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/</link>
        <pubDate>Sun, 10 May 2020 18:42:49 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/header.png" alt="Featured image of post Easy Smart Vacation Mode Lighting with HomeAssistant" /&gt;&lt;p&gt;Lighting definitely &lt;a class=&#34;link&#34; href=&#34;https://www.nytimes.com/2019/09/19/smarter-living/wirecutter/smart-lights-enhance-home-security-and-shine-a-light-on-crime.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;helps&lt;/a&gt; to &lt;a class=&#34;link&#34; href=&#34;https://www.npr.org/2016/02/23/466603833/should-you-leave-your-lights-on-at-night-it-depends&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;deter burglaries&lt;/a&gt; when you aren&amp;rsquo;t home.  I&amp;rsquo;m old enough to remember having to pull out those plug in timers to turn a lamp on/off on a timer whenever my family would go on vacation.  But the issue there is that 1) it was a fixed time and 2) only a few lights in the house were able to do this.  The other option was to leave lights on all the time, but that&amp;rsquo;s both wasteful and not very effective against convincing burglars that you&amp;rsquo;re actually home.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s obviously a lot of ways to do this.  The most common is to randomize the lights turning on/off between set times (say sunset and 10pm).  I initially went down this path using &lt;a class=&#34;link&#34; href=&#34;https://github.com/acockburn/occusim&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Occusim&lt;/a&gt; but I hit 2 problems.  First, it requires &lt;a class=&#34;link&#34; href=&#34;https://github.com/home-assistant/appdaemon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AppDaemon&lt;/a&gt; which is a great tool for doing things in Python.  However, OccuSim was the only thing I was using AppDaemon for and I generally don&amp;rsquo;t like one-off solutions like this because it&amp;rsquo;s yet another thing to update and more importantly it required a lot of tweaking to get &amp;ldquo;right.&amp;rdquo;  I had to think about where I was at different times of day which isn&amp;rsquo;t always the same.  So while it allowed me to randomize lights on a schedule or at random times overall it wasn&amp;rsquo;t a great solution.&lt;/p&gt;
&lt;h1 id=&#34;replay-last-weeks-light-schedule&#34;&gt;Replay Last Week&amp;rsquo;s Light Schedule
&lt;/h1&gt;&lt;p&gt;By far the best way I&amp;rsquo;ve found to do this is to &amp;ldquo;replay&amp;rdquo; what the lights did the previous week.  So if on Saturday the lights in my bedroom turned on at 6:51am and off at 7:23am, then with my vacation mode setup the lights in the bedroom would do the exact same thing a week later.  By mimicking what I did in a past week it will 1) reflect a real schedule, 2) saves me from having to pre-program based on weekday/weekend, take into account the sunset, etc, and 3) with it being a week apart it&amp;rsquo;s unlikely a criminal would realize that the lights are following any kind of pre-determined program.  Hat tip to &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/user/atra-ignis/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;/u/atra-ignis&lt;/a&gt; on &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/homeassistant/comments/dnqxtl/what_vacation_mode_automations_do_you_have/f5h74du&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Reddit&lt;/a&gt; for the initial concept and helping me get this working.  I did make some tweaks from there but credit for the idea goes to them.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup
&lt;/h2&gt;&lt;p&gt;The two tools we need for this are HomeAssistant and NodeRed (though you can do the automation bit in HomeAssistant too if that&amp;rsquo;s what you use).  This presumes you have all your lights set up in HomeAssistant, obviously.  Also, you&amp;rsquo;ll need to have your &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/recorder/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;recorder/database&lt;/a&gt; set up to record for a least 1 week.&lt;/p&gt;
&lt;h3 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h3&gt;&lt;p&gt;For this, we&amp;rsquo;re going to use the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/history_stats/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;History Stats&lt;/a&gt; integration.  This integration has some pretty cool use cases but here what we&amp;rsquo;ll use it for is to create a sensor that will represent with a 0 or a 1 whether a light is on or off.  Here is an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;history_stats&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Replay Office&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;light.office&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      {{ as_timestamp(now()) - (7*86400) }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;duration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Goes in the sensor portion of your configuration.yaml file&lt;/p&gt;
&lt;p&gt;A lot of the above is self explanatory.  Name the sensor whatever you want, though I would strongly suggest starting with some of kind of prefix like &amp;ldquo;Replay&amp;rdquo; or &amp;ldquo;Vacation&amp;rdquo; which you&amp;rsquo;ll see why when we get to NodeRed.  With the history_stats sensor you can define 2 of &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt; or &lt;code&gt;duration&lt;/code&gt;.  For our purposes we&amp;rsquo;re using &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;duration&lt;/code&gt;.  The start time is 7 days ago, so we create a template to determine that (there are 86400 seconds in a day).  Duration is how used to measure.  I keep mine to 30 seconds to get a fairly accurate picture of the changes.&lt;/p&gt;
&lt;p&gt;Create a sensor for each light/switch/group you want to track.  Restart HomeAssistant and you should see something like this when you click on the sensor in the States page:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/vacation-light1.png&#34;
    alt=&#34;1 represent &amp;lsquo;on&amp;rsquo; and 0 represents &amp;lsquo;off&amp;rsquo;&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;1 represent &amp;lsquo;on&amp;rsquo; and 0 represents &amp;lsquo;off&amp;rsquo;&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You&amp;rsquo;ll also want some way of tracking whether you&amp;rsquo;re on vacation or not.  For me I use an input_boolean called &amp;ldquo;Vacation Mode&amp;rdquo; (original I know) that I can manually toggle on/off, but actually is triggered by my Ecobee thermostat going into vacation mode.  You can set up vacations manually in the Ecobee app or what I do is create the vacation based on a vacation calendar in Google and use that information to trigger the vacation mode in Ecobee.&lt;/p&gt;
&lt;h3 id=&#34;nodered&#34;&gt;NodeRed
&lt;/h3&gt;&lt;p&gt;The NodeRed setup is extremely simple.  I&amp;rsquo;ll post the code below but here&amp;rsquo;s a brief explainer of what it does.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/vacation-light2.png&#34;
    alt=&#34;Vacation mode made simple&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Vacation mode made simple&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The first node is a state node that triggers when any of the replay sensor changes.  Instead of having to create a node for every single sensor, if you followed the naming suggestion I made above and everything is &lt;code&gt;sensor.replay_&lt;/code&gt; then you can use a single node.  Just select &amp;ldquo;substring&amp;rdquo; instead of &amp;ldquo;exact&amp;rdquo; in the node settings and don&amp;rsquo;t put anything for the state.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/vacation-light3.png&#34;
    alt=&#34;Select &amp;lsquo;substring&amp;rsquo;&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Select &amp;lsquo;substring&amp;rsquo;&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The next node is a check to make sure that vacation mode is turned on.  Then there&amp;rsquo;s a change node to change the &amp;ldquo;1&amp;rdquo; payload to &amp;ldquo;on&amp;rdquo; and the &amp;ldquo;0&amp;rdquo; payload to &amp;ldquo;off.&amp;rdquo;  Finally there&amp;rsquo;s a switch node to route the changes to the right light/switch you want to control, depending on which &lt;code&gt;sensor.replay_&lt;/code&gt; is changing, with a corresponding call service node to turn the light on/off depending on the payload.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-vacation-mode-lighting/vacation-light4.png&#34;
    alt=&#34;Using {{payload}} allows you to have one node for turn on and off&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Using {{payload}} allows you to have one node for turn on and off&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;As promised, here&amp;rsquo;s the NodeRed code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;83bc26c9.2c2288&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server-state-changed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Replay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityidfilter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor.replay_&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityidfiltertype&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;substring&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputinitially&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;haltifstate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_only_on_state_change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;250&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;7081a406.114374&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;7081a406.114374&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-current-state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Mode?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;halt_if_compare&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;input_boolean.vacation_mode&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;state_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entity_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;override_data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;blockInputOverrides&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;400&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;89580e3b.3d991&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;89580e3b.3d991&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;State&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;change&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;fromt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;tot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;reg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;261a9672.986142&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;261a9672.986142&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;property&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;data.entity_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;propertyType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor.replay_basement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor.replay_office&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eq&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor.replay_kitchen&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;vt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;str&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;checkall&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;repair&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;670&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bfe718.3fb748e8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3fdd00a1.a644f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b40d6311.da7848&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;df4ffbf5.3de44&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;comment&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Vacation Mode - Replay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bfe718.3fb748e8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Basement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_{{payload}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;light.basement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4260&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3fdd00a1.a644f&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Office&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_{{payload}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;light.office&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;810&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;b40d6311.da7848&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;api-call-service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;9a7feaee.12c878&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Kitchen&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;debugenabled&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service_domain&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;turn_{{payload}}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;entityId&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;switch.kitchen&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;dataType&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mergecontext&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;output_location_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;mustacheAltTags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;820&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4340&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;wires&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[[]]},{&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63517380.eb951c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Home Assistant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;legacy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;rejectUnauthorizedCerts&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;ha_boolean&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;y|yes|true|on|home|open&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;connectionDelay&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;cacheJson&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;That&amp;rsquo;s it.  Now whenever you turn on vacation mode in HomeAssistant the lights will simply repeat what they did the week before.  Even if you&amp;rsquo;re on vacation for multiple weeks it won&amp;rsquo;t matter, it will just repeat what the lights did the previous week (which is the same as the previous week).  While some very clever criminal might pick up on the fact the lights keep repeating exactly the same week in, week out that&amp;rsquo;s fairly unlikely.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Wink Subscription Service...AKA why the cloud sucks</title>
        <link>https://blog.fuzzymistborn.com/wink-subscription-service/</link>
        <pubDate>Thu, 07 May 2020 18:50:17 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/wink-subscription-service/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/wink-subscription-service/header.png" alt="Featured image of post Wink Subscription Service...AKA why the cloud sucks" /&gt;&lt;p&gt;Reasons why not to rely on a cloud service for running your smart home #23487834208: yesterday &lt;a class=&#34;link&#34; href=&#34;https://blog.wink.com/wink-blog/2020/5/6/introducing-wink-subscription&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wink announced&lt;/a&gt; a new subscription service.  This subscription takes effect in just 7 days and will be required in order to &amp;ldquo;access your Wink devices from the app, with voice control or through the API, and [operate] your automations.&amp;rdquo;  Or&amp;hellip;.you know, the entire point of a smart home hub.  So if you don&amp;rsquo;t pay your device turns into a useless paperweight.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/wink-subscription-service/wink-tech.jpg&#34;
    alt=&#34;Nice new paperweights&#34; width=&#34;700&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Nice new paperweights&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I&amp;rsquo;m not going to pull out the pitchfork too much to go after Wink for this.  I totally understand they need to make money and I think they&amp;rsquo;re trying to keep the lights on so they don&amp;rsquo;t have to completely fold.  But that doesn&amp;rsquo;t justify giving folks only 7 days notice of such a significant change.  They should have grandfathered existing users in for a month of free service before requiring payment.  And to all the armchair attorneys out there talking about claims of criminal fraud or class action lawsuits, all I&amp;rsquo;ll say is &lt;a class=&#34;link&#34; href=&#34;https://www.theverge.com/2019/10/25/20932055/wink-smart-home-problems-iamplus-william-black-eyed-peas&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;good luck going after a company that&amp;rsquo;s for all intents and purposes bankrupt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes you just can&amp;rsquo;t avoid the cloud and I totally get that.  But for all those Wink users out there who are thinking of jumping over to SmartThings you should think hard on that one whether you want to jump into bed with another cloud provider that could do the same thing a year or two from now.  Not saying that Samsung will but they could and as this Wink experience shows, there&amp;rsquo;s pretty much not a thing you can do about it.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>SSH Security - Limited Commands</title>
        <link>https://blog.fuzzymistborn.com/ssh-security/</link>
        <pubDate>Sat, 02 May 2020 17:38:18 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/ssh-security/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/ssh-security/header.jpg" alt="Featured image of post SSH Security - Limited Commands" /&gt;&lt;p&gt;SSH (Secure Shell) is pretty much a necessity in any kind of smart home set up, particularly if you&amp;rsquo;re running Linux.  It&amp;rsquo;s the main way that you connect to your computer (presuming its not your main desktop but some kind of server/Raspberry Pi/NUC/other computer).  Because SSH is so crucial, it&amp;rsquo;s also a potential vector for hackers to gain access to your system so you really need to make sure it&amp;rsquo;s protected.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t really want to spend a lot of time on the standard practices to secure SSH.  There are plenty of articles out there that cover this.  My personal favorite is from &lt;a class=&#34;link&#34; href=&#34;https://www.howtogeek.com/443156/the-best-ways-to-secure-your-ssh-server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;How-to Geek here&lt;/a&gt;.  At a minimum, you need to disable root ssh login, turn off password authentication and only use SSH keys.  Presuming you&amp;rsquo;ve done that, let&amp;rsquo;s take it a step further and let&amp;rsquo;s restrict what terminal commands an SSH key can perform.&lt;/p&gt;
&lt;p&gt;You may ask why you&amp;rsquo;d want to do this.  An easy example is the one I alluded to in my &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/&#34; &gt;post about CATT&lt;/a&gt;.  I run HomeAssistant in a Docker container and CATT runs on my server outside of a container.  To run the CATT commands I therefore needed to SSH from the Docker container to the server.  That obviously presents a security risk because one of the main benefits of Docker is that it sandboxes things a bit to limit security issues.  So if there&amp;rsquo;s a vulnerability in one of your containers your entire server isn&amp;rsquo;t necessarily compromised (though it still could be, always keep your services up to date!).  So I needed the ability to SSH to my server but I didn&amp;rsquo;t want HASS to have unrestricted access should the SSH key HASS uses somehow get compromised.&lt;/p&gt;
&lt;p&gt;Turns out it&amp;rsquo;s fairly easy to limit what commands an SSH key can run.  All you need to do is add the following bit of code to your &lt;code&gt;authorized_keys&lt;/code&gt; file (in your &lt;code&gt;.ssh&lt;/code&gt; folder) at the very begining of the line that contains the SSH key you&amp;rsquo;re trying to restrict.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;command=&amp;#34;ping 192.168.1.1&amp;#34; ssh-rsa AAB34...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything beyond ssh-rsa is purely an example. Keep whatever values are there.&lt;/p&gt;
&lt;p&gt;Now, that key can only run &lt;code&gt;ping 192.168.1.1&lt;/code&gt; command when you try to use it.  So for example if you&amp;rsquo;re logging into a Raspberry Pi via ssh and try &lt;code&gt;ssh pi@192.168.1.2 ls&lt;/code&gt; instead of getting a list of files it will start pinging 192.168.1.1.  Here&amp;rsquo;s the catch though.  You can only list one command.  So if you want the SSH key to be able to run multiple commands you need to do a bit more work.&lt;/p&gt;
&lt;p&gt;The way around the single command limitation is to create a bash script that you put in the &lt;code&gt;authorized_keys&lt;/code&gt; file.  Here&amp;rsquo;s how to do it.  Open up your text editor of choice (I like nano personally so I would do &lt;code&gt;nano ~/.ssh/auth_commands.sh&lt;/code&gt;) and create a file in your &lt;code&gt;.ssh&lt;/code&gt; directory like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# You can have only one forced command in ~/.ssh/authorized_keys. Use this&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# wrapper to allow several commands.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SSH_ORIGINAL_COMMAND&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ping 192.168.1.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ping 192.168.1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ping 192.168.1.3&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ping 192.168.1.3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ls /home/pi/docker&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ls /home/pi/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    *&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Access denied&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Obviously you&amp;rsquo;ll want to customize to whatever commands you want.  Depending on the command you may need to specify the full path to the command (run &lt;code&gt;which command_name&lt;/code&gt; to get the path to the command). Next you need to make the file executable, so &lt;code&gt;chmod +x ~/.ssh/auth_commands.sh&lt;/code&gt;.  Then you&amp;rsquo;ll need to modify your authorized_keys files to point to the &lt;code&gt;auth_commands.sh&lt;/code&gt; file (ie &lt;code&gt;command=&amp;quot;~./ssh/auth_commands.sh&amp;quot;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Now when you run &lt;code&gt;ssh pi@192.168.1.2 ls /home/pi/docker&lt;/code&gt; you&amp;rsquo;ll get the results of the command.  But if you try &lt;code&gt;ssh pi@192.168.1.2 ls /home/pi/homeassistant&lt;/code&gt; instead you&amp;rsquo;ll get &amp;ldquo;Access denied&amp;rdquo; in response.&lt;/p&gt;
&lt;p&gt;Obviously most of the time when you create SSH keys you&amp;rsquo;re going to want to allow full access to the computer.  But if you want to limit access for some reason, I&amp;rsquo;ve found the above to be the simpliest and easiest way to accomplish that goal.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>HomeAssistant and CATT (Cast All the Things!)</title>
        <link>https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/</link>
        <pubDate>Fri, 01 May 2020 01:28:25 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/header.jpeg" alt="Featured image of post HomeAssistant and CATT (Cast All the Things!)" /&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://cast.home-assistant.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Home Assistant Cast&lt;/a&gt; was &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/blog/2019/08/06/home-assistant-cast/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;announced&lt;/a&gt; about 9 months ago (August 2019) and it&amp;rsquo;s a very nifty concept if you have a Google/Nest Home Hub.  Essentially it allows you to cast a Lovelace page to your Hub and you can use the touch screen to interact with the page, just like a tablet.  There are a lot of possible use cases, from a security camera monitor to light/room controls and even media controls.  One example I use is to pull up a Google Maps view of my commute that shows me traffic data, and another example is to pull up a radar image on my nightstand so I can easily see if it&amp;rsquo;s raining when I wake up and decide whether I should go back to bed or go for a run.&lt;/p&gt;
&lt;p&gt;Unfortunately for me I could never get it to work consistently enough.  A common scenario would be I either got just a blank screen or I would get a HomeAssistant screen with &amp;ldquo;Connected&amp;rdquo; but no Lovelace page or even an error that it couldn&amp;rsquo;t find the path, despite the fact that it had worked before and I had not changed anything on my end. &lt;a class=&#34;link&#34; href=&#34;https://github.com/home-assistant/frontend/issues/4614&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This Github issue&lt;/a&gt; is representative of the many issues I had.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also issues that you need your HASS installation to be remotely accessible (either through NabuCasa or your own webpage/dynamic DNS url) which isn&amp;rsquo;t an issue for many but for some it might be.&lt;/p&gt;
&lt;p&gt;Then one day I stumbled across &lt;a class=&#34;link&#34; href=&#34;https://community.home-assistant.io/t/using-catt/130332&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this thread&lt;/a&gt; in the HASS Community forum.  There&amp;rsquo;s an alternative out there called, appropriately, &amp;ldquo;Cast All the Things&amp;rdquo; and it&amp;rsquo;s available on &lt;a class=&#34;link&#34; href=&#34;https://github.com/skorokithakis/catt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Github&lt;/a&gt;.  Let&amp;rsquo;s go through the steps to get it installed and working with HASS.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;p&gt;Installation is easy enough.  Open up a terminal on whatever device you use to run HASS (if you&amp;rsquo;re running HASS.IO/HomeAssistant you probably need to use a different machine.  I don&amp;rsquo;t use Hass.io so can&amp;rsquo;t help with the install there check out &lt;a class=&#34;link&#34; href=&#34;https://github.com/homeassistant-addons-eliseo/resting-catt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this GitHub&lt;/a&gt; which should allow for CATT control via HASS.  Please note I haven&amp;rsquo;t used so can&amp;rsquo;t speak to how well it works).  The install command is:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip3 install catt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may need to make it &amp;ldquo;pip&amp;rdquo; depending on how you have Python/pip installed&lt;/p&gt;
&lt;p&gt;Once installed, using CATT is fairly straightforward.  Here&amp;rsquo;s a list of all the commands:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Commands:
  add           Add a video to the queue (YouTube only).
  cast          Send a video to a Chromecast for playing.
  cast_site     Cast any website to a Chromecast.
  clear         Clear the queue (YouTube only).
  del_alias     Delete the alias name of the selected device.
  del_default   Delete the default device.
  ffwd          Fastforward a video by TIME duration.
  info          Show complete information about the currently-playing video.
  pause         Pause a video.
  play          Resume a video after it has been paused.
  play_toggle   Toggle between playing and paused state.
  remove        Remove a video from the queue (YouTube only).
  restore       Return Chromecast to saved state.
  rewind        Rewind a video by TIME duration.
  save          Save the current state of the Chromecast for later use.
  scan          Scan the local network and show all Chromecasts and their IPs.
  seek          Seek the video to TIME position.
  set_alias     Set an alias name for the selected device.
  set_default   Set the selected device as default.
  skip          Skip to end of content.
  status        Show some information about the currently-playing video.
  stop          Stop playing.
  volume        Set the volume to LVL [0-100].
  volumedown    Turn down volume by a DELTA increment.
  volumeup      Turn up volume by a DELTA increment.
  write_config  Please use &amp;#34;set_default&amp;#34;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I would suggest starting with running &amp;ldquo;catt scan&amp;rdquo; to make sure you can find all your Chromecast devices.  Then you can test it out by running:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;catt -d &amp;#34;NAME_OF_DEVICE&amp;#34; cast_site https://www.google.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;ldquo;NAME_OF_DEVICE&amp;rdquo; is whatever the name of the device is from running &amp;ldquo;catt scan&amp;rdquo;&lt;/p&gt;
&lt;p&gt;You should be able to see the Google webpage on your Hub.  You can stop it by running&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;catt -d &amp;#34;NAME_OF_DEVICE&amp;#34; stop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At this point you&amp;rsquo;re all set with CATT, unless you want to set up some default settings.  If you do, see the CATT Readme section &lt;a class=&#34;link&#34; href=&#34;https://github.com/skorokithakis/catt#configuration-file&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.  It&amp;rsquo;s entirely optional.&lt;/p&gt;
&lt;h2 id=&#34;setup-in-homeassistant&#34;&gt;Setup in HomeAssistant
&lt;/h2&gt;&lt;h3 id=&#34;trusted-networks&#34;&gt;Trusted Networks
&lt;/h3&gt;&lt;p&gt;Now that we have CATT set up, it&amp;rsquo;s time to get it working with HASS.  By default CATT won&amp;rsquo;t work with HASS because HASS requires authentication and there&amp;rsquo;s no way to get a keyboard on a Hub.  To get around this limitation, we&amp;rsquo;ll need to configure a &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/docs/authentication/providers/#trusted-networks&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Trusted Network&lt;/a&gt; in HASS (this is assuming you are running a version of HASS &amp;gt;0.89).&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a few ways to do this.  You can whitelist your entire network range if you want, or you can do individual devices.  You also can limit the users available.  Personally I wanted to restrict things as much as possible so I only allowed the 3 Hubs I have to be considered to be on a trusted network and restricted the user to a special &amp;ldquo;Dashboard&amp;rdquo; account I created in HASS.  So my configuration.yaml looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;homeassistant&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Note that this section is a subset of homeassistant: and is not tabbed all the way to the left like other things in configuration.yaml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;auth_providers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;trusted_networks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;trusted_networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;IP_ADDRESS_1/32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;IP_ADDRESS_2/32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;IP_ADDRESS_3/32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;trusted_users&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;IP_ADDRESS_1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DASHBOARD_USER_ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;IP_ADDRESS_2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DASHBOARD_USER_ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;IP_ADDRESS_3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DASHBOARD_USER_ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;allow_bypass_login&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Note that bypass_login only works if one user is authorized&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Under &amp;ldquo;trusted networks&amp;rdquo; I list out the 3 IP addresses with a /32 to limit the range to just that single IP.  Under &amp;ldquo;trusted user&amp;rdquo; you list the IP address of the device and then the user_id(s) you want available.  You can find the user_id if you go to the HASS configuration page, click &amp;ldquo;Users&amp;rdquo; and then click the username.  You should see a line that says &amp;ldquo;ID&amp;rdquo; and a bunch of letters and numbers.  Copy that.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/homeassistant-and-catt-cast-all-the-things/hass_user_id.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now that you have the trusted networks set up, reboot HASS and test it out to make sure it works.  Find a page you want to cast (you will need to use the internal address and not any external URL you might use).  So an example cast might be:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;catt -d &amp;#34;NAME_OF_DEVICE&amp;#34; cast_site http://HASS_URL:PORT/lovelace/0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace HASS_URL with the IP address of your server and pot with the port. Also change &amp;ldquo;lovelace/0&amp;rdquo; to whatever page you want to cast&lt;/p&gt;
&lt;p&gt;You should see a login screen on your Hub, but you&amp;rsquo;ll be able to select your dashboard user and login.  You also can click the &amp;ldquo;Save login&amp;rdquo; button in the bottom right corner to avoid having to log in every time.&lt;/p&gt;
&lt;h3 id=&#34;automating&#34;&gt;Automating
&lt;/h3&gt;&lt;p&gt;Assuming everything is working so far, now comes the fun part, automating!  To use CATT in a HASS automation you need to use the &lt;a class=&#34;link&#34; href=&#34;https://www.home-assistant.io/integrations/shell_command/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Shell_Command integration&lt;/a&gt;.  This is simply a line just like you would put in terminal to start up CATT.  So for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;shell_command&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cast_weather&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;catt -d &amp;#34;NAME_OF_DEVICE&amp;#34; cast_site http://HASS_URL:PORT/lovelace/weather&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Goes in your configuration.yaml file&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to restart HASS before the command is available.  Once it is, you can invoke it using the shell_command service call.  So using the above example, an automation might look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Good Morning Radar&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;trigger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entity_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;input_boolean.fuzzy_awake&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;shell_command.cast_weather&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;delay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;00:01:00&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;shell_command.cast_stop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that I also created a &amp;ldquo;cast_stop&amp;rdquo; shell command to stop the casting, and have it run 1 minute after the cast starts.  Another way to do this is to create a bash script and call that instead.  Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/home/fuzzy/.local/bin/catt -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;DEVICE_NAME&amp;#39;&lt;/span&gt; cast_site &lt;span class=&#34;s2&#34;&gt;&amp;#34;URL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sleep 1m
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/home/fuzzy/.local/bin/catt -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;DEVICE_NAME&amp;#39;&lt;/span&gt; stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adjust the paths, device name and URL as appropriate&lt;/p&gt;
&lt;p&gt;Since I run HASS in Docker, I actually installed CATT on the server running HASS and then use SSH to remote out of the docker container to the server.  Seems kinda meta but it works.  But that&amp;rsquo;s outside the scope of this post (I plan on a post soon on how to restrict SSH&amp;rsquo;ing so it&amp;rsquo;s not a gaping security hole).&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;CATT is definitely a bit more complicated to set up that Home Assistant Cast but it has a few advantages.  For one, it actually works (though I do hope that the HASS devs get it working consistently, its a really cool concept!).  Also, since it&amp;rsquo;s all local you don&amp;rsquo;t need to make your HASS instance open to the outside world and it should work even if your internet is down.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Smart Home Hardware</title>
        <link>https://blog.fuzzymistborn.com/smart-home-hardware/</link>
        <pubDate>Fri, 24 Apr 2020 02:27:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/smart-home-hardware/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/smart-home-hardware/header.jpg" alt="Featured image of post Smart Home Hardware" /&gt;&lt;p&gt;Well now that I&amp;rsquo;ve talked about what software I run my smart home on, what about the hardware?  Let&amp;rsquo;s dig in.&lt;/p&gt;
&lt;p&gt;(&lt;strong&gt;Note&lt;/strong&gt;: All links here do NOT contain any kind of affiliate link.  They&amp;rsquo;re just direct links to the product)&lt;/p&gt;
&lt;h1 id=&#34;thermostat&#34;&gt;Thermostat
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/ecobee3.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I only have a single zone in my house so I went for an Ecobee 3.  At the time I made my purchase, it was unique in that it had the ability to use remote sensors.  These sensors can be placed in different rooms and then the thermostat can be told to include different sensors during different comfort profiles.  So for example, during the day I don&amp;rsquo;t care what the temperature is in the bedrooms but I do care about the first floor, and vice versa at night.  Nest later added similar functionality so this is no longer unique.&lt;/p&gt;
&lt;p&gt;One major issue with Ecobee is their servers.  There&amp;rsquo;s been &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/e8c3e7/another_day_another_offline_ecobee_server/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;so&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/ci7vm2/ecobee_server_down/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;many&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/bk37ym/servers_down_again/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;server&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/b6wvja/servers_down_again/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;outages&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/bgmnby/i_get_the_servers_are_down_how_is_it_that_local/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;that&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/bqskce/is_the_server_down_again/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;I&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/aledoe/server_issues/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;can&amp;rsquo;t&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/bnuq32/server_issues_just_this_month/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;even&lt;/a&gt;  &lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/ecobee/comments/anedtj/ecobee_server_dropping_out_like_crazy_last_night/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;count&lt;/a&gt;.  It&amp;rsquo;s almost a joke these days. There&amp;rsquo;s also the &amp;ldquo;Home IQ&amp;rdquo; reports that are comical in how delayed they can be.  I can remember times when I&amp;rsquo;d log in to see and I literally have 3-4 months in a row without a report.  To the point where &lt;a class=&#34;link&#34; href=&#34;https://blog.fuzzymistborn.com/p/91412e02-0559-42a5-89a9-75a1e8888157/beestat.io&#34; &gt;beestat.io&lt;/a&gt; is what I would recommend people use instead of the Ecobee page.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/ecobee-outages.jpg&#34;
    alt=&#34;Days like these aren&amp;rsquo;t uncommon&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Days like these aren&amp;rsquo;t uncommon&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In fairness to Ecobee, things have gotten better.  I haven&amp;rsquo;t seen nearly as many outages lately and I can view the Home IQ reports for the past several months as of writing this.  Here&amp;rsquo;s the other thing: I rarely open the app or check my historical data, and I don&amp;rsquo;t think I&amp;rsquo;ve ever noticed a server outage.  I have my thermostat programmed to follow a schedule and that continues to work even when there is a server outage.&lt;/p&gt;
&lt;p&gt;Probably my favorite feature of the Ecobee is &amp;ldquo;vacation mode.&amp;rdquo;  I use this to set the temperatures to hold at slightly warmer/colder temperatures (depending on the season) when I&amp;rsquo;m away.  I use this heavily to adjust some of my home automations and I can set it via my calendar (works via HomeAssistant, you can also manually schedule in the app).&lt;/p&gt;
&lt;p&gt;In hindsight, I might have gone with a Zwave thermostat if I was to do it again due to the server issues (and desire for local control).  That being said, I do like some of the features that are built in to the Ecobee (sensors/vacation mode) and I haven&amp;rsquo;t really noticed server problems.  Overall, I&amp;rsquo;m happy enough with my Ecobee.&lt;/p&gt;
&lt;h1 id=&#34;smart-home-hub&#34;&gt;Smart Home Hub
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/alexa-google.jpg&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Ahhh the great Amazon Alexa v. Google Assistant debate.  I&amp;rsquo;m not going to spend much time on this just because I think the decision is largely personal.  For me, I started with all Echo Dots but recently got fed up with them.  I found myself having to repeat commands frequently (sometimes many times) and often times with a result I didn&amp;rsquo;t want.&lt;/p&gt;
&lt;p&gt;I did explore building my own smart assistant with some Raspberry Pis and &lt;a class=&#34;link&#34; href=&#34;https://github.com/synesthesiam/rhasspy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rhasspy&lt;/a&gt;.  It worked but to achieve what I was after (whole home music system and voice assistant) was going to be 1) significantly more expensive (about $100 per set up) and 2) not &lt;em&gt;quite&lt;/em&gt; as good as Alexa/Google.  I&amp;rsquo;ve had a few Nest Hub&amp;rsquo;s (the small one with the screen) and really liked them, so after some discussions decided to rip the Echo Dots out and switch to Google.&lt;/p&gt;
&lt;p&gt;Overall I&amp;rsquo;ve found the Minis to be  superior.  Much better recognition of commands and I really like the ability to cast music from my phone.  I have hit a few issues like automating music playback but that&amp;rsquo;s partly due to my own personal use cases.  I also wish I could turn on &amp;ldquo;brief mode&amp;rdquo; for every response instead of just when the device is in the same virtual &amp;ldquo;room&amp;rdquo; as whatever device I&amp;rsquo;m trying to control.  IE right now if the device answering me is in the kitchen and so is the light, I get a &amp;ldquo;bing&amp;rdquo; in response, if the light is in the basement I get &amp;ldquo;Ok, turning on 3 lights in the basement.&amp;rdquo;  Versus Alexa was always a &amp;ldquo;bing.&amp;rdquo;  I also have some issues with integrating the Ecobee temperature sensors but it&amp;rsquo;s not a dealbreaker for me.&lt;/p&gt;
&lt;p&gt;So really, try out both and see what works for you.  In reality they&amp;rsquo;re pretty much comparable in terms of the supported integrations and such (with some exceptions I know).&lt;/p&gt;
&lt;h1 id=&#34;zwave&#34;&gt;ZWave
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/zwave.jpg&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;ZWave comprises a large majority of my smart home devices.  I use it for all my light switches and most of my motion/door sensors.  What I like about ZWave is that it uses it&amp;rsquo;s own spectrum so there&amp;rsquo;s very little chance of interference and every wired/plugged in device acts as a repeater so it&amp;rsquo;s fairly easy to build a robust and expansive ZWave network.  It&amp;rsquo;s also locally controlled via a hub.  For a hub, I use the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Aeotec-Z-Stick-Z-Wave-create-gateway/dp/B00X0AWA6E/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Aeotec Z-Stick Gen 5&lt;/a&gt;.  Haven&amp;rsquo;t had any problems with it, and highly recommend it.&lt;/p&gt;
&lt;p&gt;The downside to ZWave is that it is a proprietary protocol that requires a license to make products.  The result is that prices are higher than similar WiFi or Zigbee devices.  For example, Zwave motion sensors are usually $30+ whereas Zigbee ones are $15-20.&lt;/p&gt;
&lt;h3 id=&#34;lights&#34;&gt;Lights
&lt;/h3&gt;&lt;p&gt;For my lights, I pretty much only have GE switches.  I do have a few Zooz ones and they&amp;rsquo;re OK, but overall I prefer the GE ones.  The main drawback to the GE ones is that they 1) require a neutral wire (which most modern houses have but NOT ALL) and 2) they require an &amp;ldquo;add-on&amp;rdquo; switch when there are multiple switches on the same circuit (which are about $20/switch).  That can make them an expensive option, especially when you look at both Zooz and Inovelli which have solutions that only require the &amp;ldquo;primary&amp;rdquo; switch to be smart and the other switches can be &amp;ldquo;dumb.&amp;rdquo;  Both these solutions start coming out after I was mostly done installing the switches so in hindsight I would probably look more closely at Inovelli, but I&amp;rsquo;m still very pleased with my GE switches and don&amp;rsquo;t regret the decision all that much.  The few Zooz switches I have work well but there are a few quirks that make them not a good fit for my use (mostly because I have so many GE switches that I just wanted consistent behavior across the board).&lt;/p&gt;
&lt;p&gt;Basically every switch in my house at this point is &amp;ldquo;smart.&amp;rdquo;  A lot of people (myself included) start off with smart light bulbs.  And they work great.  But there are 2 major issues with smart bulbs.  1) you (with a few exceptions) lose the ability to use the wall switches and 2) they can get $$$ quickly.  If you have a room with 4+ lights, that&amp;rsquo;s easily $50+ in bulbs, versus $30 for a switch.  Plus having to train guests/visitors to not use the switches is just&amp;hellip;.no.&lt;/p&gt;
&lt;h3 id=&#34;motion-sensors&#34;&gt;Motion Sensors
&lt;/h3&gt;&lt;p&gt;I started out with Dome motion and door sensors and overall they work well.  My gripes are that every now and then the door sensors don&amp;rsquo;t realize they&amp;rsquo;re closed when I open/close the door somewhat quickly and with the motion sensors the luminescence sensors work only in about 25% of the ones I have.  Also, despite the fact you can configure the sensitivity of the motion sensors and they&amp;rsquo;re supposed to be &amp;ldquo;pet proof&amp;rdquo; my cats set them off all the time.  Not a huge deal nor unique to the Dome sensors but&amp;hellip;.frustrating.&lt;/p&gt;
&lt;h3 id=&#34;locksgarage&#34;&gt;Locks/Garage
&lt;/h3&gt;&lt;p&gt;For a lock, I use the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Schlage-Connect-Touchscreen-Deadbolt-SmartThings/dp/B00AGK9KOG&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Schlage Connect&lt;/a&gt; and I LOVE it.  I haven&amp;rsquo;t had to use my house key pretty much ever.  When we go on vacation and need to let the pet sitters in I can turn on a door code that works for them (and is automatically turned on/off based on &amp;ldquo;vacation&amp;rdquo; mode).  Family members also have key codes.  And honestly it just works.  Really all I can ask for in a door lock.&lt;/p&gt;
&lt;p&gt;For the garage, I use the &lt;a class=&#34;link&#34; href=&#34;https://smile.amazon.com/GoControl-Linear-GD00Z-4-Z-Wave-Controller/dp/B00M75TEIU&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GoControl/Linear&lt;/a&gt; Zwave.  Again, I love it.  It works well, haven&amp;rsquo;t had any issues with it at all.  Can&amp;rsquo;t really say much more than that.  There are some other options out there that aren&amp;rsquo;t ZWave based but if you want locally controlled and have a ZWave network, I&amp;rsquo;d strongly encourage you to get the GoControl.  And please please please please please STAY THE HELL AWAY FROM MyQ!!!&lt;/p&gt;
&lt;h1 id=&#34;zigbee&#34;&gt;Zigbee
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/zigbee.png&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;So this is a recent addition to my smart home.  Zigbee is another protocol that is similar in some ways to ZWave in that it&amp;rsquo;s 1) locally controlled and 2) you need a hub.  The major differences are that Zigbee is (I believe) an open standard (at least one without licensing fees) so it&amp;rsquo;s easier and cheaper to make products, and more importantly it uses the same spectrum as 2.4 GHz WiFi.  Because it uses the same spectrum it&amp;rsquo;s possible that you&amp;rsquo;ll run into interference.  If you want to learn more/read how to avoid interference, go read &lt;a class=&#34;link&#34; href=&#34;https://support.metageek.com/hc/en-us/articles/203845040-ZigBee-and-WiFi-Coexistence&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the more popular brands of Zigbee devices is the Xiaomi Aqara.  There are a lot of different options here, from single click buttons to switches to magic six sided cubes.  The best part about them is that they are incredibly cheap, especially if you order them on eBay where you can get them for about $10-15.  Downside is the long shipping times and you can get them on Amazon in some cases for a few dollars more if you&amp;rsquo;re impatient.  So far I&amp;rsquo;ve only used a few of the devices but I really like them.  The main reason I decided to go down the Zigbee hole was because of the single button devices.  With the death of the Amazon Dash buttons I was exploring other options and&amp;hellip;.they really didn&amp;rsquo;t exist.  Zwave had some options but they were all $40+, and the only other options I could find were DIY which didn&amp;rsquo;t appeal to me.&lt;/p&gt;
&lt;p&gt;To control my Zigbee devices, currently I&amp;rsquo;m using a &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/dresden-elektronik-ConBee-Universal-Gateway/dp/B07PZ7ZHG5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Conbee II&lt;/a&gt; (running the deConz software).  I tried using ZHA in HomeAssistant but had some issues.  I&amp;rsquo;m also not sure I&amp;rsquo;m keeing the Conbee because I ordered a &lt;a class=&#34;link&#34; href=&#34;https://www.itead.cc/cc2531-usb-dongle.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CC2531 dongle from Sonoff&lt;/a&gt;.  This will supposedly work with Zigbee2MQTT.  For $7 shipped I&amp;rsquo;m intrigued to see how well it works compared to the $40 Conbee II.  However I&amp;rsquo;m still waiting for the CC2531 to arrive so can&amp;rsquo;t test it yet.  Hoping it arrives soon, and maybe I&amp;rsquo;ll do an update on it once I get to play with it and make a final decision.  For now, the Conbee works great.&lt;/p&gt;
&lt;h1 id=&#34;doorbell&#34;&gt;Doorbell
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/eufy-doorbell.jpg&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Most of the smart things I get I end up very happy with because I research and think hard about what I get.  I thought I&amp;rsquo;d done my homework in purchasing a Skybell HD.  I got it on a Black Friday deal for like $130 and it was The Wirecutter&amp;rsquo;s pick for best smart doorbell.  I installed it and everything was great.  Best of all, there were no subscription fees (unlike Ring which was the only major competition at the time) and cloud storage for 7 days included.  Great!&lt;/p&gt;
&lt;p&gt;The shine did not last long.  The motion sensing on the Skybell was utter garbage.  Even at it&amp;rsquo;s lowest sensitivity it was picking up large trucks and school buses driving by my house (about 50 feet away).  Then conversely it would miss when UPS/USPS/FedEx would drop off a package.  I could understand how it could pick up a truck 50 feet away but not a person standing right in front of it.  To top it off, when I did get notifications oftentimes they were minutes later.  I kept hoping for software or firmware improvements (like setting detection zones) but they never came.  And oftentimes when I&amp;rsquo;d try to load the stream I would just get a black picture.  After 2 years, I was ready to move on.&lt;/p&gt;
&lt;p&gt;Enter the &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Security-Doorbell-Resolution-Real-Time-Response/dp/B07R3WY95C/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Eufy 2k Doorbell&lt;/a&gt;.  For $160 (usually on sale for $110ish) this is an amazing doorbell.  The picture quality is really good, it&amp;rsquo;s fast to start streaming, and notifications are usually very quick.  Also, it allows you to set detection zones AND it uses some kind of AI to recognize human faces, so you can customize the detection settings a bit.  The result is that it&amp;rsquo;s probably 95% accurate in picking up a human approaching (5% is picking up my front porch flag and trees moving on particularly windy days).&lt;/p&gt;
&lt;p&gt;In terms of storage there&amp;rsquo;s no cloud option and instead the storage is all local on a 4 GB built in SD card, which is both a pro and a con.  It&amp;rsquo;s nice that the storage is local but I really wish there was a way to record via RTSP or back up to a NAS.  I&amp;rsquo;m not so worried about someone stealing my doorbell cam (though that&amp;rsquo;s a legitimate concern) but more I just would prefer the storage to be off the device.  That&amp;rsquo;s probably my main gripe (and the lack of HomeAssistant support but&amp;hellip;that&amp;rsquo;s being worked on).  Oh and you can&amp;rsquo;t use your existing doorbell, you need to use the little chime that you plug into a wall.  Wish it used the existing bell but not a big deal to me.&lt;/p&gt;
&lt;p&gt;Eufy also now has a &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/eufy-Security-Battery-Powered-Detection-Self-Installation/dp/B081C4JN51&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;battery powered version&lt;/a&gt; of the camera that saves footage to a Homebase (which is sort of like a NAS).  It also apparently can tie directly into your existing chime AND wiring, so if I had to do it again I probably would go that route instead.  I really like Eufy (sub-brand of Anker who I find to be highly reliable) and find their products to be good quality.  Which leads me to&amp;hellip;.&lt;/p&gt;
&lt;h1 id=&#34;cameras&#34;&gt;Cameras
&lt;/h1&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/wyze.jpg&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I won&amp;rsquo;t spend much time on this one because I&amp;rsquo;ll probably have more to say in a month or so.  Right now I use Wyze v2 cams flashed with the RTSP firmware to get the feed into HomeAssistant.  It&amp;rsquo;s&amp;hellip;.not great.  The cams work well enough and the video quality is acceptable, but that&amp;rsquo;s when you&amp;rsquo;re using the app.  The RTSP firmware has been in &amp;ldquo;beta&amp;rdquo; for over a year now and hasn&amp;rsquo;t seen an update in 6 months.  There are tons of drop outs/disconnects that I just can&amp;rsquo;t rely on getting a picture consistently enough to do anything more than just checking the streams on occasion in HomeAssistant.  I tried running automations off motion detection but just ended up frustrated.  And I tried multiple NVR solutions (BlueIris, MotionEye, ZoneMinder, Shinobi&amp;hellip;) and all had their issues.  For a $25 camera I really can&amp;rsquo;t be mad but I do wish the RTSP firmware worked a &lt;em&gt;little&lt;/em&gt; bit better.  Oh, and the Google Home integration is equally frustrating in that it&amp;rsquo;s slow to work (if it ever actually loads the feed) and incredibly laggy to the point of uselessness.&lt;/p&gt;
&lt;p&gt;So when Eufy recently announced their &lt;a class=&#34;link&#34; href=&#34;https://www.eufylife.com/activities/indoorcampresell&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;new indoor 2k cameras&lt;/a&gt; I was immediately intrigued.  They&amp;rsquo;re only available for pre-order at the moment (though they&amp;rsquo;re ~30% off which brings them down to Wyze level pricing.  Crucially for me is that they support RTSP &lt;em&gt;natively&lt;/em&gt;.  I&amp;rsquo;m curious to see how well they do but if they&amp;rsquo;re anything like the doorbell camera I think they&amp;rsquo;ll work great.  I ordered several cameras to basically replace every Wyze camera I have and I&amp;rsquo;ll post an update/review once I receive them (currently supposed to be released at the end of May).  So come back for more later.&lt;/p&gt;
&lt;h1 id=&#34;other-sensors&#34;&gt;Other Sensors
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/wyzesense.jpg&#34;
	width=&#34;400&#34;
	height=&#34;413&#34;
	srcset=&#34;https://blog.fuzzymistborn.com/smart-home-hardware/wyzesense_hu_bef0accafa35a614.jpg 480w, https://blog.fuzzymistborn.com/smart-home-hardware/wyzesense_hu_a7f14b8b526d79aa.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;96&#34;
		data-flex-basis=&#34;232px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;As I said above, &lt;em&gt;most&lt;/em&gt; of my door and motion sensors are Zwave.  A few months ago I picked up some Wyze contact and motion sensors and overall I&amp;rsquo;m REALLY impressed by them.  They are incredibly cheap (you can get a 4 motion sensors or contact sensors for ~$20) and are very responsive.  They use a proprietary 900 MHz frequency so no interference and VERY long range.  The downside is you need yet another hub (comes with the starter pack).  Normally you plug the hub into the back of a Wyze camera but some smart people reverse engineered things and you can now get them imported into HomeAssistant with the hub plugged directly into a computer.  No Wyze Cam necessary.  The only real drawback I&amp;rsquo;ve found with the motion sensors is that they have a 40 second cool down which is a bit longer than I&amp;rsquo;d like (and it&amp;rsquo;s not adjustable).  Not a major problem in most situations but a shorter cool down would be nice.&lt;/p&gt;
&lt;h1 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h1&gt;&lt;p&gt;Phew, that ended up longer than I was expecting it to be.  Any post about smart home hardware is going to be highly personalized to the individual user, but I thought it might be useful to see a fairly wide overview of what is out there and what kind of devices are useful.  And it&amp;rsquo;s fun for me to review some of the stuff I&amp;rsquo;ve tried and not liked and some of the stuff I still love 2+ years later.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>What software do I run?</title>
        <link>https://blog.fuzzymistborn.com/what-software-do-i-run/</link>
        <pubDate>Wed, 22 Apr 2020 01:55:00 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/what-software-do-i-run/</guid>
        <description>&lt;img src="https://blog.fuzzymistborn.com/what-software-do-i-run/header.jpg" alt="Featured image of post What software do I run?" /&gt;&lt;p&gt;Maybe the first place to start is: what software am I running to control my smart home?&lt;/p&gt;
&lt;p&gt;Surprisingly, a lot.&lt;/p&gt;
&lt;h2 id=&#34;homeassistant&#34;&gt;HomeAssistant
&lt;/h2&gt;&lt;p&gt;First, and most importantly, is &lt;a class=&#34;link&#34; href=&#34;http://home-assistant.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Home-Assistant&lt;/a&gt;, or HASS.  HASS is&amp;hellip;incredible.  HASS can literally integrate with thousand of devices and services (1,500+ as of writing this) and it&amp;rsquo;s continually increasing.  Not to say that HASS is perfect (it&amp;rsquo;s not).  There are still a lot of growing pains as it&amp;rsquo;s not 1.0 yet, which means lots of breaking changes between updates and some of them aren&amp;rsquo;t popular.  I still think it&amp;rsquo;s the best piece of software for running a smart home given it&amp;rsquo;s popularity, ease of installation, and helpful userbase.  I probably won&amp;rsquo;t do any kind of &amp;ldquo;How to Install HASS&amp;rdquo; as that&amp;rsquo;s well covered elsewhere (and again, kinda everchanging at the moment) but I probably will do some posts about the various things I integrate with HASS and how I made those decisions.&lt;/p&gt;
&lt;h2 id=&#34;nodered&#34;&gt;NodeRed
&lt;/h2&gt;&lt;p&gt;Next is &lt;a class=&#34;link&#34; href=&#34;https://nodered.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Node-Red&lt;/a&gt;.  The best way to think about Node-Red is that it&amp;rsquo;s the &amp;ldquo;brains&amp;rdquo; running the show.  HASS provides the connections to my various devices and their state and then Node-Red tells HASS what to do.  Node-Red is a visual automation editor that I have found to be far superior to the built in HASS automation editor.  I started out with HASS as the automation engine and it worked very well for me.  But I grew tired of repeating lines of code over and over when I&amp;rsquo;d add things and debugging was a pain.  Node-Red is much easier in my opinion to 1) see what you&amp;rsquo;re doing, 2) easily reuse what you&amp;rsquo;ve done before (I love using links), and 3) debug your automations to see if there are problems and where they are.  At this point I have very few automations left in HASS (mainly those I just can&amp;rsquo;t figure out how to recreate or am to lazy to deal with).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.fuzzymistborn.com/what-software-do-i-run/NodeRed.png&#34;
    alt=&#34;Example of Node-Red in action&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Example of Node-Red in action&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The above automation replaced a few hundred lines of code and controls my alarm system.  I have some other examples I&amp;rsquo;ll explore later, but I would highly recommend someone starting out with HASS to explore Node-Red as well.&lt;/p&gt;
&lt;h2 id=&#34;other-software&#34;&gt;Other Software
&lt;/h2&gt;&lt;p&gt;Just a quick rundown of other software I run. &lt;a class=&#34;link&#34; href=&#34;https://mqtt.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MQTT&lt;/a&gt; (Message Queuing Telemetry Transport) is an absolutely essential as it&amp;rsquo;s an incredibly versatile tool.  I use it a lot of interconnect various devices and services.  Basically you create a MQTT broker/server and then various clients can connect to it to both send and read/receive messages on different topics.  Sounds complicated but once you dig into it a bit you&amp;rsquo;ll see how simple and flexible it can be.  Personally I use &lt;a class=&#34;link&#34; href=&#34;https://mosquitto.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Mosquitto&lt;/a&gt; but there are a few other options out there.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll have a larger post on hardware at some point, but recently I picked up a Zigbee stick (Conbee II) and to control the various Zigbee devices I&amp;rsquo;ve picked up I use deConz.  Again, more on hardware later.&lt;/p&gt;
&lt;p&gt;Database-wise I mostly use Mariadb, but also have an InfluxDB that feeds HASS data into Grafana for some pretty graphs.  Not much to say here, a database is kind of a database&amp;hellip;&lt;/p&gt;
&lt;p&gt;Other odds and ends that are tangentially related to smart home things are &lt;a class=&#34;link&#34; href=&#34;https://github.com/ccrisan/motioneye&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MotionEye&lt;/a&gt; for recording my various Wyze Cams running RTSP (more on these later). &lt;a class=&#34;link&#34; href=&#34;https://nginx.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Nginx&lt;/a&gt; is my reverse proxy of choice (I tried Apache and Traefik but I have nginx working so I&amp;rsquo;m following the &amp;ldquo;if it ain&amp;rsquo;t broke don&amp;rsquo;t fix it&amp;rdquo; mantra).&lt;/p&gt;
&lt;h2 id=&#34;docker&#34;&gt;Docker
&lt;/h2&gt;&lt;p&gt;Everything described above is run via &lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/compose/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker-Compose&lt;/a&gt;.  Docker makes things so much simpler to set up, configure, and run.  Basically everything installs inside of a container so everything should &amp;ldquo;just work.&amp;rdquo;  If it doesn&amp;rsquo;t work, I can easily delete the container/image with minimal system impacts (and best of all, very few lingering files/folders/other cruft).  I end up trying a lot of things out and really like using Docker to test things out for that reason.  In fact, if there&amp;rsquo;s NOT a Docker container available I&amp;rsquo;m less likely to want to try the software out these days.  The result is that there&amp;rsquo;s very little that runs outside of Docker for me on my server.&lt;/p&gt;
&lt;p&gt;Finally, speaking of my server, I&amp;rsquo;m running Ubuntu 18.04 LTS (soon to be upgraded to 20.04 LTS once the .1 patch comes out).  Ubuntu works well and is well supported so again it &amp;ldquo;just works.&amp;rdquo;  Again part of the benefit of running everything in Docker is that the underlying OS doesn&amp;rsquo;t matter a ton so use what works for you.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;So that&amp;rsquo;s what runs my smart house.  Probably an overly simplistic overview but hope it&amp;rsquo;s helpful to someone to see.  Next up I&amp;rsquo;ll probably cover the hardware I use, before I start branching off a bit to some of the more nuts and bolts things that I want to write to document/write up.&lt;/p&gt;
&lt;p&gt;Till next time.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>First</title>
        <link>https://blog.fuzzymistborn.com/first/</link>
        <pubDate>Wed, 15 Apr 2020 18:10:20 +0000</pubDate>
        
        <guid>https://blog.fuzzymistborn.com/first/</guid>
        <description>&lt;p&gt;First blog post.  Wheeeeeee.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still not 100% sure what I&amp;rsquo;ll use this for.  But I wanted to start trying to document some of the smart home/tech things I&amp;rsquo;m doing so I can 1) maybe help someone else out who is having a similar problem and 2) make a resource for myself in case I have to rebuild everything (really hoping that never happens!).&lt;/p&gt;
&lt;p&gt;So expect some things about smart homes, some things about general Linux, more things about smart homes&amp;hellip;.maybe some other random things.  We&amp;rsquo;ll just have to see won&amp;rsquo;t we?&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
