恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
AIoT 智慧养老平台:完整搭建与交付指南
首页
资讯中心
/
AIoT 智慧养老平台:完整搭建与交付指南
AIoT 智慧养老平台:完整搭建与交付指南
发布时间:2026/10/5 2:30:14
一、 整体系统架构概述图中的错误一是 应该是 aiot/camera1/event、aiot/anomaly/event不是iot图中错误二是思考层发布的端口号写错了1884 vs 1883图中的错误图中间“思考层”写着 发布AI建议 MQTT 1884然后“行动层”去订阅。我的真实代码llm_alert_summarizer.py 里写的是 MQTT_PORT 1883。为什么错1884 是 ThingsBoard 的专属 MQTT 端口它只认自己的 Access Token。而大模型脚本和动作执行器都是连接我们本地的 Mosquitto (1883) 来互相通信的。其实有一根隐形的线anomaly_detector.py 和 camera_yolo.py 发出的异常/视觉事件是先发给 Mosquitto (1883)然后 llm_alert_summarizer.py 从 1883 订阅拿到的。它们之间不直接通信而是通过 MQTT 邮局解耦。注意理解。tb_forwarder.py 转发内容清单脚本作为边缘网关将HA侧MQTT消息清洗转换后统一上报ThingsBoard遥测接口v1/devices/me/telemetry监听主题HA端接收内容TB遥测字段名字段含义数据来源模块xw103/home/sensor_data温湿度、光照JSONtemperature,humidity,light房间温度、湿度、光照强度sim_master.py / anomaly_detector.pyaiot/camera1/eventYOLO视觉识别事件motion_event,motion_area目标出现/离开事件、运动区域占比复用人数数值camera_yolo.py / camera_motion.pyaiot/elderly/sosSOS紧急呼叫事件sos_triggered布尔值紧急呼叫触发标记true代表求救模拟脚本 / HA自动化aiot/elderly/inactivity长时间无人体活动inactivity_alert布尔值老人滞留/长时间无活动告警标记HA自动化 / 模拟脚本aiot/ai/alert_summaryLLM告警文本摘要ai_summary字符串AI大模型生成的告警自然语言摘要llm_alert_summarizer.py脚本附加能力简要说明鉴权与端口适配同时连接HA MQTT(1883)与ThingsBoard MQTT(1884)使用设备Token完成TB身份认证HA无需感知云端平台。数据清洗自动过滤值为None的空字段避免脏数据写入ThingsBoard数据库。字段映射转换对原始字段重命名解耦硬件命名与云端看板/告警规则。断线自动重连网络或MQTT服务短暂中断后自动重试保障边缘侧持续上报。日志输出控制台打印接收、转发日志方便调试排查消息链路。多源数据汇聚所有传感器、摄像头、告警、AI摘要数据统一归入ThingsBoard同一个边缘网关设备方便统一看板与告警规则配置。llm_alert_summarizer.py 总结它就是养老系统里的AI外脑翻译官。核心一句话听到本地报警后调用DeepSeek大模型把冷冰冰机器数据翻译成“人话”告警摘要并给出处置建议再把结果发回本地MQTT邮局。一、它听什么它连接本地Mosquitto消息邮局127.0.0.1:1883持续监听3个告警频道aiot/anomaly/event环境异常检测如温度异常aiot/camera1/event摄像头视觉识别事件aiot/elderly/inactivity老人长时间无活动滞留告警二、它怎么思考收到告警事件依次执行3步处理API限流防刷两次调用大模型最少间隔30秒短时间连续告警直接跳过避免消耗API额度。调用DeepSeek大模型把原始告警数据打包发给DeepSeek要求AI输出一句话告警摘要 处置动作。动作白名单安全校验AI只能从预设动作里选择turn_off_socket、turn_on_light、turn_off_light、no_action。如果AI输出不在白名单自动拦截强制改为no_action不执行任何操作。三、它发什么输出处理完成后将结果发布到本地MQTT主题aiot/ai/alert_summary示例JSON{summary:检测到极高温度与湿度存在火灾隐患,action:turn_off_socket,...}它不会直接发给HA也不会直接上云只把消息发到本地Mosquitto消息邮局由其他脚本接力处理。四、AI输出结果的两条接力链路tb_forwarder.py云端同步员订阅aiot/ai/alert_summary把AI摘要转发到ThingsBoard1884端口在云端大屏展示AI告警文字。ai_action_executor.py本地执行员订阅aiot/ai/alert_summary读取action字段通过HA的HTTP接口执行开灯、关插座等本地设备控制。五、3个工程容错细节异常兜底try...except网络断开、API故障、密钥失效时程序不会崩溃自动返回兜底结果保障系统持续运行。JSON自动截取大模型输出多余文字时自动截取大括号内JSON内容保证能正常解析。HTTP状态码日志打印每次调用大模型打印HTTP状态码。200代表成功401代表密钥错误方便快速调试排查。总结它就像一名外聘高级参谋通过限流、动作白名单做安全约束只负责翻译告警、给出建议不直接操控物理设备由其他模块负责云端展示和本地设备执行实现模块解耦。系统采用“边缘-云-AI协同”的分层架构[感知层] —— 传感器与摄像头 │ (F103温湿度/光照、YOLO视觉) ▼ [边缘层] —— Home Assistant Mosquitto │ (本地MQTT 1883、异常检测、HA自动化、本地控制) ▼ [传输层] —— 数据分发 ├── [云端层] ThingsBoard (Docker 1884) - 长期存储/报表/大屏/告警规则 └── [思考层] DeepSeek大模型 - 生成人类语言摘要与建议 │ ▼ [行动层] —— 动作执行器 (HTTP) └── 调用 HA REST API - 真实/虚拟设备动作 - 闭环二、 环境准备与文件清单虚拟机Ubuntu 20.04 (建议分配 4GB 内存方便同时运行多个脚本)工作目录~/aiot-camera虚拟环境~/.venv必须严格隔离防止污染系统依赖核心文件清单anomaly_detector.py异常检测camera_yolo.py视觉识别tb_forwarder.py转发到 ThingsBoardllm_alert_summarizer.py大模型摘要ai_action_executor.py动作执行器三、 完整操作步骤逐段复制粘贴第 1 步启动边缘感知层提供事件源打开终端 1运行异常检测用于监控温湿度/光照cd~/aiot-camerasource.venv/bin/activate python anomaly_detector.py(可选)打开终端 2运行 YOLO 视觉识别python camera_yolo.py0第 2 步启动云端同步数据上云打开终端 3运行转发脚本把 HA 数据传到 ThingsBoardcd~/aiot-camerasource.venv/bin/activate python tb_forwarder.py注意确保脚本里TB_MQTT_PORT 1884不是 1883。验收ThingsBoard 的HA-Edge-Gateway - Latest telemetry能看到数据跳动。第 3 步启动 AI 思考层大模型摘要打开终端 4运行大模型摘要调用 DeepSeekcd~/aiot-camerasource.venv/bin/activate python llm_alert_summarizer.py注意确保你的DEEPSEEK_API_KEY已写死在代码中且模型名为deepseek-chat。第 4 步启动行动层空跑模式打开终端 5运行动作执行器先空跑测试cd~/aiot-camerasource.venv/bin/activate python ai_action_executor.py注意确保代码里AUTO_EXECUTE False空跑模式以及HA_TOKEN填入了 HA 长期访问令牌。第 5 步触发测试终极联动打开终端 6发一条 80℃ 的极端数据mosquitto_pub-h127.0.0.1-txw103/home/sensor_data-m{properties:{temperature2:80,humidity2:95,light:2}}验收现象终端 1打印[告警] 检测到异常。终端 4打印[AI建议] 检测到极高温度与湿度存在火灾隐患 - 建议动作: turn_off_socket。终端 5打印[空跑模式] 将会调用: light.turn_off ... (AUTO_EXECUTEFalse, 实际未执行)。ThingsBoard 大屏告警列表出现High Temperature温度曲线飙升。HA 通知栏弹出“AI 告警处理”通知。第 6 步开启真枪实弹闭环最后一环去终端 5按CtrlC停掉。编辑ai_action_executor.py把AUTO_EXECUTE False改成AUTO_EXECUTE True。重新运行python ai_action_executor.py。再次去终端 6发一条 80℃ 异常数据。终极验收去 HA 网页强制刷新CtrlF5你会发现light.roomlight被关闭同时 HA 界面弹出了执行成功的通知。四、 核心技术亮点与安全设计边缘-云协同架构HA 负责本地毫秒级应急断网也能跑ThingsBoard 负责长周期存储与云端可视化。边缘与云端通过tb_forwarder.py解耦互不干扰。多维异常检测摒弃传统单变量阈值使用Isolation Forest算法综合温度、湿度、光照三个维度学习“正常模式”能发现极其隐蔽的复合异常。大模型安全校验层双重白名单第一道嘴llm_alert_summarizer.py中的ALLOWED_ACTIONS限制了 LLM 只能输出特定动作防止其“幻觉”生成危险指令。第二道手ai_action_executor.py中的ACTION_MAP作为执行字典即使收到非法指令也无法映射到 HA 实体。空跑模式执行器默认只打印不执行确认无误后才开启自动执行。限流机制MIN_SECONDS_BETWEEN_CALLS 30防止频繁告警导致 API 账单失控。无缝硬件升级目前使用 HA 虚拟实体演示软件在环未来只需将light.roomlight替换为真实的继电器实体代码无需任何改动即可控制物理世界。五、 后台常驻部署Systemd演示时手动开 6 个终端很麻烦正式交付时可以用systemd管理将anomaly_detector.py、tb_forwarder.py、llm_alert_summarizer.py、ai_action_executor.py统一注册成 service。设置Restartalways实现开机自启、崩溃自动拉起。验证命令sudo systemctl status 服务名看是否active (running)。服务文件模板示例[Unit] DescriptionAIoT LLM Summarizer Afternetwork.target mosquitto.service [Service] Userdragon WorkingDirectory/home/dragon/aiot-camera ExecStart/home/dragon/aiot-camera/.venv/bin/python llm_alert_summarizer.py Restartalways RestartSec5 [Install] WantedBymulti-user.target六、 避坑备忘录路径要命HA 的配置目录是/home/dragon/.homeassistant/带点千万不要改到无点的影子目录否则配置无法生效。端口冲突Mosquitto 占用1883ThingsBoard 的 MQTT 必须映射为1884转发脚本里绝对不能写错否则连接会被拒绝。Key 安全虽然代码里写死了 API Key 和 Token方便测试但交付或上传 GitHub 时务必替换为占位符或从环境变量读取os.environ.get。白名单匹配llm_alert_summarizer.py返回的动作词必须与ai_action_executor.py里的ACTION_MAP严格匹配否则会触发“未知动作”拦截导致执行无效。界面没反应执行成功但 HA 网页没变化时先尝试CtrlF5强制刷新。如果无效去“开发者工具 - 状态”查看light.roomlight的底层状态是否已变。ThingsBoard 配套环境Ubuntu 20.04 虚拟机Docker 部署和 HomeAssistant 共用同一个 Mosquitto MQTT broker。本文按最终跑通的版本整理遇到问题可以照着常见故障排查一节对照处理。一、原理ThingsBoard 是什么解决什么问题一个完整 IoT 项目通常分四层感知层(STM32/传感器) → 网络层(MQTT/网关) → 平台层(HA ThingsBoard) → 应用层(业务系统)ThingsBoard 占的是云端平台层和本地的 HomeAssistant 是边缘-云协同关系不是互相替代维度HomeAssistant边缘ThingsBoard云端平台管理范围一个场地多场地、多租户汇总数据存储短期专为长期时序数据设计延迟低本地响应快有网络往返断网表现能继续本地联动无法处理强项实时自动化规则引擎、告警、看板、长期趋势核心能力设备管理、数据采集、规则引擎过滤→判断→触发动作、可视化看板。社区版CE免费开源教学和个人项目完全够用。数据流向本项目实际链路HA(传感器/摄像头数据,MQTT发布) ↓ tb_forwarder.py(订阅HA主题,转换格式,转发) ↓ ThingsBoard(v1/devices/me/telemetry 接收遥测) ↓ Root Rule Chain(规则引擎: 过滤 - 创建/清除告警) ↓ Dashboard(可视化) / Alarms(告警列表)二、部署Docker 安装 ThingsBoard单节点适合教学 Demo2.1 为什么不用官方 docker-compose.yml 原文件官方仓库docker/docker-compose.yml是微服务集群版拆成 tb-node、tb-mqtt-transport、tb-coap-transport 等一堆独立容器每个都要单独的.env文件还要配 Kafka是给生产大规模集群用的教学单机环境完全没必要会一直报缺 xxx.env 文件。直接用下面这份极简双容器版本。2.2 最终可用的 docker-compose.ymlversion:3.3services:postgres:restart:alwaysimage:postgres:16environment:POSTGRES_DB:thingsboardPOSTGRES_PASSWORD:postgresvolumes:-postgres-data:/var/lib/postgresql/datahealthcheck:test:[CMD-SHELL,pg_isready -U postgres -d thingsboard]interval:10stimeout:5sretries:5thingsboard-ce:restart:alwaysimage:thingsboard/tb-node:4.3.1ports:-8080:8080-1883:1883-5683-5688:5683-5688/udpenvironment:TB_SERVICE_ID:tb-ce-nodeSPRING_DATASOURCE_URL:jdbc:postgresql://postgres:5432/thingsboardSPRING_DATASOURCE_PASSWORD:postgresdepends_on:-postgresvolumes:-tb-logs:/var/log/thingsboardvolumes:postgres-data:tb-logs:版本号为什么必须是3.3老版本docker-compose连字符版工具只认到 3.3。写 3.8 会报Version unsupported3.3 以上版本才支持的字段如 healthcheck 的start_period如果出现在 3.3 文件里会报不被支持的字段所以上面这份已经去掉了start_period用的是经过验证能跑的最小集合。如果之后换了新版 Docker Compose 插件版本号可以放心升到 3.8 甚至更新。2.3 部署步骤mkdir-p~/tb-simplecd~/tb-simplenanodocker-compose.yml# 粘贴上面内容保存退出# 初始化数据库(只需一次)sudodocker-composerun--rm-eINSTALL_TBtrue-eLOAD_DEMOtrue thingsboard-ce# 启动sudodocker-composeup-dsudodocker-composeps# 两个服务都应为 running访问http://虚拟机IP:8080默认账号tenantthingsboard.org/tenant登录后立刻改密码。2.4 镜像拉取慢的解决办法按效果排序已有可用代理时最推荐给 Docker 配 HTTP 代理走代理直连 Docker Hub 官方不依赖国内镜像源是否存活。sudomkdir-p/etc/systemd/system/docker.service.dsudonano/etc/systemd/system/docker.service.d/http-proxy.conf[Service] EnvironmentHTTP_PROXYhttp://网关IP:7890 EnvironmentHTTPS_PROXYhttp://网关IP:7890 EnvironmentNO_PROXYlocalhost,127.0.0.1网关 IP 用ip route | grep default查上网工具要开启允许局域网连接。sudosystemctl daemon-reloadsudosystemctl restartdocker三、接入创建设备 转发脚本3.1 创建设备拿 Token左侧菜单Entities → Devices → → Add new deviceName 填HA-Edge-GatewayCredentials type 选Access token复制保存。3.2 转发脚本 tb_forwarder.py订阅 HA 的 MQTT 消息转换格式后发给 ThingsBoard。放进~/aiot-camera/和摄像头脚本同一个虚拟环境#!/usr/bin/env python3importjsonimporttimeimportpaho.mqtt.clientasmqtt# 配置 HA_MQTT_HOST127.0.0.1HA_MQTT_PORT1883HA_MQTT_USERNoneHA_MQTT_PASSNoneTOPIC_SENSORxw103/home/sensor_dataTOPIC_CAMERAaiot/camera1/eventTB_MQTT_HOST127.0.0.1TB_MQTT_PORT1883TB_ACCESS_TOKEN在此粘贴你的Access TokenRECONNECT_DELAY5# defmake_client(client_id):try:returnmqtt.Client(mqtt.CallbackAPIVersion.VERSION2,client_idclient_id)exceptAttributeError:returnmqtt.Client(client_idclient_id)defmain():tb_clientmake_client(tb-forwarder)tb_client.username_pw_set(TB_ACCESS_TOKEN)defon_tb_connect(client,userdata,flags,reason_code,propertiesNone):print(已连接到 ThingsBoard)tb_client.on_connecton_tb_connect tb_client.connect(TB_MQTT_HOST,TB_MQTT_PORT,60)tb_client.loop_start()ha_clientmake_client(tb-forwarder-ha-sub)ifHA_MQTT_USER:ha_client.username_pw_set(HA_MQTT_USER,HA_MQTT_PASS)defsend_telemetry(payload:dict):clean{k:vfork,vinpayload.items()ifvisnotNone}ifnotclean:returntb_client.publish(v1/devices/me/telemetry,json.dumps(clean))print(f- 已转发到 ThingsBoard:{clean})defon_ha_message(client,userdata,msg):try:datajson.loads(msg.payload.decode(utf-8))exceptjson.JSONDecodeError:returnifmsg.topicTOPIC_SENSOR:propsdata.get(properties,{})send_telemetry({temperature:props.get(temperature2),humidity:props.get(humidity2),light:props.get(light),})elifmsg.topicTOPIC_CAMERA:send_telemetry({motion_event:data.get(event),motion_area:data.get(area_pct),})defon_ha_connect(client,userdata,flags,reason_code,propertiesNone):print(已连接到 HA 的 MQTT Broker)client.subscribe(TOPIC_SENSOR)client.subscribe(TOPIC_CAMERA)defon_ha_disconnect(client,userdata,*args):print(f与 HA MQTT 断开,{RECONNECT_DELAY}秒后自动重连...)ha_client.on_connecton_ha_connect ha_client.on_messageon_ha_message ha_client.on_disconnecton_ha_disconnect ha_client.connect(HA_MQTT_HOST,HA_MQTT_PORT,60)print(转发服务已启动,等待数据... (CtrlC 退出))try:ha_client.loop_forever(retry_first_connectionTrue)exceptKeyboardInterrupt:print(收到 CtrlC,退出)finally:tb_client.loop_stop()tb_client.disconnect()if__name____main__:main()运行cd~/aiot-camerasource.venv/bin/activate pipinstallpaho-mqtt python tb_forwarder.py验收ThingsBoardEntities → Devices → HA-Edge-Gateway → Latest telemetry能看到 temperature/humidity/light 实时刷新。注意mqtt.Client()在新版 paho-mqtt 下必须用CallbackAPIVersion写法否则会报错或警告上面的make_client()已经做了新旧版本兼容。四、规则链告警的创建与清除4.1 正确的接线位置最容易出错的地方打开Rule Chains → Root Rule Chain画布里已有一个Message Type Switch节点正常会有一条线通向Save Timeseries。新的判断节点要接在 Message Type Switch 的Post Telemetry输出口上和原有连线并列不要接在最前面的Input节点——否则设备上线/下线等非遥测消息也会被拿去跑脚本可能因为msg.temperature不存在而出错。4.2 节点配置左侧节点库分类Filter拖Script节点命名Temperature Filter。双击打开脚本语言下拉框选JavaScript默认是 TBELJS更好懂填returnmsg.temperature30;分类Action拖Create Alarm命名High Temperature Alarm接Temperature Filter的True口。双击配置Alarm typeHigh Temperature注意大小写、空格后面 Clear Alarm 要完全一致SeverityWARNINGAlarm Details Builder 是一段脚本不是纯文本框return{temperature:msg.temperature};再拖一个Clear Alarm命名Clear High Temperature Alarm接False口。Alarm type 同样填High Temperature这是最容易出错的地方——两边类型只要有一个字符不一样、多个空格Clear Alarm 就找不到对应的告警去清除。右下角Apply changes保存生效这一步必须做光保存单个节点不够。4.3 验收mosquitto_pub-h127.0.0.1-txw103/home/sensor_data-m{properties:{temperature2:35,humidity2:50,light:100}}注意每条mosquitto_pub命令单独一行回车发送不要让两条命令粘连在一起会出现Only one type of message can be sent at once报错是因为出现了两个-m。ThingsBoardAlarms页面应出现一条High TemperatureWarning 级别。降温验证清除mosquitto_pub-h127.0.0.1-txw103/home/sensor_data-m{properties:{temperature2:15,humidity2:50,light:100}}如果看起来没有清除先检查 Alarms 页面顶部的状态筛选框是不是只显示Active——ThingsBoard 默认隐藏已清除的告警清除后会直接从默认视图消失不是停留显示已清除。把筛选改成 “Cleared” 或 “Any” 确认。五、Dashboard 可视化Dashboards → → Create new dashboard起名如智慧社区总览。Edit → Add new widget → Charts → Time series chart。Datasource 选HA-Edge-GatewaySeries 添加temperature、humidity、light。保存。想看摄像头事件可以再加一个Latest values组件key 选motion_event、motion_area。六、常见故障排查清单现象原因处理ERROR: Couldnt find env file: xxx.env下载的是官方微服务版 docker-compose.yml换成本备忘第二节的单节点极简版unknown flag: --rm 打出 docker 根帮助用了docker compose空格但该插件在 sudo/root 下不可见改用docker-compose连字符或把用户加入 docker 组后不用 sudoUnsupported config option for services: postgrescompose 文件没写version被当成旧格式解析加version: 3.3Version in ... is unsupported写了 3.8但工具只认 2.x/3.3改回3.3healthcheck ... start_period was unexpected3.3 格式不支持该字段(3.4才有)删掉start_period那一行镜像拉取几KB/s 极慢国内网络访问 Docker Hub 受限用代理(效果最确定)或阿里云专属加速器见2.4节HA 改了配置界面没反应改的是另一份文件或忘记重启grep关键字确认文件内容、ls -l看修改时间configuration.yaml改动必须重启HAOnly one type of message can be sent at once两条mosquitto_pub命令粘连成一行分两行单独回车发送ThingsBoard 收不到数据tb_forwarder.py没在跑或 Token 填错看脚本终端有无已转发打印核对 Access Token 没有多余空格告警一直不清除(但实际已清除)Alarms页面默认只显示Active把状态筛选改成 Cleared / Any规则链改了不生效只保存了单个节点没点整条链的 Apply changes画布右下角 Apply changes 一定要点排查规则链问题无从下手看不到消息流经过程给相关节点逐个打开 Debug mode发测试消息后看节点的 Events 标签七、延伸后续可以往上加的模块已有设计按需实施LLM 告警摘要ThingsBoard 产生异常事件后调用大模型生成人话摘要建议动作需考虑成本/离线场景见下方设计要点。异常检测Isolation Forest 多维异常检测比单变量阈值更聪明已有anomaly_detector.py。AI 触发设备动作动作必须走白名单校验真正安全关键的动作不应该等 LLM 判断应由规则引擎直接触发LLM 只负责事后生成解释二者并行而不是串行依赖。工业质检场景检测结果偏差值、合格/NG上报为遥测ThingsBoard 做良率统计、连续NG告警走和本备忘完全相同的设备Token转发脚本规则链路径只是数据来源换成检测脚本。八、一句话复盘这套HA(边缘实时) → 转发脚本 → ThingsBoard(云端规则引擎告警看板)的链路是边缘-云协同这条主线的真实代码实现而不是停留在配置点选——这正是让你的案例和同质化教学产品拉开差距的核心部分。