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-clientsMosquitto是MQTT broker,后面NodeRED和部分WiFi设备都要用它。装完后先启动并设置开机自启:
sudo systemctl enable mosquitto sudo systemctl start mosquitto3.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,所以
Upgrade和Connection头必须设置,否则页面会一直转圈加载不出来。这是最常见的nginx配置坑。
证书用Certbot自动申请和续期:
sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.comCertbot会自动修改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/grafanaHomeAssistant的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,或者长时间不更新。排查步骤:
- 检查协调器是否正常:
ls /dev/ttyUSB*看设备是否存在 - 检查ZHA集成日志:HomeAssistant的“配置 -> 日志”里搜索
zha - 检查设备电池:纽扣电池低于2.7V就容易掉线
- 检查信号强度: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 /configYAML对缩进极其敏感,一个空格错误就会导致整个配置加载失败。我建议用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.logWebSocket连接失败的表现是页面一直加载,控制台报WebSocket connection failed。检查nginx配置里有没有这两行:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";还有一个坑是HomeAssistant的configuration.yaml里如果开了http:的use_x_forwarded_for和trusted_proxies,需要把nginx的IP加进去,否则HomeAssistant会拒绝连接。
5.4 NodeRED流程卡顿与内存泄漏
NodeRED跑久了会变慢,尤其是用了大量function节点和全局变量的情况。排查方法:
# 查看容器资源占用 docker stats nodered # 查看NodeRED日志 docker logs nodered --tail 200常见原因是function节点里用了setInterval但没有清理,或者flow上下文存了太多数据。我现在的做法是:
- 所有
setInterval用clearInterval在流程停止时清理 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=50M6.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里加
allow和deny规则,只允许特定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有没有转发?一层层查下来,问题一定定位得到。最怕的是跳步,直接怀疑最复杂的部分,结果绕一大圈发现是传感器没电了。