Commit d34621bd authored by 陈伟灿's avatar 陈伟灿

Merge branch 'cwc' into 'master'

Cwc

See merge request chenweican/k-sdk!103
parents 604f4d05 57d22634
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "kk_product.h" #include "kk_product.h"
#include "kcloud_config.h" #include "kcloud_config.h"
#include "infra_sha256.h" #include "infra_sha256.h"
#include "kk_log.h"
#define BUFSIZE 1024 #define BUFSIZE 1024
#define PRODUCTSECRET "123456" #define PRODUCTSECRET "123456"
...@@ -90,12 +91,12 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId) ...@@ -90,12 +91,12 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId)
{ {
for (l=0;l<16;l++) for (l=0;l<16;l++)
{ {
printf("%c",str[i][l]); INFO_PRINT("%c",str[i][l]);
} }
printf("\n"); INFO_PRINT("\n");
} }
//排序 //排序
printf("after order:\n"); INFO_PRINT("after order:\n");
int j,k; int j,k;
for( j=0;j<3;j++) for( j=0;j<3;j++)
for( k=j+1;k<3;k++) for( k=j+1;k<3;k++)
...@@ -108,7 +109,7 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId) ...@@ -108,7 +109,7 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId)
} }
} }
for(i=0;i<3;i++)//输出 for(i=0;i<3;i++)//输出
printf("%s\n",str[i]); INFO_PRINT("%s\n",str[i]);
len = strlen(deviceCode) + strlen(productCode) + strlen(randomId) + 1; len = strlen(deviceCode) + strlen(productCode) + strlen(randomId) + 1;
signSource = malloc(len); signSource = malloc(len);
if (signSource == NULL) { if (signSource == NULL) {
...@@ -116,7 +117,7 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId) ...@@ -116,7 +117,7 @@ char *kk_dictionary_order(char *deviceCode, char *productCode,char *randomId)
} }
memset(signSource, 0, len); memset(signSource, 0, len);
snprintf(signSource, len, "%s%s%s", str[0],str[1],str[2]); snprintf(signSource, len, "%s%s%s", str[0],str[1],str[2]);
printf("signSource %s\n",signSource); INFO_PRINT("signSource %s\n",signSource);
return signSource; return signSource;
} }
...@@ -170,7 +171,7 @@ int arrayToStr(unsigned char *buf, unsigned int buflen, char *out) ...@@ -170,7 +171,7 @@ int arrayToStr(unsigned char *buf, unsigned int buflen, char *out)
strncat(strBuf, pbuf, 2); strncat(strBuf, pbuf, 2);
} }
strncpy(out, strBuf, buflen * 2); strncpy(out, strBuf, buflen * 2);
printf("out = %s\n", out); INFO_PRINT("out = %s\n", out);
return buflen * 2; return buflen * 2;
} }
...@@ -207,10 +208,10 @@ static char * kk_create_register_info() ...@@ -207,10 +208,10 @@ static char * kk_create_register_info()
if (base64Out == NULL) { if (base64Out == NULL) {
return NULL; return NULL;
} }
printf("[%s][%d]sign_hex:%s\n",__FUNCTION__,__LINE__,sign_hex_str); INFO_PRINT("[%s][%d]sign_hex:%s\n",__FUNCTION__,__LINE__,sign_hex_str);
//memset(base64Out, 0, 128); //memset(base64Out, 0, 128);
//base64_encode(sign_hex_str,base64Out,strlen(sign_hex_str)); //base64_encode(sign_hex_str,base64Out,strlen(sign_hex_str));
printf("[%s][%d]base64Out:%s\n",__FUNCTION__,__LINE__,base64Out); INFO_PRINT("[%s][%d]base64Out:%s\n",__FUNCTION__,__LINE__,base64Out);
cJSON_AddStringToObject(root, "sign",sign_hex_str); cJSON_AddStringToObject(root, "sign",sign_hex_str);
cJSON_AddStringToObject(root, "random",KK_CCU_RANDOM); cJSON_AddStringToObject(root, "random",KK_CCU_RANDOM);
free(signSource); free(signSource);
...@@ -218,7 +219,7 @@ static char * kk_create_register_info() ...@@ -218,7 +219,7 @@ static char * kk_create_register_info()
out=cJSON_Print(root); out=cJSON_Print(root);
//cJSON_Minify(out); //cJSON_Minify(out);
cJSON_Delete(root); cJSON_Delete(root);
printf("--------------------->kk_create_register_info:%s\n",out); INFO_PRINT("--------------------->kk_create_register_info:%s\n",out);
return out; return out;
} }
char g_clientId[64] = {0}; char g_clientId[64] = {0};
...@@ -247,7 +248,7 @@ static char * kk_create_get_jwt_info() ...@@ -247,7 +248,7 @@ static char * kk_create_get_jwt_info()
out=cJSON_Print(root); out=cJSON_Print(root);
//cJSON_Minify(out); //cJSON_Minify(out);
cJSON_Delete(root); cJSON_Delete(root);
printf("--------------------->kk_create_get_jwt_info:%s\n",out); INFO_PRINT("--------------------->kk_create_get_jwt_info:%s\n",out);
return out; return out;
} }
static int kk_send_register_info(int sockfd,const char * path,int type) static int kk_send_register_info(int sockfd,const char * path,int type)
...@@ -278,7 +279,7 @@ static int kk_send_register_info(int sockfd,const char * path,int type) ...@@ -278,7 +279,7 @@ static int kk_send_register_info(int sockfd,const char * path,int type)
//str2的值为post的数据 //str2的值为post的数据
strcat(str1, str2); strcat(str1, str2);
strcat(str1, "\r\n\r\n"); strcat(str1, "\r\n\r\n");
printf("%s\n",str1); INFO_PRINT("%s\n",str1);
return write(sockfd,str1,strlen(str1)); return write(sockfd,str1,strlen(str1));
} }
int kk_start_ccu_register(void) int kk_start_ccu_register(void)
...@@ -290,30 +291,31 @@ int kk_start_ccu_register(void) ...@@ -290,30 +291,31 @@ int kk_start_ccu_register(void)
struct timeval tv; struct timeval tv;
int registerType = 0; int registerType = 0;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("---socket error!\n"); INFO_PRINT("---socket error!\n");
return -1; return -1;
}; };
bzero(&servaddr, sizeof(servaddr)); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT); servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){ if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0 ){
printf("--inet_pton error!\n"); INFO_PRINT("--inet_pton error!\n");
close(sockfd);
return -1; return -1;
}; };
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){ if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
printf("connect error!\n"); INFO_PRINT("connect error!\n");
close(sockfd);
return -1; return -1;
} }
printf("connect successful\n"); INFO_PRINT("connect successful\n");
ret = kk_send_register_info(sockfd,"/deviceRegister/register",0); ret = kk_send_register_info(sockfd,"/deviceRegister/register",0);
if (ret < 0) { if (ret < 0) {
printf("send fail\n"); INFO_PRINT("send fail\n");
close(sockfd); close(sockfd);
return -1; return -1;
}else{ }else{
printf("send success send %d bytes!\n\n", ret); INFO_PRINT("send success send %d bytes!\n\n", ret);
} }
registerType = 1; registerType = 1;
FD_ZERO(&t_set1); FD_ZERO(&t_set1);
...@@ -336,19 +338,19 @@ int kk_start_ccu_register(void) ...@@ -336,19 +338,19 @@ int kk_start_ccu_register(void)
close(sockfd); close(sockfd);
return -1; return -1;
} }
printf("\n get %s\n",buf); INFO_PRINT("\n get %s\n",buf);
if(registerType == 1){//get deviceSecret if(registerType == 1){//get deviceSecret
char* deviceSecret = strstr(buf,"deviceSecret"); char* deviceSecret = strstr(buf,"deviceSecret");
if(deviceSecret != NULL){ if(deviceSecret != NULL){
char* start = strchr(buf,'{'); char* start = strchr(buf,'{');
char* end = strrchr(buf,'}'); char* end = strrchr(buf,'}');
strncpy(buf2,start,end-start+1); strncpy(buf2,start,end-start+1);
printf("[%s][%d]buf2:%s\n",__FUNCTION__,__LINE__,buf2); INFO_PRINT("[%s][%d]buf2:%s\n",__FUNCTION__,__LINE__,buf2);
ret = kk_parse_deviceSecret(buf2); ret = kk_parse_deviceSecret(buf2);
if(ret == 0){ if(ret == 0){
ret = kk_send_register_info(sockfd,"/auth/generateJwt",1); ret = kk_send_register_info(sockfd,"/auth/generateJwt",1);
if (ret < 0) { if (ret < 0) {
printf("send fail'\n"); INFO_PRINT("send fail'\n");
close(sockfd); close(sockfd);
return -1; return -1;
}else{ }else{
......
...@@ -200,7 +200,7 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i ...@@ -200,7 +200,7 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i
case IPC_PLAT2MID: { case IPC_PLAT2MID: {
//创建2个通道 pipe和pub/sub //创建2个通道 pipe和pub/sub
char addr[30] = {0}; char addr[30] = {0};
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
loop_ctrl->ba.n = nn_socket(AF_SP, NN_PUSH); loop_ctrl->ba.n = nn_socket(AF_SP, NN_PUSH);
if (loop_ctrl->ba.n < 0) { if (loop_ctrl->ba.n < 0) {
ERROR_PRINT("loop_ctrl->ba.n =%d \r\n",loop_ctrl->ba.n); ERROR_PRINT("loop_ctrl->ba.n =%d \r\n",loop_ctrl->ba.n);
...@@ -214,9 +214,8 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i ...@@ -214,9 +214,8 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i
} }
sprintf(addr, GW2CCU_PIPE, ip); sprintf(addr, GW2CCU_PIPE, ip);
printf("---------addr:%s\n",addr);
if (nn_connect(loop_ctrl->ba.n, addr) < 0) {//pipe if (nn_connect(loop_ctrl->ba.n, addr) < 0) {//pipe
printf("[%s][%d]\n",__FUNCTION__,__LINE__); ERROR_PRINT("nn_connect error ---2\r\n");
return -1; return -1;
} }
//订阅 //订阅
...@@ -230,9 +229,8 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i ...@@ -230,9 +229,8 @@ int __nanomsg_init(Bloop_ctrl_t *loop_ctrl, ipc_type type,char* chlMark, char* i
memset(addr,0, sizeof(addr)); memset(addr,0, sizeof(addr));
sprintf(addr, GW2CCU_PUBSUB, ip); sprintf(addr, GW2CCU_PUBSUB, ip);
printf("---------addr:%s\n",addr);
if (nn_connect(loop_ctrl->ab.n, addr) < 0) {//sub if (nn_connect(loop_ctrl->ab.n, addr) < 0) {//sub
printf("[%s][%d]\n",__FUNCTION__,__LINE__); ERROR_PRINT("nn_connect error ---3\r\n");
return -1; return -1;
} }
......
...@@ -472,11 +472,13 @@ int dm_mgr_check_heartbeat_timeout(time_t timestamp) ...@@ -472,11 +472,13 @@ int dm_mgr_check_heartbeat_timeout(time_t timestamp)
if(search_node->devid == KK_DM_DEVICE_CCU_DEVICEID){ if(search_node->devid == KK_DM_DEVICE_CCU_DEVICEID){
continue; continue;
} }
//printf("[%s][%d]search_node->productCode:%s\n",__FUNCTION__,__LINE__,search_node->productCode); #if 0
//printf("[%s][%d]search_node->hb_timeout:%d\n",__FUNCTION__,__LINE__,search_node->hb_timeout); printf("[%s][%d]search_node->productCode:%s\n",__FUNCTION__,__LINE__,search_node->productCode);
//printf("[%s][%d]search_node->isOffline:%d\n",__FUNCTION__,__LINE__,search_node->isOffline); printf("[%s][%d]search_node->hb_timeout:%d\n",__FUNCTION__,__LINE__,search_node->hb_timeout);
//printf("[%s][%d]search_node->timestamp:%d\n",__FUNCTION__,__LINE__,search_node->timestamp); printf("[%s][%d]search_node->isOffline:%d\n",__FUNCTION__,__LINE__,search_node->isOffline);
//printf("[%s][%d]timestamp:%d\n",__FUNCTION__,__LINE__,timestamp); printf("[%s][%d]search_node->timestamp:%d\n",__FUNCTION__,__LINE__,search_node->timestamp);
printf("[%s][%d]timestamp:%d\n",__FUNCTION__,__LINE__,timestamp);
#endif
if((timestamp - search_node->timestamp) >= search_node->hb_timeout){ if((timestamp - search_node->timestamp) >= search_node->hb_timeout){
if(search_node->isOffline != KK_DEV_OFFLINE){ if(search_node->isOffline != KK_DEV_OFFLINE){
dm_mgr_set_dev_onoffline(search_node,1); dm_mgr_set_dev_onoffline(search_node,1);
...@@ -1289,6 +1291,7 @@ int dm_mgr_upstream_status_online(_IN_ int devid) ...@@ -1289,6 +1291,7 @@ int dm_mgr_upstream_status_online(_IN_ int devid)
if (res != SUCCESS_RETURN) { if (res != SUCCESS_RETURN) {
return FAIL_RETURN; return FAIL_RETURN;
} }
#if 0
if(strlen(node->fatherDeviceCode) > 0){ if(strlen(node->fatherDeviceCode) > 0){
res = dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node); res = dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node);
if (res != SUCCESS_RETURN) { if (res != SUCCESS_RETURN) {
...@@ -1298,7 +1301,9 @@ int dm_mgr_upstream_status_online(_IN_ int devid) ...@@ -1298,7 +1301,9 @@ int dm_mgr_upstream_status_online(_IN_ int devid)
memcpy(request.productCode,gw_node->productCode,strlen(gw_node->productCode)); memcpy(request.productCode,gw_node->productCode,strlen(gw_node->productCode));
memcpy(request.deviceCode,gw_node->deviceCode,strlen(gw_node->deviceCode)); memcpy(request.deviceCode,gw_node->deviceCode,strlen(gw_node->deviceCode));
}else{ }else
#endif
{
memcpy(request.productCode,node->productCode,strlen(node->productCode)); memcpy(request.productCode,node->productCode,strlen(node->productCode));
memcpy(request.deviceCode,node->deviceCode,strlen(node->deviceCode)); memcpy(request.deviceCode,node->deviceCode,strlen(node->deviceCode));
} }
...@@ -1353,16 +1358,17 @@ int dm_mgr_upstream_status_offline(_IN_ int devid) ...@@ -1353,16 +1358,17 @@ int dm_mgr_upstream_status_offline(_IN_ int devid)
if (res != SUCCESS_RETURN) { if (res != SUCCESS_RETURN) {
return FAIL_RETURN; return FAIL_RETURN;
} }
if(strlen(node->fatherDeviceCode) > 0){ //if(strlen(node->fatherDeviceCode) > 0){
res = dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node); //res = dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node);
if (res != SUCCESS_RETURN) { //if (res != SUCCESS_RETURN) {
ERROR_PRINT("ERROR [%s][%d] res:%d\n",__FUNCTION__,__LINE__,res); //ERROR_PRINT("ERROR [%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
return FAIL_RETURN; //return FAIL_RETURN;
} //}
memcpy(request.productCode,gw_node->productCode,strlen(gw_node->productCode)); //memcpy(request.productCode,gw_node->productCode,strlen(gw_node->productCode));
memcpy(request.deviceCode,gw_node->deviceCode,strlen(gw_node->deviceCode)); //memcpy(request.deviceCode,gw_node->deviceCode,strlen(gw_node->deviceCode));
}else{ //}else
{
memcpy(request.productCode,node->productCode,strlen(node->productCode)); memcpy(request.productCode,node->productCode,strlen(node->productCode));
memcpy(request.deviceCode,node->deviceCode,strlen(node->deviceCode)); memcpy(request.deviceCode,node->deviceCode,strlen(node->deviceCode));
} }
......
...@@ -986,7 +986,7 @@ int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params) ...@@ -986,7 +986,7 @@ int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params)
//memset(propertiesbuf[0],0x0,sizeof(propertiesbuf[0])); //memset(propertiesbuf[0],0x0,sizeof(propertiesbuf[0]));
//memcpy(propertiesbuf[0],property->identifier,strlen(property->identifier)); //memcpy(propertiesbuf[0],property->identifier,strlen(property->identifier));
//printf("propertiesbuf[0]:%s,num:%d\n",propertiesbuf[0],num); //printf("propertiesbuf[0]:%s,num:%d\n",propertiesbuf[0],num);
epNumInt = 1; //epNumInt = 1;
} }
propertyItem = cJSON_GetObjectItem(params, property->identifier); propertyItem = cJSON_GetObjectItem(params, property->identifier);
if(propertyItem != NULL){ if(propertyItem != NULL){
......
{
"schema": "https://iot-ap.ikonke.com/model/product_1002.json",
"productType": "switch",
"profile": {
"heartbeat": "3000",
"productCode": "1002",
"productName": "铂金系列一路灯控"
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}],
"identifier": "get",
"inputData": ["PowerSwitch"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}, {
"outputData": [],
"identifier": "negativeProperty",
"inputData": [{
"identifier": "PropertyName",
"dataType": {
"specs": {
"length": "50"
},
"type": "text"
},
"name": "属性名字"
}],
"method": "thing.service.negativeProperty",
"name": "negativeProperty",
"required": true,
"callType": "async",
"desc": "属性值取反"
}],
"properties": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关",
"accessMode": "rw",
"required": true
}],
"events": [{
"outputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1003.json",
"productType": "switch",
"profile": {
"heartbeat": "3000",
"productCode": "1003",
"productName": "铂金系列二路灯控"
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}],
"identifier": "get",
"inputData": ["PowerSwitch_1", "PowerSwitch_2"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}, {
"outputData": [],
"identifier": "negativeProperty",
"inputData": [{
"identifier": "PropertyName",
"dataType": {
"specs": {
"length": "50"
},
"type": "text"
},
"name": "属性名字"
}],
"method": "thing.service.negativeProperty",
"name": "negativeProperty",
"required": true,
"callType": "async",
"desc": "属性值取反"
}],
"properties": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路",
"accessMode": "rw",
"required": true
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路",
"accessMode": "rw",
"required": true
}],
"events": [{
"outputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1004.json",
"productType": "switch",
"profile": {
"heartbeat": "3000",
"productCode": "1004",
"productName": "铂金系列三路灯控 "
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}, {
"identifier": "PowerSwitch_3",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关3路"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}, {
"identifier": "PowerSwitch_3",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关3路"
}],
"identifier": "get",
"inputData": ["PowerSwitch_1", "PowerSwitch_2", "PowerSwitch_3"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}, {
"outputData": [],
"identifier": "negativeProperty",
"inputData": [{
"identifier": "PropertyName",
"dataType": {
"specs": {
"length": "50"
},
"type": "text"
},
"name": "属性名字"
}],
"method": "thing.service.negativeProperty",
"name": "negativeProperty",
"required": true,
"callType": "async",
"desc": "属性值取反"
}],
"properties": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路",
"accessMode": "rw",
"required": true
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路",
"accessMode": "rw",
"required": true
}, {
"identifier": "PowerSwitch_3",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关3路",
"accessMode": "rw",
"required": true
}],
"events": [{
"outputData": [{
"identifier": "PowerSwitch_1",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关1路"
}, {
"identifier": "PowerSwitch_2",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关2路"
}, {
"identifier": "PowerSwitch_3",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关3路"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1007.json",
"productType": "curtain",
"profile": {
"heartbeat": "3000",
"productCode": "1007",
"productName": "铂金系列推窗面板"
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启"
},
"type": "enum"
},
"name": "推窗器操作模式"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启"
},
"type": "enum"
},
"name": "推窗器操作模式"
}],
"identifier": "get",
"inputData": ["OperationMode"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启"
},
"type": "enum"
},
"name": "推窗器操作模式",
"accessMode": "rw",
"required": true
}],
"events": [{
"outputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启"
},
"type": "enum"
},
"name": "推窗器操作模式"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1008.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1008",
"productName": "铂金系列长供电SOS"
},
"services": [{
"outputData": [{
"identifier": "SosState",
"name": "紧急按钮状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "get",
"inputData": ["SosState", "Battery", "DismantleState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "SosState",
"name": "门磁状态",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"events": [{
"outputData": [{
"identifier": "SosState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}, {
"outputData": [{
"identifier": "SosState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}],
"identifier": "sosAlarm",
"method": "thing.event.sosAlarm.post",
"name": "sosAlarm",
"type": "alarm",
"required": true,
"desc": "紧急按钮告警"
}, {
"outputData": [{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "BatteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
}, {
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}]
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1012.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1012",
"productName": "铂金系列SOS按钮"
},
"services": [{
"outputData": [{
"identifier": "SosState",
"name": "紧急按钮状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "get",
"inputData": ["SosState", "Battery", "DismantleState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "SosState",
"name": "门磁状态",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"events": [{
"outputData": [{
"identifier": "SosState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}, {
"outputData": [{
"identifier": "SosState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}],
"identifier": "sosAlarm",
"method": "thing.event.sosAlarm.post",
"name": "sosAlarm",
"type": "alarm",
"required": true,
"desc": "紧急按钮告警"
}, {
"outputData": [{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "BatteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
}, {
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}]
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1015.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1015",
"productName": "KPL燃气报警器"
},
"services": [{
"outputData": [{
"identifier": "GasSensorState",
"name": "燃气检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "燃气泄漏"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "get",
"inputData": ["GasSensorState", "Battery", "DismantleState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "GasSensorState",
"name": "燃气检测状态",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "燃气泄漏"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"events": [{
"outputData": [{
"identifier": "GasSensorState",
"name": "燃气检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "燃气泄漏"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}, {
"outputData": [{
"identifier": "GasSensorState",
"name": "燃气检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "燃气泄漏"
}
}
}],
"identifier": "gasAlarm",
"method": "thing.event.gasAlarm.post",
"name": "gasAlarm",
"type": "alarm",
"required": true,
"desc": "燃气告警"
}, {
"outputData": [{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "batteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
}, {
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}]
}]
}
\ No newline at end of file
This diff is collapsed.
{
"schema": "https://iot-ap.ikonke.com/model/product_1018.json",
"productType": "curtain",
"profile": {
"heartbeat": "3000",
"productCode": "1018",
"productName": "杜亚窗帘电机"
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启",
"2": "暂停"
},
"type": "enum"
},
"name": "窗帘操作模式"
}, {
"identifier": "Position",
"dataType": {
"specs": {
"unit": "%",
"min": "0",
"unitName": "百分比",
"max": "100",
"step": "1"
},
"type": "int"
},
"name": "窗帘打开位置"
}, {
"identifier": "WorkMode",
"dataType": {
"specs": {
"0": "正转",
"1": "反转",
"2": "校验"
},
"type": "enum"
},
"name": "窗帘工作模式"
}, {
"identifier": "RouteState",
"dataType": {
"specs": {
"0": "未设置",
"1": "已设置"
},
"type": "enum"
},
"name": "行程设置"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启",
"2": "暂停"
},
"type": "enum"
},
"name": "窗帘操作模式"
}, {
"identifier": "Position",
"dataType": {
"specs": {
"unit": "%",
"min": "0",
"unitName": "百分比",
"max": "100",
"step": "1"
},
"type": "int"
},
"name": "窗帘打开位置"
}, {
"identifier": "WorkMode",
"dataType": {
"specs": {
"0": "正转",
"1": "反转",
"2": "校验"
},
"type": "enum"
},
"name": "窗帘工作模式"
}, {
"identifier": "RouteState",
"dataType": {
"specs": {
"0": "未设置",
"1": "已设置"
},
"type": "enum"
},
"name": "行程设置"
}],
"identifier": "get",
"inputData": ["OperationMode", "Position", "WorkMode", "RouteState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启",
"2": "暂停"
},
"type": "enum"
},
"name": "窗帘操作模式",
"accessMode": "rw",
"required": true
}, {
"identifier": "WorkMode",
"dataType": {
"specs": {
"0": "正转",
"1": "反转",
"2": "校验"
},
"type": "enum"
},
"name": "窗帘工作模式",
"accessMode": "rw",
"required": true
}, {
"identifier": "Position",
"dataType": {
"specs": {
"unit": "%",
"min": "0",
"unitName": "百分比",
"max": "100",
"step": "1"
},
"type": "int"
},
"name": "窗帘打开位置",
"accessMode": "rw",
"required": true
}, {
"identifier": "RouteState",
"dataType": {
"specs": {
"0": "未设置",
"1": "已设置"
},
"type": "enum"
},
"accessMode": "rw",
"required": true,
"name": "行程设置"
}],
"events": [{
"outputData": [{
"identifier": "OperationMode",
"dataType": {
"specs": {
"0": "关闭",
"1": "开启",
"2": "暂停"
},
"type": "enum"
},
"name": "窗帘操作模式"
}, {
"identifier": "Position",
"dataType": {
"specs": {
"unit": "%",
"min": "0",
"unitName": "百分比",
"max": "100",
"step": "1"
},
"type": "int"
},
"name": "窗帘打开位置"
}, {
"identifier": "WorkMode",
"dataType": {
"specs": {
"0": "正转",
"1": "反转",
"2": "校验"
},
"type": "enum"
},
"name": "窗帘工作模式"
}, {
"identifier": "RouteState",
"dataType": {
"specs": {
"0": "未设置",
"1": "已设置"
},
"type": "enum"
},
"name": "行程设置"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1020.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1020",
"productName": "环境传感器"
},
"services": [{
"outputData": [{
"identifier": "Temperature",
"name": "温度",
"dataType": {
"type": "double",
"specs": {
"min": "-40",
"max": "100",
"unit": "°C",
"unitName": "摄氏度",
"step": "0.01"
}
}
}, {
"identifier": "Humidity",
"name": "当前湿度",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "Illuminance",
"name": "光照度检测值",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "65535",
"unit": "Lux",
"unitName": "照度",
"step": "0.01"
}
}
}],
"identifier": "get",
"inputData": ["Temperature", "Humidity", "Illuminance"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}, {
"outputData": [],
"inputData": [],
"identifier": "PositioningDevice",
"method": "thing.service.PositioningDevice",
"name": "PositioningDevice",
"required": true,
"callType": "async",
"desc": "设备定位"
}],
"properties": [{
"identifier": "CurrentTemperature",
"name": "当前温度",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "-40",
"max": "80",
"unit": "°C",
"unitName": "摄氏度",
"step": "0.01"
}
}
}, {
"identifier": "CurrentHumidity",
"name": "当前湿度",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "Illuminance",
"name": "光照度检测值",
"accessMode": "r",
"required": true,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "65535",
"unit": "Lux",
"unitName": "照度",
"step": "0.01"
}
}
}, {
"identifier": "Illuminance",
"name": "仅用于光照作为场景触发条件",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"1": "黑夜[0~10]",
"2": "暗淡(10,100]",
"3": "正常(100,500]",
"4": "明亮(>500)"
}
}
}],
"events": [{
"outputData": [{
"identifier": "Temperature",
"name": "温度",
"dataType": {
"type": "double",
"specs": {
"min": "-40",
"max": "100",
"unit": "°C",
"unitName": "摄氏度",
"step": "0.01"
}
}
}, {
"identifier": "Humidity",
"name": "当前湿度",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "Illuminance",
"name": "光照度检测值",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "65535",
"unit": "Lux",
"unitName": "照度",
"step": "0.01"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1022.json",
"productType": "light",
"profile": {
"heartbeat": "3000",
"productCode": "1022",
"productName": "RGBW灯带"
},
"services": [{
"outputData": [],
"identifier": "set",
"inputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}, {
"identifier": "RGBColor",
"dataType": {
"type": "struct",
"specs": [{
"identifier": "Red",
"name": "红色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Green",
"name": "绿色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Blue",
"name": "蓝色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}]
},
"name": "RGB调色"
}, {
"identifier": "Brightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "亮度"
}, {
"identifier": "WhiteBrightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "白光亮度"
}, {
"identifier": "Mode",
"dataType": {
"type": "enum",
"specs": {
"1": "模式1",
"2": "模式2",
"3": "模式3",
"4": "模式4",
"5": "模式5",
"6": "模式6",
"7": "模式7",
"8": "模式8",
"9": "模式9",
"10": "模式10",
"11": "模式11",
"12": "模式12"
}
},
"name": "模式"
}],
"method": "thing.service.property.set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置"
}, {
"outputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}, {
"identifier": "RGBColor",
"dataType": {
"type": "struct",
"specs": [{
"identifier": "Red",
"name": "红色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Green",
"name": "绿色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Blue",
"name": "蓝色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}]
},
"name": "RGB调色"
}, {
"identifier": "brightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "亮度"
}, {
"identifier": "whiteBrightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "白光亮度"
}, {
"identifier": "Mode",
"dataType": {
"type": "enum",
"specs": {
"1": "模式1",
"2": "模式2",
"3": "模式3",
"4": "模式4",
"5": "模式5",
"6": "模式6",
"7": "模式7",
"8": "模式8",
"9": "模式9",
"10": "模式10",
"11": "模式11",
"12": "模式12"
}
},
"name": "模式"
}, {
"identifier": "ModeType",
"dataType": {
"type": "enum",
"specs": {
"MANUALMODE": "手动",
"PICKEDMODE": "精选",
"DYNAMICMODE": "动态"
}
},
"name": "模式类型"
}],
"identifier": "get",
"inputData": ["PowerSwitch", "RGBColor", "Brightness", "WhiteBrightness", "Mode", "ModeType"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关",
"accessMode": "rw",
"required": true
}, {
"identifier": "RGBColor",
"name": "RGB调色",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "struct",
"specs": [{
"identifier": "Red",
"name": "红色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Green",
"name": "绿色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Blue",
"name": "蓝色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}]
}
}, {
"identifier": "Brightness",
"name": "亮度",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
}, {
"identifier": "WhiteBrightness",
"name": "白光亮度",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
}, {
"identifier": "Mode",
"name": "模式",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"1": "模式1",
"2": "模式2",
"3": "模式3",
"4": "模式4",
"5": "模式5",
"6": "模式6",
"7": "模式7",
"8": "模式8",
"9": "模式9",
"10": "模式10",
"11": "模式11",
"12": "模式12"
}
}
}, {
"identifier": "ModeType",
"accessMode": "w",
"required": false,
"name": "模式类型",
"dataType": {
"type": "enum",
"specs": {
"MANUALMODE": "手动",
"PICKEDMODE": "精选",
"DYNAMICMODE": "动态"
}
}
}],
"events": [{
"outputData": [{
"identifier": "PowerSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "电源开关"
}, {
"identifier": "RGBColor",
"dataType": {
"type": "struct",
"specs": [{
"identifier": "Red",
"name": "红色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Green",
"name": "绿色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}, {
"identifier": "Blue",
"name": "蓝色",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "255",
"unitName": "无",
"step": "1"
}
}
}]
},
"name": "RGB调色"
}, {
"identifier": "Brightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "亮度"
}, {
"identifier": "WhiteBrightness",
"dataType": {
"type": "int",
"specs": {
"min": "1",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "白光亮度"
}, {
"identifier": "Mode",
"dataType": {
"type": "enum",
"specs": {
"1": "模式1",
"2": "模式2",
"3": "模式3",
"4": "模式4",
"5": "模式5",
"6": "模式6",
"7": "模式7",
"8": "模式8",
"9": "模式9",
"10": "模式10",
"11": "模式11",
"12": "模式12"
}
},
"name": "模式"
}, {
"identifier": "ModeType",
"dataType": {
"type": "enum",
"specs": {
"MANUALMODE": "手动",
"PICKEDMODE": "精选",
"DYNAMICMODE": "动态"
}
},
"name": "模式类型"
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1023.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1023",
"productName": "KPL门磁"
},
"services": [{
"outputData": [{
"identifier": "ContactState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "get",
"inputData": ["ContactState", "Battery", "DismantleState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "ContactState",
"name": "门磁状态",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"events": [{
"outputData": [{
"identifier": "ContactState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}, {
"outputData": [{
"identifier": "ContactState",
"name": "门磁状态",
"dataType": {
"type": "enum",
"specs": {
"0": "关闭",
"1": "打开"
}
}
}],
"identifier": "contactAlarm",
"method": "thing.event.contactAlarm.post",
"name": "contactAlarm",
"type": "alarm",
"required": true,
"desc": "门磁告警"
}, {
"outputData": [{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "BatteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
}, {
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}]
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1024.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1024",
"productName": "KPL水浸"
},
"services": [{
"outputData": [{
"identifier": "WaterSensorState",
"name": "水浸检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "有水浸入"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "get",
"inputData": ["WaterSensorState", "Battery", "DismantleState"],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}],
"properties": [{
"identifier": "WaterSensorState",
"name": "水浸检测状态",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "有水浸入"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"events": [{
"outputData": [{
"identifier": "WaterSensorState",
"name": "水浸检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "有水浸入"
}
}
}, {
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}, {
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
}, {
"outputData": [{
"identifier": "WaterSensorState",
"name": "水浸检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "有水浸入"
}
}
}],
"identifier": "waterAlarm",
"method": "thing.event.waterAlarm.post",
"name": "waterAlarm",
"type": "alarm",
"required": true,
"desc": "水浸告警"
}, {
"outputData": [{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "BatteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
}, {
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}]
}]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1028.json",
"productType": "controller",
"profile": {
"heartbeat": "3000",
"productCode": "1028",
"productName": "断水面板(电磁水阀控制器)"
},
"services": [
{
"identifier": "set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置",
"method": "thing.service.property.set",
"inputData": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"dataType": {
"type": "bool",
"specs": {
"0": "关闭",
"1": "开启"
}
}
}
],
"outputData": []
},
{
"identifier": "get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取",
"method": "thing.service.property.get",
"inputData": [],
"outputData": []
}
],
"properties": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"accessMode": "w",
"required": true,
"dataType": {
"type": "bool",
"specs": {
"0": "关闭",
"1": "开启"
}
}
}
],
"events": [
{
"identifier": "post",
"name": "post",
"type": "info",
"required": true,
"desc": "属性上报",
"method": "thing.event.property.post",
"outputData": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"dataType": {
"type": "bool",
"specs": {
"0": "关闭",
"1": "开启"
}
}
}
]
}
]
}
\ No newline at end of file
{
"schema": "https://iot-ap.ikonke.com/model/product_1029.json",
"productType": "controller",
"profile": {
"heartbeat": "3000",
"productCode": "1029",
"productName": "燃气机械臂控制器"
},
"services": [
{
"identifier": "set",
"name": "set",
"required": true,
"callType": "async",
"desc": "属性设置",
"method": "thing.service.property.set",
"inputData": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"dataType": {
"type": "bool",
"specs": {
"0": "关闭"
}
}
}
],
"outputData": []
},
{
"identifier": "get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取",
"method": "thing.service.property.get",
"inputData": [],
"outputData": []
}
],
"properties": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"accessMode": "w",
"required": true,
"dataType": {
"type": "bool",
"specs": {
"0": "关闭"
}
}
}
],
"events": [
{
"identifier": "post",
"name": "post",
"type": "info",
"required": true,
"desc": "属性上报",
"method": "thing.event.property.post",
"outputData": [
{
"identifier": "PowerSwitch",
"name": "电源开关",
"dataType": {
"type": "bool",
"specs": {
"0": "关闭"
}
}
}
]
}
]
}
\ No newline at end of file
This diff is collapsed.
{
"schema": "https://iot-ap.ikonke.com/model/product_1035.json",
"productType": "sensor",
"profile": {
"heartbeat": "3000",
"productCode": "1035",
"productName": "kit silicon labs 人体感应"
},
"services": [
{
"outputData": [
{
"identifier": "MotionAlarmState",
"name": "红外检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "无人",
"1": "有人"
}
}
},
{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
},
{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}
],
"identifier": "get",
"inputData": [
"MotionAlarmState",
"Battery",
"DismantleState"
],
"method": "thing.service.property.get",
"name": "get",
"required": true,
"callType": "async",
"desc": "属性获取"
}
],
"properties": [
{
"identifier": "MotionAlarmState",
"name": "红外检测状态(2~7仅用于场景)",
"accessMode": "r",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "不触发",
"1": "触发",
"2": "智能有人",
"3": "智能无人_2分钟",
"4": "智能无人_5分钟",
"5": "智能无人_10分钟",
"6": "智能无人_15分钟",
"7": "智能无人_30分钟"
}
}
},
{
"identifier": "Battery",
"name": "电池电量",
"accessMode": "r",
"required": false,
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
},
{
"identifier": "DismantleState",
"name": "拆卸状态",
"accessMode": "r",
"required": false,
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}
],
"events": [
{
"outputData": [
{
"identifier": "MotionAlarmState",
"name": "红外检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "无人",
"1": "有人"
}
}
},
{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
},
{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}
],
"identifier": "property",
"method": "thing.event.property.post",
"name": "property",
"type": "info",
"required": true,
"desc": "属性上报"
},
{
"outputData": [
{
"identifier": "MotionAlarmState",
"name": "红外检测状态",
"dataType": {
"type": "enum",
"specs": {
"0": "无人",
"1": "有人"
}
}
}
],
"identifier": "motionAlarm",
"method": "thing.event.motionAlarm.post",
"name": "motionAlarm",
"type": "alarm",
"required": true,
"desc": "红外检测告警"
},
{
"outputData": [
{
"identifier": "Battery",
"name": "电池电量",
"dataType": {
"type": "double",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "0.01"
}
}
}
],
"identifier": "BatteryAlarm",
"method": "thing.event.BatteryAlarm.post",
"name": "BatteryAlarm",
"type": "alarm",
"required": true,
"desc": "低电量告警"
},
{
"identifier": "TamperAlarm",
"name": "防撬报警",
"type": "alert",
"required": true,
"method": "thing.event.TamperAlarm.post",
"outputData": [
{
"identifier": "DismantleState",
"name": "拆卸状态",
"dataType": {
"type": "enum",
"specs": {
"0": "正常",
"1": "被拆卸"
}
}
}
]
}
]
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
{ {
"outputData": [ "outputData": [
{ {
"identifier": "SceneId", "identifier": "SceneNum",
"dataType": { "dataType": {
"specs": { "specs": {
"1": "场景1", "1": "场景1",
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3014.json", "schema": "https://iot-ap.ikonke.com/model/product_3014.json",
"productType": "scene", "productType": "scene",
"version": "1", "version": "1.0",
"profile": { "profile": {
"heartbeat": "1200", "heartbeat": "1200",
"productCode": "3014", "productCode": "3014",
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3015.json", "schema": "https://iot-ap.ikonke.com/model/product_3015.json",
"productType": "sensor", "productType": "sensor",
"version": "1", "version": "1.0",
"profile": { "profile": {
"heartbeat": "300", "heartbeat": "300",
"productCode": "3015", "productCode": "3015",
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3016.json", "schema": "https://iot-ap.ikonke.com/model/product_3016.json",
"productType": "sensor", "productType": "sensor",
"version": "1", "version": "1.0",
"profile": { "profile": {
"heartbeat": "1200", "heartbeat": "1200",
"productCode": "3016", "productCode": "3016",
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"profile": { "profile": {
"heartbeat": "300", "heartbeat": "300",
"productCode": "3028", "productCode": "3028",
"productName": "肖邦系列.白色零火线调光面板Z3S(KONKE)" "productName": "肖邦系列.零火线调光面板Z3S(KONKE)"
}, },
"services": [ "services": [
{ {
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3029.json", "schema": "https://iot-ap.ikonke.com/model/product_3029.json",
"productType": "floorHeating", "productType": "floorHeating",
"version": "1.0",
"profile": { "profile": {
"heartbeat": "300", "heartbeat": "300",
"productCode": "3029", "productCode": "3029",
"productName": "肖邦系列.白色水地暖面板Z3S(KONKE)" "productName": "肖邦系列.水地暖面板Z3S(KONKE)"
}, },
"services": [ "services": [
{ {
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3039.json", "schema": "https://iot-ap.ikonke.com/model/product_3039.json",
"productType": "sensor", "productType": "sensor",
"version": "1", "version": "1.1",
"profile": { "profile": {
"heartbeat": "1200", "heartbeat": "1200",
"productCode": "3039", "productCode": "3039",
...@@ -78,6 +78,21 @@ ...@@ -78,6 +78,21 @@
"step": "0.01" "step": "0.01"
} }
} }
},
{
"identifier": "SensorType",
"name": "安防等级",
"accessMode": "rw",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "在家安防",
"1": "室外安防",
"2": "24小时警戒",
"3": "无警戒"
}
}
} }
], ],
"events": [ "events": [
......
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3040.json", "schema": "https://iot-ap.ikonke.com/model/product_3040.json",
"productType": "sensor", "productType": "sensor",
"version": "1", "version": "1.1",
"profile": { "profile": {
"heartbeat": "300", "heartbeat": "300",
"productCode": "3040", "productCode": "3040",
...@@ -71,6 +71,21 @@ ...@@ -71,6 +71,21 @@
"1": "故障" "1": "故障"
} }
} }
},
{
"identifier": "SensorType",
"name": "安防等级",
"accessMode": "rw",
"required": true,
"dataType": {
"type": "enum",
"specs": {
"0": "在家安防",
"1": "室外安防",
"2": "24小时警戒",
"3": "无警戒"
}
}
} }
], ],
"events": [ "events": [
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{ {
"schema": "https://iot-ap.ikonke.com/model/product_3046.json", "schema": "https://iot-ap.ikonke.com/model/product_3046.json",
"productType": "scene", "productType": "scene",
"version": "1", "version": "1.0",
"profile": { "profile": {
"heartbeat": "7200", "heartbeat": "7200",
"productCode": "3046", "productCode": "3046",
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment