场景业务逻辑

## 场景业务逻辑 - 场景的条件 数据结构 - 场景的动作 数据结构 - 场景设备状态订阅 - 场景设备状态维持时间订阅 - 自动化场景的 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