跳到主要内容

JSON 自动化脚本定义

前提条件

在开始编写 JSON 自动化脚本前,请确保您已通过调用 QueryDeviceSupportedScriptAutomationConfigRequest 接口 了解您所需的功能点信息

标准结构

JSON 自动化脚本的标准结构如下所示,包含元数据(metadata)和自动化定义(automations):

参数类型是否必需说明
metadataObject自动化操作的元数据,包含自动化操作的名称、说明和变量定义。
metadata.nameString自动化的名称。
metadata.descriptionString自动化的描述。
metadata.scopeArray of DeviceProperty定义设备的属性值变量列表。
automationsArray of Object自动化数组,包含一个或多个自动化。
automations.nameString自动化名称
automations.startersArray of Starter触发器列表(至少包含一个)。
automations.conditionObject执行条件,详情情参考 Condition
automations.actionsArray of Action此参数定义自动化触发后要执行的操作列表(至少包含 1 个),按顺序执行。

Starter

Starter 是用于触发自动化的条件,支持以下类型:

类型说明
PropertyEvent此触发器表示仅当设备属性变化并满足特定条件时触发自动化。
TimeSchedule此触发器表示仅在指定时间触发自动化。
Manual此触发器表示自动化由用户手动触发。

PropertyEvent

参数类型是否必需说明
typeString固定为 "property.event"。
sourceDatasource监听的设备属性数据源。
isDynamic检查数据是否等于某个值。
isNotDynamic检查数据是否不等于某个值。
greaterThanDynamic检查数据是否大于某个值。
greaterThanOrEqualToDynamic检查数据是否大于等于某个值。
lessThanDynamic检查数据是否小于某个值。
lessThanOrEqualToDynamic检查数据是否小于等于某个值。
forDuration比较条件必须持续满足的时间长度(例如:"30min"、"1hour10min20sec")。
suppressForDuration在一次触发之后,必须等待该时间结束后才能再次触发。
提示

参数使用需遵循以下约束:

  • isisNot 不能同时使用。
  • lessThanlessThanOrEqualTo 不能同时使用。
  • greaterThangreaterThanOrEqualTo 不能同时使用。

比较运算符的类型说明

比较运算符(is、isNot、greaterThan 等)的值支持以下三种类型:

  • 字面量:基本数值类型,如 Boolean、Number、String。

    示例如下:

    // 布尔值
    "is": true
    "is": false

    // 数值
    "greaterThan": 25
    "lessThanOrEqualTo": 100.5

    // 字符串
    "is": "on"
    "isNot": "offline"
  • 变量引用:引用在 metadata.scope 中定义的变量,类型为 DataRef

    示例如下:

    "is": {
    "type": "data.ref",
    "from": "/metadata/scope",
    "select": {
    "by": "name",
    "value": "targetTemp"
    }
    }
  • 设备属性引用:直接引用另一个设备的属性值进行比较。

    参数类型是否必需说明
    typeString固定为 "device.property"。
    deviceIdString设备 ID。
    functionCodeString功能代码。
    endpointIdInteger端点 ID。
    traitCodeString属性代码。

    示例如下:

    "is": {
    "type": "device.property",
    "deviceId": "sensor002",
    "endpointId": 1,
    "functionCode": "TemperatureMeasurement",
    "traitCode": "MeasuredValue"
    }

TimeSchedule

参数类型是否必需说明
typeString固定为 "time.schedule"。
cronString(与 at 二选一)Cron 表达式。
atString(与 cron 二选一)具体时刻,详情请参考 Time 说明
timezoneString指定时区,请输入符合 IANA 标准的时区标识(如 "Asia/Shanghai"),以确保定时任务按期望时区执行。如未填写,默认使用 Aqara Studio 当前的时区信息。

Manual

参数类型是否必需说明
typeString固定为 "manual"。
nameString您自定义的名称。

示例如下:

{
"type": "manual",
"name": "回家"
}

Condition

Condition(条件)用于在执行 Action(操作)之前进行判断。只有当 Starter(触发器)被触发后,系统才会判断 Condition 是否满足。如果 Condition 判断通过,则会继续执行后续的 Action,否则不会执行操作。

Condition 的类型包含如下:

类型说明
AndCondition仅当所有子条件都满足才触发操作。
OrCondition只需任意子条件满足即可触发操作。
NotCondition对单个子条件的结果取反。
PropertyState检查设备属性的当前状态。
TimeBetween检查当前时间是否在指定范围内。

AndCondition

此条件表示仅当所有子条件都满足才触发操作。

参数类型是否必需说明
typeString固定为 "and"。
conditionsArray of Condition子条件列表(至少两个)。

示例如下:

{
"type": "and",
"conditions": [
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "roomTemp"
}
},
"greaterThan": 25
},
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "humidity"
}
},
"lessThan": 60
}
]
}

OrCondition

此条件表示只需任意子条件满足即可触发操作。

参数类型是否必需说明
typeString固定为 "or"。
conditionsArray of Condition子条件列表(至少两个)。

示例如下:

{
"type": "or",
"conditions": [
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "motionSensor1"
}
},
"is": true
},
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "motionSensor2"
}
},
"is": true
}
]
}

NotCondition

此条件表示对单个子条件的结果取反。

字段类型是否必需说明
typeString固定为 "not"。
conditionCondition要取反的条件。

示例如下:

{
"type": "not",
"condition": {
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "vacationMode"
}
},
"is": true
}
}

PropertyState

此条件用于判断设备某个属性的当前值是否满足指定的比较条件。

字段类型是否必需说明
typeString固定为 "property.state"。
sourceDatasource要检查的设备属性数据源。
isDynamic检查数据是否等于某个值。
isNotDynamic检查数据是否不等于某个值。
greaterThanDynamic检查数据是否大于某个值。
greaterThanOrEqualToDynamic检查数据是否大于等于某个值。
lessThanDynamic检查数据是否小于某个值。
lessThanOrEqualToDynamic检查数据是否小于等于某个值。
forDuration指定需要持续满足比较条件的最长时间,例如 "30min" 或 "1hour10min20sec"。
提示

至少需要指定一个比较运算符。

示例如下:

{
"type": "property.state",
"source": {
"type": "device.property",
"deviceId": "light001",
"endpointId": 1,
"functionCode": "OnOff",
"traitCode": "OnOff"
},
"is": true
}

TimeBetween

此条件用于检查当前时间是否在指定范围内。

参数类型是否必需说明
typeString固定为 "time.between"。
afterString开始时间,详情请参考 Time
beforeString结束时间,详情请参考 Time

示例如下:

{
"type": "time.between",
"after": "08:00",
"before": "22:00"
}

Action

Action(操作)用于在自动化被触发且满足条件后实际执行的操作。每个 Action 描述一次具体的执行行为,如控制设备、延迟执行等。

Action 的类型包含如下:

类型说明
TraitWrite写入设备功能点值。
Delay设置延迟时长。

TraitWrite

此操作为写入设备功能点值。

参数类型是否必需说明
typeString固定为 "device.trait.write"
functionCodeString功能代码。
traitCodeString功能点代码。
targetsArray of Object端点 ID 列表。
targets[].deviceIdString设备 ID。
targets[].endpointIdsArray of Integer端点 ID 列表。
valueDynamic待写入的功能点值。此参数的类型与功能点类型相关,详情请参考 Value 类型说明

Value 类型说明

功能点类型值类型示例
Booleantrue / false / "toggle"true
NumericNumber80 或 25.5
EnumString / Number"cool" 或 1
StringString"hello"

示例如下:

{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "light001",
"endpointIds": [1, 2]
},
{
"deviceId": "light002",
"endpointIds": [2, 3]
}
],
"value": true
}

Delay

此操作为设置延迟时长。

参数类型是否必需说明
typeString固定为 "delay"。
forDuration延迟时长。

示例如下:

{
"type": "delay",
"for": "20sec"
}

Datasource

Datasource 是用于引用设备属性或变量的通用结构,分为两种类型:DeviceProperty(设备属性)和 DataRef(变量引用)。

DeviceProperty

此对象用于直接引用设备的特定属性。

参数类型是否必需说明
typeString固定为 "device.property"。
deviceIdString设备 ID
functionCodeString功能代码(如 OnOff、LevelControl)。
endpointIdInteger端点 ID。
traitCodeString特性代码(如 OnOff、CurrentLevel)。
nameString变量名称,在 metadata.scope 中定义时须添加。

DataRef

此对象用于引用在 metadata.scope 中定义的变量。

参数类型是否必需说明
typeString固定为 "data.ref"。
fromString目标路径,固定为 "/metadata/scope",默认可不加。
selectObject选择表达式,用于指定要引用的变量。
select.byObject选择方式,固定值 "name"
select.valueObject变量名称(即您在 scope.name 中定义的字符串)

Cron

Cron 表达式的结构为:秒 分 时 日 月 周 年(依次排列),说明如下:

位置字段允许值特殊字符
10-59* /
20-59* /
30-23* /
4日(月中天)1-31, * ?
51-12, - *
6周(周中天)
  • 1:星期一
  • 2:星期二
  • 3:星期三
  • 4:星期四
  • 5:星期五
  • 6:星期六
  • 7:星期日
, * ?
7四位数字, *

特殊字符说明

符号含义示例说明
*所有值在分钟字段中写 * 表示“每一分钟”
?无特定值当你只想指定日或周中的某一字段,而不关心另一个字段。例如:日字段写 10,周字段写 ? 表示每月 10 号触发,但不在意星期几
-范围小时字段写 10-12 表示“10 点、11 点和 12 点”
,额外值周字段写 1,3,5 表示“星期一、星期三和星期五”
/步进(增量)秒字段写 0/15 表示“第 0、15、30、45 秒”,5/15 表示“第 5、20、35、50 秒”;日字段写 1/3 表示“从每月第一天开始,每 3 天触发一次”;可与 * 配合使用,*/15 表示“每 15 个单位触发一次”

以下示例可帮助您更清晰地理解 Cron 表达式的用法:

Cron 表达式含义
0 0 2 * * ? *每天凌晨 2 点触发(不关心星期几)
0 0 9 ? * 2 *每周二 9:00 执行(不关心日期)
0 0 0 1 * ? *每月 1 号凌晨 0 点执行(不关心星期几)
0 */5 * * * ? *每 5 分钟执行一次
0 0/15 9-17 * * ? *每天 9 点到 17 点,每小时的 0、15、30、45 分钟执行
0 0 1 1,10,20 * ? *每月的 1、10、20 日凌晨 1 点执行
0 0 9 ? * 2,4 *每周二和周四早上 9 点执行(不关心具体日期)
0 0 0 1 1 ? 20262026 年 1 月 1 日凌晨 0 点执行
0 0 0/3 * * ? *每 3 小时执行一次,从 0 点开始

Time

Time 表示一天中的时间点,支持 时钟时间太阳时间 两种类型。

时钟时间

您可以使用 24 小时格式或 AM/PM 格式。

  • 24 小时格式:
    格式示例说明
    HH:mm13:0013 点 00 分
    HH:mm:ss13:00:0113 点 00 分 01 秒(秒可选)
    H:mm8:308 点 30 分
  • AM/PM 格式:
    格式示例说明
    h:mm am/pm0:30 am凌晨 0 点 30 分
    h:mm am/pm7:30 pm晚上 7 点 30分
    h:mm:ss am/pm8:00:00 am早上 8 点整

太阳时间

太阳时间是指以日出或日落为基准的时间,您可以通过添加或减少偏移量(Duration),来精确设定具体的触发时刻。

格式示例说明
sunrisesunrise日出时刻
sunsetsunset日落时刻
sunrise+Durationsunrise+30min日出后 30 分钟
sunrise-Durationsunrise-1hour日出前 1 小时
sunset+Durationsunset+30min日落后 30 分钟
sunset-Durationsunset-1hour日落前 1 小时

Duration

Duration 表示一段时间长度,用于以下字段:

  • delay.for:延迟控制设备的等待时间。
  • property.event.for:比较条件必须持续满足的时间长度。
  • property.event.suppressFor:在一次触发之后,必须等待该时间结束后才能再次触发。
  • property.state.for:检查状态是否已保持一定时长。

支持的时间单位:

时间单位关键字示例
小时hour1hour
分钟min30min
sec20sec

您可以组合上述多个时间单位,按 hour、min、sec 的顺序排列,如下所示:

示例说明
1hour10min20sec1 小时 10 分钟 20 秒
1hour30min1 小时 30 分钟
10min30sec10 分钟 30秒

完整示例

以下是三个 JSON 自动化脚本的示例:

空调与温度传感器联动

以下示例表示当温度超过 28°C 且持续 5 分钟时,自动打开空调并设置为制冷模式。

{
"metadata": {
"name": "空调与温度传感器联动",
"scope": [
{
"name": "roomTemp",
"type": "device.property",
"deviceId": "temp_sensor_001",
"endpointId": 1,
"functionCode": "TemperatureMeasurement",
"traitCode": "MeasuredValue"
}
]
},
"automations": [
{
"name": "高温开空调",
"starters": [
{
"type": "property.event",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "roomTemp"
}
},
"greaterThan": 2800,
"for": "5min",
"suppressFor": "1hour"
}
],
"condition": {
"type": "time.between",
"after": "08:00",
"before": "23:00"
},
"actions": [
{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "lumi.xxxxx",
"endpointIds": [3]
}
],
"value": true
},
{
"type": "device.trait.write",
"functionCode": "Thermostat",
"traitCode": "SystemMode",
"targets": [
{
"deviceId": "lumi.xxxxx",
"endpointIds": [1]
}
],
"value": "cool"
},
{
"type": "device.trait.write",
"functionCode": "Thermostat",
"traitCode": "OccupiedCoolingSetpoint",
"targets": [
{
"deviceId": "ac_001",
"endpointIds": [1]
}
],
"value": 2500
}
]
}
]
}

灯光与人体传感器联动

以下示例表示检测到人体时开灯,无人时 5 分钟后关灯。

{
"metadata": {
"name": "人体感应灯光",
"scope": [
{
"name": "motion",
"type": "device.property",
"deviceId": "motion_001",
"endpointId": 1,
"functionCode": "OccupancySensing",
"traitCode": "Occupancy"
}
]
},
"automations": [
{
"name": "有人开灯",
"starters": [
{
"type": "property.event",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "motion"
}
},
"is": true
}
],
"condition": {
"type": "time.between",
"after": "18:00",
"before": "06:00"
},
"actions": [
{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "light_001",
"endpointIds": [1]
}
],
"value": true
}
]
},
{
"name": "无人关灯",
"starters": [
{
"type": "property.event",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "motion"
}
},
"is": false,
"for": "5min"
}
],
"actions": [
{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "light001",
"endpointIds": [1]
}
],
"value": false
}
]
}
]
}

多条件联合场景控制

以下示例表示周一到周五早上 7 点,如果温度低于 20°C 且湿度大于 70%,开启除湿器和暖风机。

{
"metadata": {
"name": "早晨环境调节",
"scope": [
{
"name": "temp",
"type": "device.property",
"deviceId": "sensor_001",
"endpointId": 1,
"functionCode": "TemperatureMeasurement",
"traitCode": "MeasuredValue"
},
{
"name": "humidity",
"type": "device.property",
"deviceId": "sensor_001",
"endpointId": 1,
"functionCode": "RelativeHumidityMeasurement",
"traitCode": "MeasuredValue"
}
]
},
"automations": [
{
"name": "早晨环境调节",
"starters": [
{
"type": "time.schedule",
"cron": "0 0 7 * * MON-FRI"
}
],
"condition": {
"type": "and",
"conditions": [
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "temp"
}
},
"lessThan": 2000
},
{
"type": "property.state",
"source": {
"type": "data.ref",
"select": {
"by": "name",
"value": "humidity"
}
},
"greaterThan": 7000
}
]
},
"actions": [
{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "light001",
"endpointIds": [1]
}
],
"value": true
},
{
"type": "device.trait.write",
"functionCode": "Switch",
"traitCode": "OnOff",
"targets": [
{
"deviceId": "light001",
"endpointIds": [1]
},
{
"deviceId": "heater_001",
"endpointIds": [1]
}
],
"value": true
}
]
}
]
}