Home Assistant
Table of Contents
I heard about Home Assistant home automation project before: open source, integrates with everything... But it wasn't until I replaced my HVAC system recently that I decided to see what it can do. And it is great!
Some informational sites:
Installation
Home Assistant documentation describes a number of ways to install it.
Dedicated Hardware - not the one
One approach is to use dedicated Raspberry Pi-based hardware, and the purpose-built units offered for sale look great; this is probably the best way for those who do not have a home server; I do though, and prefer to run Home Assistant on it - along with other things.
Docker Containers - not the one
One way to run Home Assistant on a machine not dedicated to it is to use Docker containers; this
installation method is called Home Assistant
Container. Setting up Home Assistant this way is simple enough - here is the docker-compose.yaml:
version: '3'
services:
homeassistant:
restart: unless-stopped
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
privileged: true
network_mode: host
volumes:
- /home/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
- /run/dbus:/run/dbus:ro
One issue with this approach is that there is no one-click updates: new image needs to be pulled
explicitly with a Docker command; another is - no access to add-ons: each add-on needs to be installed
manually using a separate docker-compose.yaml
Here, for example, is one for Z-Wave:
version: '3.7'
services:
zwave-js-ui:
container_name: zwave-js-ui
image: zwavejs/zwave-js-ui:latest
restart: unless-stopped
tty: true
stop_signal: SIGINT
environment:
- SESSION_SECRET=...
- ZWAVEJS_EXTERNAL_CONFIG=/usr/src/app/store/.config-db
networks:
- zwave
devices:
# Do not use /dev/ttyUSBX serial devices,
# as those mappings can change over time.
# Instead, use the /dev/serial/by-id/X serial device for your Z-Wave stick.
- '/dev/serial/by-id/...:/dev/zwave'
volumes:
- '/home/homeassistant/zwave-js-ui/config:/usr/src/app/store:Z'
ports:
- '8091:8091' # port for web interface
- '3000:3000' # port for Z-Wave JS websocket server
networks:
zwave:
(Instead of the UI-less minimalist image https://hub.docker.com/r/kpine/zwave-js-server, I went with the official image
that also has a very nice UI: https://github.com/zwave-js/zwave-js-ui/blob/master/docker/docker-compose.yml. Note: zwave-js-ui used to be called jwavejsmqtt; some instructions still use the old name...)
With zwave-js-ui now running on port 8091, I followed instructions:
- in Settings / Home Assistant, enabled "WS Server"
- kept MQTT discovery disabled
- disabled MQTT gateway
- used circular arrows icons to generate random keys (S2_Unauthenticated etc.)
It looks like I do not need to do anything about Home Assistant Z-Wave add-on; on the Home Assistant side, I added Z-Wave integration with the default web-socket settings - and that's it!
Appealing to the control freaks who love doing everything themselves, this approach quickly becomes
inconvenient - one needs to hand-craft or find a working docker-compose.yaml file for
each add-on, and then manually update them all. For those who value convenience, better approach is to
let Home Assistant itself take care of the add-on management and updates: it does use Docker
internally, and provides UI for managing the add-ons and updating everything. This means - install
Home Assistant OS.
So, I want to run Home Assistant OS on a dedicated machine without dedicating my home server to it and without any additional hardware. This means - virtual machines!
Virtual Machine - the one
Manual
One approach is to create Home Assistant virtual machine using virt-manager.
For it to be accessible from other machines on my network (including my phone), I need a special network setup; see "Network" in [[Virtual Machines]]. In the following, network interface set up for this purpose is named "mac0".
Official instructions for installing Home Assistant in a virtual machine:
wgettheKVM(.qcow2) image from the list to/home/homeassistant;- uncompress resulting file with:
unxz haos_ova-13.1.qcow2.xz; - In
virt-manager: create a new virtual machine; - "Import existing disk image": browse to the downloaded and uncompressed image;
- "Generic or unknown OS. Usage is not recommended.";
- RAM: 8192 megabytes, 4 CPUs;
- "Customize configuration before install.";
- "Network selection: Macvtap device.": mac0
- Overview / Firmware / UEFI x86_64: /usr/share/edk2/ovmf/OVMF_CODE.fd
- Add Hardware / Channel: device type "unix"; org.qemu.guest_agent.0
- "Begin Installation"
For the various USB dongles (Z-Wave, Zigbee, RTL) to be visible to the Home Assistant inside the
virtual machine, they need to be added in "Add Hardware" of the virt-manager.
(Bluetooth controller did not work for me though, which is fine really; see https://www.reddit.com/r/VFIO/comments/wbsqy1/how_to_fix_onboard_intel_bluetooth_error_code_10/)
ProxMox
Just as running Home Assistant in a virtual machine is more convenient than managing its components manually, it is more convenient to run virtual machines using [[ProxMox]] than setting them up manually:
- ProxMox takes care of the network setup that exposes the virtual machines to the local network using a bridge
- there are community scripts that automate setting up virtual machines, including one for the Home Assistant.
- ProxMox exposes a web-based management UI, so there is no need to run
virt-managerUI over SSH
Add-Ons and Integrations
With Home Assistant installed in a virtual machine, adding add-ons is trivial. I use:
- File Editor
- Home Assistant Google Drive Backup
- Mosquitto broker
- MQTT Explorer
- rtl_433 (next)
- rtl_433 MQTT Auto Discovery (next)
- Terminal & SSH
- Z-Wave JS
- Jewish Calendar
I also added HACS - Home Assistant Community Store.
Integrations I use:
- ESPHome
- MQTT
- Viessmann ViCare
- Z-wave
- Zigbee Home Automation
Home Assistant Cloud and Backups
Just as it is more convenient to let Home Assistant OS manage itself than configure and update each add-on manually, it is more convenient to pay a little bit to Nabu Casa than setting up remote access manually.
Home Assistant Cloud can be configured to use a custom domain too!
Home Assistant Cloud supports storage of one backup; instead, I went with the Google Drive Backup Add-On.
Viessmann Boiler
To bring my new a Viessmann's Vitodens 100-W boiler under the control of Home Assistant, I:
- installed Viessmann's ViCare application on my phone;
- used it to connect the boiler to Viessmann's cloud over WiFi;
- followed instructions on the ViCare integration, and it just worked!
A few month later I noticed that there are things that I can do using the ViCare application that I can't do in Home Assistant. I filed a bug - and it got fixed (thank you, CFenner!). Now I can switch from ViCare to Home Assistant completely :)
On July 10, 2025 I got a message from Viessmann about a Domain Change for the Viessmann API https://api.viessmann.com to https://api.viessmann-climatesolutions.com; not clear at this point what, if anything, I need to do about this...
Garage Door Opener
When I replaced my garage door openers in 2015, I wanted to be able to open the doors with my phone - just for fun! But it turned out that I needed some WiFi accessory that wasn't compatible with my model of the opener or some such...
Over the years, I though about building some Raspberry Pi-based thingy to control the garage door opener, but since I do not really need it, and interfacing with the opener properly did not seem trivial, I did nothing ;)
Recently, I saw a post I added a ratgdo to my garage door, and I don’t know why I waited so long. Turns out, one guy completely solved the garage door opener integration, and how! The product is compatible with any garage door opener and any home automation approach! And it's completely local: my data doesn't get shipped to the Garage Door Opener Manufacturer's cloud! So, I:
- ordered a ratgdo v2.53i kit for $45 and ratgdo v2.53i holster for $9;
- got them in a couple of days;
- flashed the ESPHome firmware recommended for use with Home Assistant;
- the tool itself added my board to my Home Assistant;
- in Home Assistant's settings, set "Allow the device to perform Home Assistant actions";
- powered down my garage door opener;
- moved wires for the door button and obstruction sensors from the opener to the ratgo;
- connected ratgo to the opener using supplied three-wire harness;
- powered ratgo up with the supplied USB brick and cable;
- powered the opener back up - and it just worked!
I am not sure how the sales of this little device can possibly fund continuous improvements to both hardware and firmware and research involved, especially since one needs to be a little bit of a geek to buy it...
I am in awe: one person developed and continues to improve a solution that completely covers this application area ;)
Professionally done labor of love - way to go!!
Firmware is ESPHome 2024.8.3 (re-OTAd 2026-08-19 only to move Wi‑Fi to podval-2g; still .240). Do not update to current esphome-ratgdo unless something is actually broken. Latest builds need ESPHome 2026.4+ and an
API encryption key this board does not have — HA would drop until the key is added. ESP8266 OTA is
tight; some 2026.1/2026.2 updates broke the handshake. If we ever flash again: pin a release, compile
with a noise key, OTA from http://192.168.1.240, have a USB cable ready.
Z-Wave
From the list of Z-Wave controllers Home Assistant supports](https://www.home-assistant.io/docs/z-wave/controllers/), I picked "Zooz 800 Series Z-Wave Long Range S2 USB Stick ZST39 LR" ($37 on Amazon).
In the zwave-js-ui, my Z-Wave USB stick reports firmware version v1.40 and SDK version v7.22.0, which seem fine. ZOOZ firmware page has the latest firmware; ZOOZ firmware update instructions caution against updating the firmware using Home Assistant itself.
By now, I switched to Home Assistant Connect ZWA-2.
Thermostat
I have a Honeywell T6 Pro model TH6210U2001 thermostat; it does not have remote capabilities, so I can not integrate it with Home Assistant, but it turns out that other models in the Honeywell T6 Pro lineup do work with Home Assistant, and I do not need to re-wire anything, since all T6 models have the same mounting plate!
Bitten by the "local control, no cloud accounts" bug, I rejected WiFi models TH6220WF2006/U and TH6320WF2003/U, which require a Honeywell Cloud account, and settled on Z-Wave model TH6320ZW2003-U ($128 on Amazon).
Thermostat replacement went without a hitch, and I was able to add it to Z-Wave controller even though the my Z-Wave stick is plugged into a server in the attic,two floors above the thermostat with a few walls in-between - beautiful!
Zigbee
I bought Sonoff Zigbee 3.0 USB Dongle Plus-E Gateway ($33 on Amazon). Integrating it into Home Assistant turned out to be much simpler than the official instructions for ZHA (Zigbee Home Automation) make it sound: I plugged the dongle into the machine where Home Assistant is running and restarted the Home Assistant; it discovered the dongle, and when I agreed to integrate it, everything got configured automatically!
I also bought a Sonoff Zigbee Indoor Temperature and Humidity Sensor, SNZB-02D LCD ($20 on Amazon). Told ZHA to add a new device, pressed the pairing button on the device for 5 seconds - and that was it!
RTL 433
I have a little LCD device with three additional sensors that send data to the screen. Turns out, there is a library that handles the protocols such devices use: rtl_433! Of course, to decode the messages the sensors transmit, we first need to receive them using an RTL-SDR USB dongle.
Receiver/decoder can be run stand-alone, but does not have to when used in Home Assistant:
- add the RTL-SDR USB dongle to the virtual machine running Home Assistant
- add Mosquitto Broker add-on (HA creates a broker user for add-ons; do not add a
Person named
mqtt) - start the add-on
- add MQTT integration with the Mosquitto broker
- add rtl_433_next add-on
/config/rtl_433/next.conf.template (broker user/pass come from the add-on's MQTT
service, not this file):
output mqtt://${host}:${port},user=${username},pass=${password},retain=${retain}
protocol 20
convert si
verbose 4
Only protocol 20 (Ambient Weather F007TH). Auto Discovery is stopped so neighbor sensors are not re-created; start it only if a real sensor gets a new ID after a battery change.
- start the add-on (it picks up the template and the Supervisor MQTT service)
- add rtl_433 MQTT Auto Discovery (next) add-on
- configure it: host homeassistant, user mqtt, password mqtt - ?
- start the add-on when adding a new 433 MHz sensor
- add MQTT Explorer add-on
- configure the connection to homeassistant:1883,user=mqtt,pass=mqtt
- start the add-on when debugging topics
Garden
Added a SONOFF Sprinkler Timer Zigbee 3.0; since it is far from my server in the attic, placed a Zigbee plug on the inside of the wall where the garden faucet is :)
Security
I want to replace my door bell with a video one and install some cameras; I am thinking Reolink, which integrates with Home Assistant - although it seems that some additional trickery is needed for audio... Also, the head-to-toe version (white, not black) does not seem to be available...
Bought and installed in June 2026.
Floor Plans
Make floor plans with:
- SweetHouse3D
- RoomSketcher
- FereeCAD
Integrate with Home Assistant with:
Grok
I added my SSH public key to Home Assistant's Terminal/SSH add-on ("app"). Grok can use it once I SSH there first ;)
Current setup (2026-08)
Core 2026.8.2 on qemux86-64 (HAOS 18.2, [[ProxMox]] VM 100). Hostnames:
homeassistant.local, homeassistant.lan.podval.org (192.168.1.209). Not 192.168.1.101 (that's the UniFi switch). Core HTTP is :8123 with ssl: false. Doorbell talk/mic needs a secure context; today that means
Nabu Casa. /config is a symlink to /homeassistant.
configuration.yaml is stock: default_config plus includes for
automations/scripts/scenes, plus a YAML notify action group notify.phones (Pixel 10 / Pixel
8 / Pixel 8 Remote). No packages/, no /config/esphome/. Scripts file is empty.
Logic is YAML automations. Node-RED is installed but stopped (boot: manual, empty flow) —
check it is still empty before adding YAML that might duplicate a future flow.
Add-ons started: Z-Wave JS, Terminal & SSH 10.4.0, Mosquitto, Google Drive Backup,
rtl_433 (next). Boot manual: Node-RED and rtl_433 MQTT Auto Discovery are stopped; File
editor and MQTT Explorer are in error. Custom: HACS + Frigate integration 5.15.4. Advanced
Camera Card is unpacked under /config/www/advanced-camera-card/ v7.27.4 (not HACS); lovelace_resources is what actually loads it.
Keepers for the F007TH sensors: boiler 2-234, garage 1-55, deck 3-219.
Automations (do not clobber)
YAML is a list of maps (id, alias, modern triggers: / actions: keys, mode:). Timers that should reset when the device is turned on
again use mode: restart — that is per-automation, not per entity, so do not combine the
bathroom fans into one automation.
- Shabbos/Yom Tov — tag
tag.shabbos_yom_tov(3ef26f62-ef32-4d27-b819-1abf66dfa0ee) and automationshabbos_yom_tov_scene_before_sunset(sensor.jewish_calendar_sunset_shkia− 40 min, only ifupcoming_candle_lightingis still ahead and within 2½ h) bothscene.turn_onscene.shabbos_scene, then explicitswitch.turn_ononswitch.refrigerator_sabbath_mode. That scene: master bedroom Shabbos lights + fridge Sabbath on. No fridge tag (tag.refrigerator_shabbos_modewas removed). Do not usescene.master_bedroom_shabbos_scene. - Fridge Sabbath mode —
switch.refrigerator_sabbath_mode(Samsung / SmartThings). Explicitswitch.turn_on/switch.turn_offdoes reach the appliance (door light off/on). Do not rely on scenes alone:scene.turn_onskips an entity HA already thinks matches. Motzaei 2026-08-22 appliedscene.night(which lists the switch off) while HA still showedoff, so the fridge command never went out. Automationrefrigerator_sabbath_follows_shabbos(automation.refrigerator_sabbath_mode_follows_shabbos_yom_tov) sends the switch command when Shabbos/Night/Day is actually activated (15 s recency, ignore unavailable) and whenbinary_sensor.jewish_calendar_issur_melacha_in_effectturns on/off. Motzaeimotzei_shabbos_yom_tov_night_scenealsoswitch.turn_offafter Night. - Scenes YAML also has
scene.nightandscene.day(Day currently matches Night; both list fridge Sabbath off). Living Room islight.s2_dimmer(notlight.light_2). Master bedroom on/off light islight.master_bedroom_light(not hiddenswitch.background_light). - Doorbell Notification → Reolink
binary_sensor.front_door_visitor(button) or Frigatebinary_sensor.stoop_person_occupancy(person whose feet are in thestoopzone) →notify.phones.binary_sensor.doorbell_person_occupancyis still anyone in frame — do not use it for notify. On button,frigate.create_event(visitor, 30s). Talk/lovelace-doorbell/talk. Keep Reolink for the chime. See [[Frigate]]. - Bathroom fan auto-off (one automation per fan,
mode: restart, 15 min):fan.master_bathroom_fanfan.bathroom_fan(UI name Bathroom Fan; helper overswitch.1st_floor_bathroom_fan)fan.guest_bathroom_fanfan.attic_bathroom_fan(helper overswitch.attic_bathroom_fan_2)- Not
light.attic_bathroom_fan_light/switch.attic_bathroom_fan(that's the attic fan light)
Those fan devices also have disabled Z-Wave number.*_auto_turn_off_timer config
params. Prefer the YAML automations unless I want the on-device timer.
Prefer the entity the UI/voice uses. Example: fan.master_bathroom_fan is switch_as_x over switch.master_bathroom_fan — automate the fan.
Stable entities (re-check the registry)
- Garage:
cover.ratgdov25i_0bd4e4_door(ratgdo v2.5i,.240onpodval-2g) - Garden:
valve.back_garden_water,switch.sonoff_swv - Climate:
climate.t6_pro_z_wave_programmable_thermostat - Boiler:
sensor.e3_vitodens_100_na_0521_* - Doorbell button/chime (Reolink):
binary_sensor.front_door_visitor,number.reolink_chime_*. Video/person ([[Frigate]]):camera.doorbell,binary_sensor.doorbell_person_occupancy. Disablecamera.front_door_fluent. - Phones:
device_tracker.pixel_10,notify.phones(group). Singles:notify.mobile_app_pixel_10/notify.pixel_10(and Pixel 8 / Pixel 8 Remote). - Speakers / Cast: Entryway speaker
media_player.entryway_speaker(Nest Mini, Google Home name Entryway speaker,.117onpodval-u, area Entranceway). Google Cast hub is already configured (zeroconf + known host.117). Also on Cast: Family Room TV (media_player.family_room_tv_3; androidtv_remote ismedia_player.family_room_tv). Master Bedroom Nest Audiomedia_player.bedroom_speakeris currently unavailable. The Mini is a Google Assistant device — Cast gives HA amedia_player(TTS / play media), not a Home Assistant voice satellite.
~700 enabled entities, ~2600 registered. Many lights still have generic ids (light.dimmer, light.light). Use the registry original_name / name to disambiguate.
person.mqtt is leftover from Mosquitto onboarding — delete in Settings →
People. After that, the HA login user mqtt can go too; rtl_433 no longer uses
it.
TODO
Move refrigerator to podval-2g, then make podval-u 5 GHz
only. See [[UniFi]] § Later. ratgdo .240 is already on podval-2g.
Smoke / CO + garden leak notify. Sensors exist, nothing notifies. Attic Zooz ZEN55:
binary_sensor.attic_fire_sensor_smoke_detected, binary_sensor.attic_fire_sensor_carbon_monoxide_detected. Garden SONOFF valve: binary_sensor.sonoff_swv_water_leak. Send notify.phones (Pixel 10 + both Pixel 8s),
high priority. Do not trigger on the fire sensor idle binary sensor.
Advanced Camera Card via HACS (today it is just files in /config/www/advanced-camera-card/). Then drop the leftover frontend.extra_module_url in configuration.yaml; lovelace_resources is
what actually loads the card.
Official Z-Wave JS → Z-Wave JS UI for network graph / heal / per-node debug. Do not run both add-ons. Switch doc.
Watchman + battery status. Watchman for a weekly unavailable-entity report. Separate low-battery notify to
notify.phones for real cells: eight SNZB-02D sensor.sonoff_snzb_02d_battery*,
garden sensor.sonoff_swv_battery, T6 sensor.t6_pro_z_wave_programmable_thermostat_battery_level / binary_sensor.t6_pro_z_wave_programmable_thermostat_low_battery_level, F007TH keepers only
(sensor.ambientweather_234_battery, sensor.ambientweather_f007th_1_55_battery,
sensor.ambientweather_f007th_3_219_battery). Skip phone battery entities.
Floor plan dashboard. Draw in Sweet Home 3D / RoomSketcher / FreeCAD; see Floor Plans above.
Local HTTPS so doorbell Talk works on the LAN without Nabu Casa.
use simplified automation UI released in June 2026
https://www.home-assistant.io/dashboards/sections/#creating-a-sections-view
Can I replace my Honeywell HumidiPRO H6062 with something compatible with Home Assistant?
https://samakroyd.com/2024/09/25/home-assistant-weve-done-smart-home-what-about-smart-garden/
https://itead.cc/product/sonoff-zigbee-human-presence-sensor/
https://1projectaweek.com/blog/2023/8/7/rtl433-home-assistant-and-cheap-flood-sensors-oh-my
Maintenance dashboard!