Přeskočit obsah

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) enp0s18192.168.20.7/24, GW 192.168.20.1 (Static, primary)
NIC 2 (IoT) enp0s19192.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.name192.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 zdroje 192.168.20.7 př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 zdroje 192.168.40.7 a 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: enp0s19gateway: null, primary: false; enp0s18gateway: 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 rm nebo úpravou .storage JSON 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 spustil reload_all, který se zasekl na nemocném modbus atrea a shodil rest+template domé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á. Viz decision_log.md 2026-06-15.

Postup deploye (3 kroky):

  1. Pull na HA: akce shell_command.ha_git_deploy (skript shell_scripts/ha_git_deploy.sh) — git fetch origin master + git reset --hard origin/master. Hard reset = lokální strom HA je přesně GitHub master (zahodí případný drift).
  2. 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.
  3. 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 ne reload_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):

  1. Vývojářské nástroje → Akceshell_command.ha_git_deployProvést akci (stáhne GitHub master na HA).
  2. Vývojářské nástroje → YAMLZnovu 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)
  • --verbose vypisuje 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í)