场景业务逻辑
## 场景业务逻辑
- 场景的条件 数据结构
- 场景的动作 数据结构
- 场景设备状态订阅
- 场景设备状态维持时间订阅
- 自动化场景的 review 过程,一切都基于事件
- 场景动作的执行过程
### 1. 场景创建
- 场景数据入库。 scenes
- 根据场景 conditions字段,为该场景订阅设备状态。deviceStateEventSubcriber (全局表)
- 根据场景 conditions字段,为指定设备的指定状态值,维护一个 cloud_task,用于出发状态维持指定时间事件。 deviceStateDelayUpdateTask (全局表)
- 根据场景 conditions字段,为该场景 维护 cloud_schedule job,如果存在 TIMER 类型的condition sceneTimerScheduleJob
- 根据场景 conditions字段,如果存在基于天气的condition,维护 houseWeatherStateEventSubscriber,系统每个一个小时,从该表 获取需要获取天气状态数据,并检查状态是否变化,触发review scene topic。(houseWeatherStateEventSubscriber(全局表):)
>d 如果场景的 conditions存在 多个 TIMER类型 的condition ,则conditions 的逻辑操作只能是 OR
逻辑操作为and,只能存在一个 TIMER 类型的condition
/deviceStateEventSubcriber/<device_id>
|字段|类型|说明|
|-|-|-|
|user_id|String|用户id|
|house_id|String|房子id|
|scene_id|String|场景id|
|state|String|设备的状态字段|
/deviceStateDelayUpdateTask/<device_id>
|字段|类型|说明|
|-|-|-|
|user_id|String|用户id|
|house_id|String|房子id|
|scene_id|String|场景id|
|state|Object|设备的状态字段事件, {"states.currentSensorStateData.humanPassDetectState": {"$eq": "no_human_pass_detected"}}|
|delay|Number|延迟(保持)时长,单位是秒|
|task_id|String|cloud_task的id,为none表示当前没有cloud_task在跑|
/sceneTimerScheduleJob/<scene_id>
|字段|类型|说明|
|-|-|-|
|user_id|String|用户id|
|house_id|String|房子id|
|scene_id|String|场景id|
|schedule|String|* * * * *|
|schedule_id|String|cloud_schedule_id, 为null说明没有schedule正在运行|
>d TimerSchedule的目标是 pub/sub=review_scene,topic_data中会携带事件触发源。{"scene_id":, "state_event": {"type":, "data": <设备状态值>}}
>d 对于基于timer的场景,如果是and逻辑操作,则必须由 timer事件触发,其他事件触发,表示timer事件不满足。如果是or逻辑操作,则没有这个必要,而且只要是timer事件触发的review_scene, 都表示场景条件满足,其他conditions 不必去review.
/houseWeatherStateEventSubscriber/<scene_id>
|字段|类型|说明|
|-|-|-|
|user_id|String|用户id|
|house_id|String|房子id|
|scene_id|String|场景id|
|location|Object|需要获取天气的地方的位置信息,|
>d 这个表 在场景创建/更新/删除的时候,维护。系统有一个长期运行的cloud_schedule job,每隔一个小时,会从这张表获取数据。
之所以提供location 字段,而不是让代码去根据house_id去获取房子的位置信息,是为了兼容基于不同地方的天气状态事件。
天气状态维护cloud_schedule的目标是 pub/sub=review_scene,
/userLocationStateEventSubscriber/<user_id>
|字段|类型|说明|
|-|-|-|
|user_id|String|用户id|
|house_id|String|房子id|
|scene_id|String|场景id|
>d 上报的位置信息,将携带在topic_data里面
### 2. 自动化场景 reivew 过程
scene_review_gateway_on_device_state_update
scene_review_gateway_on_weather_state_update
scene_review_gateway_on_location_state_update
scene_review_gateway_on_device_state_update
当发生设备状态更新事件:
- 从 deviceStateDelayUpdateTask, 根据 设备的id,获取所有订阅该设备状态事件的场景列表,然后为每一个场景 发布场景 review_scene_topic
关于 house所在地天气状态数据维护:
- 系统每个一个小时,获取需要维护的
关于 基于位置的场景的逻辑:
- app侧 检测用户的位置是否发生变化(变化的条件设定一个范围)
- 后台,report_user_location 发布用户位置发生变化事件
- scene_review_gateway_on_location_state_update,提取这个用户的订阅了location状态的场景,并发布场景review topic