资产指标开放接口说明和公式函数说明。
一、资产指标接口说明
1、 查询资产指标对应的设备资产的历史值
路径 | /industry/asset/indicator/query/history/data |
版本 | 1.0.0 |
请求参数
入参名称 | 数据类型 | 是否必须 | 缺省默认值 | 入参描述 |
assetTypeCode | string | 是 | 资产类型编码 | |
indicatorCode | string | 是 | 资产指标编码 | |
assetCode | string | 是 | 资产编码 | |
pageNo | integer | 是 | 页码,从1开始 | |
pageSize | integer | 是 | 分页大小,最大200条 | |
since | Long | 否 | 开始时间,精度是毫秒 | |
until | Long | 否 | 结束时间,精度是毫秒 |
请求示例
{
"assetCode": "Sk001",
"pageNo": 1,
"indicatorCode": "dca",
"pageSize": 5,
"assetTypeCode": "Skw001",
"until": 1640846111022,
"since": 1640846051022
}
响应参数
参数类型 | 数据类型 | 结构类型 | 参数描述 |
code | integer | 响应码 200 成功 | |
data | JSON | 数组 | data |
-total | Integer | 数量 | |
-dataList | JSON数组 | 数组 | |
--asset_code | 字符串 | 资产编码 | |
--ts | 字符串 | 时间戳,格式:YYYY-MM-DD hh:mm:ss | |
--value | 浮点/整形/字符串 |
响应示例
{
"code": 200.0,
"data": {
"total": 5.0,
"dataList": [{
"asset_code": "Sk001",
"value": 848320.0,
"ts": "2021-12-30 14:29:40"
}, {
"asset_code": "Sk001",
"value": 848319.0,
"ts": "2021-12-30 14:29:39"
}, {
"asset_code": "Sk001",
"value": 848318.0,
"ts": "2021-12-30 14:29:38"
}, {
"asset_code": "Sk001",
"value": 848317.0,
"ts": "2021-12-30 14:29:37"
}, {
"asset_code": "Sk001",
"value": 848316.0,
"ts": "2021-12-30 14:29:36"
}]
}
}
响应失败示例
{
"id": "37f7e5fa-d6a5-4efe-8abf-5bf23dca6284",
"code": 403,
"message": "request forbidden.",
"localizedMsg": "请求被禁止",
"data": null
}
2、 查询资产指标对应设备资产的最新值
路径 | /industry/asset/indicator/data/query |
版本 | 1.0.0 |
请求参数
入参名称 | 数据类型 | 是否必须 | 缺省默认值 | 入参描述 |
assetTypeCode | string | 是 | 资产类型编码 | |
assetCode | string | 是 | 资产编码 | |
indicatorCode | string | 否 | 资产指标编码,如果不为空,只查询该指标最新值 | |
pageNo | integer | 否 | 1 | 页码,从1开始 |
pageSize | integer | 否 | 200 | 分页大小,最大200条 |
请求示例
{
"assetCode": "Test1231001",
"pageNo": 1,
"pageSize": 5,
"assetTypeCode": "test1231"
}
响应参数
参数类型 | 数据类型 | 结构类型 | 参数描述 |
code | integer | 响应码 200 成功 | |
data | JSON | 数组 | data |
-total | Integer | 数量 | |
-dataList | JSON数组 | 数组 | |
--code | 字符串 | 资产指标编码 | |
--name | 字符串 | 资产指标名称 | |
--ts | 字符串 | 时间戳,格式:YYYY-MM-DD hh:mm:ss | |
--value | 浮点/整形/字符串 | 最新值 |
响应示例
{
"code": 200,
"data": {
"dataList": [{
"code": "attr1_agg",
"data": 60,
"name": "attr1_agg",
"ts": "2022-01-18 15:58:14"
}],
"total": 1
}
}
响应失败示例
{
"id": "37f7e5fa-d6a5-4efe-8abf-5bf23dca6284",
"code": 403,
"message": "request forbidden.",
"localizedMsg": "请求被禁止",
"data": null
}
二、资产指标公式函数说明
:
1 多技术属性联合计算,最多可以支持对三个技术属性计算。
2 #号只是操作界面提示符,当在资产指标公式输入框输入#符号时,前端会自动展示技术属性列表和对应的数据类型,然后直接选择即可,无需输入完整的技术属性编码。
1、数据转换
1.1、四则运算
例子:
1.8 * #XC_P0103B + 16
1.8 * #XC_P0103B + 1.2 * #XC_P0103A
#XC_P0103B + #XC_P0103A + #XC_P0103C
1.2、条件表达式
标准的CASE WHEN SQL表达式
例子:
CASE WHEN #XC_P0103B < 1000 THEN "S" WHEN #XC_P0103B < 2000 THEN "M" WHEN #XC_P0103B < 3000 THEN "L" ELSE "XL" END
1.3、字符串转换
例子:
length(#XC_P0103B)
concat(#XC_P0103B, "_test")
upper(concat(#XC_P0103B, "_test"))
函数说明:
函数 | 示例 | 说明 |
concat | concat(col1...) | 连接数组或字符串。 此函数接受任意数量的参数并返回 String 或 Array |
endswith | endswith(col1, col2) | 返回一个布尔值,该布尔值指示第一个 String参数是否以第二个 String 参数结尾。 |
format_time | format_time(col1, format) | 将日期时间格式化为字符串。其中,若参数 col1 为兼容类型,则在格式化之前转换给DateTime类型 |
indexof | indexof(col1, col2) | 返回第二个参数的第一个索引(从0开始),作为第一个参数中的子字符串。 |
length | length(col1) | 返回提供的字符串中的字符数。 |
lower | lower(col1) | 返回给定 String 的小写版本。 |
lpad | lpad(col1, 2) | 返回 String,在左侧用第二个参数指定的空格数填充。 |
ltrim | ltrim(col1) | 从提供的字符串中删除所有前导空格(制表符和空格)。 |
numbytes | numbytes(col1) | 以提供的字符串的 UTF-8 编码返回字节数。 |
regexp_matches | regexp_matches(col1, regex) | 如果字符串(第一个参数)包含正则表达式的匹配项,则返回 true。 |
regexp_replace | regexp_matches(col1, regex, str) | 将第一个参数中所有出现的第二个参数(正则表达式)替换为第三个参数。 |
regexp_substr | regexp_substr(col1, regex) | 在第一个参数中找到第二个参数(regex)的第一个匹配项。 |
rpad | rpad(col1, 2) | 返回字符串参数,在右侧填充第二个参数指定的空格数。 |
rtrim | rtrim(col1) | 从提供的字符串中删除所有尾随空白(制表符和空格)。 |
substring | substring(col1, start, end) | 从提供的 Int 索引(从0开始,包括0)到字符串的结尾,返回提供的String的子字符串。 |
startswith | startswith(col1, str) | 返回布尔值,是否第一个字符串参数是否以第二个字符串参数开头。 |
trim | trim(col1) | 从提供的字符串中删除所有前导和尾随空格(制表符和空格)。 |
upper | upper(col1) | 返回给定 String 的大写版本。 |
1.4、数学函数转换
例子:
abs(#XC_P0103B)
ceil(#XC_P0103B)
函数说明:
函数 | 示例 | 说明 |
abs | abs(col1) | 绝对值 |
acos | acos(col1) | 弧度数的反余弦值 |
asin | asin(col1) | 弧度数的反正弦值 |
atan | atan(col1) | 弧度数的反正切值 |
atan2 | atan2(col1, col2) | 正x轴与两个自变量中定义的(x,y)点之间的弧度角 |
bitand | bitand(col1, col2) | 对两个Int(-converted)参数的位表示执行按位“与”运算 |
bitor | bitor(col1, col2) | 对两个参数的位表示进行或运算 |
bitxor | bitxor(col1, col2) | 对两个Int(-converted)参数的位表示执行逐位异或运算 |
bitnot | bitnot(col1) | 在Int(-converted)参数的位表示形式上执行按位NOT运算 |
ceil | ceil(col1) | 将值舍入到最接近的BIGINT值。 |
cos | cos(col1) | 返回以弧度为单位的数字的余弦值。 |
cosh | cosh(col1) | 返回弧度数的双曲余弦值。 |
exp | exp(col1) | 返回小数点参数的e。 |
ln | ln(col1) | 返回参数的自然对数。 |
log | log(col1) | 返回参数的以10为底的对数。 |
mod | mod(col1, col2) | 返回第一个参数除以第二个参数的余数。 |
power | power(x, y) | 返回 x 的 y 次方。 |
rand | rand() | 返回一个伪随机数,其均匀分布在0.0和1.0之间。 |
round | round(col1) | 将值四舍五入到最接近的 BIGINT 值。 |
sign | sign(col1) | 返回给定数字的符号。 当参数的符号为正时,将返回1。 当参数的符号为负数时,返回-1。 如果参数为0,则返回0。 |
sin | sin(col1) | 返回弧度数的正弦值。 |
sinh | sinh(col1) | 返回弧度数的双曲正弦值。 |
sqrt | sqrt(col1) | 返回数字的平方根。 |
tan | tan(col1) | 返回以弧度表示的数字的正切值。 |
tanh | tanh(col1) | 返回弧度数的双曲正切值。 |
1.5、哈希函数
例子:
md5(#XC_P0103B)
sha1(#XC_P0103B)
函数说明:
函数 | 示例 | 说明 |
md5 | md5(col1) | 参数的哈希值 |
sha1 | sha1(col1) | 参数的哈希值 |
sha256 | sha256(col1) | 参数的哈希值 |
sha384 | sha384(col1) | 参数的哈希值 |
sha512 | sha512(col1) | 参数的哈希值 |
1.6、比较函数
例子:
gt(#{B.Int_004}, 10)
gte(#{B.Int_004}, 10)
eq(#{B.Int_004}, 10)
neq(#{B.Int_004}, 10)
lt(#{B.Int_004}, 10)
lte(#{B.Int_004}, 10)
if(#{B.Int_004}, "normal", "caution")
函数说明:
函数 | 示例 | 说明 |
gt | gt(x, y) | 如果 x 大于 y,则返回 1,否则,返回 0 (x > y)。 |
gte | gte(x, y) | 如果 x 大于或等于 y,则返回 1,否则,返回 0 (x ≥ y)。 |
eq | eq(x, y) | 如果 x 等于 y,则返回 1,否则,返回 0 (x == y)。 |
neq | neq(x, y) | 返回值1如果x不等于y否则为0(x == y)。 |
lt | lt(x, y) | 如果 x 小于 y,则返回 1,否则,返回 0 (x < y)。 |
lte | lte(x, y) | 如果 x 小于或等于 y,则返回 1,否则,返回 0 (x ≤ y)。 |
if | if(condition, result_if_true, result_if_false) | 评估condition和返回result_if_true如果条件计算结果为 true,或result_if_false如果条件计算结果为 false,则为 false。 condition必须是数字。此函数考虑0和一个空字符串作为 false 和其他所有内容(包括NaN)为 true。布尔值转换为0(false)1(真)。 |
1.7、其它函数
例子:
cast(#XC_P0103B, "bigint")
函数说明:
函数 | 示例 | 说明 |
cast | cast(col, "bigint") | 将值从一种数据类型转换为另一种数据类型。 支持的类型包括:bigint,float,string,boolean 和 datetime。 |
chr | chr(col1) | 返回与给定 Int 参数对应的 ASCII 字符 |
encode | encode(col1, "base64") | 使用 encode 函数根据编码方案将负载(可能是非 JSON 数据)编码为其字符串表示形式。目前,只支持"base64"econding 类型。 |
trunc | trunc(dec, int) | 将第一个参数截断为第二个参数指定的小数位数。 如果第二个参数小于零,则将其设置为零。 如果第二个参数大于34,则将其设置为34。从结果中去除尾随零。 |
使用 cast 函数转换到 datatime 类型时,转换规则如下:
如果参数为 datatime 类型,则直接返回原值。
如果参数为 bigint 或者 float 类型,则其数值会作为自 1970年1月1日0时起至今的毫秒值而转换为 datetime 类型。
如果参数为 string 类型,则会用默认格式"2006-01-02T15:04:05.000Z07:00"将其转换为 datetime类型。
其他类型的参数均不支持转换。
2、数据统计
2.1、聚合转换
例子:
例子一:
技术属性有两种值 1和0,从0变到1计算一次
0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 00 1
statchange(col1,0,1) = 4
例子二:
lastvalue(col1)
lastwindowvalue(col1)
例子三:
delta(col1)
例子四:
统计当前时间窗口内,技术属性为true持续的时间,单位为秒
stattime(col1,true)
统计当前时间窗口内,技术属性等于5.5持续的时间,单位为秒
stattime(col1,5.5)
统计当前时间窗口内,技术属性等于10持续的时间,单位为秒
stattime(col1,10)
统计当前时间窗口内,技术属性为idle状态持续的时间,单位为秒
stattime(col1,"idle")
例子五:
统计当前时间窗框内,100~1000的数据条数,其中.Value是固定值,表示取值
stat_if(col,".Value>100 and .Value < 1000")
stat_if(col,".Value>100 or .Value < 20")
stat_if( EGoodCount ,".Value>160 or .Value<145") >0 or stat_if( EBadCount , ".Value>160 or .Value<145") >0
函数说明:
函数 | 示例 | 说明 |
avg | avg(col1) | 组中的平均值。空值不参与计算。 |
count | count(col) | 组中的项目数。空值不参与计算。 |
max | max(col1) | 组中的最大值。空值不参与计算。 |
min | min(col1) | 组中的最小值。空值不参与计算。 |
sum | sum(col1) | 组中所有值的总和。空值不参与计算。 |
collect | collect(col1)[0] | collect(col1):表示组中指定列的值组成的数组 collect(col1)[0]:表示取数组的第一个值。 |
collect(col1)[-1] | collect(col1):表示组中指定列的值组成的数组 collect(col1)[-1]:表示取数组的最后一个值。 |
statchange | statchange(col1,0,1) | 统计在一个窗口内,一个技术属性由A变到B的次数 statchange(col1, A, B) 其中第二个和第三个参数类型必须相同,可以是:string、bool、int、float |
stattime | stattime(col1,"idle") | 返回给定变量在当前窗口内为某一值的时间(以秒为单位) 第二个参数类型可以是:string、bool、int、float |
lastvalue | lastvalue(col1) | 当前窗口时间内最后一个值 |
firstvalue | firstvalue(col1) | 当前窗口时间内第一个值 |
nth_value | nth_value(col1,2) | 返回从窗口开始的指定偏移量处的值。偏移量从 1 开始。偏移量可以是任何标量表达式。如果偏移量为 null 或大于窗口中值的数量,则返回 null。偏移量为零或负数是错误的。 |
lastwindowvalue | lastwindowvalue(col1) | 返回上一个窗口时间内最后一个值 |
delta | delta(col1) | 当前窗口时间内的最后一个值减去上一个窗口时间内的最后一个值。 主要应用于:电表、水表、气表一直递增数据场景 |
stat_if | stat_if(col,expression) | 统计满足条件的数据条数 |
2.2、条件计数
例子一:
count(#XC_P0103B > 1000 and #XC_P0103B < 2000)
例子二:
count(#XC_P0103B * 5 > 10000)
例子三:
count(#XC_P0103B)
三、资产指标数据推送
:
推送的内容包括两部分:一部分是资产指标元数据信息推送,包括创建资产指标、修改资产指标、删除资产指标等;另外一部分是资产指标计算后的结果数据推送。
推送方式是通过MQTT。
1、Topic 格式
MQTT topic 规范,{$AssetTypeCode},{$AssetCode},{$IndicatorCode}替换为具体的标识符
AssetTypeCode:资产类型编码
AssetCode:设备资产编码
IndicatorCode:资产指标编码
#订阅资产类型下的某个的设备的某个资产指标
/iot/metric/indicator/{$AssetTypeCode}/{$AssetCode}/{$IndicatorCode}
#订阅资产类型下的所有设备的某个资产指标
/iot/metric/indicator/{$AssetTypeCode}/+/{$IndicatorCode}
#订阅资产类型下的某个设备的所有资产指标
/iot/metric/indicator/{$AssetTypeCode}/{$AssetCode}/#
# 订阅资产类型下的某个资产指标元数据信息
/iot/metric/indicator/meta/{$AssetTypeCode}/{$IndicatorCode}
# 订阅资产类型下的所有资产指标元数据信息
/iot/metric/indicator/meta/{$AssetTypeCode}/#
2、 数据格式
2.1 创建资产指标
{
"action": "insert",
"id": 1,
"assetTypeCode": "xxx",
"assetTypeName": "xxx",
"code": "xxx",
"name": "xxx",
"description": "xxx",
"indicatorType": "transform",
"windowSize": 1,
"windowUnit": "MI",
"formula": "xx",
"unit": "xxx",
"attributeGroups": [{
"attributeGroupName": "xx",
"attributeName": "xx",
"attributeCode": "xxx",
"dataType": 0
}]
}
2.2 修改资产指标
{
"action": "update",
"id": 1,
"assetTypeCode": "xxx",
"assetTypeName": "xxx",
"code": "xxx",
"name": "xxx",
"description": "xxx",
"indicatorType": "transform",
"windowSize": 1,
"windowUnit": "MI",
"formula": "xx",
"unit": "xxx",
"attributeGroups": [{
"attributeGroupName": "xx",
"attributeName": "xx",
"attributeCode": "xxx",
"dataType": 0
}]
}
2.3 删除资产指标
{
"action": "delete",
"id": 1,
"assetTypeCode": "xxx",
"assetTypeName": "xxx",
"code": "xxx",
"name": "xxx"
}
2.4 资产指标数据
数据转换和数据统计数据格式不同,并且时间戳精度是毫秒级别
数据转换:
{
"assetTypeCode": "xxx",
"indicatorCode": "xxx",
"assetCode": "xxx",
"ts": xxxx,
"value": xxx
}
数据统计:
{
"assetTypeCode": "xxx",
"indicatorCode": "xxx",
"assetCode": "xxx",
// 窗口开始时间
"window_start": xxxx,
// 窗口结束时间
"window_end":xxxx,
"value": xxx
}