场景创建业务拓展

更新时间:2024-08-20 02:42:08下载pdf

本文基于 场景创建,介绍如何创建和编辑场景条件、动作和生效时间段等重要数据模型。

准备工作

在开始阅读教程之前,确保您已经完成了 准备工作集成业务拓展 SDK 等步骤。

条件

关于场景条件,参考 场景条件创建。不同的场景条件类型依赖不同的模型进行构造。

  • 设备条件、传感类条件和计算型条件创建依赖设备模型、DP 模型和条件表达式模型。
  • 天气条件和日落日出条件依赖城市信息模型。

核心模型

设备模型

通过 Home SDK 中的 ThingSmartDeviceCoreKit,获取设备模型对象。

获取设备模型示例:

let deviceModel = ThingSmartDevice(deviceId: "Device ID")?.deviceModel

DP 模型

通过 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 等。

布尔型 DP

/// 类型为布尔型
let deviceBoolExpr = ThingSmartSceneConditionExprBuilder.createBoolExpr(withType: dpModel.entitySubId, isTrue: true, exprType: .device)

数值型 DP

/// 类型为数值型
let deviceValueExpr = ThingSmartSceneConditionExprBuilder.createValueExpr(withType: dpModel.entitySubId, operater: "==", chooseValue: 100, exprType: .device)

枚举型 DP

/// 类型为枚举型
let deviceEnumExpr = ThingSmartSceneConditionExprBuilder.createEnumExpr(withType: dpModel.entitySubId, chooseValue: res, exprType: .device)

透传型 DP

当 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 条件

传感类 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 字段且内部的 calTypeduration 才能创建计算型条件。同时 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)
}