找回密码
 立即注册

微信扫码登录

搜索
查看: 139|回复: 2

[教程系列] 【NodeRED】AI赋能家居有多暖?开门即享小爱暖心问候,这才是下班回家的正确打开方式

[复制链接]

3

主题

66

回帖

769

积分

高级会员

积分
769
金钱
700
HASS币
0
发表于 昨天 11:07 | 显示全部楼层 |阅读模式
本帖最后由 wenghy 于 2025-10-17 12:18 编辑

分享一篇AI+NodeRED实现开门播报的工作流。

image.png
代码如下:
[{"id":"b5e0e3d8a2040c40","type":"tab","label":"AI生成提示语","disabled":false,"info":"","env":[]},{"id":"0e49a82962811afa","type":"api-call-service","z":"b5e0e3d8a2040c40","name":"小爱音箱播放文本","server":"4b8a1c75bb43f078","version":5,"debugenabled":false,"domain":"text","service":"set_value","areaId":[],"deviceId":[],"entityId":["text.xiaomi_lx06_e22b_play_text"],"data":"{"value":msg.payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":360,"wires":[[]]},{"id":"baab6869f11684c5","type":"inject","z":"b5e0e3d8a2040c40","name":"测试","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{"open_person":"周杰伦"}","payloadType":"json","x":90,"y":420,"wires":[["d635d2c40c739ee7"]]},{"id":"d635d2c40c739ee7","type":"function","z":"b5e0e3d8a2040c40","name":"设置提示词Prompt","func":"\nconst address = '广州市广州塔';\nconst person = msg.payload.open_person;\nconst prompt = `我家在${address},结合当地的天气,得出当前${person}开门回家的原因,\n写一段非常温馨俏皮的欢迎词,不要输出地址信息,字数限制在60到90字之间`;\nmsg.payload=prompt;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":290,"y":360,"wires":[["f5c7a5c2.1a3d58"]]},{"id":"f5c7a5c2.1a3d58","type":"function","z":"b5e0e3d8a2040c40","name":"设置请求参数","func":"// 设置 API 请求参数\nmsg.payload = {\n    "model": "qwen-plus-2025-04-28", // 模型名称\n    "messages": [\n        {"role": "user", "content": msg.payload}\n    ],\n    "temperature": 0.7, // 随机性参数\n    "max_tokens": 200 // 最大响应长度\n};\n\n// 设置请求头(根据实际 API 要求修改)\nmsg.headers = {\n    "Content-Type": "application/json",\n    "Authorization": "Bearer sk-xxxxx" // 替换为你的 API 密钥\n};\n\n// 设置请求 URL(根据实际 API 地址修改)\nmsg.url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"; // 示例 API 地址\nmsg.method = "POST"; // 通常为 POST 方法\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":360,"wires":[["a1d7c3e6.8f2b4"]]},{"id":"a1d7c3e6.8f2b4","type":"http request","z":"b5e0e3d8a2040c40","name":"调用 AI API","method":"use","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","x":630,"y":360,"wires":[["e3b2d1c8.9a7f2"]]},{"id":"e3b2d1c8.9a7f2","type":"function","z":"b5e0e3d8a2040c40","name":"处理响应结果","func":"// 解析 API 响应,提取需要的内容\nif (msg.payload && msg.payload.choices && msg.payload.choices.length > 0) {\n    // 提取模型返回的内容\n    msg.payload = msg.payload.choices[0].message.content;\n} else {\n    // 处理错误情况\n    msg.payload = "API 调用失败: " + (msg.payload?.error?.message || "未知错误");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":360,"wires":[["0e49a82962811afa","277ff8cb8af7b464"]]},{"id":"53c9f68e1d24d1e9","type":"comment","z":"b5e0e3d8a2040c40","name":"调用大模型-API KEY","info":"","x":530,"y":320,"wires":[]},{"id":"3b0fe69064e73ab1","type":"link in","z":"b5e0e3d8a2040c40","name":"输出到AI大模型","links":[],"x":125,"y":320,"wires":[["d635d2c40c739ee7"]]},{"id":"5a3f264a5296de77","type":"server-state-changed","z":"b5e0e3d8a2040c40","name":"门锁输入","server":"4b8a1c75bb43f078","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"input_text.lock_record01","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":180,"y":160,"wires":[["14ca5923ddeb3d5c","d635d2c40c739ee7"]]},{"id":"14ca5923ddeb3d5c","type":"debug","z":"b5e0e3d8a2040c40","name":"debug 31","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":520,"y":160,"wires":[]},{"id":"277ff8cb8af7b464","type":"debug","z":"b5e0e3d8a2040c40","name":"大模型输出结果","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":960,"y":280,"wires":[]},{"id":"4b8a1c75bb43f078","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":true,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
导入之后做如下动作:
修改“设置提示词Prompt”节点
image.png
修改其中的地址为你的家庭住址,越精确越好,人员为msg.payload.open_person,你可以根据你的输入调整。
设置AI大模型的请求参数
    需要改动三个地方(示例的是Qwen大模型):    模型名称、API 密钥、API地址,这部分需要查对应的大模型文档。
image.png


修改输出的小爱音箱实体ID(从MiAuto插件获取)

image.png

接入门锁(这部分比较难,大家耐心观看)
这边需要注意的是,触发实体是events:state,大家先配置实体为你的门锁,修改Entity

image.png
部署一下,最后触发开门看下你的输出的debug日志试下。
右边的调试窗口输出的是:
2025/10/13 14:50:13节点: debug 31
input_text.lock_record01 : msg.payload : string[3]
"周杰伦"


表示的是msg.payload输出的是文本,内容是“周杰伦”。
然后我们看下设置提示词Prompt的代码。

image.png
其中原先的第三行代码如下:

<font color="#000000">const person = msg.payload.open_person;</font>

然后可以看到调试窗口中的大模型输出结果节点:

image.png
"周杰伦开门回家啦!
微风不燥,阳光正好,像极了你回家的路。
欢迎回家,让音乐与爱一起,把日子谱成温暖的歌。"
假设上面右边的调试窗口输出的是:


2025/10/13 14:34:13节点: debug 31
input_text.lock_record01 : msg.payload : Object
{"name":"雷军"}


就改为如下代码:
const person = msg.payload.name;


反正因地制宜,大家把自己的实体输出到调试窗口,如果不知道如何设置,可以留言,我会一一解答。


AI调优

输出的文本部分如果不满意的,可以把输入的提示词到对应的大模型上多次调试,然后按照格式组装到“设置提示词Prompt”节点上。
`我家在${address},结合当地的天气,得出当前${person}开门回家的原因,写一段非常温馨俏皮的欢迎词,不要输出地址信息,字数限制在60到90字之间`根据变量调整一下,最后格式化后填入prompt。


拓展思路:不止欢迎词,还有更多玩法
掌握了“NodeRED+小米Miot+AI”的组合,你还能解锁更多智能家居新姿势:
  • 离家提醒:门锁关闭后,小爱播报“记得带钥匙、关灯、关空调哦”。
  • 访客播报:当门锁检测到密码开锁(非家人),小爱说“有客人来啦,快去开门~”。
  • 节日专属问候:在AI提示词中加入节日信息,比如春节时播报“新春快乐,欢迎回家吃年夜饭!”

由于论坛的图片数量的限制等原因,本文去掉了公众号上一些非核心的解释,如果真的需要观看原文,见https://mp.weixin.qq.com/s/oHB31--TjKdcf67b-sHFtg



点击【我叫小宇哥】扫码关注
回复

使用道具 举报

32

主题

1529

回帖

7067

积分

元老级技术达人

积分
7067
金钱
5481
HASS币
70
发表于 昨天 11:48 | 显示全部楼层
原文都不贴,纯引流我觉得有点过了
回复

使用道具 举报

3

主题

66

回帖

769

积分

高级会员

积分
769
金钱
700
HASS币
0
 楼主| 发表于 昨天 11:57 | 显示全部楼层
c1pher_小愚 发表于 2025-10-17 11:48
原文都不贴,纯引流我觉得有点过了

抱歉,本来贴了原文,很多微信的图片不显示,就直接贴地址,我到时候重新编辑下原文
点击【我叫小宇哥】扫码关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-10-18 01:48 , Processed in 0.148896 second(s), 6 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表