树莓派智能家居第13版:HomeAssistant+NodeRED+nginx全栈部署实战
发布时间:2026/9/20 14:30:56 作者:尧图编辑部 阅读量:1,286

1. 这套系统到底在折腾什么树莓派智能家居系统做到第13版这个数字本身就说明了很多问题。第一版可能只是拿个继电器模块点个灯第三版开始琢磨手机控制第五版被HomeAssistant的配置文件折磨得死去活来第八版终于把NodeRED的自动化流程跑通到了第十版左右开始认真考虑稳定性、安全性和远程访问的问题。如果你正在看这篇文章大概率你手里已经有一块树莓派4B或者树莓派5可能已经装好了系统也可能还在纠结到底用哪个方案。不管你是做毕设的学生还是纯粹想让自己家变得稍微聪明一点的折腾党这套系统的核心目标就一个把家里那些各自为政的智能设备用一个统一的平台管起来并且让它们能按照你的逻辑自动运行。我见过太多人一开始就贪大求全恨不得把全屋灯光、窗帘、空调、安防全部接入结果卡在第一步——设备连不上。所以这一版的核心思路很明确先跑通最小闭环再逐步扩展。最小闭环是什么一个树莓派作为中枢跑HomeAssistant做设备管理和UI展示跑NodeRED做自动化逻辑编排再用nginx做反向代理和SSL终结让手机在外面也能安全访问。这套组合拳打下来你得到的是一个不依赖任何云平台、数据完全在自己手里的智能家居系统。适合谁来参考如果你有基本的Linux操作能力能看懂YAML配置文件知道什么是IP地址和端口那就可以直接抄作业。如果你连SSH都没用过建议先花半天时间补一下基础否则后面的坑会让你怀疑人生。这一版相比之前最大的变化是我把整个部署流程重新梳理了一遍把那些容易出错的环节单独拎出来讲清楚。比如nginx的反向代理配置很多人照着网上的教程抄结果HomeAssistant的WebSocket连不上界面一直转圈。再比如NodeRED的能耗统计如果不注意数据持久化重启一次所有历史数据全丢。这些问题我都踩过所以你知道该怎么绕过去。2. 整体架构设计与选型逻辑2.1 为什么是HomeAssistant而不是自己写一个很多人第一反应是我直接用Python写个脚本MQTT收消息然后控制继电器不就行了为什么要搞这么复杂的HomeAssistant这个问题我在第三版的时候也问过自己。当时我用Flask写了一个简单的Web界面用paho-mqtt订阅设备状态看起来挺美好。但很快问题就来了设备类型越来越多每个设备的通信协议不一样有的用MQTT有的用HTTP有的用Zigbee你不可能为每个设备都写一套适配代码。HomeAssistant的价值就在于它已经帮你写好了几千种设备的集成你只需要在配置文件里填几行参数它就能自动发现并管理这些设备。更重要的是它提供了一个统一的实体模型不管底层是什么协议在HomeAssistant里都抽象成light、switch、sensor这些实体你的自动化逻辑只需要针对实体操作不需要关心底层实现。另一个关键因素是UI。HomeAssistant自带的Lovelace界面虽然不算惊艳但足够灵活你可以用卡片把不同房间的设备分组展示手机上也能有不错的操作体验。自己写前端除非你本身就是前端工程师否则投入产出比太低。所以选型逻辑很简单把精力花在自动化和设备接入上而不是重复造轮子。2.2 NodeRED在自动化里的角色定位HomeAssistant自带的自动化功能其实已经很强了为什么还要引入NodeRED这个问题取决于你的自动化复杂度。如果你只是简单的“人体传感器触发开灯”HomeAssistant的自动化编辑器完全够用。但当你需要处理复杂的条件判断、时间窗口、状态机逻辑时YAML配置就会变得非常臃肿且难以维护。NodeRED的可视化流程编辑器在这种情况下优势明显你可以把不同的逻辑分支画成节点连线调试的时候能看到消息在节点之间流动哪个环节出了问题一目了然。我自己的经验是简单的定时任务和单条件触发放在HomeAssistant里复杂的多条件联动、数据处理、通知推送放在NodeRED里。两者通过HomeAssistant的NodeRED集成或者直接调用REST API来通信。这样分工的好处是HomeAssistant保持轻量NodeRED承担重逻辑互不干扰。2.3 nginx反向代理的必要性树莓派上的服务默认都是HTTP明文传输而且端口号五花八门HomeAssistant是8123NodeRED是1880。你在家里用没问题但一旦想在外面访问直接暴露这些端口是非常危险的。nginx在这里扮演三个角色第一统一入口把不同服务的请求转发到对应的后端端口第二SSL终结让所有外部访问都走HTTPS加密第三访问控制可以在nginx层面加一层认证防止未授权访问。有人会问HomeAssistant不是自带SSL配置吗为什么还要套一层nginx原因很简单HomeAssistant的SSL配置只保护它自己NodeRED和其他服务还是裸奔。而且一旦你需要在同一个域名下挂多个服务比如ha.yourdomain.com和nodered.yourdomain.comnginx的虚拟主机功能就是最干净的解决方案。另外nginx处理静态文件和WebSocket连接的性能也比HomeAssistant内置的服务器要好界面加载速度会有明显提升。2.4 硬件选型的现实考量树莓派4B和树莓派5怎么选如果你手里已经有4B完全够用。HomeAssistant和NodeRED对CPU的占用并不高4B的4GB内存版本跑这套系统绰绰有余。但如果你要跑一些额外的服务比如用YOLOv5做摄像头图像识别或者用ROS2做机器人控制那树莓派5的PCIe接口和更强的CPU就很有必要了。存储方面强烈建议用SSD而不是SD卡。SD卡的随机读写性能差而且寿命有限HomeAssistant的数据库频繁写入用不了多久就会把卡写坏。我自己的树莓派4B通过USB3.0接了一个128GB的SSD系统跑了一年多数据库写入量大概在几十GBSSD的健康度依然很好。电源也是容易被忽视的环节。树莓派4B的官方电源是5V 3A如果你外接了SSD、Zigbee协调器、多个传感器建议用5V 4A以上的电源否则会出现莫名其妙的掉线问题。我就遇到过因为供电不足导致Zigbee协调器频繁掉线的情况排查了半天才发现是电源功率不够。3. 核心细节解析与实操要点3.1 系统安装与基础环境配置树莓派系统的选择上我推荐用Raspberry Pi OS Lite版本不带桌面环境。原因很简单这套系统跑起来之后你根本不需要在树莓派上直接操作所有管理都通过SSH和Web界面完成。桌面环境只会白白消耗内存和CPU资源。如果你用的是树莓派5可以装Ubuntu Server 24.04对PCIe设备的支持更好。安装系统的时候记得在烧录工具里提前配置好WiFi和SSH这样开机就能直接连上省去接显示器和键盘的麻烦。系统装好之后第一件事是换源。国内访问官方源的速度不稳定换成清华或者中科大的镜像源会快很多。树莓派OS的源配置文件在/etc/apt/sources.list和/etc/apt/sources.list.d/目录下把raspbian.raspberrypi.org替换成mirrors.tuna.tsinghua.edu.cn/raspbian即可。换完之后执行sudo apt update sudo apt upgrade -y把系统更新到最新。接下来安装Docker和Docker Compose。为什么用Docker而不是直接apt安装因为Docker能把每个服务的依赖隔离开HomeAssistant升级不会影响NodeREDnginx的配置也不会被其他服务干扰。而且Docker Compose可以用一个YAML文件定义所有服务一键启动和停止管理起来非常方便。安装Docker的命令官方文档里有这里不再赘述注意安装完成后把当前用户加入docker组否则每次执行docker命令都要加sudo。3.2 HomeAssistant的容器化部署HomeAssistant的Docker镜像用官方的ghcr.io/home-assistant/home-assistant:stable就行。配置文件目录映射到宿主机的一个路径比如/opt/homeassistant/config。网络模式建议用host模式这样HomeAssistant能直接发现局域网内的设备不需要额外配置端口映射。但host模式下端口就是8123如果和其他服务冲突需要提前规划好。启动之后访问树莓派的IP地址加8123端口就能看到HomeAssistant的初始化界面。第一次启动会花几分钟创建数据库和默认配置耐心等待。初始化完成后第一件事是创建管理员账户然后进入配置目录检查configuration.yaml。默认的配置文件里有一些示例配置建议先备份一份然后根据自己的需求修改。这里有一个关键点HomeAssistant的配置文件修改后需要重启才能生效但重启过程中所有自动化都会暂停。所以建议在修改配置之前先规划好尽量一次性改完。另外YAML对缩进非常敏感用空格不用Tab缩进层级要一致。我见过太多人因为缩进问题导致配置加载失败排查起来非常痛苦。建议用VS Code的YAML插件来编辑它会自动检查语法错误。3.3 NodeRED的安装与HomeAssistant集成NodeRED的Docker镜像用nodered/node-red:latest。端口映射1880:1880数据目录映射到/opt/nodered/data。启动之后访问树莓派的IP加1880端口就能看到NodeRED的流程编辑器。要让NodeRED和HomeAssistant通信需要安装node-red-contrib-home-assistant-websocket这个节点包。安装方法是在NodeRED的菜单里选择“管理调色板”搜索这个包名然后安装。安装完成后在NodeRED里添加一个HomeAssistant的服务器配置填入HomeAssistant的地址和长期访问令牌。长期访问令牌在HomeAssistant的用户 profile 页面底部可以创建创建后复制保存好NodeRED里需要用到。集成好之后你可以在NodeRED里直接读取HomeAssistant的实体状态也可以调用服务来控制设备。比如你想在NodeRED里获取客厅温度传感器的数值只需要拖一个“events: state”节点配置实体ID为sensor.living_room_temperature就能实时收到温度变化的消息。控制设备的话用“api: call service”节点选择对应的服务和实体即可。3.4 nginx反向代理与SSL配置nginx的Docker镜像用官方的nginx:stable-alpine体积小性能好。配置文件目录映射到/opt/nginx/conf.dSSL证书目录映射到/opt/nginx/certs。SSL证书可以用Lets Encrypt免费申请也可以用自签名证书。如果只是自己用自签名证书完全够用浏览器会提示不安全但加密效果是一样的。nginx配置的核心是反向代理和WebSocket支持。HomeAssistant的界面依赖WebSocket来实时推送状态更新如果nginx配置里没有正确处理WebSocket的升级请求界面会一直显示“正在连接”或者频繁断线。正确的配置是在location块里加上proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection upgrade这两行。另外proxy_read_timeout要设置得长一些比如3600秒否则长时间没有数据传输连接会被断开。下面是一个完整的nginx配置示例同时代理HomeAssistant和NodeREDserver { listen 443 ssl; server_name ha.yourdomain.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { proxy_pass http://127.0.0.1:8123; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } } server { listen 443 ssl; server_name nodered.yourdomain.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { proxy_pass http://127.0.0.1:1880; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; proxy_send_timeout 3600s; } }配置完成后执行nginx -t检查语法然后nginx -s reload重载配置。如果一切正常你就可以通过https://ha.yourdomain.com访问HomeAssistant了。注意自签名证书在浏览器里会显示安全警告需要在浏览器里手动信任。如果不想看到警告可以用Lets Encrypt申请正式证书但需要你有公网域名并且能完成DNS验证。3.5 能耗统计的实现思路NodeRED的能耗统计是这一版新增的功能。实现思路很简单通过智能插座或者电流传感器采集设备的功率数据然后在NodeRED里做积分计算得到累计用电量。具体来说你需要一个能上报功率的智能插座比如基于ESP8266的Sonoff POW或者涂鸦的计量插座。这些设备通过MQTT或者HomeAssistant集成接入后会暴露一个功率传感器实体单位是瓦特。在NodeRED里用“events: state”节点订阅这个功率传感器每当功率值变化时把功率值和时间戳一起存入数据库。数据库可以用InfluxDB也可以用SQLite。InfluxDB更适合时间序列数据查询和聚合都很方便。存入之后用Grafana做可视化展示就能看到每天的用电曲线和累计用电量。积分计算的逻辑是假设采样间隔是10秒当前功率是P瓦特那么这10秒内的用电量就是P乘以10除以3600单位是瓦时。把每个采样周期的用电量累加起来就是总用电量。NodeRED里可以用function节点实现这个计算把累计值存到一个全局变量或者写入数据库。提示采样间隔不要太短否则数据库写入压力大。10到30秒的间隔对于家庭能耗统计来说完全够用。另外功率传感器的精度有限累计误差会随着时间增大建议定期用实际电表读数校准。4. 实操过程与核心环节实现4.1 从零开始搭建的完整步骤假设你手里有一块全新的树莓派4B或者树莓派5一张32GB以上的SD卡或者SSD以及一个稳定的电源。下面是完整的搭建流程。第一步烧录系统。用Raspberry Pi Imager选择Raspberry Pi OS Lite 64位版本在高级设置里配置WiFi、SSH、用户名和密码。烧录完成后插入树莓派上电启动。等待两分钟用SSH连接树莓派的IP地址。第二步系统初始化。执行sudo raspi-config在Interface Options里启用SSH和I2C如果你要用I2C传感器。在Advanced Options里扩展文件系统确保所有存储空间都被使用。然后换源、更新系统、安装Docker和Docker Compose。第三步创建目录结构。在/opt目录下创建homeassistant、nodered、nginx、mosquitto四个目录分别用于存放各服务的配置和数据。mosquitto是MQTT broker如果你有MQTT设备的话需要它。第四步编写docker-compose.yml。这个文件定义了所有服务的镜像、端口、卷映射和依赖关系。下面是一个完整的示例version: 3 services: homeassistant: container_name: homeassistant image: ghcr.io/home-assistant/home-assistant:stable network_mode: host volumes: - /opt/homeassistant/config:/config - /etc/localtime:/etc/localtime:ro restart: unless-stopped nodered: container_name: nodered image: nodered/node-red:latest ports: - 1880:1880 volumes: - /opt/nodered/data:/data restart: unless-stopped nginx: container_name: nginx image: nginx:stable-alpine ports: - 443:443 - 80:80 volumes: - /opt/nginx/conf.d:/etc/nginx/conf.d - /opt/nginx/certs:/etc/nginx/certs restart: unless-stopped mosquitto: container_name: mosquitto image: eclipse-mosquitto:latest ports: - 1883:1883 volumes: - /opt/mosquitto/config:/mosquitto/config - /opt/mosquitto/data:/mosquitto/data restart: unless-stopped第五步启动服务。在docker-compose.yml所在目录执行docker-compose up -dDocker会自动拉取镜像并启动所有容器。第一次启动HomeAssistant会花几分钟初始化耐心等待。第六步配置HomeAssistant。访问http://树莓派IP:8123创建管理员账户然后在配置目录里编辑configuration.yaml添加你需要集成的设备。每修改一次配置执行docker restart homeassistant重启服务。第七步配置NodeRED。访问http://树莓派IP:1880安装HomeAssistant集成节点配置服务器连接。然后根据你的需求创建自动化流程。第八步配置nginx。把SSL证书放到/opt/nginx/certs目录把nginx配置文件放到/opt/nginx/conf.d目录然后docker restart nginx重载配置。4.2 设备接入的实操细节设备接入是智能家居系统里最耗时的环节因为不同品牌的设备接入方式差异很大。我按照通信协议把常见设备分成三类WiFi设备、Zigbee设备和蓝牙设备。WiFi设备通常支持MQTT或者有HomeAssistant官方集成。比如涂鸦的WiFi插座可以通过LocalTuya集成接入不需要依赖云平台。接入的时候需要获取设备的本地密钥这个密钥可以通过涂鸦的开发者平台获取或者用tinytuya这个Python库扫描局域网获取。获取到密钥后在HomeAssistant的configuration.yaml里添加LocalTuya集成填入设备IP、设备ID和本地密钥即可。Zigbee设备需要一个Zigbee协调器比如CC2652P或者ConBee II。协调器通过USB接入树莓派然后在HomeAssistant里添加ZHA集成或者Zigbee2MQTT。ZHA是HomeAssistant内置的配置简单但支持的设备种类相对少一些。Zigbee2MQTT是独立的服务通过MQTT和HomeAssistant通信支持的设备更多但配置稍微复杂。我自己的选择是Zigbee2MQTT因为它的设备数据库更新更快新设备支持更好。蓝牙设备接入比较麻烦因为树莓派自带的蓝牙模块信号范围有限而且HomeAssistant的蓝牙集成需要额外的适配器。如果你有蓝牙温湿度计建议用ESP32做一个蓝牙网关通过MQTT把数据转发给HomeAssistant。这样比直接用树莓派的蓝牙更稳定覆盖范围也更广。4.3 自动化流程的设计与实现自动化流程的设计原则是简单逻辑用HomeAssistant复杂逻辑用NodeRED。下面举几个实际例子。第一个例子人体传感器触发开灯。这个逻辑很简单在HomeAssistant的自动化编辑器里创建一个自动化触发器选择人体传感器的状态变为on动作选择打开对应的灯光。但这里有一个细节如果天还亮着就不应该开灯。所以需要加一个条件判断当前的光照传感器数值是否低于某个阈值。这个条件在HomeAssistant里用模板条件实现或者在NodeRED里用一个switch节点判断。第二个例子离家模式。当所有家庭成员都离开家后自动关闭所有灯光和空调开启安防模式。这个逻辑涉及多个设备的状态判断用NodeRED实现更清晰。在NodeRED里用“events: state”节点订阅每个人的手机是否在家通过HomeAssistant的device_tracker实体然后用一个“join”节点等待所有状态更新再用一个“function”节点判断是否所有人都离开了。如果是就调用HomeAssistant的服务关闭灯光和空调。第三个例子能耗统计与通知。当某个设备的累计用电量超过阈值时发送通知提醒。这个逻辑在NodeRED里实现用“events: state”节点订阅功率传感器用“function”节点做积分计算把累计值存入InfluxDB同时判断是否超过阈值。如果超过用“api: call service”节点调用HomeAssistant的通知服务发送到手机。实操心得NodeRED的流程调试很重要。在关键节点后面接一个debug节点把消息内容输出到调试窗口这样能看到数据在流程中的变化。另外NodeRED的流程要定期导出备份否则容器重建后流程会丢失。4.4 远程访问的安全加固远程访问的安全性是很多人忽视的问题。直接暴露HomeAssistant的端口到公网是非常危险的因为HomeAssistant的认证机制虽然不弱但一旦有漏洞你的整个家居系统都会被控制。所以必须通过nginx做反向代理并且在nginx层面加一层额外的认证。最简单的方式是用nginx的auth_basic模块配置一个用户名和密码。这样即使有人知道了你的域名没有密码也无法访问。配置方法是在nginx的location块里加上auth_basic Restricted和auth_basic_user_file /etc/nginx/.htpasswd。.htpasswd文件用htpasswd命令生成或者用在线工具生成。更安全的方式是用客户端证书认证但配置起来比较复杂适合对安全性要求极高的场景。对于大多数家庭用户来说auth_basic加上强密码已经足够了。另外建议在路由器上设置端口转发时只转发443端口不要转发8123和1880端口这样外部只能通过nginx访问无法直接访问后端服务。注意如果你没有公网IP无法从外部直接访问可以考虑用内网穿透工具。但这类工具的安全性和稳定性参差不齐选择的时候要谨慎。我自己的做法是不做远程访问所有自动化都在本地运行需要查看状态的时候连上家里的WiFi即可。这样最安全也最省心。5. 常见问题与排查技巧实录5.1 HomeAssistant启动失败排查HomeAssistant启动失败最常见的原因是配置文件语法错误。YAML对缩进和格式要求严格一个多余的空格或者一个Tab都可能导致解析失败。排查方法是查看容器日志执行docker logs homeassistant日志里会显示具体的错误行号和错误原因。根据提示修改配置文件然后重启容器。另一个常见原因是端口冲突。如果树莓派上已经有其他服务占用了8123端口HomeAssistant会启动失败。用netstat -tlnp | grep 8123查看端口占用情况如果有冲突修改HomeAssistant的端口或者停止冲突的服务。还有一种情况是数据库损坏。HomeAssistant使用SQLite数据库存储历史数据如果SD卡或者SSD出现坏块数据库可能损坏。症状是HomeAssistant启动后界面空白或者频繁重启。解决方法是删除配置目录下的home-assistant_v2.db文件重启后会重新创建数据库。历史数据会丢失但系统能恢复正常。5.2 NodeRED连接HomeAssistant失败NodeRED连接HomeAssistant失败通常是因为长期访问令牌无效或者地址配置错误。首先检查HomeAssistant里创建的长期访问令牌是否复制完整令牌是一长串字符容易漏掉或者多复制空格。其次检查NodeRED里配置的HomeAssistant地址是否正确如果NodeRED和HomeAssistant在同一台树莓派上地址应该是http://127.0.0.1:8123而不是树莓派的局域网IP。如果令牌和地址都没问题但还是连不上可能是HomeAssistant的API没有启用。检查configuration.yaml里是否有api:这一行如果没有添加后重启HomeAssistant。另外HomeAssistant的默认配置里可能限制了API的访问来源检查http:配置块里是否有ip_ban或者trusted_networks的设置。5.3 nginx反向代理后WebSocket断连这是最常见的问题之一。症状是HomeAssistant界面能打开但状态不更新或者提示“连接已断开”。原因是nginx没有正确处理WebSocket的升级请求。解决方法是在nginx配置里加上proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection upgrade这两行。另外proxy_read_timeout要设置得足够长建议3600秒以上。还有一个可能的原因是HomeAssistant的配置里没有信任nginx的代理头。在configuration.yaml的http:配置块里加上use_x_forwarded_for: true和trusted_proxies: - 127.0.0.1。这样HomeAssistant才能正确识别客户端的真实IPWebSocket连接也能正常建立。5.4 设备频繁掉线的排查思路设备频繁掉线的原因很多按照可能性从高到低排列供电不足、信号干扰、协议兼容性问题、设备固件bug。供电不足是最常见的原因。树莓派的USB口输出电流有限如果同时接了多个USB设备比如Zigbee协调器、SSD、蓝牙适配器可能会出现供电不足。解决方法是换用带独立供电的USB Hub或者换用功率更大的电源。信号干扰主要影响Zigbee和WiFi设备。Zigbee使用的是2.4GHz频段和WiFi重叠如果路由器离Zigbee协调器太近可能会互相干扰。解决方法是在路由器里把WiFi的2.4GHz频段固定到1、6、11这三个信道之一Zigbee协调器则选择不同的信道比如15或20。另外USB3.0设备也会产生2.4GHz频段的干扰如果Zigbee协调器插在USB3.0口旁边建议用延长线把协调器远离树莓派。协议兼容性问题通常出现在新设备上。有些设备虽然声称支持Zigbee但实现不规范导致无法接入或者频繁掉线。解决方法是查看Zigbee2MQTT的设备支持列表确认设备是否被支持。如果不支持可以尝试更新Zigbee2MQTT到最新版本或者换用其他品牌的设备。5.5 常见问题速查表问题现象可能原因排查方法解决方案HomeAssistant界面打不开容器未启动或端口冲突docker ps查看容器状态netstat查看端口重启容器或修改端口界面能打开但状态不更新WebSocket连接失败浏览器开发者工具查看WebSocket连接检查nginx的Upgrade头配置NodeRED无法连接HomeAssistant令牌无效或地址错误检查令牌和地址配置重新创建令牌确认地址为127.0.0.1设备频繁掉线供电不足或信号干扰检查电源功率查看Zigbee信道换大功率电源调整信道数据库写入失败存储空间不足或坏块df -h查看磁盘空间dmesg查看IO错误清理空间或更换存储SSL证书无效证书过期或域名不匹配浏览器查看证书详情重新申请证书或更新域名独家避坑技巧每次修改配置文件之前先备份一份。HomeAssistant的配置目录里有一个.storage文件夹里面存储了UI上做的所有配置比如自动化、场景、仪表盘。这个文件夹也要定期备份。我自己的做法是用Git管理配置目录每次修改后提交一次这样出问题了可以随时回滚。6. 系统优化与长期维护6.1 性能优化的几个关键点树莓派的性能有限跑多个服务的时候需要做一些优化。首先是HomeAssistant的数据库默认的SQLite在数据量大的时候查询会变慢。可以在configuration.yaml的recorder配置块里设置purge_keep_days: 7只保留最近7天的历史数据。如果不需要历史数据可以直接禁用recorder这样能省不少资源。其次是NodeRED的流程优化。避免在流程里使用过多的function节点因为每个function节点都会执行JavaScript代码消耗CPU。能用switch节点和change节点解决的问题就不要用function节点。另外debug节点在调试完成后要及时删除或者禁用否则会一直输出日志占用IO资源。nginx的优化主要是开启gzip压缩和缓存。在nginx配置里加上gzip on和gzip_types text/plain text/css application/json application/javascript能显著减少传输数据量。对于静态文件可以设置expires头让浏览器缓存。6.2 数据备份与恢复策略数据备份是长期维护里最重要的一环。需要备份的数据包括HomeAssistant的配置目录、NodeRED的流程数据、nginx的配置文件、SSL证书、mosquitto的配置和数据。备份策略可以是每天自动打包压缩然后同步到另一台设备或者云存储。我自己的做法是用一个简单的shell脚本每天凌晨3点执行把/opt目录下的所有配置打包成tar.gz文件然后用rclone同步到云盘。脚本内容如下#!/bin/bash DATE$(date %Y%m%d) tar -czf /backup/smart-home-$DATE.tar.gz /opt/homeassistant/config /opt/nodered/data /opt/nginx/conf.d /opt/nginx/certs /opt/mosquitto/config rclone sync /backup/smart-home-$DATE.tar.gz remote:backup/smart-home/ find /backup -name smart-home-*.tar.gz -mtime 30 -delete这个脚本会保留最近30天的备份超过30天的自动删除。恢复的时候只需要把对应的tar.gz文件解压到/opt目录然后重启所有容器即可。6.3 系统升级的注意事项HomeAssistant和NodeRED的版本更新比较频繁升级之前一定要看release notes确认有没有破坏性变更。升级HomeAssistant的方法是拉取最新镜像然后重启容器docker-compose pull homeassistant docker-compose up -d homeassistant。升级之前建议先备份配置目录万一新版本有问题可以快速回滚。NodeRED的升级类似但要注意节点包的兼容性。有些第三方节点包可能不支持新版本的NodeRED升级后会导致流程报错。所以升级NodeRED之前先检查一下已安装的节点包是否有更新版本如果有先更新节点包再升级NodeRED。树莓派系统的升级要谨慎尤其是大版本升级比如从Debian 11升级到Debian 12。大版本升级可能会改变系统库的版本导致Docker容器无法启动。建议的做法是备份数据后重新烧录系统而不是原地升级。6.4 扩展方向的个人建议这套系统跑通之后你可以根据自己的需求逐步扩展。如果你对语音控制感兴趣可以接入HomeAssistant的语音助手用ESP32做一个简单的语音终端通过MQTT发送语音识别结果。如果你对安防感兴趣可以接入摄像头用树莓派的OV5647摄像头模块做移动侦测检测到异常时自动录像并发送通知。如果你对能耗管理感兴趣可以接入更多的计量插座用Grafana做一个能耗看板分析家里各个电器的用电情况。我自己的扩展方向是往边缘计算走在树莓派5上部署一个轻量级的YOLOv5模型用摄像头做实时物体检测。比如检测到有人出现在门口时自动打开门廊灯并发送通知。这个方案对树莓派5的NPU或者GPU有要求树莓派4B跑起来会比较吃力。如果你用的是树莓派5可以尝试用ONNX Runtime或者TensorRT来加速推理。最后再分享一个小技巧如果你在调试自动化流程的时候不想每次都实际触发设备可以在NodeRED里用一个inject节点手动触发流程把消息注入到流程的中间节点这样能快速验证逻辑是否正确。另外HomeAssistant的开发者工具里有一个“模板”页面可以实时测试模板语句的输出结果对于调试复杂的条件判断非常有用。