树莓派智能家居实战:HomeAssistant+NodeRED+nginx本地部署指南
2026/9/20 3:37:59 网站建设 项目流程

1. 这套系统到底在解决什么问题

树莓派做智能家居,网上能搜到的方案没有一千也有八百,但大部分都停留在“点个灯、读个温度”的玩具阶段。我这套系统迭代到第13版,前后跑了三年多,从最早的单个传感器脚本,到现在家里灯光、窗帘、空调、新风、安防、能耗监测全部接入,中间踩过的坑足够写一本小册子。这篇文章不讲虚的,就把整套系统的设计思路、核心组件选型、实操部署过程、以及那些只有真正跑过半年以上才会暴露出来的问题,一次性讲透。

核心组件就四个:树莓派做本地中枢,HomeAssistant做设备接入和自动化引擎,NodeRED做复杂逻辑编排和可视化流程,nginx做反向代理和外部访问入口。这四个东西各司其职,缺一不可。很多人一开始只装HomeAssistant,用着用着发现自动化写起来太死板,又加NodeRED;再往后发现手机App访问慢、证书配不好、多个服务端口记不住,才想到nginx。我建议你从一开始就把这四个的架构想清楚,不然后期迁移成本很高。

这套方案适合谁?如果你手头有一块树莓派4B或5,家里有若干WiFi或Zigbee设备,想让它们真正联动起来而不是各玩各的,同时你又不想把数据传到云端、不想被厂商绑定,那这套本地优先的方案就是为你准备的。不需要你精通Linux,但至少要能照着教程敲命令、看得懂YAML缩进。下面我从架构设计开始,一步步拆开讲。

2. 整体架构设计与选型逻辑

2.1 为什么是树莓派而不是工控机或旧手机

树莓派在这套系统里的角色是“永远在线的本地服务器”。它的优势不是性能强,而是功耗低、GPIO可扩展、社区支持好。我实测过树莓派4B(4GB)跑HomeAssistant + NodeRED + nginx + Mosquitto,待机功耗大约3.5W,一个月电费不到两块钱。换成x86小主机,功耗至少15W起步,而且GPIO扩展还得额外买模块。

但树莓派也有硬伤:SD卡寿命短。我前三版系统都死在SD卡上,最长撑了八个月,最短三个月就出现坏块。后来换成USB SSD启动,到现在两年多没出过问题。所以如果你打算长期跑,SSD是必须的,不是可选。树莓派5支持PCIe HAT接M.2硬盘,速度更快,但发热也更大,需要加散热片或风扇。

至于为什么不用旧手机或旧笔记本,核心问题是稳定性。旧设备的电源管理、系统更新、驱动兼容都是隐患,智能家居中枢最怕的就是半夜宕机。树莓派虽然性能一般,但胜在行为可预测,你清楚它什么时候会出什么问题。

2.2 HomeAssistant与NodeRED的分工边界

这是很多人纠结的地方:到底用HomeAssistant的自动化还是NodeRED?我的经验是——设备接入和状态管理交给HomeAssistant,复杂逻辑和跨设备联动交给NodeRED

HomeAssistant的强项是设备集成,它支持两千多种设备类型,Zigbee、Z-Wave、WiFi、蓝牙、MQTT都能接。它的自动化引擎适合简单场景,比如“人体传感器触发开灯”。但一旦涉及多条件判断、延时、循环、变量、HTTP请求,YAML写起来就非常痛苦。

NodeRED的强项是流程编排,拖拖拽拽就能实现“如果A且B且C,则执行D,等待E秒后检查F,否则执行G”。它还内置了function节点,可以直接写JavaScript,灵活性极高。我现在的做法是:HomeAssistant里只保留设备实体和极简自动化(比如按钮直接控制),所有涉及“如果……那么……否则……”的逻辑全部放NodeRED。

两者通过HomeAssistant的WebSocket API或MQTT通信。NodeRED有官方维护的node-red-contrib-home-assistant-websocket节点,安装后可以直接读取和调用HomeAssistant的实体状态和服务。

2.3 nginx在这套系统里到底干什么

很多人觉得nginx是多余的,HomeAssistant自带Web服务器,NodeRED也有自己的端口,为什么还要加一层?原因有三个:

第一,统一入口。HomeAssistant默认端口8123,NodeRED默认1880,Mosquitto默认1883,你记不住这么多端口。nginx可以把它们统一到443端口下,用不同路径区分,比如/走HomeAssistant,/nodered/走NodeRED。

第二,HTTPS和证书管理。HomeAssistant自带的HTTPS配置比较麻烦,而且NodeRED的HTTPS支持更弱。nginx处理SSL证书非常成熟,配置一次,后面所有服务都走HTTPS。

第三,安全隔离。nginx可以做访问控制、限流、IP白名单,把不安全的服务藏在后面。比如Mosquitto的WebSocket端口,绝对不应该直接暴露,通过nginx转发并加认证才安全。

我现在的nginx配置里,HomeAssistant走/,NodeRED走/nodered/,Mosquitto的WebSocket走/mqtt,全部走443端口,证书用Let's Encrypt自动续期。手机App只需要记住一个地址。

2.4 网络拓扑与设备接入方式

我家里的设备接入分三层:

  • Zigbee设备(人体传感器、门窗传感器、温湿度传感器、按钮)通过CC2652P协调器接入,走ZHA集成。Zigbee的优势是低功耗、自组网,传感器一颗纽扣电池能用一年以上。
  • WiFi设备(空调伴侣、智能插座、摄像头)通过局域网直接接入,部分走HomeAssistant官方集成,部分走MQTT。WiFi设备的问题是依赖路由器,路由器重启后部分设备会掉线,需要在NodeRED里做断线重连检测。
  • 红外设备(老空调、电视)通过红外发射模块接入,树莓派GPIO直接控制,或者用ESP8266做红外桥接。

所有设备的状态最终汇聚到HomeAssistant的实体注册表,NodeRED通过WebSocket订阅状态变化,nginx负责外部访问。整个数据流是本地闭环的,断网也能正常运行,只有远程访问才需要外网。

3. 核心组件部署实操

3.1 系统准备与树莓派基础配置

我用的系统是Raspberry Pi OS Lite 64位(无桌面版),树莓派4B 4GB。为什么不装桌面?因为桌面环境会占用大量内存和CPU,而且智能家居中枢不需要图形界面,所有操作通过SSH和Web完成。

烧录系统用Raspberry Pi Imager,在烧录前按Ctrl+Shift+X打开高级设置,直接配置好WiFi、SSH、用户名密码、时区。这一步能省掉后面接显示器和键盘的麻烦。

烧录完成后第一次启动,先做三件事:

# 更新系统 sudo apt update && sudo apt full-upgrade -y # 修改源(如果用国内网络) sudo nano /etc/apt/sources.list # 把deb开头的那行替换成镜像源地址 # 配置SSD启动(如果已接SSD) # 用raspi-config的Advanced Options -> Boot Order -> USB Boot sudo raspi-config

注意:树莓派4B的USB启动需要先更新固件,sudo rpi-update虽然能更新但风险较高,建议用sudo apt full-upgrade更新固件包即可。树莓派5的PCIe启动需要在/boot/firmware/config.txt里加dtparam=pciex1,然后设置启动顺序。

系统装好后,我习惯先装几个基础工具:

sudo apt install -y git curl wget htop nano mosquitto mosquitto-clients

Mosquitto是MQTT broker,后面NodeRED和部分WiFi设备都要用它。装完后先启动并设置开机自启:

sudo systemctl enable mosquitto sudo systemctl start mosquitto

3.2 HomeAssistant的安装与初始配置

HomeAssistant的安装方式有好几种,我推荐用Docker,因为版本管理方便,升级和回滚都简单。但如果你不想碰Docker,也可以用官方的一键脚本。

Docker方式:

# 安装Docker curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 创建配置目录 mkdir -p ~/homeassistant/config # 启动HomeAssistant容器 docker run -d \ --name homeassistant \ --privileged \ --restart=unless-stopped \ -e TZ=Asia/Shanghai \ -v ~/homeassistant/config:/config \ --network=host \ ghcr.io/home-assistant/home-assistant:stable

--network=host很关键,因为HomeAssistant需要发现局域网内的设备,用host网络模式最省事。--privileged是为了让容器能访问USB设备(比如Zigbee协调器)。

启动后访问http://树莓派IP:8123,第一次会引导你创建账号、设置位置、选择单位。这些按实际情况填就行。

初始配置完成后,重点改configuration.yaml。我的配置结构是这样的:

# configuration.yaml homeassistant: name: Home latitude: !secret latitude longitude: !secret longitude elevation: 50 unit_system: metric time_zone: Asia/Shanghai # 拆分配置文件 group: !include groups.yaml automation: !include automations.yaml script: !include scripts.yaml scene: !include scenes.yaml sensor: !include sensors.yaml switch: !include switches.yaml light: !include lights.yaml

提示:!secret引用的敏感信息放在secrets.yaml里,这个文件不要提交到Git。我见过有人把WiFi密码和API密钥直接写在配置里然后传到公开仓库,后果很严重。

Zigbee设备接入用ZHA集成,在“配置 -> 设备与服务 -> 添加集成”里搜索ZHA,选择USB协调器端口(通常是/dev/ttyUSB0/dev/ttyACM0)。如果协调器是CC2652P,建议刷最新的Z-Stack固件,旧固件在设备数量超过30个后容易出现掉线。

3.3 NodeRED的安装与与HomeAssistant打通

NodeRED我同样用Docker部署:

docker run -d \ --name nodered \ --restart=unless-stopped \ -p 1880:1880 \ -e TZ=Asia/Shanghai \ -v ~/nodered/data:/data \ nodered/node-red:latest

启动后访问http://树莓派IP:1880,先装HomeAssistant的WebSocket节点:

docker exec -it nodered npm install node-red-contrib-home-assistant-websocket

装完后重启NodeRED容器,在节点面板里就能看到HomeAssistant相关的节点。配置连接时,Server填http://树莓派IP:8123,Access Token需要在HomeAssistant的“个人资料 -> 长期访问令牌”里生成一个。

这里有个细节:长期访问令牌只显示一次,生成后立刻复制保存。如果丢了只能删掉重新生成。

NodeRED里我常用的节点组合:

  • events: state节点订阅HomeAssistant实体状态变化
  • call service节点调用HomeAssistant服务(比如开灯、关灯)
  • function节点写JavaScript处理复杂逻辑
  • delay节点做延时和节流
  • http request节点调用外部API(比如天气)

一个典型的自动化流程是:人体传感器触发 -> 判断光照是否低于阈值 -> 判断当前是否在夜间模式 -> 开灯 -> 启动5分钟无人移动计时器 -> 超时关灯。这个逻辑在NodeRED里用六七个节点就能画出来,在HomeAssistant的YAML里写至少要五十行。

3.4 nginx反向代理与HTTPS配置

nginx的安装很简单:

sudo apt install -y nginx

关键是配置文件。我在/etc/nginx/sites-available/下建一个smart-home文件:

server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # HomeAssistant 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # NodeRED location /nodered/ { 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # Mosquitto WebSocket location /mqtt { proxy_pass http://127.0.0.1:9001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

注意:HomeAssistant和NodeRED都用了WebSocket,所以UpgradeConnection头必须设置,否则页面会一直转圈加载不出来。这是最常见的nginx配置坑。

证书用Certbot自动申请和续期:

sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com

Certbot会自动修改nginx配置并设置定时续期任务。续期测试用sudo certbot renew --dry-run

Mosquitto的WebSocket需要在配置里启用:

# /etc/mosquitto/conf.d/websocket.conf listener 9001 protocol websockets

改完后重启Mosquitto:sudo systemctl restart mosquitto

3.5 能耗监测与数据持久化

NodeRED里有个node-red-contrib-energy相关的节点,但我更推荐用InfluxDB + Grafana做数据持久化和可视化。HomeAssistant有InfluxDB集成,可以把所有实体状态写入InfluxDB,Grafana负责画图。

InfluxDB和Grafana也用Docker部署:

# InfluxDB docker run -d \ --name influxdb \ --restart=unless-stopped \ -p 8086:8086 \ -v ~/influxdb:/var/lib/influxdb2 \ influxdb:2 # Grafana docker run -d \ --name grafana \ --restart=unless-stopped \ -p 3000:3000 \ -v ~/grafana:/var/lib/grafana \ grafana/grafana

HomeAssistant的configuration.yaml里加:

influxdb: host: 127.0.0.1 port: 8086 database: homeassistant username: homeassistant password: !secret influxdb_password max_retries: 3 default_measurement: state include: entities: - sensor.temperature_living_room - sensor.humidity_living_room - sensor.power_total - sensor.energy_total

这样所有传感器的历史数据都会写入InfluxDB,Grafana里可以画温度曲线、能耗趋势、设备在线率。我现在的能耗监测能看到每个插座的实时功率和历史用电量,配合NodeRED做“功率超过阈值自动断电”的保护逻辑。

4. 自动化逻辑设计与实战案例

4.1 灯光自动化的三层逻辑

灯光自动化是最基础也最容易做砸的。我见过太多人写“人体传感器触发就开灯”,结果人在沙发上坐着不动,灯就灭了。我的方案分三层:

第一层:触发条件。人体传感器触发、门磁打开、按钮按下,这些是“可能有人”的信号。

第二层:保持条件。灯光开启后,持续检测人体传感器状态。如果5分钟内没有新触发,进入下一层判断。这里用NodeRED的trigger节点,设置“收到消息后延时5分钟发送”,每次收到新消息就重置计时器。

第三层:环境判断。光照传感器数值低于阈值、当前时间在日落之后、家庭模式为“在家”,三个条件同时满足才执行开灯。任何一个不满足,就不开或者只开低亮度。

NodeRED里的流程是这样的:

[人体传感器] -> [光照判断] -> [时间判断] -> [模式判断] -> [开灯] -> [启动5分钟计时器] | [计时器超时] -> [关灯]

实操心得:人体传感器的放置位置比数量更重要。我一开始在客厅装了三个,结果互相干扰,人在中间走动时反而不触发。后来改成两个,一个对着沙发区,一个对着入口,效果反而更好。传感器的探测角度和安装高度需要根据实际户型调整,没有万能参数。

4.2 空调与新风联动控制

空调控制比灯光复杂,因为涉及温度、湿度、CO2浓度多个变量。我的逻辑是:

  • 夏季:室内温度超过28度且有人在家 -> 开空调制冷,目标26度
  • 冬季:室内温度低于18度且有人在家 -> 开空调制热,目标22度
  • CO2浓度超过1000ppm -> 开新风,直到降到800ppm以下
  • 窗户打开超过3分钟 -> 关空调,防止冷气外泄

这些逻辑全部在NodeRED里用function节点实现。比如CO2控制新风的function代码:

var co2 = msg.payload; var新风状态 = flow.get('新风状态') || 'off'; if (co2 > 1000 && 新风状态 === 'off') { flow.set('新风状态', 'on'); msg.payload = { service: 'turn_on' }; return msg; } else if (co2 < 800 && 新风状态 === 'on') { flow.set('新风状态', 'off'); msg.payload = { service: 'turn_off' }; return msg; } return null;

这里用了flow上下文存储新风状态,避免频繁开关。迟滞区间(1000开、800关)很关键,如果只用单一阈值,CO2在阈值附近波动时新风会反复启停,既费电又吵。

4.3 安防与离家模式的实现

离家模式的核心是“一键切换所有设备状态”。我在HomeAssistant里建了一个input_boolean实体叫“离家模式”,NodeRED监听它的状态变化。

离家时执行:

  • 关闭所有灯光
  • 关闭空调和新风
  • 开启门窗传感器报警
  • 开启摄像头移动侦测
  • 启动随机灯光模拟(晚上7点到10点随机开关客厅灯)

回家时执行:

  • 关闭安防报警
  • 根据时间和光照自动开灯
  • 恢复空调到之前的状态

随机灯光模拟用NodeRED的random节点加delay节点实现,每天晚上7点到10点之间随机触发3到5次。这个功能在长期外出时很有用,但注意不要设置得太规律,否则反而显得可疑。

注意:安防报警的推送不要只依赖手机App通知,因为手机可能静音或没网。我额外加了一个本地蜂鸣器,通过树莓派GPIO控制,报警时直接响。蜂鸣器用三极管驱动,不要直接接GPIO,否则电流不够。

4.4 能耗监测与异常告警

能耗监测的数据来自智能插座和空调伴侣。我用的智能插座支持功率计量,通过MQTT上报数据。NodeRED订阅这些主题,做两件事:

第一,实时功率监控。如果某个插座功率超过设定阈值(比如电暖器超过2000W),立即断电并推送告警。

第二,日用电量统计。每天凌晨统计前一天的总用电量,写入InfluxDB,Grafana里画趋势图。

异常告警的逻辑用NodeRED的switch节点加delay节点实现。比如“功率持续超过阈值5分钟”才告警,避免瞬间峰值误报。

// 能耗告警function节点 var power = msg.payload; var threshold = 2000; var duration = 5 * 60 * 1000; // 5分钟 if (power > threshold) { var startTime = flow.get('highPowerStart') || Date.now(); flow.set('highPowerStart', startTime); if (Date.now() - startTime > duration) { msg.payload = '功率持续超过阈值,请检查设备'; return msg; } } else { flow.set('highPowerStart', null); } return null;

这个逻辑的关键是持续时间判断,而不是瞬时值判断。我一开始用瞬时值,结果空调启动瞬间功率冲到2500W就告警,后来加了5分钟延时才准确。

5. 常见问题与排查技巧实录

5.1 设备掉线与重连

Zigbee设备掉线是最常见的问题。表现是实体状态变成unavailable,或者长时间不更新。排查步骤:

  1. 检查协调器是否正常:ls /dev/ttyUSB*看设备是否存在
  2. 检查ZHA集成日志:HomeAssistant的“配置 -> 日志”里搜索zha
  3. 检查设备电池:纽扣电池低于2.7V就容易掉线
  4. 检查信号强度:ZHA里可以看到每个设备的LQI值,低于50说明信号弱

解决方法:增加Zigbee路由器(比如常电的智能插座),重新配对掉线设备。如果协调器本身不稳定,考虑换USB延长线,避免USB 3.0接口的电磁干扰。

WiFi设备掉线通常是路由器问题。我在NodeRED里加了一个“心跳检测”流程,每5分钟检查一次关键设备的状态,如果连续两次unavailable就自动重启设备(通过智能插座断电再上电)。

5.2 HomeAssistant启动失败

HomeAssistant启动失败的原因很多,最常见的是配置文件语法错误。排查方法:

# 查看容器日志 docker logs homeassistant --tail 100 # 检查配置语法 docker exec homeassistant hass --script check_config -c /config

YAML对缩进极其敏感,一个空格错误就会导致整个配置加载失败。我建议用VS Code加HomeAssistant插件,它有语法检查和自动补全。

另一个常见问题是数据库损坏。HomeAssistant默认用SQLite,长期运行后数据库可能膨胀到几个GB。解决方法是改用MariaDB或PostgreSQL,或者定期清理旧数据:

recorder: purge_keep_days: 30 exclude: domains: - automation - updater entity_globs: - sensor.weather_*

5.3 nginx 502错误与WebSocket连接失败

nginx报502通常是后端服务没启动或者端口不对。排查:

# 检查后端服务是否在监听 ss -tlnp | grep 8123 ss -tlnp | grep 1880 # 检查nginx配置语法 sudo nginx -t # 查看nginx错误日志 sudo tail -f /var/log/nginx/error.log

WebSocket连接失败的表现是页面一直加载,控制台报WebSocket connection failed。检查nginx配置里有没有这两行:

proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

还有一个坑是HomeAssistant的configuration.yaml里如果开了http:use_x_forwarded_fortrusted_proxies,需要把nginx的IP加进去,否则HomeAssistant会拒绝连接。

5.4 NodeRED流程卡顿与内存泄漏

NodeRED跑久了会变慢,尤其是用了大量function节点和全局变量的情况。排查方法:

# 查看容器资源占用 docker stats nodered # 查看NodeRED日志 docker logs nodered --tail 200

常见原因是function节点里用了setInterval但没有清理,或者flow上下文存了太多数据。我现在的做法是:

  • 所有setIntervalclearInterval在流程停止时清理
  • flow上下文只存必要状态,不存历史数据
  • 定期重启NodeRED容器(每周一次),用docker restart nodered

实操心得:NodeRED的delay节点如果设置不当,会在内存里堆积大量待处理消息。比如“5分钟延时”节点,如果每分钟触发一次,5分钟后同时有5条消息在等待。解决方法是加msg.reset或者用trigger节点替代。

5.5 常见问题速查表

问题现象可能原因排查命令解决方法
Zigbee设备频繁掉线信号弱或电池低ls /dev/ttyUSB*加路由器、换电池
HomeAssistant启动失败YAML语法错误hass --script check_config检查缩进、用VS Code
nginx 502后端未启动ss -tlnp | grep 8123重启后端容器
WebSocket连接失败nginx头缺失nginx -t加Upgrade头
NodeRED变慢内存泄漏docker stats nodered定期重启、清理上下文
数据库膨胀历史数据过多du -sh /config/*.db配置recorder清理
远程访问慢上行带宽不足speedtest-cli降低推送频率、用本地缓存

6. 系统优化与长期维护经验

6.1 性能调优的几个关键参数

树莓派4B的内存有限,跑四个服务后剩余内存不多。我做了这些优化:

HomeAssistant:关闭不用的集成,减少轮询频率。比如天气集成从每15分钟改成每30分钟,设备状态轮询从30秒改成60秒。

NodeRED:减少debug节点的使用,每个debug节点都会占用内存。生产环境只保留必要的日志输出。

InfluxDB:设置数据保留策略,原始数据保留30天,聚合数据保留1年。

CREATE RETENTION POLICY "30days" ON "homeassistant" DURATION 30d REPLICATION 1 DEFAULT CREATE RETENTION POLICY "1year" ON "homeassistant" DURATION 52w REPLICATION 1

系统层面:把日志写入内存而不是SD卡,减少写入次数:

# /etc/systemd/journald.conf Storage=volatile RuntimeMaxUse=50M

6.2 备份策略与灾难恢复

智能家居系统最怕的是配置丢失。我的备份策略是三层:

第一层,每日自动备份。用cron每天凌晨3点打包HomeAssistant和NodeRED的配置目录,保留最近7天。

# /etc/cron.daily/smart-home-backup #!/bin/bash DATE=$(date +%Y%m%d) tar -czf /backup/homeassistant-$DATE.tar.gz ~/homeassistant/config tar -czf /backup/nodered-$DATE.tar.gz ~/nodered/data find /backup -name "*.tar.gz" -mtime +7 -delete

第二层,异地备份。每周把备份文件同步到另一台设备或对象存储。我用的是rclone同步到云存储,加密后上传。

第三层,配置版本管理。所有YAML文件和NodeRED流程导出后提交到私有Git仓库。这样不仅能恢复,还能看到每次改动的历史。

注意:备份文件里包含secrets.yaml和长期访问令牌,一定要加密存储。我见过有人把备份传到公开网盘,结果家里设备被陌生人控制。

6.3 安全加固的实操清单

本地优先不等于绝对安全,该做的加固还是要做:

  • 修改默认端口:HomeAssistant的8123和NodeRED的1880不要直接暴露,全部走nginx的443。
  • 启用双因素认证:HomeAssistant支持TOTP,在“个人资料 -> 安全”里开启。
  • 限制访问IP:nginx里加allowdeny规则,只允许特定IP段访问。
  • Mosquitto认证:不要用匿名访问,配置用户名密码和ACL。
  • 定期更新:HomeAssistant和NodeRED的版本更新频繁,每月检查一次,但不要追最新版,等稳定版发布后一周再升级。
# Mosquitto ACL示例 user homeassistant topic readwrite homeassistant/# user nodered topic readwrite nodered/# topic read homeassistant/#

6.4 从第13版回看迭代历程

这套系统从第1版到第13版,最大的变化不是功能增加,而是架构越来越清晰。早期版本把所有逻辑塞在HomeAssistant的YAML里,改一个自动化要翻几百行配置。后来引入NodeRED,逻辑可视化,改起来直观多了。再后来加nginx,统一入口和证书,手机访问体验提升明显。

如果让我给刚入门的人一个建议,那就是:不要一开始就追求大而全。先跑通一个灯和一个传感器,理解数据流,再逐步加设备、加逻辑。我见过太多人一上来就买几十个设备,结果配置搞不定,最后全部吃灰。

另一个体会是,文档比代码重要。每个自动化逻辑为什么这么写、参数为什么这么设,都要记下来。三个月后你回头看,没有文档根本想不起来当时的思路。我现在用Obsidian记笔记,每个设备、每个自动化都有对应的说明文档。

最后分享一个排查问题的通用思路:从数据源头开始查。设备状态有没有上报?MQTT有没有收到?HomeAssistant实体有没有更新?NodeRED有没有触发?nginx有没有转发?一层层查下来,问题一定定位得到。最怕的是跳步,直接怀疑最复杂的部分,结果绕一大圈发现是传感器没电了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询