Voice Control Without the Cloud#
Most Alexa integrations for Home Assistant rely on cloud services, vendor accounts, and a sprinkle of vague, hand-wavy magic. I wasn’t having it. I wanted fully local voice control: no cloud, no accounts, just my LAN, my rules.
That’s where node-red-contrib-amazon-echo
comes in. It emulates Philips Hue-like devices on your network so Alexa can discover and control them. Completely cloud-free.
The First Attempt: node-red-contrib-alexa-local#
I initially started with node-red-contrib-alexa-local
, which looked promising at first. The idea was simple: emulate Alexa devices locally and let them be discovered without any cloud involvement.
But… it didn’t work. Not at all.
Some digging revealed a very blunt warning:
!!!THIS NODE IS NO LONGER WORKING!!!
Why?#
- Modern Alexa devices require the discovery process to happen over port 80 on your Node-RED instance.
- This node used random ports to avoid the need for root permissions, which worked fine for older Echo devices, but completely fails on newer ones.
- The developer even recommended switching to
node-red-contrib-amazon-echo
, which is essentially the same thing, but with proper port 80 support.
So I followed that advice and installed the recommended node:
Setting Up the Alexa Hub and Devices#
I configured an Amazon Echo Hub in Node-RED. This hub handles discovery and emulates Hue-like devices for Alexa.
A basic flow looks like this:
- Amazon Echo Hub → Emulates a Hue bridge.
- Amazon Echo Device → One for each Home Assistant entity.
- Home Assistant Service Call → Executes the desired action.
For example, I created a virtual device named Living Room Light
. When Alexa turns it on, Node-RED passes the command to Home Assistant via a light.turn_on
service call.

I also added a rate limit to the Living Room Light
device. I noticed that sometimes Alexa sends two or more trigger messages in quick succession (within 1–2 seconds), causing the light to toggle twice. I’m not sure if this is a bug or just a quirk, but the limit node ensures only a single trigger goes through, regardless of how many times Alexa fires.
Alexa Discovery & Routines#
Once everything was in place, I asked Alexa:
"Alexa, discover devices."
And just like that, Living Room Light
appeared as if it were a native device. I then created custom Alexa Routines. Since my RF switch (used for lights) is already integrated with Home Assistant, as shown in my previous blog post, I could control it through these routines.
👈 Integrating this switch we hacked a while back
Since the RF switch can only be triggered (not queried), it doesn’t report its current state back to Home Assistant. So, I configured Alexa routines where both “Turn on Living Room Light” and “Turn off Living Room Light” call the same Home Assistant service, toggling the switch.
The trick is to use aliases like Turn on Living Room Light
and Turn off Living Room Light
so Alexa understands the commands.
- “Turn on Living Room Light” → Activates the RF switch
- “Turn off Living Room Light” → Activates the RF switch
This way, I can control my lights with simple voice command, all while keeping everything local and private.
Of course, since the switch doesn’t report its state, it’s more of a stateless toggle. Saying “Turn on” may actually turn the light off, and vice versa. But honestly, that’s a minor inconvenience I can live with.
Final Thoughts#
This integration has been a game-changer for my home automation setup. I now have:
- Local Control — All traffic stays on my LAN.
- Privacy and Performance — No cloud interaction at all.
- Flexibility — Any Home Assistant device is now voice-controllable.
The next step? I’m working on integrating my blinds and creating routines for even more seamless voice control.
Stay tuned for part two!