RFC: Running Integrations on Separate Machines
Hello! I'd like to propose an idea to enable Home Assistant integrations to run on different machines while keeping the Core in control.
The Problem
Currently, all integrations run in the same Home Assistant process. This means:
No isolation: One crashing integration can bring down the entire system
Resource bottleneck: Need a powerful single machine for everything (cameras, AI, many integrations)
Can't use specialized hardware: Want to run AI on a machine with GPU, or Zigbee on the machine with the USB dongle
Expensive upgrades: When a Raspberry Pi isn't enough, you need to buy a much more powerful single machine
The Idea
Let integrations run on separate machines (workers) while keeping all the control and configuration in Core:
- Core decides when integrations update (like today)
- Core manages all configuration (no split configs)
- Users choose where each integration runs (local by default, or on a specific worker)
- Workers are just "executors" - they have no autonomous behavior
Example Use Cases
Budget-conscious setup:
- Core on Raspberry Pi 4 (critical integrations only)
- Old laptop as worker (cameras, AI, non-critical stuff)
Performance-focused:
- Core on NUC (stable, UPS-backed)
- NAS as worker (resource-intensive integrations)
- Dedicated machine with GPU (vision/AI integrations)
Security-conscious:
- Core on trusted hardware
- Untrusted/community integrations isolated on separate worker
Hardware-specific:
- Zigbee integration on machine with USB dongle
- Everything else on a different, more powerful machine
How It Would Work (High Level)
- Configure workers in
configuration.yaml:workers: - name: my-nas type: docker host: tcp://192.168.1.50:2375 - When adding an integration, choose where to run it:
- Local (default, works exactly like today)
- Remote on "my-nas"
- Core stays in control:
- Core starts/stops the integration on the worker
- Core triggers updates (same DataUpdateCoordinator as today)
- Core receives entity states from worker
- Worker is "dumb" - just executes what Core tells it
- Integration code unchanged (this is key!):
- Existing integrations work without modification
- Developer doesn't need to think about "local vs remote"
What I've Built (POC)
I have a working proof-of-concept with Pi-hole:
Pi-hole integration code runs UNMODIFIED on a separate process
Communication via gRPC (bidirectional)
Everything works: states sync, services (turn_on/turn_off), polling
What I'm Asking
Before I invest more time, I'd like feedback on:
- Does this solve a real problem for you? What's your use case?
- What concerns do you have? Security? Complexity? Performance?
- Which integrations would you run remotely? Which must stay local?
- Better name? "Remote Integrations"? "Distributed Integrations"?
- Would you actually use this? Be honest - cool idea vs actually useful
old and wrongs things
Things I guess
-
Won't work remotely:
- USB/Serial integrations (Zigbee dongles, Z-Wave, Anything requiring direct hardware access, etc.) - unless worker is on the machine with the hardware ??
-
Probably fine:
- Cloud APIs (Nest, Spotify, Weather, etc.)
- Local HTTP APIs (Pi-hole, ESPHome, etc.)
- MQTT integrations
- Most sensors
Your thoughts?
Is this something you'd want? What am I missing? What could go wrong ?