- Part 1 - Design
- Part 2 - Where to start
- Part 3 - "Smart" Appliances
- Part 4 - Ceiling Fans
- Part 5 - Bin Day
- Part 6 - Lighting
- Part 7 - Motorised Gate
- Part 8 - Motorised Blinds
- Part 9 - Door Locks
- Part 10 - Debugging! (this post)
- Part 11 - House sitter mode
- Part 12 - Backups
- Part 13 - Wall Mounted Dashboards
- Part 14 - Motion, Occupancy, and Presence
- Part 15 - Generative AI and Notifications
- Part 16 - Seasonal Automation's
When you get down to it, a smart home is partially a software solution, and like any good software solution there are bugs. I’ve recently been spending some time “debugging” my home, and I thought I’d share some of the things I’ve learned.
Case sensitivity
For home security, I have an automation that runs every night when my phone goes on the wireless charger to close the garage door and gate. This is to ensure that if I forget to close them, they will be closed before I go to bed. Here’s part of that automation:
|
|
I didn’t think much of it, I just assumed the automation was working, but one day I noticed that the automation hadn’t run any of the actions. That’s weird, it says it ran, so I had a look at the traces for the automation and I found that it bailed out on the condition
.
The group.persons
entity is defined as so:
|
|
And I knew that we were both home, but looking back through the history it turned out the automation had never run. Ok, we’ve got a bug to fix. Having a look at the trace log for the automation, I noticed this when it hit the condition
:
Result:
result: true
state: home
wanted_state: Home
sigh I had a typo in the automation, I had Home
instead of home
. I fixed the typo and the automation started working as expected… well, it actually uncovered another bug.
Why is the gate open
A few posts ago I wrote about controlling out motorised gate and it’s basically the same approach we have for the garage door (the motor operates in a very similar manner).
Let’s go back to the automation from the last section, and look at the actions:
|
|
It does two things, calls cover.close_cover
to close the garage and gate, and lock.lock
to lock the front door. I can see in the trace that they run as expected, and thankfully the front door was locked, but why are the gate and garage door open?
Well, it turns out that the cover
entities I had for both had a bug in them. I had defined them as so:
|
|
Can you see the problem? The close_cover
(and open_cover
for that matter) are defined to call switch.turn_on
which triggers the Shelly to turn on and start the motor. The problem is, it will do this without first checking should it do it, the service doesn’t know the state of the garage or gate, that’s provided by a binary_sensor
(from an Aqara contact sensor) and is only visually represented by the value_template
and icon_template
.
To fix this I had to change the close_cover
(and open_cover
) to have a condition that checks the door state first:
|
|
Now if the sensor returns “off”, which means the door is open, it can call switch.turn_on
and close the garage, but if it’s “on” (the door is closed) it won’t call switch.turn_on
and the garage door won’t move.
No more waking up to the garage door open!
Why did that light turn on
I’ve talked at length about how I control our fans and to make them better I added some Shelly’s so now the ceiling fans pretty much don’t get turned off, from a power standpoint, we just send the right RF signals.
Well, the other day at 1am my wife and I were rudely woken up to the light in our bedroom being on at fully brightness. Queue me fumbling around to grab my phone, open the HA app, finding it not responding for some reason and having to get out of bed to turn the light off (and wait the 10s for it to turn off - thanks to an automation).
This wasn’t the first time I’d noticed the fan light in our room turning on at random times and only the second time that it’d done it in the middle of the night to wake us up, so it was time to figure out what was going on.
When I was awake in the morning I went to the HA logs and found that the light was turned on by this automation:
|
|
In this case I’m using the Shelly’s in Detached Switch mode and relying on the automation to turn them on or off as required. The mistake I have here is what triggers we’re using, or more accurately, I have an assumption about the state
that the switch can be to trigger the automation.
I incorrectly assumed that the state of the switch would be on
or off
, but it turns out there is at least one other state, unavailable
. This state happens if the Shelly reboots, loses power or the network connection is lost. In this case the automation is triggered and the light is turned on.
Now Shelly’s are pretty stable devices, but the reason that I hit it this particular time is that we’d had a restart in our UDM from an update, so the network dropped briefly, the Shelly went to unable
and then the automation triggered and turned the light on.
To fix this, I made the triggers a lot more specific, I really only care if you go from on
to off
, or vice versa, so I changed the automation triggers to:
|
|
I also decided to use a choose
action rather than an if
and only handle the on
and off
case.
The light now works as expected and we haven’t had any more random light turning on in the middle of the night.
Why won’t the light turn off
From one light problem to another and again the culprit is the fan lights, but this time in our kids bedrooms. The kids have two lights in their room, the fan light and a wifi LED bulb in their lamp that can do a bunch of colours and effects, the main one we use being a nightlight effect. For their fan lights I have an automation that turns the light on or off, unless it’s after bed time, then instead of turning it off, it’ll turn the lamp to Night Light, which in turn turns the fan light off.
|
|
It might seem like we have an overly complex set of automations, like the fact that we don’t always control the light from the switch, but using the nightlight like this works great as we can set the scene of the bedroom in one set of commands and it’s controllable from HA and the Google Home, so the kids can control it themselves.
But there’s a problem, what happens if it’s after 6.45pm and the lamp is already in Night Light mode? Well, the switch will set the effect but it doesn’t change anything which means that it doesn’t trigger the next automation in the chain, so the light stays on and there’s no way to turn it off (short of using the HA app). Yeah, this wasn’t wasn’t a great experience when I was helping our youngest change his PJ’s in the middle of a night after an accident, having to then fumble around turning the lamp off and back on to get it off the effect to then turn the fan light off.
Again, this was a relatively easy fix, I added an additional condition to check if the lamp had the effect set to Night Light and if it did, then don’t set it again, go to the turn off light step.
|
|
(I also check if the lamp isn’t unavailable
as one of the bulbs tends to go offline randomly and can only be fixed by a power cycle… not ideal in the middle of the night).
Wrapping up
Ah debugging, who’d think I would have to do that of my own house, but here we are!
The problems that I’ve looked at here are really easy mistakes to make as a beginner with Home Assistant.
If you’re putting state-based conditions, ensure that you verify the case of the states that you’re testing against, especially if they are states that are generated by non-standard entities. Diving into the traces of the automations can be a great way to see what’s going on and why things aren’t working as expected.
Also, be aware of the states beyond the ones that you actually care about. Because I wasn’t taking into consideration the unavailable
state, I was getting unexpected results - the lights were turning on. Having additional conditions to check for the states that you don’t care about can help to avoid these issues.
Lastly, when using templated entities, ensure that you know where the state is maintained. Because the state of my cover entities are separated from the entity itself - we’re using template to display the right label/icon, it didn’t actually know to not trigger the switch that opens/closes the garage/gate. But it’s an easy fix with conditions on the service calls.
With these fixes sorted out everyone is a lot happier. Sure, there’ll be more bugs to come, but knowing these things that can catch me out will help me to avoid them in the future.