Home Assistant (Server)
Centrální mozek domácnosti běžící jako virtuální stroj (VM) na Proxmoxu.
Základní Info
| Parametr | Hodnota |
|---|---|
| VMID | 102 (VM) |
| Node | pmx2 |
| Hostname | homeassistant |
| NIC 1 (LAN) | enp0s18 — 192.168.20.7/24, GW 192.168.20.1 (Static, primary) |
| NIC 2 (IoT) | enp0s19 — 192.168.40.7/24, bez gateway (Static, VLAN 40) — viz Routing níže |
| OS | HAOS (Home Assistant OS) |
| RAM | 4096 MB |
| CPU | 2 jádra |
| URL | https://ha.marada.name |
| URL (direct) | http://192.168.20.7:8123 |
| Nginx | ha.marada.name → 192.168.20.7:8123 (WebSocket) |
Síťová Topologie (Dual-NIC)
HA má dvě fyzické síťovky zapojené do dvou různých VLAN:
| NIC | VLAN | Účel | Routing přes pfSense |
|---|---|---|---|
enp0s18 |
LAN (20) — trusted | Default route, veškerá inter-VLAN komunikace | Default allow LAN to any (vtnet1) — pass do všech privátních VLAN |
enp0s19 |
IoT (40) | Přímá L2 komunikace s IoT zařízeními (Tuya, mmWave, Zigbee koordinátory v IoT) | Block IoT to Internal Networks (vtnet3) — drop do trusted/MEDIA/kamer |
Proč dvě NIC: IoT VLAN má v pfSense restriktivní pravidla (žádný traffic do trusted sítí). HA potřebuje s IoT zařízeními komunikovat oboustranně, takže má v IoT NIC přímou L2 přítomnost — komunikace probíhá same-VLAN, neprochází firewallem.
Routing (klíčové pro správné fungování):
- Default route HA musí jít přes
enp0s18(VLAN 20). Linux pak posílá veškerý non-local traffic ze zdroje192.168.20.7přes pfSense, kde rule "Default allow LAN to any" vše pustí. - Pokud default route spadne na
enp0s19(IoT), HA pošle non-local traffic ze zdroje192.168.40.7a pfSense to tiše zařízne na pravidle "Block IoT to Internal Networks" (log: false). Důsledek: HA timeoutuje na kamery, doorbell (192.168.60.10), MEDIA, Proxmox infrastrukturu — same-subnet provoz (20.x, 40.x) jede dál, což mate diagnostiku. Viz decision_log.md 2026-05-06 a 2026-06-19.
Trvalá oprava (2026-06-19): enp0s19 nemá gateway. Když má gateway jen enp0s18, je default route deterministicky přes VLAN 20 a HAOS už nemůže primary přehodit. IoT NIC gateway nepotřebuje — slouží jen k same-subnet L2 komunikaci s IoT zařízeními.
# Aplikace (CLI obejde UI validaci, která smazání gateway u IoT NIC nedovolí)
ssh root@192.168.20.7 'ha network update enp0s19 --ipv4-method static --ipv4-address 192.168.40.7/24 --ipv4-gateway "" --ipv4-nameserver ""'
ssh root@192.168.20.7 'ha network reload'
Důležité: smazání gateway přes UI nejde (validace ho nedovolí — proto dřívější pokusy „nepřežily"). Funguje jen přes CLI výše. Rollback: ha network update enp0s19 --ipv4-gateway 192.168.40.1 --ipv4-nameserver 192.168.40.1.
Po každém HA OS upgrade ověř, že úprava přežila (upgrade může síť přegenerovat):
ssh root@192.168.20.7 'ha network info | grep -E "interface:|gateway:|primary:"'
Cílový stav: enp0s19 → gateway: null, primary: false; enp0s18 → gateway: 192.168.20.1, primary: true. Když se gateway na enp0s19 vrátí, znovu spusť CLI příkaz výše a poté ha core restart (smaže cache zdrojové IP pro Cast/TTS).
Přístup (SSH) 🔐
ssh root@192.168.20.7
- Port: 22 (SSH & Web Terminal Addon)
- Klíč: SSH klíč v
authorized_keys.
[!WARNING] Zasahujete přímo do systému. Opatrně s příkazy jako
rmnebo úpravou.storageJSON souborů za běhu.
Umístění Konfigurace
/config— Hlavní konfigurační adresář (YAML, DB, Storage)./config/.storage— Registry zařízení a entit (Hidden)./backup— Lokální zálohy.
Deploy: Jak se nasazují změny konfigurace
Co to dělá: Konfigurace HA se nikdy needituje přímo na serveru. Edituje se v Git repu (docek/ha-config na GitHubu), pushne na master a pak se ručně nasadí na běžící HA. Žádný automatický sync v pozadí — deploy řídí ten, kdo změnu udělal (typicky přes asistenta a jeho skill ha-deploy, nebo ručně přes UI).
Proč ručně a ne automaticky: dřívější auto-sync (cron každých 5 min + automatizace
reload_all/restart) byl zdroj incidentů — 2026-06-14 spustilreload_all, který se zasekl na nemocnémmodbus atreaa shodilrest+templatedoménu na 2 h. Protože každá změna stejně prochází pracovní session, autonomní stahování řešilo problém, který nenastává. Vizdecision_log.md2026-06-15.
Postup deploye (3 kroky):
- Pull na HA: akce
shell_command.ha_git_deploy(skriptshell_scripts/ha_git_deploy.sh) —git fetch origin master+git reset --hard origin/master. Hard reset = lokální strom HA je přesně GitHubmaster(zahodí případný drift). - Config check: ověření platnosti konfigurace. Při chybě → rollback na předchozí commit (
shell_command.ha_git_reset_to), HA se nereloaduje a běží dál na starém. - Aplikace: podle toho, co se změnilo — cílený reload (
automation.reload,template.reload,rest.reload, …) bez výpadku, nebo plný restart jen pro core soubory (configuration.yaml,modbus/,climate.yaml,sensor.yaml). Nikdy nereload_all(kaskáduje přes modbus a může zaseknout).
Jak to sledovat: sensor.ha_config_commit (nasazený commit) vs. sensor.ha_github_commit (GitHub master) — když se liší, něco není nasazeno. binary_sensor.ha_gitops_stale = on při rozdílu (pasivní indikátor, bez notifikace).
Ruční deploy bez asistenta (rodina/helper, nouzový postup):
- Vývojářské nástroje → Akce →
shell_command.ha_git_deploy→ Provést akci (stáhne GitHub master na HA). - Vývojářské nástroje → YAML → Znovu načíst příslušnou doménu (automatizace / šablony / …), nebo restart HA u core souborů.
Případně přes SSH: ssh root@192.168.20.7, pak /config/shell_scripts/ha_git_deploy.sh a reload/restart přes UI.
Pozn.: Změny v zigbee2mqtt/configuration.yaml se aplikují až restartem addonu Zigbee2MQTT (ručně) — HA restart je neaplikuje.
Klíčové Addony
| Addon | Funkce |
|---|---|
Grafana Alloy (wymangr) |
Log collector: journal + syslog (UDP 5514) → Loki |
| SSH & Web Terminal | Přístup přes SSH (port 22) |
| Zigbee2MQTT | Zigbee koordinátor |
| File Editor | Editace YAML z GUI |
Integrace
- Zigbee: Přes MQTT (Zigbee2MQTT).
- Kamery: Scrypted (Apple HomeKit + NVR).
- DALI: Foxtron custom component (osvětlení).
- Modbus: VZT, Tepelné čerpadlo.
- InfluxDB: Export metrik do
192.168.20.20:8086.
CLI Tooling
Pro read-only práci s registry Home Assistantu je v repu skript scripts/ha_cli.py.
uv run python scripts/ha_cli.py areas --verbose
uv run python scripts/ha_cli.py entities --query obyvak
uv run python scripts/ha_cli.py devices --format table --limit 20
- Výchozí URL je
https://ha.marada.name - Token se čte z
.env(HA_LONG_LIVED_TOKEN) --verbosevypisuje fáze běhu, aby bylo poznat, zda skript běží nebo kde se zasekl- Skript je zatím read-only:
areas,devices,entities,labels,floors
Backup
- ✅ ZFS Replication (pmx2 → pmx1, RPO 15 min)
- ✅ PBS záloha (denní)