Commit 97abaac5 authored by chen.weican's avatar chen.weican

【修改内容】1,增加移动安防类设备到待分配后需要恢复成默认安防等级问题修改,2,创建场景,触发条件选择温度、湿度或者光照在有变化的情况下才再一次触发

【提交人】陈伟灿
parent 7643c68c
1.4.9
\ No newline at end of file
1.4.10
\ No newline at end of file
......@@ -17,7 +17,7 @@ const char KK_URI_SYS_PREFIX_EX[] = "biz/newkk/%s/%s";
const char KK_URI_OTA_PREFIX[] = "ota/device/%s/%s/upgrade";
const char KK_URI_OTA_PROCESS[] = "ota/device/%s/%s/progress";
const char KK_URI_OTA_REPLY[] = "ota/device/%s/%s/upgrade_reply";
//#define NEW_TOPIC_RULE
static int s_gw_status = DEVICE_OFFLINE;
int kk_set_gw_status(int status)
{
......@@ -36,7 +36,9 @@ int KK_Subdev_Subscribe(const cJSON *root)
cJSON *data = NULL;
//cJSON *cmd = NULL;
int url_len = 0;
char ccuid[32] = {0};
char dcodeCcuid[64] = {0};
KK_Get_ccuid(ccuid);
data = cJSON_GetObjectItem(root, "data");
if(data == NULL){
return -1;
......@@ -48,35 +50,44 @@ int KK_Subdev_Subscribe(const cJSON *root)
productCode = cJSON_GetObjectItem(data,MSG_PRODUCT_CODE_STR);
if(productCode == NULL){
return -1;
}
url_len = strlen(KK_URI_SYS_PREFIX) + strlen(productCode->valuestring) + strlen(deviceCode->valuestring) + 1;
}
if(strcmp(deviceCode->valuestring,ccuid) == 0){//主机的topic
sprintf(dcodeCcuid,"%s",deviceCode->valuestring);
}else{
#ifdef NEW_TOPIC_RULE
sprintf(dcodeCcuid,"%s_%s",ccuid,deviceCode->valuestring);
#else
sprintf(dcodeCcuid,"%s",deviceCode->valuestring);
#endif
}
url_len = strlen(KK_URI_SYS_PREFIX) + strlen(productCode->valuestring) + strlen(dcodeCcuid) + 1;
char *url = malloc(url_len);
if (url == NULL) {
return -1;
}
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_OTA_PREFIX, productCode->valuestring, deviceCode->valuestring);
snprintf(url, url_len, KK_URI_OTA_PREFIX, productCode->valuestring, dcodeCcuid);
INFO_PRINT("ota [%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_SYS_PREFIX_GET, productCode->valuestring, deviceCode->valuestring);
snprintf(url, url_len, KK_URI_SYS_PREFIX_GET, productCode->valuestring, dcodeCcuid);
INFO_PRINT("sys [%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_SYS_PREFIX, productCode->valuestring, deviceCode->valuestring);
snprintf(url, url_len, KK_URI_SYS_PREFIX, productCode->valuestring, dcodeCcuid);
INFO_PRINT("sys [%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_SYS_PREFIX_SERVICE, productCode->valuestring, deviceCode->valuestring);
snprintf(url, url_len, KK_URI_SYS_PREFIX_SERVICE, productCode->valuestring, dcodeCcuid);
INFO_PRINT("sys [%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
memset(url, 0, url_len);
snprintf(url, url_len, KK_URI_SYS_PREFIX_TOPO_CHANGE, productCode->valuestring, deviceCode->valuestring);
snprintf(url, url_len, KK_URI_SYS_PREFIX_TOPO_CHANGE, productCode->valuestring, dcodeCcuid);
INFO_PRINT("sys [%s][%d] URL:%s\n",__FUNCTION__,__LINE__,url);
res = KK_MQTT_SubTopic(url);
free(url);
......@@ -136,21 +147,32 @@ int KK_CCU_TOPIC_Subscribe(void)
static int _kk_utils_topic(_IN_ const char *name, _IN_ char *product_code,
_IN_ char *device_code, _OU_ char **topic)
{
char ccuid[32] = {0};
char dcodeCcuid[64] = {0};
int service_name_len = 0;
if (name == NULL|| product_code == NULL || device_code == NULL ||
topic == NULL || *topic != NULL) {
return -1;
}
service_name_len = strlen(KK_URI_SYS_PREFIX_EX) + strlen(product_code) + strlen(device_code)
KK_Get_ccuid(ccuid);
if(strcmp(device_code,ccuid) == 0){//主机的topic
sprintf(dcodeCcuid,"%s",device_code);
}else{
#ifdef NEW_TOPIC_RULE
sprintf(dcodeCcuid,"%s_%s",ccuid,device_code);
#else
sprintf(dcodeCcuid,"%s",device_code);
#endif
}
service_name_len = strlen(KK_URI_SYS_PREFIX_EX) + strlen(product_code) + strlen(dcodeCcuid)
+ strlen(name)+1;
*topic = malloc(service_name_len);
if (*topic == NULL) {
return -1;
}
memset(*topic, 0, service_name_len);
snprintf(*topic, service_name_len, KK_URI_SYS_PREFIX_EX, product_code, device_code);
snprintf(*topic, service_name_len, KK_URI_SYS_PREFIX_EX, product_code, dcodeCcuid);
if (name != NULL) {
memcpy(*topic + strlen(*topic), name, strlen(name));
}
......@@ -160,57 +182,86 @@ static int _kk_utils_topic(_IN_ const char *name, _IN_ char *product_code,
static int _kk_utils_topic_ota_process(_IN_ char* product_code,_IN_ char* device_code, _OU_ char **topic)
{
int service_name_len = 0;
char ccuid[32] = {0};
char dcodeCcuid[64] = {0};
KK_Get_ccuid(ccuid);
if (product_code == NULL || device_code == NULL ||
topic == NULL || *topic != NULL) {
return -1;
}
service_name_len = strlen(KK_URI_OTA_PROCESS) + strlen(product_code) + strlen(device_code) +1;
if(strcmp(device_code,ccuid) == 0){//主机的topic
sprintf(dcodeCcuid,"%s",device_code);
}else{
#ifdef NEW_TOPIC_RULE
sprintf(dcodeCcuid,"%s_%s",ccuid,device_code);
#else
sprintf(dcodeCcuid,"%s",device_code);
#endif
}
service_name_len = strlen(KK_URI_OTA_PROCESS) + strlen(product_code) + strlen(dcodeCcuid) +1;
*topic = malloc(service_name_len);
if (*topic == NULL) {
return -1;
}
memset(*topic, 0, service_name_len);
snprintf(*topic, service_name_len, KK_URI_OTA_PROCESS, product_code, device_code);
snprintf(*topic, service_name_len, KK_URI_OTA_PROCESS, product_code, dcodeCcuid);
return 0;
}
static int _kk_utils_topic_upgrade_reply(_IN_ char* product_code,_IN_ char* device_code, _OU_ char **topic)
{
int service_name_len = 0;
char ccuid[32] = {0};
char dcodeCcuid[64] = {0};
KK_Get_ccuid(ccuid);
if (product_code == NULL || device_code == NULL ||
topic == NULL || *topic != NULL) {
return -1;
}
service_name_len = strlen(KK_URI_OTA_REPLY) + strlen(product_code) + strlen(device_code) +1;
if(strcmp(device_code,ccuid) == 0){//主机的topic
sprintf(dcodeCcuid,"%s",device_code);
}else{
#ifdef NEW_TOPIC_RULE
sprintf(dcodeCcuid,"%s_%s",ccuid,device_code);
#else
sprintf(dcodeCcuid,"%s",device_code);
#endif
}
service_name_len = strlen(KK_URI_OTA_REPLY) + strlen(product_code) + strlen(dcodeCcuid) +1;
*topic = malloc(service_name_len);
if (*topic == NULL) {
return -1;
}
memset(*topic, 0, service_name_len);
snprintf(*topic, service_name_len, KK_URI_OTA_REPLY, product_code, device_code);
snprintf(*topic, service_name_len, KK_URI_OTA_REPLY, product_code, dcodeCcuid);
return 0;
}
int KK_Subdev_UnSubscribe_By_DeviceCode(const char *deviceCode,const char *productCode )
{
char *topic = NULL;
int topic_len = 0;
topic_len = strlen(KK_URI_SYS_PREFIX) + strlen(productCode)+strlen(deviceCode) + 1;
char ccuid[32] = {0};
char dcodeCcuid[64] = {0};
KK_Get_ccuid(ccuid);
#ifdef NEW_TOPIC_RULE
sprintf(dcodeCcuid,"%s_%s",ccuid,deviceCode);
#else
sprintf(dcodeCcuid,"%s",deviceCode);
#endif
topic_len = strlen(KK_URI_SYS_PREFIX) + strlen(productCode)+strlen(dcodeCcuid) + 1;
topic = malloc(topic_len);
if (topic == NULL) {
return -1;
}
memset(topic,0,topic_len);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX, productCode,deviceCode);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX, productCode,dcodeCcuid);
INFO_PRINT("[%s][%d] TOPIC:%s\n",__FUNCTION__,__LINE__,topic);
KK_MQTT_UnsubTopic(topic);
memset(topic,0,topic_len);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX_SERVICE, productCode,deviceCode);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX_SERVICE, productCode,dcodeCcuid);
INFO_PRINT("[%s][%d] TOPIC:%s\n",__FUNCTION__,__LINE__,topic);
KK_MQTT_UnsubTopic(topic);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX_TOPO_CHANGE, productCode,deviceCode);
snprintf(topic, topic_len, KK_URI_SYS_PREFIX_TOPO_CHANGE, productCode,dcodeCcuid);
INFO_PRINT("[%s][%d] TOPIC:%s\n",__FUNCTION__,__LINE__,topic);
KK_MQTT_UnsubTopic(topic);
free(topic);
......
......@@ -414,7 +414,6 @@ cJSON *map_type_convert(cJSON *s_dataType,cJSON *s_valueRange,cJSON *value,cJSON
strcmp(s_dataType->valuestring,"int")==0) {
if(rlt->valueint == value->valueint) {
args = cJSON_GetArrayItem(d_valueRange,j);
printf("222:%s\n",cJSON_Print(args));
break ;
}
}else if(strcmp(s_dataType->valuestring,"double")==0){
......@@ -525,16 +524,11 @@ int kk_lan_add_val_to_obj(cJSON *obj,cJSON *val,const char *id)
int kk_lan_replace_val_to_obj(cJSON *obj,cJSON *val,const char *id)
{
char *pVal = NULL;
if(id==NULL||obj==NULL||obj->type!=cJSON_Object||val==NULL){
debug_log(LOG_DEBUG_LEVEL,"[err] para.\n");
return -1;
}
pVal = cJSON_Print(val);
//debug_log(LOG_DEBUG_LEVEL,"[replace] id=%s,type=%d,val=%s.\n",id,val->type,pVal);
free(pVal);
if(val->type==cJSON_False){
cJSON_ReplaceItemInObject(obj, id, cJSON_CreateFalse());
}else if(val->type==cJSON_True){
......
......@@ -515,8 +515,11 @@ cJSON *_kk_sync_devicestatus_arg_build(kk_map_dev_node_t *node,int ch)
//todo:
if(strcmp(synType->valuestring,"timing_shutdown")==0) {
cJSON *syn_obj = cJSON_CreateObject();
double t=cJSON_GetObjectItem(newccuItem,"value")->valuedouble;
cJSON *valueStr = cJSON_GetObjectItem(newccuItem,"value");
if(valueStr == NULL){
continue;
}
double t=valueStr->valuedouble;
char buff[32]={0};
snprintf(buff,32,"%f",t);
......@@ -761,7 +764,6 @@ static int _kk_guard_sensors_build(cJSON *guard_sensors,int num,SYN_GUARD_SENSOR
if(num<=0 || sensors==NULL){
return -1;
}
pSensor = sensors;
for(i=0;i<num;i++,pSensor++){
cJSON *item = cJSON_CreateObject();
......@@ -772,8 +774,6 @@ static int _kk_guard_sensors_build(cJSON *guard_sensors,int num,SYN_GUARD_SENSOR
return 0;
}
int kk_sync_guard_to_sdk(cJSON *root,cJSON *data)
{
char *armingStr = NULL;
......@@ -788,7 +788,6 @@ int kk_sync_guard_to_sdk(cJSON *root,cJSON *data)
cJSON_AddStringToObject(guard, "arming_status", "1");
cJSON_AddItemToObject(guard,"custom_guard_zone",custom_guard_zone);
cJSON_AddItemToObject(guard,"guard_sensors",guard_sensors);
cJSON_AddItemToObject(root, "guard", guard);
if(properties==NULL||properties->type!=cJSON_Object){
......@@ -933,7 +932,7 @@ static int kk_get_ac_indoor_info_by_deviceCode(cJSON *data,char *pdeviceCode,cha
new_dev_item g_new_item[16] = {0};
new_dev_item g_new_item[64] = {0};
CENTRAL_AC_INDOOR_ITEM *g_indoor_item = NULL;
int g_newgw_count = 0;
int g_indoor_count = 0;
......
......@@ -75,7 +75,7 @@ cJSON * val_conver_new2old(cJSON *newccuItem,cJSON *oldccuItem,int syn_type)
{
cJSON *n_value = NULL,*n_dataType = NULL,*o_dataType = NULL;
cJSON *o_valueRange = NULL,*n_valueRange = NULL;
if(newccuItem==NULL||newccuItem->type!=cJSON_Object||
oldccuItem==NULL||oldccuItem->type!=cJSON_Object){
debug_log(LOG_DEBUG_LEVEL,"[err] para.\n");
......@@ -143,11 +143,9 @@ static int _kk_lan_update_device_status(int nodeId,cJSON *opcode,cJSON *arg,cons
send_msg_to_module(msg);
cJSON_Delete(msg);
}
return 0;
}
static int _kk_lan_check_channel(cJSON *channelObj,cJSON *epNumObj)
{
int channel = -1;
......@@ -195,7 +193,6 @@ static int _kk_lan_check_channel(cJSON *channelObj,cJSON *epNumObj)
return channel;
}
static int _kk_lan_sync_device_status(const char *deviceCode,kk_map_dev_node_t *devNode,int ch)
{
cJSON *msg = NULL;
......
......@@ -111,16 +111,20 @@
#define GET_PRODUCTID_CMD "fw_printenv pid -n"
#endif
#define KK_DEVICESECRET_PATH_SUB "kk/kk_deviceSecret.txt"
#define KK_TOKEN_PATH_SUB "kk/kk_token.txt"
#define KK_DEVICE_MAP_FILE_PATH_SUB "kk/map/device_%s.json"
#ifdef CONFIG_NDK
#define KK_VIRTUAL_FILE_DB "kk/kk_virtual.db"
#define KK_DB_FILE_SUB "kk/kk_database.db"
#define KK_LAN_NODE_DB_FILE_SUB "kk/kk_lan_node.db"
#elif CONFIG_A133_PLATFORM
#define KK_VIRTUAL_FILE_DB "kk/db/kk_virtual.db"
#define KK_DB_FILE_SUB "kk/db/kk_database.db"
#define KK_LAN_NODE_DB_FILE_SUB "kk/db/kk_lan_node.db"
#else
#define KK_VIRTUAL_FILE_DB "kk/kk_virtual.db"
#define KK_DB_FILE_SUB "kk/kk_database.db"
#define KK_LAN_NODE_DB_FILE_SUB "kk/kk_lan_node.db"
#endif
......
......@@ -423,8 +423,9 @@ int kk_topo_delete_handle(cJSON *payload,cJSON *buf)
}
cJSON * item = deviceArray->child;
while(item != NULL){
char *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR)->valuestring;
res = dm_mgr_get_device_by_devicecode(deviceCode, &node);
cJSON *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR);
if(deviceCode == NULL){continue;}
res = dm_mgr_get_device_by_devicecode(deviceCode->valuestring, &node);
if (res < SUCCESS_RETURN) {
ERROR_PRINT("dm_mgr_search_device_by_pkdn failed");
//kk_topo_delete_report(paramStr);//补报topo delete
......@@ -447,9 +448,9 @@ int kk_topo_delete_handle(cJSON *payload,cJSON *buf)
cJSON_AddItemToObject(rootData,"payload",cJSON_Parse(payload11));
char *pnewout=cJSON_Print(rootData);
kk_sendData2gw(pnewout, strlen(pnewout), node->fatherDeviceCode);//send to gw itself
kk_scene_delete_action_by_deviceCode(deviceCode);
kk_scene_rebuild_device_active(deviceCode,-1);
dm_mgr_subdev_delete(deviceCode);
kk_scene_delete_action_by_deviceCode(deviceCode->valuestring);
kk_scene_rebuild_device_active(deviceCode->valuestring,-1);
dm_mgr_subdev_delete(deviceCode->valuestring);
free(pnewout);
free(payload11);
cJSON_Delete(rootData);
......@@ -794,6 +795,33 @@ static int kk_service_addDeviceToRoom_handle(cJSON *params)
kk_scene_productType_handle(node->productType);
return NO_ERROR;
}
static int _kk_reset_SensorType(char *deviceCode)
{
int res = 0;
int level = 0;
char tmpValue[16] = {0};
dm_mgr_dev_node_t *node = NULL;
if(deviceCode == NULL){
return INVALID_PARAMETER;
}
res = dm_mgr_get_device_by_devicecode((char*)deviceCode, &node);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
if(strcmp(node->productType ,"sensor") == 0){
if(kk_check_human_induction_device(node->productCode) == 1 || //门磁和人体默认室外安防
kk_check_door_induction_device(node->productCode) == 1){
level = 1;
kk_tsl_set_value(kk_tsl_set_property_value,node->dev_shadow,"SensorType",&level,NULL);
}else{
level = 2;
kk_tsl_set_value(kk_tsl_set_property_value,node->dev_shadow,"SensorType",&level,NULL);//其他24小时警戒
}
sprintf(tmpValue,"%d",level);
kk_property_db_update_value(deviceCode,"SensorType",tmpValue);
}
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:删除设备从房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含设备deviceCode
......@@ -804,7 +832,7 @@ static int kk_service_addDeviceToRoom_handle(cJSON *params)
static int kk_service_removeDeviceFromRoom_handle(cJSON *params)
{
char epNumStr[10] = {0};
if(params == NULL){
return DEVICE_PARAM_ERR;
}
......@@ -822,6 +850,7 @@ static int kk_service_removeDeviceFromRoom_handle(cJSON *params)
kk_room_dev_remove(deviceCode->valuestring,epNumStr);
kk_scene_update_device_active(deviceCode->valuestring,atoi(epNumStr),0);
kk_scene_rebuild_device_active(deviceCode->valuestring,atoi(epNumStr));
_kk_reset_SensorType(deviceCode->valuestring);
return NO_ERROR;
}
......
......@@ -227,19 +227,18 @@ char *door_induction_device[] = {
(char*){"3051"},
(char*){"3070"},
};
static int _kk_check_human_induction_device(char *productCode){
int kk_check_human_induction_device(char *productCode){
int i = 0;
int num = sizeof(human_induction_device)/sizeof(char *);
for(i =0; i < num; i++){
if(strcmp(productCode,human_induction_device[i]) == 0)
{
if(strcmp(productCode,human_induction_device[i]) == 0){
return 1;
}
}
return 0;
}
static int _kk_check_door_induction_device(char *productCode){
int kk_check_door_induction_device(char *productCode){
int i = 0;
int num = sizeof(door_induction_device)/sizeof(char *);
......@@ -283,8 +282,8 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
if(_kk_check_human_induction_device(node->productCode) == 1 || //门磁和人体默认室外安防
_kk_check_door_induction_device(node->productCode) == 1){
if(kk_check_human_induction_device(node->productCode) == 1 || //门磁和人体默认室外安防
kk_check_door_induction_device(node->productCode) == 1){
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,identifier,"1",valuetype,devtype);
}else{
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,identifier,"2",valuetype,devtype);//其他24小时警戒
......@@ -897,7 +896,6 @@ int kk_indoorAir_query_epnums(const char *deviceCode,int epList[])
while(sqlite3_step(stmt) == SQLITE_ROW){
if(count > 64){
sqlite3_free(sqlCmd);
sqlite3_finalize(stmt);
_kk_property_db_unlock();
return count;
......
......@@ -91,5 +91,7 @@ int kk_indoorAir_db_update_online(const char *deviceCode,int online,int epNum);
int kk_subFreshAir_db_update_online(const char *deviceCode,int online,int epNum);
int kk_subAirSwitch_db_update_online(const char *deviceCode,int online,int epNum);
int kk_indoorair_property_db_get_value_directly(const char *deviceCode,const char *identifier,char* value,int ep);
int kk_check_human_induction_device(char *productCode);
int kk_check_door_induction_device(char *productCode);
#endif
......@@ -1505,12 +1505,13 @@ void kk_platMsg_handle(void* data, char* chalMark){
char* outstr = cJSON_Print(payload);
kk_tsl_property_set_by_shadow(search_node->dev_shadow, outstr, strlen(outstr)+1);
proCode = cJSON_GetObjectItem(info, MSG_PRODUCT_CODE_STR);
dm_msg_thing_property_post_by_identify(proCode->valuestring,info_dcode->valuestring,jsonPay);
//如果带version,代表的是快照信息,快照信息不需要触发iftt
cJSON *version = cJSON_GetObjectItem(jsonPay, "version");
if(version == NULL && is_BodySensor_dev(proCode->valuestring)==0){
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
dm_msg_thing_property_post_by_identify(proCode->valuestring,info_dcode->valuestring,jsonPay);
free(outstr);
}
}else if(strstr(msgType->valuestring, KK_THING_TOPO_DELETE_MSG) != NULL){
......
......@@ -454,6 +454,7 @@ int kk_scene_action_add(const char *gwdeviceCode,const char *sceneId,kk_scene_ac
kk_scene_delete_scene_protype(sceneId);
kk_scene_delete_scene_action(sceneId,isforword);
kk_scene_delete_scene_invokeservice(sceneId);
kk_scene_rm_TNBSceneId_list((const char*)sceneId);
}
/************************************************************
......@@ -1993,6 +1994,7 @@ int kk_scene_check_trigger_condition(const char *sceneId)
int sceneType = 0,isEnable = 0;
int active = 0;
sqlite3_stmt *stmt;
dm_mgr_dev_node_t *node = NULL;
char currentValue[64] = {0};
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
res = kk_scene_get_scene_info(sceneId,&sceneType,&isEnable);
......@@ -2028,7 +2030,12 @@ int kk_scene_check_trigger_condition(const char *sceneId)
break;
}
}else{
kk_property_db_get_value_directly(pdeviceCode,identifier,currentValue);
res = dm_mgr_get_device_by_devicecode(pdeviceCode, &node);
if(res != 0){
break;
}
kk_tsl_get_value(kk_tsl_get_property_value, node->dev_shadow,identifier,currentValue,NULL);
//kk_property_db_get_value_directly(pdeviceCode,identifier,currentValue);
INFO_PRINT("currentValue:%s\n",currentValue);
res = kk_scene_check_value_ex(compareType,currentValue,compareValue);
INFO_PRINT("kk_scene_check_value_ex:res:%d\n",res);
......@@ -2457,7 +2464,6 @@ next:
free(out);
}
else{
propertyName = (char*)sqlite3_column_text(stmt,DB_SCENEACTION_PROPERTYNAME);
propertyValue = (char*)sqlite3_column_text(stmt,DB_SCENEACTION_PROPERTYVALUE);
delay = sqlite3_column_int(stmt,DB_SCENEACTION_DELAY);
......@@ -2745,10 +2751,34 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
}else{
cJSON *item = cJSON_GetObjectItem(param,identifier);
if(item != NULL){
propertyValueType = kk_dm_get_property_type(deviceCode,identifier);
res = kk_scene_check_value(compareType,compareValue,item,propertyValueType);
if(res == SUCCESS_RETURN){
res = kk_trigger_execute(sceneId);
if(kk_TNB_identifier_check(identifier) == 1){//环境检测需要判断是否有变化
if(kk_find_TNBScene_execute(sceneId) == 0){//如果此场景没有执行过,无需判断温度变化
propertyValueType = kk_dm_get_property_type(deviceCode,identifier);
res = kk_scene_check_value(compareType,compareValue,item,propertyValueType);
if(res == SUCCESS_RETURN){
res = kk_trigger_execute(sceneId);
if(res == SUCCESS_RETURN){//执行成功需要记录下此场景ID
kk_scene_push_TNBSceneId_list(sceneId);
}
}
}else{
if(kk_TNB_value_check(identifier,(char*)deviceCode,compareType,compareValue) == 1){
propertyValueType = kk_dm_get_property_type(deviceCode,identifier);
res = kk_scene_check_value(compareType,compareValue,item,propertyValueType);
if(res == SUCCESS_RETURN){
res = kk_trigger_execute(sceneId);
if(res == SUCCESS_RETURN){//执行成功需要记录下此场景ID
kk_scene_push_TNBSceneId_list(sceneId);
}
}
}
}
}else{
propertyValueType = kk_dm_get_property_type(deviceCode,identifier);
res = kk_scene_check_value(compareType,compareValue,item,propertyValueType);
if(res == SUCCESS_RETURN){
res = kk_trigger_execute(sceneId);
}
}
}
}
......@@ -2836,7 +2866,6 @@ static int kk_quickpanel_pro_get(const char* sceneId,char *propertyValue)
char *pPropertyValue = NULL;
sqlite3_stmt *stmt;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneId = '%s'",sceneId);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
......@@ -3034,7 +3063,7 @@ int kk_scene_rebuild_device_active(char *deviceCode,int epNum)
memcpy(scene_id_bak[count],scene_id,strlen(scene_id));
count++;
}
usleep(500*1000);
usleep(100*1000);
}
sqlite3_free(sqlCmd);
sqlite3_finalize(stmt);
......@@ -3059,7 +3088,6 @@ int kk_scene_productType_handle(char *productType)
if(productType == NULL){
return -1;
}
size = kk_get_product_type_table_size();
for(k = 0; k < size; k++){
if(!strcmp(productType,producTypeMap[k].maptype)){
......@@ -3068,7 +3096,6 @@ int kk_scene_productType_handle(char *productType)
break;
}
}
if(exist == 0){//无对应的type
return -1;
}
......
......@@ -2,6 +2,7 @@
#include "sqlite3.h"
#include "kk_log.h"
#include "kk_hal.h"
#include "kk_dm_mng.h"
#include "kk_scene_pollution_check.h"
#include "kk_property_db.h"
kk_pmGrade_t g_pm25GradeMap[] =
......@@ -133,4 +134,115 @@ int kk_pm25_condition_check(char *deviceCode)
return 0;
}
return kk_pollution_level_check(g_pm25GradeMap[i].levelMap,atoi(currentValue),5);
}
static kk_TNBSceneId_list_t *p_TNBSceneId_list= NULL;
char *identifierSceneSpl[] = {
(char*){"Temperature"},
(char*){"Humidity"},
(char*){"IlluminanceLevel"},
};
int kk_TNB_identifier_check(char *identifier)
{
int num = 0;
int i = 0;
num = sizeof(identifierSceneSpl)/sizeof(char*);
for(i = 0; i < num; i++){
if(strcmp(identifierSceneSpl[i],identifier) == 0){
INFO_PRINT("[%s]kk_TNB_identifier_check enter!!!\n",identifier);
return 1;
}
}
return 0;
}
int kk_TNB_value_check(char *identifier,char *deviceCode,char * compareType,char * compareValue)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
char currentValue[64] = {0};
res = dm_mgr_get_device_by_devicecode(deviceCode, &node);
if(res != 0){
return res;
}
kk_property_db_get_value_directly(deviceCode,identifier,currentValue);
if(!strcmp(compareType,"=") && strcmp(compareValue,currentValue) != 0){
INFO_PRINT("currentValue[%s]compareValue[%s],kk_TNB_value_check enter!!!\n",currentValue,compareValue);
res = 1;
}else if(!strcmp(compareType,">") && strcmp(currentValue,compareValue) < 0){
INFO_PRINT("currentValue[%s]compareValue[%s],kk_TNB_value_check enter!!!\n",currentValue,compareValue);
res = 1;
}else if(!strcmp(compareType,"<") && strcmp(currentValue,compareValue) > 0){
INFO_PRINT("currentValue[%s]compareValue[%s],kk_TNB_value_check enter!!!\n",currentValue,compareValue);
res = 1;
}else{
INFO_PRINT("currentValue[%s]compareValue[%s],compareType[%s]!!\n",currentValue,compareValue,compareType);
res = -1;
}
return res;
}
int kk_find_TNBScene_execute(const char* sceneId)
{
kk_TNBSceneId_list_t *ptr = p_TNBSceneId_list;
while(ptr){
if(strcmp(ptr->sceneId,sceneId) == 0){
INFO_PRINT("[%s]kk_find_TNBScene_execute enter!!!\n",sceneId);
return 1;
}
ptr = ptr->next;
}
return 0;
}
int kk_scene_push_TNBSceneId_list(const char* sceneId)
{
if(sceneId == NULL){
return INVALID_PARAMETER;
}
kk_TNBSceneId_list_t *ptr = NULL,*ptemp = NULL;
ptemp = ptr = p_TNBSceneId_list;
while(ptr){
ptemp = ptr;
ptr = ptr->next;
}
ptr = malloc(sizeof(kk_TNBSceneId_list_t));
if(ptr == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(ptr,0x0,sizeof(kk_TNBSceneId_list_t));
memcpy(ptr->sceneId,sceneId,strlen(sceneId));
if(p_TNBSceneId_list == NULL){
p_TNBSceneId_list = ptr;
}else{
ptemp->next = ptr;
}
return SUCCESS_RETURN;
}
void kk_scene_rm_TNBSceneId_list(const char* sceneId)
{
kk_TNBSceneId_list_t *ptr = p_TNBSceneId_list;
kk_TNBSceneId_list_t *pTemp = NULL;
while(ptr){
if(strcmp(ptr->sceneId,sceneId) == 0){
if(ptr == p_TNBSceneId_list){
p_TNBSceneId_list = p_TNBSceneId_list->next;
free(ptr);
return;
}
else{
pTemp->next = ptr->next;
free(ptr);
return;
}
}
pTemp = ptr;
ptr = ptr->next;
}
return;
}
void kk_scene_print_TNBSceneId_list()
{
kk_TNBSceneId_list_t *ptr = p_TNBSceneId_list;
while(ptr){
printf("kk_scene_print_TNBSceneId_list [%s]\n",ptr->sceneId);
ptr = ptr->next;
}
}
\ No newline at end of file
......@@ -17,8 +17,19 @@ typedef struct
{
kk_pollution_level_t levelMap[5];
}kk_pmGrade_t;
typedef struct kk_TNBSceneId_list{
char sceneId[16];
struct kk_TNBSceneId_list *next;
} kk_TNBSceneId_list_t;
int kk_pollution_level_check(kk_pollution_level_t levelMap[],int val,int num);
int kk_pollution_check(cJSON *param,int grade);
int kk_pollution_condition_check(char *deviceCode,int grade);
int kk_pm25_condition_check(char *deviceCode);
int kk_TNB_identifier_check(char *identifier);
int kk_TNB_value_check(char *identifier,char *deviceCode,char * compareType,char * compareValue);
int kk_find_TNBScene_execute(const char* sceneId);
void kk_scene_rm_TNBSceneId_list(const char* sceneId);
int kk_scene_push_TNBSceneId_list(const char* sceneId);
void kk_scene_print_TNBSceneId_list();
#endif
\ No newline at end of file
......@@ -3,7 +3,7 @@
"productType": "gw",
"profile":
{
"heartbeat": "3000",
"heartbeat": "300",
"productCode": "2",
"productName": "网关"
},
......
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