2026-10-05 · 原文发布日
灌溉传感器异常自动分级并派工到Slack
给有灌溉设备的场景用的n8n模板:传感器通过webhook上报分区、湿度、水泵状态和坐标,流程先用Open-Meteo补齐当地降水和气温预报,再把数据交给Google Gemini判断事故严重度、可能根因、SLA和处理建议,按CRITICAL/HIGH/ADVISORY分级路由,生成带工单号和SLA时限的格式化告警发到Slack频道,同时把结构化工单回传给调用方。模式可迁移到其他物联网告警分级场景。
原文要点
原模板是一个n8n工作流:webhook接收灌溉遥测(分区、湿度、水泵状态、上次运行时间、坐标),缺失字段用默认值补齐,调用Open-Meteo获取当地近期与预报降水和气温,再把传感器加天气上下文交给Google Gemini(页面写作Gemini 3.1 Flash Lite)产出结构化事故评估(严重度、标题、根因、SLA、行动项、升级标记)。随后规范化严重度/SLA、生成带时间戳的唯一工单号,按CRITICAL/HIGH/ADVISORY/NORMAL路由设定派发频道与工单状态,组装含SLA截止时间的工单发到Slack频道,并把结构化工单回传给webhook调用方。设置需要Gemini(PaLM)凭据、Slack凭据和目标频道。
这次做成什么
在自己n8n实例复刻一条“传感器上报→天气补全→AI分级→Slack派工→回传工单”的链路,并用本站设计的三档合成遥测数据验证分级路由是否生效。
准备什么
- 一个可公网访问的n8n实例(自托管需开启隧道或公网地址)
- Google AI Studio的Gemini API密钥,用于添加Gemini(PaLM)凭据
- Slack工作区及可发消息的Bot Token与目标频道(测试用新建频道)
- 能发起HTTP POST的工具,如curl或Postman
具体怎么做
搭建webhook入口与字段归一化
新建Webhook节点,方法POST,路径自定如irrigation-intake,响应方式选“在最后节点响应”。后接Code或Set节点:读取body中的zone、moisture_pct、pump_state、last_run_at、lat、lon,对缺省字段填默认值(如pump_state缺省unknown),并附received_at时间戳。
调用Open-Meteo补全天气
加HTTP Request节点,GET请求https://api.open-meteo.com/v1/forecast,查询参数传latitude、longitude取自上一步坐标,hourly取precipitation与temperature_2m,forecast_days设1。Open-Meteo该端点无需密钥。把返回的降水与气温摘要合并进同一JSON。
让Gemini输出结构化分级
加Google Gemini(PaLM)节点,绑定API凭据,提示词中要求只返回固定JSON结构:severity(限CRITICAL/HIGH/ADVISORY/NORMAL)、title、root_cause、sla_minutes、action_items数组、escalate布尔。把传感器与天气字段拼进提示词。模型名以原模板配置的Gemini 3.1 Flash Lite为准,若你的凭据不可用该标识,在节点里换成你可用的Gemini模型并在原模板核对。
解析、编号与分级路由
加Code节点解析AI返回JSON,生成工单号如IRR-20261005-四位随机数,规范severity大小写与sla_minutes数值。接Switch节点按severity分四路:CRITICAL与HIGH设为紧急派发(urgency高、工单状态dispatch_now),ADVISORY为观察(状态monitor),NORMAL只记录不告警。
发Slack并回传工单
每路接Slack节点(绑定Slack凭据,选测试频道),消息文本包含工单号、分区、湿度、天气摘要、SLA截止时间(received_at加sla_minutes)与处理建议列表。末尾用Respond to Webhook节点把最终工单JSON回给调用方,字段含ticket_id、severity、sla_deadline、status。
可直接复制的材料
分级提示词(粘贴到Gemini节点)
本站按原模板描述独立编写的提示词,{{}}为n8n表达式需按你实际字段名调整,严重度阈值是本站示例设定,可按作物需要改。
你是灌溉系统运维分诊员。根据以下传感器遥测和当地天气,判断事故严重度并只输出JSON,不要输出任何解释文字。
输入数据:
分区:{{$json.zone}}
土壤湿度:{{$json.moisture_pct}}%
水泵状态:{{$json.pump_state}}
上次灌溉时间:{{$json.last_run_at}}
近1小时降水:{{$json.precip_mm}}毫米
当前气温:{{$json.temp_c}}摄氏度
严重度规则:
- CRITICAL:水泵故障且湿度低于20%,或湿度低于15%的紧急情况
- HIGH:水泵异常或湿度20%到30%且近期无降水
- ADVISORY:湿度30%到40%或数据异常需人工查看
- NORMAL:一切正常
输出格式(严格遵守):
{"severity":"...","title":"不超过20字的事故标题","root_cause":"最可能根因一句话","sla_minutes":数字,"action_items":["第一步","第二步","第三步"],"escalate":true或false}
CRITICAL的sla_minutes为30,HIGH为240,ADVISORY为1440,NORMAL为10080。三档合成测试遥测数据
本站虚构的合成数据,坐标为东京市区示例值,不代表真实站点。
[
{"case":"紧急","body":{"zone":"A-3","moisture_pct":12,"pump_state":"fault","last_run_at":"2026-10-04T22:00:00Z","lat":35.68,"lon":139.69}},
{"case":"偏高","body":{"zone":"B-1","moisture_pct":26,"pump_state":"ok","last_run_at":"2026-10-05T06:00:00Z","lat":35.68,"lon":139.69}},
{"case":"正常","body":{"zone":"C-2","moisture_pct":55,"pump_state":"ok","last_run_at":"2026-10-05T05:30:00Z","lat":35.68,"lon":139.69}}
]输入与输出示例
本站虚构演示,分级结果来自本站提示词规则而非实际运行原模板。
输入
POST到webhook:{"zone":"A-3","moisture_pct":12,"pump_state":"fault","last_run_at":"2026-10-04T22:00:00Z","lat":35.68,"lon":139.69}对应输出
回传JSON示意:{"ticket_id":"IRR-20261005-4821","zone":"A-3","severity":"CRITICAL","title":"A-3区水泵故障土壤过干","root_cause":"水泵故障导致灌溉中断,土壤湿度降至12%","sla_minutes":30,"sla_deadline":"2026-10-05T09:42:00Z","status":"dispatch_now","slack_posted":true}做完检查这些
- 三条测试数据各自进入对应严重度分支:水泵故障且湿度12%的紧急案例应为CRITICAL、正常案例应为NORMAL,中间案例依天气结果为HIGH或ADVISORY,Switch输出与提示词规则一致
- Slack测试频道收到含工单号、SLA截止时间和行动项列表的格式化消息
- webhook调用方收到的回传JSON含ticket_id、severity、sla_deadline且字段名与流程内一致
- 缺pump_state的请求也能走完全程,归一化后该字段为默认值unknown
容易卡住的地方
- Gemini模型标识以原模板配置为准,凭据不支持时需在节点内换可用模型,不要假设所有账号都有该型号
- Gemini可能返回带```json围栏的文本,解析节点需先剥离围栏再JSON.parse
- Open-Meteo坐标缺失或非法会返回错误,归一化步骤应给坐标兜底值或拒绝无坐标请求
- 测试请用新建Slack频道和合成数据,别在生产灌溉频道直接激活
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Triage irrigation incidents with Google Gemini, Open-Meteo, and Slack alerts
- 原作者
- iamvaar
- 原始发布日期
- 2026-10-05T09:01:11.259Z
- 来源
- https://n8n.io/workflows/20430