Skip to main content

Home Assistant

Home Assistant runs as a Podman quadlet unit in the hass-pod pod alongside Mosquitto MQTT. Both containers share the host network, which enables mDNS device discovery and keeps service-to-service communication on localhost.
The quadlet system is described in detail on the Podman quadlets page. This page focuses on Home Assistant’s specific configuration and integration points.

Pod architecture

The hass-pod pod groups Home Assistant and Mosquitto into a single systemd-managed unit. Sharing host network gives Home Assistant direct access to the local network for mDNS-based device discovery (used by Matter, Philips Hue, and other auto-discoverable devices).
hass-pod (host network)
├── mosquitto.service   — MQTT broker on 127.0.0.1:1883
└── homeassistant.service — HA web UI on :8123
Frigate runs in a separate quadlet unit but connects to the same Mosquitto broker on localhost, so all event routing is contained within the host.

Quadlet units

Pod definition

/etc/containers/systemd/pod-hass.pod
[Pod]
PodName=hass-pod
Network=host

Mosquitto MQTT broker

/etc/containers/systemd/mosquitto.container
[Unit]
Description=Mosquitto MQTT Broker
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/eclipse-mosquitto:latest
ContainerName=mosquitto
Pod=hass-pod.pod

Volume=/etc/mosquitto/config:/mosquitto/config:Z
Volume=/srv/nas/mosquitto-data:/mosquitto/data:Z
Volume=/srv/nas/mosquitto-log:/mosquitto/log:Z

PodmanArgs=--pull=newer

[Service]
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target default.target

Home Assistant container

/etc/containers/systemd/homeassistant.container
[Unit]
Description=Home Assistant
After=network-online.target mosquitto.service
Wants=network-online.target
# ensure mosquitto is up before HA tries to connect

[Container]
Image=ghcr.io/home-assistant/home-assistant:stable
ContainerName=homeassistant
Pod=hass-pod.pod

# host network for mDNS discovery of devices — critical for HA
Network=host

# HA needs system time and host device access for USB dongles
Volume=/etc/homeassistant/config:/config:Z
Volume=/etc/localtime:/etc/localtime:ro
Volume=/run/dbus:/run/dbus:ro   # DBus for bluetooth if used

# USB Zigbee/Zwave dongle — adjust device path
# AddDevice=/dev/ttyUSB0

Environment=TZ=UTC

PodmanArgs=--pull=newer

[Service]
Restart=on-failure
RestartSec=15
# give HA time to write state cleanly on stop
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target default.target

Volume mounts

Container pathHost pathPurpose
/config/etc/homeassistant/configHA configuration, automations, and state
/etc/localtime/etc/localtimeSystem timezone (read-only)
/run/dbus/run/dbusD-Bus socket for Bluetooth integration
The TZ=UTC environment variable sets the container’s timezone. Home Assistant uses its own timezone setting from the onboarding wizard — this environment variable only affects log timestamps inside the container.

Mosquitto configuration

The broker is configured to listen only on loopback, which is sufficient because all consumers (HA and Frigate) share host network:
/etc/mosquitto/config/mosquitto.conf
listener 1883 127.0.0.1
allow_anonymous true

# persistence
persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log
log_type error
log_type warning
log_type information

# HA + Frigate both on localhost via host network pod
# lock to loopback — nothing external needs MQTT directly
allow_anonymous true is safe only because the broker binds to 127.0.0.1. If you ever expose the broker on 0.0.0.0, add authentication with a password file.

Enabling and starting the services

The image script deploys the quadlet files at image build time. On first boot, systemd’s quadlet generator creates the corresponding .service units automatically. No explicit systemctl enable is needed for Quadlet units — the WantedBy= directive handles activation. If you add or modify quadlet files after first boot, reload the generator:
systemctl daemon-reload
systemctl start homeassistant.service
Check that all pod services started cleanly:
systemctl status homeassistant.service mosquitto.service

Checking logs

journalctl -u homeassistant.service -f

Accessing the web UI

Open http://<cm5-ip>:8123 in a browser. On first access, the onboarding wizard runs to create an account and configure your location and timezone.

Frigate integration

Once both Frigate and Home Assistant are running, install the Frigate integration to receive detection events as HA entities and triggers.
1

Install HACS (if not already installed)

Follow the HACS installation guide to add the Home Assistant Community Store.
2

Add the Frigate integration

In Home Assistant, go to SettingsIntegrationsAdd Integration and search for Frigate. Install it from HACS or the official store.
3

Configure the Frigate URL

Set the Frigate URL to http://127.0.0.1:5000. Because both services share host network, no hostname resolution is needed.
4

Configure MQTT

The MQTT broker is auto-discovered because it runs on the same host. If prompted, confirm the broker address as 127.0.0.1:1883.
5

Verify entities

After configuration, Frigate exposes camera entities, binary sensors for each tracked object class, and event triggers you can use in automations.

USB Zigbee / Z-Wave dongle

To pass a USB Zigbee or Z-Wave coordinator through to Home Assistant, uncomment the AddDevice line in the quadlet file and set the correct device path:
/etc/containers/systemd/homeassistant.container
# USB Zigbee/Zwave dongle — adjust device path
AddDevice=/dev/ttyUSB0
Then reload and restart:
systemctl daemon-reload && systemctl restart homeassistant.service
Use ls /dev/serial/by-id/ to find a stable device path for your dongle that survives reboots, and use that path in AddDevice instead of /dev/ttyUSBx.

Build docs developers (and LLMs) love