更新时间:2024-08-20 02:42:08下载pdf
本文基于 场景创建,介绍如何创建和编辑场景条件、动作和生效时间段等重要数据模型。
在开始阅读教程之前,确保您已经完成了 准备工作 和 集成业务拓展 SDK 等步骤。
关于场景条件,参考 场景条件创建。不同的场景条件类型依赖不同的模型进行构造。
通过 Home SDK 中的 ThingSmartDeviceCoreKit
,获取设备模型对象。
获取设备模型示例:
let deviceModel = ThingSmartDevice(deviceId: "Device ID")?.deviceModel
通过 ThingSmartSceneManager
中的 getCondicationDeviceDPList
,获取对应设备的 DP 模型列表。
func fetchConditionDeviceDPList() {
ThingSmartSceneManager.sharedInstance().getCondicationDeviceDPList(withDevId: "Device ID") { sceneDPModels in
self.dpList = sceneDPModels
self.tableView.reloadData()
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
SVProgressHUD.showError(withStatus: errorMessage)
}
}
选择 DP,根据 DP 对应的类型生成对应的条件表达式对象。条件 DP 类型主要有 bool、enum、value、raw、string 等。
/// 类型为布尔型
let deviceBoolExpr = ThingSmartSceneConditionExprBuilder.createBoolExpr(withType: dpModel.entitySubId, isTrue: true, exprType: .device)
/// 类型为数值型
let deviceValueExpr = ThingSmartSceneConditionExprBuilder.createValueExpr(withType: dpModel.entitySubId, operater: "==", chooseValue: 100, exprType: .device)
/// 类型为枚举型
let deviceEnumExpr = ThingSmartSceneConditionExprBuilder.createEnumExpr(withType: dpModel.entitySubId, chooseValue: res, exprType: .device)
当 DP 类型为 string、raw,可以调用下面的 API 生成条件表达式。
/// 类型为透传型
let deviceRawExpr = ThingSmartSceneConditionExprBuilder.createRawExpr(withType: dpModel.entitySubId, exprType: .device)
如果您通过定位获取经纬度,可以通过经纬度获取城市信息模型。
ThingSmartSceneManager.sharedInstance().getCityInfo(withLatitude: "", longitude: "") { cityModel in
print(cityModel)
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
}
如果您通过选择城市列表,可以通过城市 ID 获取城市信息模型。
ThingSmartSceneManager.sharedInstance().getCityInfo(withCityId: "") { cityModel in
print(cityModel)
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
}
创建设备条件模型示例:
let deviceCondition = ThingSmartSceneConditionFactory.createDeviceCondition(withDevice: deviceModel, dpModel: dpModel, exprModel: deviceExpr) {
self.conditions?.append(deviceCondition)
self.tableView.reloadData()
}
创建天气条件模型示例:
let weatherCondition = ThingSmartSceneConditionFactory.createWhetherCondition(withCity: cityModel, dpModel: weatherDPModel, exprModel: weatherExpr)!
定时条件 只依赖定时表达式模型,先构造定时表达式,然后就可以构造出定时条件。
定时表达式模型:
let timeExpr = ThingSmartSceneConditionExprBuilder.createTimerExpr(withTimeZoneId: NSTimeZone.default.identifier, loops: "1111111", date: "20231010", time: "20:30")
创建定时条件模型:
let timerCondition = ThingSmartSceneConditionFactory.createTimerCondition(with: timeExpr)
传感类 PIR 条件 是设备条件衍生出来的一类,所以也依赖设备模型、DP 模型和条件表达式模型。
设备模型和 DP 模型按照设备条件的教程进行构造,此处描述传感类 PIR 条件的构造。
let pirCondition = ThingSmartSceneConditionFactory.createPirCondition(withDevice: deviceModel, dpModel: dpModel, exprModel: enumExpr)
地理围栏条件 是依赖系统服务的一种条件,它依赖位置的经纬度和半径等。
let geofenceCondition = ThingSmartSceneConditionFactory.createGeoFenceCondition(withGeoType: .reach, geoLati: 30.30288959184809, geoLonti: 120.0640840491766, geoRadius: 100, geoTitle: "XX 影视")
家人回家条件 依赖设备关联的家庭成员的 ID 和名称等。家庭成员 ID 和名称是通过选择某个设备所关联的数据。
家人回家条件构造示例:
let memberGoingHomeCondition = ThingSmartSceneConditionFactory.memberBackHomeCondition(withDevId: "vdevo155919804483178", entitySubIds: "1,2,3,4,5,6,7", memberIds: "id1,id2,id3", memberNames: "name1,name2,name3")
计算型条件构造 有一些前提条件,选择的 DP 模型需要包含 condCalExtraInfo
字段且内部的 calType
为 duration
才能创建计算型条件。同时 condCalExtraInfo
字段内的 maxSeconds
限制了您可以设置的最大持续时间。
它也依赖设备模型、DP 模型、表达式模型和持续时间。设备模型和 DP 模型按照之前教程进行创建。
let calcaulateCondition = ThingSmartSceneConditionFactory.calculateCondition(with: deviceModel, dpModel: dpModel, exprModel: expr, durationTime: 100)
日落日出条件 构造依赖城市模型和表达式模型。
表达式模型和条件模型都需要城市模型数据。城市信息模型按照之前教程进行创建。
let sunsetriseExpr = ThingSmartSceneConditionExprBuilder.createSunsetriseTimerExpr(withCity: cityModel, type: .set, deltaMinutes: 30)
let sunsetriseCondition = ThingSmartSceneConditionFactory.createSunsetriseTimerCondition(withCity: cityModel, exprModel: sunsetriseExpr)
关于背景知识,参考 场景动作创建。
设备动作和群组动作都需要依赖设备的功能模型 ThingSmartSceneCoreFeatureModel
。获取功能模型之前,要先获取设备和群组列表,然后选择某个设备或群组后,进入功能列表。
通过 ThingSmartSceneManager
中的 getActionGroupListAndDeviceList
,获取家庭下的设备和群组列表。
func fetchActionDeviceList() {
guard let homeID = Home.current?.homeId else {
SVProgressHUD.showError(withStatus: "HomeID is Empty")
return
}
ThingSmartSceneManager.sharedInstance().getActionGroupListAndDeviceList(withHomeId: homeID) { deviceMap in
if let groupList = deviceMap?["groupList"] as? [ThingSmartGroupModel] {
for groupModel in groupList {
let nodeModel = SceneDeviceNode(groupModel: groupModel)
self.deviceList?.append(nodeModel)
}
}
if let deviceList = deviceMap?["deviceList"] as? [ThingSmartDeviceModel] {
for deviceModel in deviceList {
let nodeModel = SceneDeviceNode(deviceModel: deviceModel)
self.deviceList?.append(nodeModel)
}
}
self.tableView.reloadData()
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
SVProgressHUD.showError(withStatus: errorMessage)
}
}
通过 ThingSmartSceneManager
中的 getNewActionDeviceDPList
,根据设备 ID 获取功能模型。
func fetchActionDeviceDPList() {
ThingSmartSceneManager.sharedInstance().getNewActionDeviceDPList(withDevId: "Device ID") { featureModels in
self.dpList = featureModels
self.tableView.reloadData()
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
SVProgressHUD.showError(withStatus: errorMessage)
}
}
通过 ThingSmartSceneManager
中的 getNewActionGroupDPList
,根据群组 ID 获取功能模型。
func fetchActionGroupDPList() {
ThingSmartSceneManager.sharedInstance().getNewActionGroupDPList(withGroupId: "Group ID") { featureModels in
self.dpList = featureModels
self.tableView.reloadData()
} failure: { error in
let errorMessage = error?.localizedDescription ?? ""
SVProgressHUD.showError(withStatus: errorMessage)
}
}
根据设备 ID 获取到的功能模型,选择某项功能后,就可以创建出设备动作模型数据。
func buildDeviceAction() {
let deviceAction = ThingSmartSceneActionFactory.deviceAction(withFeature: featureModel, devId: deviceModel.devId, deviceName: deviceModel.name)
}
根据群组 ID 获取到的功能模型,选择某项功能后,就可以创建出群组动作模型数据。
func buildGroupAction() {
let groupAction = ThingSmartSceneActionFactory.groupAction(withFeature: featureModel, groupId: groupModel.groupId, groupName: groupModel.name)
}
选择已有智能动作中包括选择 一键执行 和选择 自动化。
func buildSelectTapToRunAction() {
let selectTapToRunAction = ThingSmartSceneActionFactory.createTriggerSceneAction(withSceneId: "scene ID", sceneName: "scene name")
}
func buildSelectAutomationAction() {
let automationAction = ThingSmartSceneActionFactory.createSwitchAutoAction(withSceneId: "scene ID", sceneName: "scene name", type: AutoSwitchType(rawValue: 0)!)
}
延时动作比较简单,主要设置时、分、秒。
func buildDelayAction() {
let delayAction = ThingSmartSceneActionFactory.createDelayAction(withHours: "0", minutes: "0", seconds: "60")
}
消息动作包括消息中心、短信提醒和电话提醒。其中,短信提醒和电话提醒需要在涂鸦开发者平台购买相应服务才能使用。
func buildNotificationAction() {
let notificaitonAction = ThingSmartSceneActionFactory.createSendNotificationAction()
}
func buildSendSMSAction() {
let sendSMSAction = ThingSmartSceneActionFactory.createSmsAction()
}
func buildSendCallAction() {
let sendCallAction = ThingSmartSceneActionFactory.createCallAction()
}
创建自动化场景时,可以设置生效的时间段,用来控制在某个时段才会触发自动化场景。目前,涂鸦支持全天、白天、黑夜和自定义四种时间段类型。
创建生效时间段模型的四种类型都需要城市信息和时区信息,城市信息模型按照之前教程进行构造。仅自定义类型可以设置开始时间和结束时间。
创建生效时间段的通用方法:
func buildPrecondition() {
let precondParam = TSmartScenePreconditionParam()
precondParam.sceneID = currentPrecondition?.scenarioId ?? ""
precondParam.conditionID = currentPrecondition?.conditionId ?? ""
precondParam.preconditionType = .custom
precondParam.cityId = "5621253"
precondParam.cityName = "Hangzhou"
precondParam.loops = "1111111"
precondParam.timeZoneId = TimeZone.current.identifier
precondParam.beginDate = "07:00"
precondParam.endDate = "20:00"
let precondition = ThingSmartScenePreConditionFactory.scenePrecondition(with: precondParam)
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈