场景联动
这篇解决什么
属性超阈值、设备上线、定时到点时,怎么自动设属性、调服务或拉响告警。读完能对上 iot_scene_rule 的 triggers / actions,以及设备消息与定时两条执行入口。
不要把外部转发写进场景。那是 数据流转。告警配置反向挂场景 id,见 告警配置。
示意图:设备触发走消息总线;定时触发走 Quartz,Job 名 iot_scene_rule_timer_{id}。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| API | /iot/scene-rule,含改状态、精简列表 | ruoyi-office/yudao-module-iot/yudao-module-iot-server/.../IotSceneRuleController.java |
| 表 | triggers / actions 都是 JSON | @TableName("iot_scene_rule") |
| 设备消费 | group iot_rule_consumer | IotSceneRuleMessageSubscriber |
| 定时 | Quartz + IotSchedulerManager | IotSceneRuleTimerHandler、IotSceneRuleJob |
| 前端 | 触发 / 条件 / 动作分段表单 | ruoyi-office-vben/apps/web-antd/src/views/iot/rule/scene/ |
触发类型 IotSceneRuleTriggerTypeEnum:上下线 1、属性上报 2、事件 3、服务调用 4、定时 100。定时不要填 productId / deviceId,改填 cronExpression。
条件分组:外层 List 是「或」,内层是「且」。条件类型:设备状态 1、设备属性 2、当前时间 100。比较符在 IotSceneRuleConditionOperatorEnum(= / in / between,以及 date_time_、time_ 一组)。多个值用逗号,如 1,2,3。
动作类型 IotSceneRuleActionTypeEnum:设属性 1、调服务 2、告警触发 100、告警恢复 101。触发告警时动作里的 alertConfigId 为空,由告警配置的 sceneRuleIds 反查。恢复告警才填 alertConfigId。
deviceId = 0 表示全部设备。动作里若仍填 0,设属性 / 调服务实现会再展开具体设备,不要假设只打一条下行。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
triggers | 事件 + 条件分组 | IotSceneRuleDO.Trigger |
actions | 执行类型与参数 | IotSceneRuleDO.Action |
lastTriggerTime | 最近一次触发 | IotSceneRuleDO |
status | 停用会暂停定时 Job | update-status |
定时不是 XXL-Job
设备 OTA 推送才走 XXL deviceUpgradeJob。场景定时是模块内 Quartz,类 IotSceneRuleJob。改 cron 要走场景保存,让 IotSceneRuleTimerHandler 重注册。
告警触发不要在动作里选配置
ALERT_TRIGGER 只表示「这条场景响了」。谁收短信 / 邮件,在告警配置里勾这条场景。
@RequestMapping("/iot/scene-rule")
public class IotSceneRuleController { }
@TableName(value = "iot_scene_rule", autoResultMap = true)
public class IotSceneRuleDO extends TenantBaseDO { }配置与操作
走 规则引擎 → 场景联动(4049,/iot/rule/scene)。触发:上下线 1 / 属性 2 / 事件 3 / 服务 4 / 定时 100。定时填 cronExpression,不要填设备。条件外层或、内层且。动作:设属性 1、调服务 2、告警触发 100(不填 alertConfigId)、恢复 101(要填)。
定时是模块内 Quartz IotSceneRuleJob,不是 XXL-Job。停用会暂停 Job。开启见 IoT 功能设计。

本系统截图:规则引擎 → 场景联动。定时走模块内 Quartz,不是 XXL-Job。
