模板数据项、指令和指令策略间的关系

1、什么是模板数据项?

在一个设备的模板中,数据项就是物理设备采集指标在平台的一个定义。

比如这个模板中定义了如下多个数据项:

一个模板的数据项

【序号】:数据项排序用,多用于组态和表单展示中

【数据项】:这是提供给网关使用的,比如在MQTT协议中,上传的标签就是这个数据项字段

【名称】:这是提供给平台显示使用的,因为大部分情况下【数据项】字段是不可读的,比如DO1,需要一个能够正常识别的名字

【单位】:

【是否数值】:

【数据类型】:

【取值范围】:

除了这些显示的字段,在数据项中有两个非常重要的隐藏字段【id】和【uid】,先来一段代码:

{
    "code": "0",
    "message": null,
    "data": [{
        "domainPath": "/0/314888726511165/",
        "id": 9,
        "label": "一号炉口",
        "createTime": "2018-08-29T07:44:03.975+0000",
        "modifyTime": "2018-11-09T12:57:19.586+0000",
        "orCondition": null,
        "conditionField": null,
        "values": {},
        "name": "DO1",
        "description": null,
        "icon": null,
        "canEdit": true,
        "noSave": false,
        "uid": 314888726511563,
        "modelId": 314888726511551,
        "modelIdList": null,
        "granularity": 5,
        "granularityUnit": "MINUTE",
        "expression": null,
        "unit": "NA",
        "unitId": null,
        "triggerTime": null,
        "saveInterval": 0,
        "keepPeriod": 0,
        "range": null,
        "normalRange": null,
        "baseKpiId": 0,
        "calKpiPeriod": null,
        "timeDeviation": 0,
        "industryId": null,
        "displayParam": null,
        "instance": 0,
        "compress": false,
        "compressTime": 0,
        "deadZoneRange": 0.0,
        "interval": false,
        "intervalTime": 0,
        "type": "kpi",
        "serial": 1,
        "tagModel": false,
        "exportDataModelId": 0,
        "autoCreation": false,
        "kpi": true,
        "number": true,
        "kpiType": false
    }, {
        "domainPath": "/0/314888726511165/",
        "id": 378837143666810,
        "label": "二号炉口",
        "createTime": "2018-08-29T07:43:57.947+0000",
        "modifyTime": "2018-11-09T12:57:19.586+0000",
        "orCondition": null,
        "conditionField": null,
        "values": {},
        "name": "DO2",
        "description": null,
        "icon": null,
        "canEdit": true,
        "noSave": false,
        "uid": 378837143666810,
        "modelId": 314888726511551,
        "modelIdList": null,
        "granularity": 5,
        "granularityUnit": "MINUTE",
        "expression": null,
        "unit": "NA",
        "unitId": null,
        "triggerTime": null,
        "saveInterval": 0,
        "keepPeriod": 0,
        "range": null,
        "normalRange": null,
        "baseKpiId": 0,
        "calKpiPeriod": null,
        "timeDeviation": 0,
        "industryId": null,
        "displayParam": null,
        "instance": 0,
        "compress": false,
        "compressTime": 0,
        "deadZoneRange": 0.0,
        "interval": false,
        "intervalTime": 0,
        "type": "kpi",
        "serial": 2,
        "tagModel": false,
        "exportDataModelId": 0,
        "autoCreation": false,
        "kpi": true,
        "number": true,
        "kpiType": false
    }],
    "stackTrace": null
}

有没有特别的发现?
是的,数据项的属性【id】和【uid】有不同的展现方式:一号炉口的id=9和uid=314888726511563是不一样的,而二号炉口的id=378837143666810和uid=378837143666810却是一样的。这个是什么原因造成的呢?
在解答这个问题之前,我们看一下模板里添加数据项的两种方式

第一种:一个输入的数据项
一个输入的数据项

这种方式产生的数据项【id】和【uid】是一样的

autoCreation: false
baseKpiId: 0
calKpiPeriod: null
canEdit: true
compress: false
compressTime: 0
conditionField: null
createTime: "2018-11-12T02:49:06.160+0000"
deadZoneRange: 0
description: null
displayParam: null
domainPath: "/0/314888726511165/"
exportDataModelId: 0
expression: null
granularity: 5
granularityUnit: "MINUTE"
icon: null
id: 490232995857795
industryId: null
instance: 0
interval: false
intervalTime: 0
keepPeriod: 0
kpi: true
kpiType: false
label: "输入一个数据项"
modelId: 314888726511536
modelIdList: null
modifyTime: "2018-11-12T02:49:06.160+0000"
name: "输入一个数据项"
noSave: false
normalRange: null
number: true
orCondition: null
range: null
saveInterval: 0
serial: 10
tagModel: false
timeDeviation: 0
triggerTime: null
type: "kpi"
uid: 490232995857795
unit: null
unitId: null
values: {}
第二种:一个选择的数据项
一个选择的数据项

这种方式产生的数据项【id】和【uid】是不一样的,id来源于选择的这个数据项,比如选中了【风机状态】,这样的好处是我们能够保证每一个模板中数据项id是一样的

utoCreation: false
baseKpiId: 0
calKpiPeriod: null
canEdit: true
compress: false
compressTime: 0
conditionField: null
createTime: "2018-11-12T02:53:19.128+0000"
deadZoneRange: 0
description: null
displayParam: null
domainPath: "/0/314888726511165/"
exportDataModelId: 0
expression: null
granularity: 5
granularityUnit: "MINUTE"
icon: null
id: 42067
industryId: null
instance: 0
interval: false
intervalTime: 0
keepPeriod: 0
kpi: true
kpiType: false
label: "风机状态"
modelId: 314888726511536
modelIdList: null
modifyTime: "2018-11-12T02:53:19.128+0000"
name: "风机状态"
noSave: false
normalRange: null
number: true
orCondition: null
range: null
saveInterval: 0
serial: 11
tagModel: false
timeDeviation: 0
triggerTime: null
type: "kpi"
uid: 490232995857883
unit: "NA"
unitId: null
values: {}

那么这些来源于选择的数据项又是怎么来的,这是一个好问题,其实平台中数据项一部分来自内置,另一部分来自各个用户的创建。

2、什么是模板的指令?

数据项的数据如果采集自一个读写线圈或寄存器的话,那么客户应当可以对其进行控制(取决于授权)。
比如我们在模板的指令中添加了如下几个指令,方便对炉口进行管理控制


设备模板的指令

一个指令的配置

这里很清楚的表示了,我们是要对一号炉口进行控制,一号炉口这个数据项又是来源于我们之前的模板定义。
所以,模板的指令是基于模板的数据项来创建的。
来一段代码:

{
    "code": "0",
    "message": null,
    "data": [{
        "domainPath": "/0/314888726511165/",
        "id": 378837143666848,
        "label": null,
        "createTime": "2018-08-29T07:49:10.973+0000",
        "modifyTime": "2018-11-09T13:01:16.383+0000",
        "orCondition": null,
        "conditionField": null,
        "values": {},
        "name": "一号炉灶控制",
        "description": "",
        "icon": null,
        "canEdit": true,
        "noSave": false,
        "commandCode": "1001",
        "commandName": null,
        "commandType": "nor",
        "kpiDefinitionIds": [314888726511563],
        "params": [{
            "domainPath": null,
            "id": 314888726511563,
            "label": "一号炉口",
            "createTime": null,
            "modifyTime": null,
            "orCondition": null,
            "conditionField": null,
            "values": {},
            "name": "DO1",
            "description": null,
            "icon": null,
            "canEdit": false,
            "noSave": false,
            "defaultValue": null,
            "uid": 0,
            "dataType": "String",
            "modelId": 0,
            "sourceType": null,
            "sourceValue": null,
            "sourceValueExtra": null,
            "matchType": null,
            "range": null,
            "attrType": null,
            "attrTypeSort": 0
        }],
        "modelId": 314888726511551,
        "kpiName": null
    }, {
        "domainPath": "/0/314888726511165/",
        "id": 378837143666849,
        "label": null,
        "createTime": "2018-08-29T07:49:23.015+0000",
        "modifyTime": "2018-11-09T13:01:21.161+0000",
        "orCondition": null,
        "conditionField": null,
        "values": {},
        "name": "二号炉灶控制",
        "description": "",
        "icon": null,
        "canEdit": true,
        "noSave": false,
        "commandCode": "1002",
        "commandName": null,
        "commandType": "nor",
        "kpiDefinitionIds": [378837143666810],
        "params": [{
            "domainPath": null,
            "id": 378837143666810,
            "label": "二号炉口",
            "createTime": null,
            "modifyTime": null,
            "orCondition": null,
            "conditionField": null,
            "values": {},
            "name": "DO2",
            "description": null,
            "icon": null,
            "canEdit": false,
            "noSave": false,
            "defaultValue": null,
            "uid": 0,
            "dataType": "String",
            "modelId": 0,
            "sourceType": null,
            "sourceValue": null,
            "sourceValueExtra": null,
            "matchType": null,
            "range": null,
            "attrType": null,
            "attrTypeSort": 0
        }],
        "modelId": 314888726511551,
        "kpiName": null
    }, {
        "domainPath": "/0/314888726511165/",
        "id": 378837143666861,
        "label": null,
        "createTime": "2018-08-29T07:57:03.943+0000",
        "modifyTime": "2018-11-09T13:01:49.406+0000",
        "orCondition": null,
        "conditionField": null,
        "values": {},
        "name": "所有炉灶控制",
        "description": "",
        "icon": null,
        "canEdit": true,
        "noSave": false,
        "commandCode": "1000",
        "commandName": null,
        "commandType": "nor",
        "kpiDefinitionIds": [314888726511563, 378837143666810],
        "params": [{
            "domainPath": null,
            "id": 378837143666810,
            "label": "二号炉口",
            "createTime": null,
            "modifyTime": null,
            "orCondition": null,
            "conditionField": null,
            "values": {},
            "name": "DO2",
            "description": null,
            "icon": null,
            "canEdit": false,
            "noSave": false,
            "defaultValue": null,
            "uid": 0,
            "dataType": "String",
            "modelId": 0,
            "sourceType": null,
            "sourceValue": null,
            "sourceValueExtra": null,
            "matchType": null,
            "range": null,
            "attrType": null,
            "attrTypeSort": 0
        }, {
            "domainPath": null,
            "id": 314888726511563,
            "label": "一号炉口",
            "createTime": null,
            "modifyTime": null,
            "orCondition": null,
            "conditionField": null,
            "values": {},
            "name": "DO1",
            "description": null,
            "icon": null,
            "canEdit": false,
            "noSave": false,
            "defaultValue": null,
            "uid": 0,
            "dataType": "String",
            "modelId": 0,
            "sourceType": null,
            "sourceValue": null,
            "sourceValueExtra": null,
            "matchType": null,
            "range": null,
            "attrType": null,
            "attrTypeSort": 0
        }],
        "modelId": 314888726511551,
        "kpiName": null
    }],
    "stackTrace": null
}

从代码中,很明白的看出了,指令的params参数的对象里,保存的是每一个数据项的信息,并且参数对象的【id】属性对应的是数据项中的【uid】,这一点很重要。因为数据项uid是能够唯一区分数据项的,所以指令的参数对象ID使用数据项的uid来作为唯一值。

3、什么是指令策略?

为了能够让平台进行自动化调整,比如什么时候开机、关机;又比如什么条件下做某些事情。那么需要一个能够设置指令策略的功能。平台免费提供了这样高级的功能:


指令策略管理

上图的策略我们先看一下数据的结构:

{
    "code": "0",
    "message": null,
    "data": [{
        "domainPath": "/0/314888726511165/",
        "id": 378837143666892,
        "createTime": "2018-08-29T09:07:11.229+0000",
        "modifyTime": "2018-08-30T06:52:18.574+0000",
        "name": "炉灶自动开机",
        "description": "",
        "cron": "20 * * * * ? *",
        "frequency": "MINUTE",
        "directiveDomainPath": "/0/314888726511165/",
        "deviceModelId": 314888726511551,
        "deviceIds": [],
        "directiveId": 378837143666861,
        "kpiDefinitionIds": [378837143666810, 9],
        "thresholds": [{
            "targetKpiId": 378837143666810,
            "kpiId": 325243175548712,
            "compareType": "EQ",
            "thresholdValue": "0"
        }, {
            "targetKpiId": 9,
            "kpiId": 325243175548712,
            "compareType": "EQ",
            "thresholdValue": "0"
        }],
        "params": [{
            "kpiId": 378837143666810,
            "name": "DO2",
            "value": "1"
        }, {
            "kpiId": 9,
            "name": "DO1",
            "value": "1"
        }]
    }, {
        "domainPath": "/0/314888726511165/",
        "id": 378837143667579,
        "createTime": "2018-08-29T10:32:37.829+0000",
        "modifyTime": "2018-08-29T11:16:22.182+0000",
        "name": "炉灶自动关机",
        "description": "",
        "cron": "30 * * * * ? *",
        "frequency": "MINUTE",
        "directiveDomainPath": "/0/314888726511165/",
        "deviceModelId": 314888726511551,
        "deviceIds": [],
        "directiveId": 378837143666861,
        "kpiDefinitionIds": [378837143666810, 9],
        "thresholds": [{
            "targetKpiId": 378837143666810,
            "kpiId": 325243175548712,
            "compareType": "EQ",
            "thresholdValue": "1"
        }, {
            "targetKpiId": 9,
            "kpiId": 325243175548712,
            "compareType": "EQ",
            "thresholdValue": "1"
        }],
        "params": [{
            "kpiId": 378837143666810,
            "name": "DO2",
            "value": "0"
        }, {
            "kpiId": 9,
            "name": "DO1",
            "value": "0"
        }]
    }],
    "stackTrace": null
}

很明显,策略里params的对象参数kpiId是数据项的id,所以这里要注意一下:指令和指令策略里,关于id和uid并不一样。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,930评论 2 89
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,312评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 大学,总是那么的唯美,在最舒适的环境里谈着一场不着调的爱情。 我们在大学认识,我叫小豆子,他就随远。这个名...
    芝麻小团豆阅读 205评论 0 0
  • 在去咸阳机场的航站楼这段仅仅没五分钟的时间里,接站车上上来一位年轻帅气的小伙子,仪表堂堂,文质彬彬。他刚坐稳就回头...
    枫映山红阅读 270评论 1 2