ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

群晖NAS上部署Home Assistant:Docker容器实现智能家居中枢全攻略

群晖NAS上部署Home Assistant:Docker容器实现智能家居中枢全攻略 1. 内容整体设计与思路拆解1.1 为什么要把HomeAssistant跑在群晖NAS上很多人一开始接触智能家居都是从某个品牌的App开始的。米家用米家App苹果用家庭App涂鸦系的设备再用涂鸦App。结果就是手机里装了好几个智能家居App每个App只能管自己那一亩三分地想让不同品牌的设备联动基本靠喊。HomeAssistant下面简称HA就是来解决这个问题的。它是个开源智能家居中枢可以把不同品牌、不同协议的设备统一接入在一个界面里管理还能做跨设备的自动化。比如“客厅的人体传感器检测到有人移动同时光照度低于某个值就打开电视背景灯”这种联动在单一品牌App里往往很难实现在HA里只需要一个自动化就能搞定。那为什么要把HA装在群晖NAS上而不是买一个专门的智能家居网关盒子我自己的体会是NAS本身就是一台7x24小时开机的小服务器CPU、内存、存储都有冗余再跑一个HA容器对群晖来说毫无压力。专门买盒子既多花一笔钱又多一个要维护的硬件。而且群晖NAS通常放在弱电箱或者电视柜旁边网线直连路由器网络环境非常干净HA最需要的局域网设备发现能力能发挥到最大。如果你是那种不想折腾硬件、只希望在已有设备上加一个智能中枢的人群晖NAS跑HA几乎是性价比最高的方案。我自己就是一台用了好几年的群晖家里二三十个智能设备全部挂在HA上稳定跑了大半年。1.2 三种安装方式为什么最终选Docker容器HA官方提供了几种安装形态你得先搞清楚区别再决定用哪种。HA OS整机安装HA直接充当操作系统跑在一台独立设备上。好处是集成度高、官方支持最好坏处是没法跟NAS共存你得有一台专门的小主机。Supervised / Home Assistant Container基于Docker的容器版HA跑在容器里设备接入能力和HA OS几乎一样但部分底层功能比如自动更新、超级面板需要自己维护。这是我们这次用的方式。手动安装 Python 环境直接跑HA适合极客不推荐依赖管理能把人逼疯。群晖上装HA最主流的方式就是Home Assistant Container。原因很直接群晖有成熟的Container Manager套件DSM 7.2以后叫这个名更早版本叫Docker套件创建容器、映射目录、设置端口都是图形化操作门槛低而且容器和NAS系统相互隔离就算HA挂了也不会影响NAS里的文件服务、相册、影音这些核心功能。再一个关键点是备份。HA的所有配置都存在/config目录下用Docker容器部署时只需要把这个目录映射到NAS本地的一个共享文件夹备份就是复制文件这么简单。我每次改完重要配置就去复制一份config目录比什么快照都直观。1.3 整体架构HA在整个智能家居里处在什么位置从整个系统结构看群晖NAS Docker HA相当于一个“中枢大脑”最底层是群晖NAS的硬件和DSM系统提供稳定的运行环境。中间层是Container Manager负责管理HA容器的生命周期。HA容器内部运行核心的服务包括设备发现、实体注册、自动化执行、前端面板。外部设备通过Wi-Fi、蓝牙、Zigbee、MQTT等方式接入HA。如果你只是接入米家这种云平台设备HA和设备的通信路径是“设备 → 厂商云 → HA”如果你走的是MQTT、ESPHome、Zigbee这类本地协议路径就是“设备 → 局域网/网关 → HA”后者响应更快断网也能用。我们在后面接入设备的时候会重点说这两条路径的取舍。2. 环境准备与关键决策2.1 硬件和系统要求不是所有群晖都适合先泼一盆冷水如果你手里的是老款入门级群晖比如单核CPU、512MB内存那种老古董我劝你直接放弃在它上面跑HA体验会让你崩溃。HA虽然不算吃配置但启动时加载集成、扫描设备、跑自动化引擎都需要内存撑住。我的判断标准很简单内存至少2GB4GB以上最舒服。因为除了HA你可能还会跑一个MQTT消息服务器偶尔再挂一两个扩展集成。CPU架构最好是x86_64Intel/AMD处理器虽然ARM架构的群晖也能跑但有些第三方集成和二进制组件对ARM支持不好折腾起来很烦。群晖型号方面DS220、DS420、DS920、DS1522这类x86机型都没问题。老款DS218play、DS418这类ARM机型的用户建议能换就换换不了就降低预期。我这里说的都是基于常见实践的补充具体到你的机型可以在群晖官网查一下CPU架构和内存再决定装不装。2.2 启用Container Manager套件DSM 7.2以上的群晖套件中心里直接搜索Container Manager就能找到点安装即可。老版本DSM装的是Docker套件界面不太一样但逻辑是通的。装好以后在套件中心打开Container Manager你会看到“概览”“容器”“映像”“项目”“网络”“日志”这几个选项卡。其中“项目”是Docker Compose的图形化入口我们这次会用到它“容器”和“映像”就是日常管理HA容器的地方。这里有个小建议安装Container Manager前先确保NAS的系统时间是对的。很多人在后面遇到日志时间不对、HTTPS证书报错根源就是系统时区或者时间没同步好。群晖的“控制面板 → 区域选项 → 时间”里可以设置NTP服务器自动同步别忽略这一步。2.3 目录规划/config映射到哪、怎么命名HA容器里最重要的目录只有一个/config所有配置、自定义集成、自动化脚本、历史记录文件都在这里。创建容器时必须把这个目录映射到NAS的本地文件夹。我在实际操作中的习惯是在NAS的Docker共享文件夹下建一个叫homeassistant的目录然后把HA的config映射进去。具体路径类似/volume1/docker/homeassistant/config不要直接映射到/volume1/docker根目录因为HA会在config目录下生成大量子目录和文件跟其他容器混在一起很难维护。给每个容器单独建一个子目录这个习惯能让你在几个月后回头排查问题时省下大量时间。如果你后续要给HA挂载媒体文件比如让自动化播放本地提示音建议额外建立一个媒体目录映射到容器的/media路径。不是必须但用了就知道方便。2.4 网络模式Host还是Bridge我站Host创建HA容器时网络模式有两个选择Bridge桥接和Host主机。我直接给结论选Host。原因很简单HA要自动发现局域网里的设备支持UPnP、mDNS等协议需要直接监听到局域网的广播包和多播包。如果用Bridge模式容器处在NAS的虚拟内网里很多设备发现协议会失效你会在集成页面里搜了半天都看不到设备——大概率就是网络模式的问题。用Host模式也有代价HA会直接占用NAS的8123端口如果你NAS上已经有别的东西占用这个端口会冲突。不过8123是HA默认端口绝大多数群晖用户不会碰到冲突可以放心用。如果你出于某些原因必须用Bridge模式那就得手动映射8123端口到NAS的某个端口并且要做好设备手动配置IP的准备这会增加不少工作量新手我不建议走这条路。3. 实操过程与核心环节实现3.1 通过Container Manager创建HA容器的完整步骤按照我的习惯创建一个常规容器我都会在Container Manager的“项目”里用Compose文件创建而不是用图形化的“容器 → 新增”按钮。原因是Compose文件可以把所有配置以纯文本形式保存下来以后复制到别的机器上就能一键重建这对迁移和容灾太重要了。具体步骤如下。第一步在Container Manager里打开“项目”选项卡点击“新增”。第二步在项目名称里填homeassistant路径选择你刚才创建好的/volume1/docker/homeassistant目录这里需要提前在File Station里建好。第三步使用“创建docker-compose.yml”的编辑框填入下面的内容services: homeassistant: container_name: homeassistant image: homeassistant/home-assistant:latest restart: unless-stopped network_mode: host environment: - TZAsia/Shanghai volumes: - /volume1/docker/homeassistant/config:/config - /volume1/docker/homeassistant/media:/media这里解释几个关键点。image: homeassistant/home-assistant:latest是HA官方的Docker镜像latest标签对应最新的稳定版。如果你对版本有执念可以去Docker Hub看具体版本号但我个人建议普通用户始终用latest因为HA的更新迭代很快长期停在旧版本反而容易积攒兼容性问题。network_mode: host决定了容器直接使用NAS主机的网络原因上一节说过了。TZAsia/Shanghai是把容器的时区设成北京时间少了这一行HA前端显示的时间和日志时间会差8小时这是新手最容易踩的坑。restart: unless-stopped表示容器异常退出时自动重启群晖重启后也会自动拉起HA这个设置非常省心。第四步点击“下一步”完成创建。Container Manager会自动从Docker Hub拉取镜像然后启动容器。第一次拉镜像可能要等几分钟取决于你的网络环境。如果在国内拉取Docker Hub的镜像可能比较慢你可以给Container Manager配置可用的镜像源加速。群晖的Container Manager在“设置 → 注册表”可以配置镜像源把官方源替换成你本地的加速地址就行这一步可以大幅缩短拉取时间。注意不要使用任何需要额外软件或违规方式才能访问的源配置国内公共镜像源即可。3.2 首次启动从日志确认状态到创建管理员账户容器创建完成后打开Container Manager的“容器”选项卡看到homeassistant这个容器在运行状态。先别急着打开页面点一下容器详情切到“日志”标签等日志输出稳定。HA首次启动要初始化数据库、加载内置组件这个过程在第一分钟日志会刷得很快看到类似Starting Home Assistant、Home Assistant initialized in X seconds这样的日志后说明启动完成了。然后浏览器访问http://你的群晖IP:8123如果页面能打开会进入初始配置向导会让你创建管理员账户、设置家庭名称和位置。位置信息填你的城市即可HA会用它算日出日落时间联动光照自动化会用到。全程按向导走不到两分钟就能进入HA的主界面。进入主界面后我建议你按顺序做三件事打开“设置 → 系统 → 关于”确认HA版本号正常不是beta版。打开“设置 → 设备与服务”看自动发现的设备列表。HA会自动扫描局域网很多时候小米设备、HomeKit设备、或者支持mDNS协议的其他设备会在这里直接出现。如果一片空白别着急后面接入设备的部分会讲怎么处理。给NAS拍个快照或者在File Station里复制一份homeassistant/config目录作为初始备份。这时候的config目录是干净状态万一后面改配置改崩了可以直接回滚到这个干净版本。3.3 HA配置文件的逻辑configuration.yaml和自动发现HA和很多开源软件一样核心配置都集中在一个叫configuration.yaml的文件里。当你完成了初始化打开/volume1/docker/homeassistant/config/configuration.yaml会看到一份默认配置。这里要理解一个概念HA的绝大多数功能优先级是这样的——前端操作UI优先于配置文件。也就是说你通过主界面添加的集成、自动化、仪表盘都会自动写入配置器管理的存储文件里不需要你去手动编辑configuration.yaml。配置文件主要用来声明一些底层选项比如加载哪些默认组件、自定义实体名称、设置数据存储路径等。所以我的建议是新手尽量不要手动去编辑configuration.yaml除非你知道自己在做什么。HA的设计已经在往“全UI管理”方向走很多功能都能在界面上完成。等你有一定经验了再开始用yaml定义复杂自动化也不迟。如果你确实需要在配置文件里加内容记住YAML的缩进规则极其严格一个多余的空格就可能让HA启动失败。我见过太多人因为缩进问题被卡死每次改完配置我都会先在“开发者工具 → YAML”里做一次配置检查养成这个习惯能省掉80%的启动报错。4. 智能设备接入的路径与实操4.1 HA到底能接哪些设备先从协议层面理解很多新手以为HA“什么设备都能接”这是误解。HA是基于集成Integration体系运作的每种集成对应一种设备接入协议或一个云平台。从底层协议来说HA支持这些主流接入方式云集成通过厂商云API接入比如小米、涂鸦、HomeKit Controller其实走的是本地。局域网协议MQTT、ESPHome、Modbus、KNX、Zigbee需要USB协调器、Z-Wave。红外遥控通过Broadlink等红外网关把传统家电纳入控制。在接入具体设备之前你先想清楚一个问题这个设备在断电断网的时候你还需要控制它吗如果答案是“需要”那你要优先选本地协议接入的设备Zigbee、MQTT、ESPHome如果只是图个方便云集成也没问题。4.2 最核心的一步把MQTT消息服务器跑起来HA的生态里MQTT是一个绕不开的东西。你可以把它理解成一个“局域网内的共享消息总站”——所有支持MQTT的设备把状态发到一个主题上HA订阅这些主题就能获取状态HA要控制设备时就往另一个主题发指令设备端收到后执行动作。假如你买了Sonoff的Wi-Fi开关、DIY了一个ESP32传感器或者用我之前文章里讲过的ESPHome固件刷设备这些设备基本都是通过MQTT接入HA的。所以先把MQTT服务器准备好后面接入设备会顺畅很多。在群晖上跑MQTT服务器常见选择是Eclipse Mosquitto和EMQX。我个人的建议是——如果你只给HA用装一个轻量的Mosquitto就足够了如果你后续设备量很大、对性能有要求再考虑EMQX。创建方式跟HA差不多还是在Container Manager里新增项目Compose内容如下services: mqtt: container_name: mqtt image: eclipse-mosquitto:2 restart: unless-stopped ports: - 1883:1883 - 9001:9001 volumes: - /volume1/docker/mosquitto/config:/mosquitto/config - /volume1/docker/mosquitto/data:/mosquitto/data - /volume1/docker/mosquitto/log:/mosquitto/log注意Mosquitto 2.x 版本默认配置比较严格你必须自己在/mosquitto/config目录下放一个mosquitto.conf否则容器会一直重启。配置文件最小内容如下listener 1883 allow_anonymous trueallow_anonymous true表示允许局域网内匿名连接这个设置在家庭内网可以用如果你要让MQTT端口暴露到公网就务必改成用户名密码认证并且不要用默认端口。我自己的环境里是设了用户名密码的具体配置方式不复杂但在你还没有公网需求前匿名模式足够用。MQTT服务器跑起来后再到HA的“设置 → 设备与服务 → 添加集成”里搜索MQTT填入NAS的IP和端口1883如果设置了密码就填账号密码。HA连接成功后你在MQTT设备端配置好broker地址设备状态就能自动推送进HA了。4.3 云平台接入小米设备怎么弄说到云平台接入国内最常见的自然是小米生态。小米设备分两种一种是支持本地局域网控制的比如部分摄像头、智能音箱通过DLNA、Yeelight灯另一种是必须走云端API的比如相当一部分米家传感器和插排。对于米家设备插件生态里最常用的是HACS里的Xiaomi Miot Auto集成。它通过小米的开放接口把你在米家App里的设备异步接入到HA。安装HACS本身需要一点网络操作因为HACS的默认下载地址在国内访问不太稳定这里我不展开讲网络部分直接用国内可访问的流程说明在HA里添加集成时可以搜到HACS或者手动把HACS相关文件放到/custom_components目录。如果你下载HACS的文件遇到困难可以找本地社区分享的离线包导入到custom_components目录也能正常工作。装好HACS后在HACS商店里搜索Xiaomi Miot Auto安装并重启HA然后在“设备与服务”里添加Xiaomi Miot Auto登录小米账号它会自动拉取你账号下的设备列表。之后你就可以把米家设备绑定到HA里设置区域、实体名称开始做自动化了。这里有一个我自己踩过的坑如果米家账号开启了双重验证Xiaomi Miot Auto可能频繁掉线因为Token会过期。这种时候可以尝试在小米App里关闭该设备的“局域网控制权限保护”或者选择走本地模式接入——部分设备可以通过MiIO协议直接局域网控制完全不走云端。Xiaomi Miot Auto配置时有“连接模式”选项优先选“局域网/云模式”能局域网控制的就让它走局域网只有局域网控制不了的才让它走云端。4.4 本地协议接入ESPHome和自制传感器如果你喜欢折腾或者想接入一些市面上买不到的特殊设备比如土壤湿度传感器、门窗磁、自定义按键ESPHome几乎是首选方案。ESPHome是一个能把ESP32/ESP8266开发板变成HA智能设备的固件框架。你在电脑上写好一个yaml配置文件编译后烧录到开发板上开发板就会自动连接到你的Wi-Fi然后自动注册到HA里整个过程不用写一行C代码。最基础的ESPHome配置大概是这样的esphome: name: living_room_sensor platform: ESP32 board: nodemcu-32s wifi: ssid: 你的Wi-Fi名 password: 你的Wi-Fi密码 api: encryption: key: 这里填自动生成的密钥 sensor: - platform: dht pin: GPIO4 temperature: name: 客厅温度 humidity: name: 客厅湿度 update_interval: 60s把这段配置保存成yaml文件用ESPHome编译并烧录到开发板上电后它就会出现在HA的设备列表里。整个过程最复杂的地方是安装ESPHome的编译环境但如果你在NAS上用Docker跑一个esphome容器这个问题也能解决。ESPhome官方提供了ghcr.io/esphome/esphome镜像在群晖上创建一个容器映射一个配置目录就能在网页里编译固件了。我自己做了好几个ESPHome设备温度传感器、门窗传感器、甚至一个用红外发射管做的电视遥控全部跑在HA里响应速度比云平台快得多断网也不会失联。4.5 把设备分组、命名、做自动化设备接入完成后HA主界面的“概览”会自动生成一张卡片。但默认的卡片一般比较乱我建议你花点时间做两件事。第一在“设置 → 区域”里把设备分配到相应区域客厅、卧室、厨房这样做自动化时选择实体会很方便。第二给实体起一个可读的名字。比如默认的实体ID可能是sensor.living_room_sensor_temperature你可以在实体的设置里修改“名称”为“客厅温度”显示更友好后续在自动化里引用也更清晰。接下来就可以创建自动化了。HA的自动化都在“设置 → 自动化”里管理全图形化操作不用写代码。一个最简单的自动化是当“客厅温度”超过30度时打开风扇开关。触发器: 客厅温度高于30度 条件: 无 动作: 打开风扇开关这样的自动化可以写很多条HA还支持“场景模式”比如一键把全家灯光调到暖色、播放音乐、空调调到26度。这些全靠图形化配置就能完成难度不高关键是思路要清晰。5. 常见问题与排查技巧实录5.1 容器一直重启或者是Running但页面打不开容器状态显示Running但浏览器访问8123一直转圈这种情况十有八九是配置文件出问题了。最常见的原因是你手动编辑过configuration.yaml出现了语法错误或缩进错误。排查方法打开Container Manager点进homeassistant容器的日志看到最后几行如果有类似Invalid config for [homeassistant]或者Error loading configuration的字样那就是配置问题。解决办法有两条路一是直接修改配置文件用“开发者工具 → YAML”做配置检查二是如果改不回来就把之前备份的干净config目录覆盖回去恢复初始状态。另外一个隐藏原因你可能同时创建了多个HA容器抢占同一个端口。到容器列表确认一下有没有残留的旧容器把旧的删掉。5.2 设备发现不了搜索不到集成里的设备这个问题的头号元凶就是网络模式选错了。如果你创建容器时选了Bridge模式HA很难发现局域网里的设备。解决办法修改容器的网络模式为Host重建容器。还有一个常见原因是NAS的防火墙拦了多播广播包。到群晖的“控制面板 → 安全性 → 防火墙”里确认没有拒绝来自局域网网段的流量。如果你开过防火墙且规则很严格建议放行内网段的全部流量或者在规则里允许8123端口和HA需要使用的端口。如果你的设备品牌有自己的App先确认该设备在App里已经正常联网了。HA是基于设备发现协议扫描网络的设备本身没连上Wi-Fi那HA再怎么扫也扫不出来。5.3 升级HA后配置丢失或者集成损坏HA的升级频率很高通常一个月好几个小版本。每次升级前我都强烈建议先在NAS上做一次备份至少复制config目录。升级过程本身很简单在Container Manager里拉取最新镜像停止容器编辑项目并重新应用容器会用新镜像重建。如果升级后发现某个集成失效最常见的原因是第三方集成的兼容性还没跟上官方版本。这时候的应急办法是回滚到上一个镜像版本。在Container Manager的“映像”里找到旧版本的tag比如homeassistant/home-assistant:2025.1编辑Compose把镜像tag改成旧版本号重新部署即可。所以每次升级前记录一下当前版本号很关键方便回滚。5.4 MQTT连不上、设备状态不更新如果你配置了MQTT但HA里看不到设备状态先按这个顺序排查第一用MQTT客户端工具比如MQTT Explorer连一下broker看能不能连通NAS的1883端口。如果连不通检查Mosquitto容器的日志看是不是配置有问题。第二确认为MQTT设置的账号密码在HA的MQTT集成里填对了。很多MQTT服务器配置了匿名拒绝但你HA那边填了空密码自然会失败。第三如果MQTT能连通但设备状态没出现在HA里多半是主题Topic不匹配。设备发布的状态主题和HA订阅的主题要一致。检查设备端配置里的publish topic和HA集成里对应的topic两边对齐就行。5.5 常见问题速查表现象可能原因解决办法HA页面打不开容器没启动或端口被占用检查容器日志和端口重建容器设备自动发现不到网络模式用了Bridge或防火墙拦截改成Host模式放行内网流量时间显示差8小时容器时区TZ环境变量缺失在Compose里加TZAsia/Shanghai升级后插件失效第三方集成兼容性问题回滚镜像版本或等插件适配更新容器反复重启配置文件错误或目录权限问题检查YAML格式检查NAS目录权限设备在HA里没反应设备离线或云Token过期检查设备App在线状态重新授权云端接入6. 结尾一点实际体会和后续玩法装了这么多年HA我最深刻的一个体会是别过度追求“全自动”先把手动控制做好。很多新手一上来就想把家里所有设备都加上自动化结果每天被误触发搞得心烦意乱。我建议的顺序是先确保所有常用设备都能在HA里手动控制然后把卧室起床、客厅观影这种最刚需的场景自动化跑起来最后才是那些锦上添花的联动。稳扎稳打才能让智能家居真正省心。另外一个小技巧HA的自动化运行日志一定要常看。在“开发者工具 → 日志”里你能看到每条自动化的事件触发记录包括为什么没触发、条件哪里不满足。排查自动化失灵的时候这个页面比任何文档都有用。最后等这整套跑顺以后你可以再玩的方向也很多给HA加一个语音助手本地语音唤醒控制设备、把NAS里的媒体文件接入HA做家庭影音联动、或者用HA的仪表盘DIY一个全屋状态面板。每一样都够折腾一阵子但都能让这套系统变得更好用。慢慢玩这套系统会陪你很久。
返回列表