Commit 2360ed07 authored by 陈伟灿's avatar 陈伟灿

Merge branch 'cwc' into 'master'

【修改内容】增加门锁的场景设置和同步

See merge request chenweican/k-sdk!196
parents 7fc8146e 48b5d7ed
......@@ -152,6 +152,7 @@ typedef enum {
#define MAX_LISTEN_NUM 10
#define MAX_IP_LEN 16
#define KK_DEVICE_SCREEN_MAX_SUPPORT 8
#define KK_DEVICE_LOCKUSR_MAX_SUPPORT 64
//#ifndef DEVICE_CODE_LEN
//#define DEVICE_CODE_LEN 33
//#endif
......
......@@ -521,7 +521,7 @@ int kk_check_dev_exist_roomId(const char* deviceCode,const char *epNum,char *roo
}
int kk_room_dev_add(const char *roomId,const char *roomName,const char *deviceCode,const char *epNum,const char *devName)
{
int res = 0;
int res = SUCCESS_RETURN;
kk_area_ctx_t *ctx = _kk_area_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
......@@ -547,7 +547,7 @@ int kk_room_dev_add(const char *roomId,const char *roomName,const char *deviceCo
}
sqlite3_free(sqlCmd);
_kk_area_unlock();
return SUCCESS_RETURN;
return res;
}
int kk_room_reset_armingstate(void)
{
......@@ -721,7 +721,7 @@ int kk_room_dev_remove(const char *deviceCode,const char *epNum)
}
sqlite3_free(sqlCmd);
_kk_area_unlock();
return SUCCESS_RETURN;
return res;
}
int kk_room_device_list_add(const char *deviceCode)
......
......@@ -613,7 +613,7 @@ int dm_mgr_get_gw_deviceCode(_OU_ dm_mgr_dev_node_t **node)
dm_mgr_dev_node_t *search_node = NULL;
list_for_each_entry(search_node, &ctx->dev_list, linked_list, dm_mgr_dev_node_t) {
if (memcmp(search_node->productCode, "gateway_2", strlen("gateway_2")) == 0) {
if (memcmp(search_node->productCode, KK_GW_PRODUCTID, strlen(KK_GW_PRODUCTID)) == 0) {
/* dm_log_debug("Device Found, Product Key: %s, Device Name: %s", product_key, device_name); */
if (node) {
*node = search_node;
......@@ -1756,6 +1756,7 @@ int dm_mgr_subdev_delete(_IN_ char deviceCode[DEVICE_CODE_MAXLEN])
return FAIL_RETURN;
}
INFO_PRINT("dm_mgr_subdev_delete deviceCode:%s\n",deviceCode);
kk_delete_LockUser_info((const char*)deviceCode);
kk_scene_deleteall_panel_scene_info(deviceCode);//如果是情景面板,删除对应信息
/*房间信息中删除对应的设备*/
kk_room_dev_remove(deviceCode,NULL);
......
......@@ -78,7 +78,6 @@ typedef struct {
#define KK_THING_SERVICE_GETLOCALTIMER "/thing/service/getLocalTimer"
#define KK_THING_SERVICE_SETCOUNTDOWN "/thing/service/setCountDown"
#define KK_THING_SERVICE_GETCOUNTDOWN "/thing/service/getCountDown"
#define KK_THING_SERVICE_GETKEYLIST "/thing/service/GetKeyList"
#define KK_THING_SERVICE_ADDKEY "/thing/service/AddKey"
#define KK_THING_SERVICE_DELETEKEY "/thing/service/DeleteKey"
#define KK_THING_SERVICE_MODIFYKEY "/thing/service/ModifyKey"
......@@ -161,7 +160,8 @@ typedef struct {
#define KK_THING_SERVICE_QUERYGROUP_REPLY "/thing/service/queryGroup_reply"
#define KK_THING_SERVICE_EXCUTEGROUP "/thing/service/excuteGroup"
#define KK_THING_SERVICE_EXCUTEGROUP_REPLY "/thing/service/excuteGroup_reply"
#define KK_THING_SERVICE_GETKEYLIST "/thing/service/getKeyList"
#define KK_THING_SERVICE_GETKEYLIST_REPLY "/thing/service/getKeyList_reply"
void kk_sendData2app(void *info, void *payload,int isAsync);
......
......@@ -415,7 +415,7 @@ int kk_topo_delete_handle(cJSON *payload,cJSON *buf)
}
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *state = cJSON_GetObjectItem(paramStr, MSG_TOPO_CHANGE_TYPE_STR);
kk_topo_delete_report(paramStr);//主动报topo delete
//kk_topo_delete_report(paramStr);//主动报topo delete
if(state != NULL && state->valueint == 1){
cJSON *deviceArray = cJSON_GetObjectItem(paramStr, MSG_TOPO_CHANGE_DEVICES_STR);
if(deviceArray == NULL){
......@@ -446,6 +446,8 @@ int kk_topo_delete_handle(cJSON *payload,cJSON *buf)
cJSON_AddItemToObject(rootData,"payload",payload);
char *pnewout=cJSON_Print(rootData);
kk_sendData2gw(pnewout, strlen(pnewout), node->fatherDeviceCode);//send to gw itself
kk_scene_update_device_active(deviceCode,-1,0);
kk_scene_rebuild_device_active(deviceCode,-1);
dm_mgr_subdev_delete(deviceCode);
free(pnewout);
//cJSON_Delete(rootData);
......@@ -780,7 +782,7 @@ static int kk_service_addDeviceToRoom_handle(cJSON *params)
}else{
strcpy(epNumStr,epNum->valuestring);
}
kk_room_dev_add(roomId->valuestring,room_name->valuestring,deviceCode->valuestring,epNumStr,dev_name->valuestring);
res = kk_room_dev_add(roomId->valuestring,room_name->valuestring,deviceCode->valuestring,epNumStr,dev_name->valuestring);
//kk_scene_update_device_active(deviceCode->valuestring,atoi(epNumStr),1);
//kk_scene_rebuild_device_active(deviceCode->valuestring,atoi(epNumStr));
//内机默认添加到跟网关同个房间
......@@ -826,7 +828,7 @@ static int kk_service_addDeviceToRoom_handle(cJSON *params)
}
}
#endif
return SUCCESS_RETURN;
return res;
}
/************************************************************
*功能描述:删除设备从房间处理函数
......@@ -970,6 +972,7 @@ static int kk_service_setFloor_handle(cJSON *params)
while(itemroom != NULL){
cJSON * roomid = cJSON_GetObjectItem(itemroom,MSG_AREA_ROOM_CCUROOMID);
if(roomid == NULL){
ERROR_PRINT("DATA ERROR!!!\n");
return INVALID_PARAMETER;
}
kk_room_set_floor_info(floorId->valuestring,"",roomid->valuestring);
......@@ -1431,6 +1434,76 @@ static int kk_service_getScreenList_handle(cJSON *param,cJSON *msgId)
cJSON_Delete(info);
return res;
}
/************************************************************
*功能描述:获取智能锁用户信息
*输入参数:params:云端下发数据,包含场景Id等
msgId:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_LockKeyList_handle(cJSON *inforoot,cJSON *msgId)
{
int res = 0;
int i = 0,num = 0;
LockKeyInfo_t *pList = NULL;
if(inforoot == NULL || msgId == NULL){
return INVALID_PARAMETER;
}
cJSON *deviceCode = cJSON_GetObjectItem(inforoot, MSG_DEVICE_CODE_STR);
if(deviceCode == NULL){
return FAIL_RETURN;
}
cJSON *productCode = cJSON_GetObjectItem(inforoot, MSG_PRODUCT_CODE_STR);
if(productCode == NULL){
return FAIL_RETURN;
}
cJSON *info = cJSON_CreateObject();
cJSON_AddStringToObject(info, MSG_TYPE_STR, KK_THING_SERVICE_GETKEYLIST_REPLY);
cJSON_AddStringToObject(info, MSG_DEVICE_CODE_STR, deviceCode->valuestring);
cJSON_AddStringToObject(info, MSG_PRODUCT_CODE_STR, productCode->valuestring);
char *infff=cJSON_Print(info);
cJSON *payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "desc", "success");
cJSON_AddStringToObject(payload, "version", "1.0");
cJSON_AddStringToObject(payload, "code", "0");
cJSON_AddStringToObject(payload, "msgId", msgId->valuestring);
cJSON_AddStringToObject(payload, "method", "thing.service.getKeyList_reply");
pList = (LockKeyInfo_t*)malloc(sizeof(LockKeyInfo_t)*KK_DEVICE_LOCKUSR_MAX_SUPPORT);
if(pList == NULL){
ERROR_PRINT("MALLOC ERROR!!!");
cJSON_Delete(payload);
cJSON_Delete(info);
free(infff);
return -1;
}
memset(pList,0x0, sizeof(LockKeyInfo_t)*KK_DEVICE_LOCKUSR_MAX_SUPPORT);
cJSON *paramArray = cJSON_CreateArray();
num = kk_get_LockUser_list(pList,deviceCode->valuestring);
for(i = 0; i < num; i++){
cJSON *Item = cJSON_CreateObject();
cJSON_AddStringToObject(Item, "keyRole", pList[i].keyRole);
cJSON_AddStringToObject(Item, "keyName", pList[i].keyName);
cJSON_AddStringToObject(Item, "keyID", pList[i].keyId);
cJSON_AddStringToObject(Item, "keyType", pList[i].keyType);
cJSON_AddItemToArray(paramArray, Item);
}
cJSON *data = cJSON_CreateObject();
cJSON_AddItemToObject(data, "data", paramArray);
cJSON_AddItemToObject(payload, "params", data);
char *payload11=cJSON_Print(payload);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
free(pList);
cJSON_Delete(payload);
cJSON_Delete(info);
return res;
}
/************************************************************
*功能描述:获取指定屏类数据
*输入参数:params:云端下发数据,包含场景Id等
......@@ -2191,58 +2264,66 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT(" delete room \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_deleteRoom_handle(paramStr);
if(kk_service_deleteRoom_handle(paramStr) == 0){
kk_service_deleteRoom_reply(info_root,msgId);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDDEVICETOROOM) == 0){
INFO_PRINT(" adddevicetoroom \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_addDeviceToRoom_handle(paramStr);
if(kk_service_addDeviceToRoom_handle(paramStr) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_ADDDEVICETOROOM_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_REMOVEDEVICEFROMROOM) == 0){
INFO_PRINT(" removedevicefromroom \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_removeDeviceFromRoom_handle(paramStr);
if(kk_service_removeDeviceFromRoom_handle(paramStr) == 0){
//kk_service_addDeviceToRoom_reply(info_root,msgId,1);
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_REMOVEDEVICEFROMROOM_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDSCENC) == 0){
INFO_PRINT(" add scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_addScene_handle(paramStr,msgId);
if(kk_service_addScene_handle(paramStr,msgId) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_ADDSCENC_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_UPDATESCENC) == 0){
INFO_PRINT(" update scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_updateScene_handle(paramStr,msgId);
if(kk_service_updateScene_handle(paramStr,msgId) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_UPDATESCENC_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ENABLESCENC) == 0){
INFO_PRINT(" enable scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_enableScene_handle(paramStr,msgId);
if(kk_service_enableScene_handle(paramStr,msgId) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_ENABLESCENC_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_DELETESCENC) == 0){
INFO_PRINT("delete scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_deleteScene_handle(paramStr,msgId);
if(kk_service_deleteScene_handle(paramStr,msgId) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_DELETESCENC_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_EXECUTESCENE) == 0){
INFO_PRINT("execute scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_executeScene_handle(paramStr,msgId);
if(kk_service_executeScene_handle(paramStr,msgId) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_EXECUTESCENE_REPLY);
}
}else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_SYNCDEVICEINFO) == 0){
INFO_PRINT("SYNCDEVICEINFO service \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2287,11 +2368,12 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT("bind scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
if(paramStr != NULL){
kk_service_bindScene_handle(paramStr,deviceCode->valuestring);
if(kk_service_bindScene_handle(paramStr,deviceCode->valuestring) == 0){
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_common_reply(info_root,msgId,"/thing/service/bindScene_reply");
}
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_UNBINDSBUTTTON) == 0){
INFO_PRINT("unbind button \n");
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
......@@ -2319,11 +2401,12 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
goto directReturn;
}
sprintf(btnId,"%d",buttonId->valueint);
kk_scene_execute_quickpanel(btnId,deviceCode->valuestring);
if(kk_scene_execute_quickpanel(btnId,deviceCode->valuestring) == 0){
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_common_reply(info_root,msgId,"/thing/service/activeButton_reply");
}
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_GETCCUVERSION) == 0){
INFO_PRINT("GET CCU VERISON \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2356,9 +2439,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT("SETFLOOR \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_setFloor_handle(paramStr);
if(kk_service_setFloor_handle(paramStr) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_SETFLOOR_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDFLOORS) == 0){
INFO_PRINT("ADDFLOOR \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2369,9 +2453,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT("DELETEFLOOR \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_deleteFloor_handle(paramStr);
if(kk_service_deleteFloor_handle(paramStr) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_DELETEFLOORS_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_GETFLOOR) == 0){
INFO_PRINT("GETFLOOR \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2382,9 +2467,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT("UPDATEFLOOR \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_updateFloor_handle(paramStr);
if(kk_service_updateFloor_handle(paramStr) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_UPDATEFLOORS_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_CLIENTREPORT) == 0){
INFO_PRINT("CLIENTREPORT \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2395,9 +2481,10 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
INFO_PRINT("SPECIALDEV TO ROOM \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_addScreenToRoom_handle(paramStr);
if(kk_service_addScreenToRoom_handle(paramStr) == 0){
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_SPECIALDEVTOROOM_REPLY);
}
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_RMSPECIALDEVFROMROOM) == 0){
INFO_PRINT("RM SPECIALDEV FROM ROOM \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
......@@ -2452,6 +2539,11 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_executeGroup_handle(info_root,paramStr,msgId);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_GETKEYLIST) == 0){
INFO_PRINT("GETKEYLIST \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_LockKeyList_handle(info_root,msgId);
}
else{
INFO_PRINT("Error msgtype!!! \n");
}
......
......@@ -114,6 +114,22 @@ static int kk_subDev_db_Init(void)
sqlite3_free(pcErr);
return FAIL_RETURN;
}
const char *pUserInfoTable = "CREATE TABLE IF NOT EXISTS LockUserInfo( \
idx INTEGER PRIMARY KEY , \
keyId varchar(32), \
keyType varchar(32), \
keyRole varchar(32), \
keyName varchar(255), \
deviceCode varchar(33), \
reverse varchar(128))";
if (sqlite3_exec(ctx->pDb, pUserInfoTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
return FAIL_RETURN;
}
//eUtils_LockUnlock(&sLock);
_kk_subDb_unlock();
return SUCCESS_RETURN;
......@@ -224,7 +240,7 @@ static int _kk_check_subDev_exist(const char* deviceCode)
pmac = (char*)sqlite3_column_text(stmt, DB_SUB_DEVICECODE);
if(!strcmp(deviceCode,pmac))
{
{
isExist = 1;
break;
}
......@@ -235,7 +251,137 @@ static int _kk_check_subDev_exist(const char* deviceCode)
return isExist;
}
/************************************************************
*功能描述:保存设备信息到数据库
*输入参数:devType:设备类型
productCode:产品Id
deviceCode:设备deviceCode
fatherDeviceCode:上一级网关的deviceCode
mac: mac地址
version:版本号
heartbeat:心跳时间
*输出参数:无
*返 回 值:0:成功;其他:失败
*其他说明:
*************************************************************/
static int _kk_check_LockUser_exist(const char* keyId,const char *deviceCode)
{
int isExist = 0;
sqlite3_stmt *stmt;
char *sqlCmd = NULL;
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
const char *searchCmd = "select * from LockUserInfo where keyId = %s and deviceCode = %s;";
sqlCmd = sqlite3_mprintf(searchCmd,keyId,deviceCode);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
//INFO_PRINT("total_column = %d\n", sqlite3_column_count(stmt));
while(sqlite3_step(stmt) == SQLITE_ROW){
isExist = 1;
break;
}
INFO_PRINT("\n");
sqlite3_free(sqlCmd);
sqlite3_finalize(stmt);
return isExist;
}
int kk_LockUser_insert_db(char *keyId,char *keyType,char *keyRole,char *keyName,char *deviceCode)
{
const char *insertCmd = "insert into LockUserInfo (keyId,keyType,keyRole,keyName,deviceCode,reverse) \
values ('%s','%s','%s','%s','%s','%s');";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
if(_kk_check_LockUser_exist((const char*)keyId,(const char*)deviceCode) == 1){
WARNING_PRINT("[%s][%d] DATA ALREADY EXIST!!!\n",__FUNCTION__,__LINE__);
return SUCCESS_RETURN;
}
_kk_subDb_lock();
sqlCmd = sqlite3_mprintf(insertCmd,keyId,keyType,keyRole,keyName,deviceCode,"");
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
//INFO_PRINT("sub device insert data successfully\n");
}
sqlite3_free(sqlCmd);
_kk_subDb_unlock();
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:获取屏类列表
*输入参数:deviceCode:设备deviceCode
isAuth:1,已注册;0,未注册
*输出参数:无
*返 回 值:0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_get_LockUser_list(LockKeyInfo_t *list,const char *deviceCode)
{
const char *searchCmd = "select * from LockUserInfo where deviceCode = '%s'";
char *zErrMsg = 0;
sqlite3_stmt *stmt;
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
char *pkeyId = NULL;
char *pkeyType = NULL;
char *pkeyRole = NULL;
char *pkeyName = NULL;
int count = 0;
char *sqlCmd = NULL;
sqlCmd = sqlite3_mprintf(searchCmd,deviceCode);
_kk_subDb_lock();
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
pkeyId = (char*)sqlite3_column_text(stmt, DB_LOCKUSR_KEYID);
pkeyType = (char*)sqlite3_column_text(stmt, DB_LOCKUSR_KEYTYPE);
pkeyRole = (char*)sqlite3_column_text(stmt, DB_LOCKUSR_KEYROLE);
pkeyName = (char*)sqlite3_column_text(stmt, DB_LOCKUSR_KEYNAME);
//printf("currentValue:%d\n",currentValue);
memcpy(list[count].keyId,pkeyId,strlen(pkeyId));
memcpy(list[count].keyType,pkeyType,strlen(pkeyType));
memcpy(list[count].keyRole,pkeyRole,strlen(pkeyRole));
memcpy(list[count].keyName,pkeyName,strlen(pkeyName));
count++;
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
_kk_subDb_unlock();
return count;
}
/************************************************************
*功能描述:获取屏类列表
*输入参数:deviceCode:设备deviceCode
isAuth:1,已注册;0,未注册
*输出参数:无
*返 回 值:0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_delete_LockUser_info(const char *deviceCode)
{
const char *deleteCmd = "delete from LockUserInfo where deviceCode = '%s';";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_subDb_ctx_t *ctx = _kk_subDb_get_ctx();
_kk_subDb_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,deviceCode);
INFO_PRINT("Table delete data sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
//INFO_PRINT("Table delete data successfully\n");
}
sqlite3_free(sqlCmd);
_kk_subDb_unlock();
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:保存设备信息到数据库
*输入参数:devType:设备类型
......
......@@ -18,6 +18,12 @@ typedef struct {
char mac[32];
int type;
} ScreenDevInfo_t;
typedef struct {
char keyId[17];
char keyType[8];
char keyRole[8];
char keyName[32];
} LockKeyInfo_t;
int kk_subDb_init(void);
int kk_subDev_insert_db(int devType,char productCode[PRODUCT_CODE_MAXLEN], \
char deviceCode[DEVICE_CODE_MAXLEN],char fatherMac[DEVICE_MAC_MAXLEN],char mac[DEVICE_MAC_MAXLEN], char version[DEVICE_VERSION_MAXLEN],int heartbeat);
......@@ -46,7 +52,9 @@ int kk_subDev_getDeviceCodes_byProductType(DeviceCode_t *list,char *type);
int kk_indoor_air_action_add(char *propertyValue,char* deviceCode,int delay,char*gwDeviceCode,char *sceneId,char *type,int epnum);
int kk_subDev_update_fatherDeviceCode(char *fatherDeviceCode,const char *deviceCode);
int kk_subDev_find_fatherDeviceCode(const char *deviceCode,char *fatherDeviceCode);
int kk_LockUser_insert_db(char *keyId,char *keyType,char*keyRole,char *keyName,char* deviceCode);
int kk_get_LockUser_list(LockKeyInfo_t *list,const char *deviceCode);
int kk_delete_LockUser_info(const char *deviceCode);
enum{
DB_SUB_IDX = 0,
DB_SUB_ONLINE,
......@@ -74,4 +82,13 @@ enum{
DB_SCREEN_ROOMNAME,
DB_SCREEN_EXPAND,
};
enum{
DB_LOCKUSR_IDX = 0,
DB_LOCKUSR_KEYID,
DB_LOCKUSR_KEYTYPE,
DB_LOCKUSR_KEYROLE,
DB_LOCKUSR_KEYNAME,
DB_LOCKUSR_DEVICECODE,
DB_LOCKUSR_REVERSE,
};
#endif
......@@ -1247,18 +1247,26 @@ static int kk_get_scenes_trigger_info(cJSON *triggerObj,char *sceneId)
isAnd = sqlite3_column_int(stmt, DB_SCENETRIGGER_ISAND);
if(isAnd == 0){
cJSON *triggerItem = cJSON_CreateObject();
type = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_TYPE);
deviceCode = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_DEVICECODE);
epNum = sqlite3_column_int(stmt, DB_SCENETRIGGER_EPNUM);
propertyName = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_PROPERTYNAME);
compareType = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_COMPARETYPE);
compareValue = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_COMPAREVALUE);
type = (char*)sqlite3_column_text(stmt, DB_SCENETRIGGER_TYPE);
cJSON_AddStringToObject(triggerItem, "type", type);
cJSON_AddStringToObject(triggerItem, KK_SYNC_DEVICECODE_STR, (char*)deviceCode);
cJSON_AddNumberToObject(triggerItem, KK_SYNC_SCENE_EPNUM_STR, epNum);
if(strcmp(type,"trigger/thing/event") == 0){//门锁场景同步
cJSON_AddStringToObject(triggerItem, "identifier", (char*)propertyName);
cJSON *comparesJson = cJSON_Parse(compareValue);
if(comparesJson != NULL){
cJSON_AddItemToObject(triggerItem, "compares", comparesJson);
}
}else{
cJSON_AddStringToObject(triggerItem, KK_SYNC_SCENE_PROPERTYNAME_STR, (char*)propertyName);
cJSON_AddStringToObject(triggerItem, KK_SYNC_SCENE_COMPARETYPE_STR, (char*)compareType);
cJSON_AddStringToObject(triggerItem, KK_SYNC_SCENE_COMPAREValue_STR, (char*)compareValue);
}
cJSON_AddItemToArray(triggerAry, triggerItem);
}
}
......
......@@ -63,6 +63,7 @@ char * g_filerToPlatTable[] =
(char *){KK_THING_SERVICE_ACTIVEBUTTON},
(char *){KK_THING_SERVICE_HISTORYALARM},
(char *){KK_THING_SERVICE_DEL_HISTORYALARM},
(char *){KK_THING_SERVICE_GETKEYLIST},
};
static char s_ccuid[DEVICE_CODE_LEN] = {0};
static char s_Version[VERSION_MAXLEN] = {0};
......@@ -1534,6 +1535,7 @@ void kk_platMsg_handle(void* data, char* chalMark){
}
dm_mgr_update_timestamp_by_devicecode(node->deviceCode,0);
dm_mgr_set_dev_onoffline(node,1);
kk_delete_LockUser_info((const char*)node->deviceCode);
//kk_ipc_send(IPC_MID2APP,data,strlen(data)+1);
//dm_mgr_subdev_delete(devCode->valuestring);
......@@ -1630,9 +1632,27 @@ void kk_platMsg_handle(void* data, char* chalMark){
if(pack==1){
INFO_PRINT("kk_platMsg_handle data: event pack post\n");
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier,NULL);
if(strcmp(eventItem->identifier,"KeyAddNotification") == 0){
char KeyTypeBuf[8] = {0};
char KeyRoleBuf[8] = {0};
cJSON * keyId = cJSON_GetObjectItem(jsonPay, "KeyID");
cJSON * KeyRole = cJSON_GetObjectItem(jsonPay, "KeyRole");
cJSON * KeyType = cJSON_GetObjectItem(jsonPay, "KeyType");
if(keyId != NULL && KeyRole != NULL && KeyType != NULL){
if(KeyType->type == cJSON_Number){
sprintf(KeyTypeBuf,"%d",KeyType->valueint);
}
if(KeyRole->type == cJSON_Number){
sprintf(KeyRoleBuf,"%d",KeyRole->valueint);
}
kk_LockUser_insert_db(keyId->valuestring,KeyTypeBuf,KeyRoleBuf,"",info_dcode->valuestring);
}
}
if(strcmp(eventItem->identifier,"LockOpenNotification") == 0){
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
}
}
else if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 &&
eventItem->output_data_number == 0){
itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier);
......
......@@ -776,7 +776,11 @@ int kk_scene_update_device_active(char *deviceCode,int epNum,int value)
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
_kk_scene_lock();
if(epNum == -1){
sqlCmd = sqlite3_mprintf("UPDATE SceneActionInfo SET active='%d' WHERE deviceCode = '%s'",value,deviceCode);
}else{
sqlCmd = sqlite3_mprintf("UPDATE SceneActionInfo SET active='%d' WHERE deviceCode = '%s' and epNum= '%d'",value,deviceCode,epNum);
}
INFO_PRINT("kk_scene_update_device_active sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
......@@ -784,8 +788,11 @@ int kk_scene_update_device_active(char *deviceCode,int epNum,int value)
sqlite3_free(zErrMsg);
}
sqlite3_free(sqlCmd);
if(epNum == -1){
sqlCmd = sqlite3_mprintf("UPDATE SceneTriggerInfo SET active='%d' WHERE deviceCode = '%s'",value,deviceCode);
}else{
sqlCmd = sqlite3_mprintf("UPDATE SceneTriggerInfo SET active='%d' WHERE deviceCode = '%s' and epNum= '%d'",value,deviceCode,epNum);
}
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
......
......@@ -49,6 +49,7 @@ enum{
DB_SCENEACTION_DELAY,
DB_SCENEACTION_SCENEID,
DB_SCENEACTION_GWDEVICECODE,
DB_SCENEACTION_ACTIVE,
};
enum{
......
......@@ -583,6 +583,7 @@ int kk_scene_action_add(const char *gwdeviceCode,const char *sceneId,kk_scene_ac
if(action == NULL || gwdeviceCode == NULL || sceneId == NULL){
return INVALID_PARAMETER;
}
cJSON *root=cJSON_CreateObject();
cJSON_AddStringToObject(root,MSG_SCENE_SCENEID,sceneId);
cJSON_AddItemToObject(root,MSG_SCENE_ACTIONS,action);
......@@ -982,6 +983,37 @@ static int kk_scene_parse_trigger_detail(const char *type,const cJSON *item,cons
return res;
}
static int kk_scene_parse_trigger_event_type(const char *type,const cJSON *item,const char *sceneId,int isAnd)
{
int res = FAIL_RETURN;
cJSON *deviceCode,*epNum;
cJSON *propertyName;
cJSON *compares;
int ep = 0;
if(type == NULL || item == NULL || sceneId == NULL){
return INVALID_PARAMETER;
}
deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR);
if(deviceCode == NULL) return FAIL_RETURN;
epNum = cJSON_GetObjectItem(item,MSG_SCENE_EPNUM);
if(epNum == NULL){
ep = 1;
}else{
if(epNum->type==cJSON_Number){
ep = epNum->valueint;
}else{
ep = atoi(epNum->valuestring);
}
}
propertyName = cJSON_GetObjectItem(item,"identifier");
if(propertyName == NULL) return FAIL_RETURN;
compares = cJSON_GetObjectItem(item,"compares");
if(compares == NULL) return FAIL_RETURN;
char *compareValue = cJSON_PrintUnformatted(compares);
res = kk_scene_insert_scene_trigger(type,deviceCode->valuestring,ep,
propertyName->valuestring,"",compareValue,sceneId,isAnd);
return res;
}
/************************************************************
*功能描述:解析场景触发条件
*输入参数:str:触发内容的CJSON字串;
......@@ -1028,6 +1060,12 @@ int kk_scene_parse_scene_trigger(const cJSON* str,const char *sceneId)
time_t newStart = kk_scene_creat_timer_starttime(weekflag,atoi(timestr->valuestring),current);
kk_scene_insert_scene_timer(newStart,weekflag,sceneId);
kk_scene_push_timer_info(newStart,weekflag,(char*)sceneId);
}else if(!strcmp("trigger/thing/event",type->valuestring)){
res = kk_scene_parse_trigger_event_type(type->valuestring,item,sceneId,0);
if(res != SUCCESS_RETURN){
ERROR_PRINT("kk_scene_parse_trigger_event_type fail!!!\n");
return res;
}
}
item = item->next;
}
......@@ -1610,7 +1648,7 @@ int kk_scene_parse_scene_muticontrol(const cJSON* str,const char *sceneId,int is
int kk_scene_parse_addscene(const cJSON* args,char *sceneId,int isUpdate,const char *msgId)
{
int res = 0;
kk_tsl_t *pSceneShadow = NULL;
if(args == NULL||sceneId == NULL){
ERROR_PRINT("[%d]kk_scene_parse_addscene fail!!!\n",__LINE__);
return INVALID_PARAMETER;
......@@ -1627,12 +1665,10 @@ int kk_scene_parse_addscene(const cJSON* args,char *sceneId,int isUpdate,const c
cJSON *enable = cJSON_GetObjectItem(args,MSG_SCENE_ENABLE);
if(enable == NULL) return FAIL_RETURN;
if(!isUpdate){
kk_tsl_t *pSceneShadow = NULL;
HAL_GetTime_s(sceneId);//use time to create the sceneId
pSceneShadow = kk_scene_shadow();
if(pSceneShadow != NULL){
kk_tsl_set_value(kk_tsl_set_event_output_value,pSceneShadow,MSG_SCENE_ADDNOTIFICATION_SCENEID,NULL,sceneId);
dm_msg_scene_event_post(MSG_SCENE_ADDNOTIFICATION,pSceneShadow,msgId);
}
}
......@@ -1672,6 +1708,9 @@ int kk_scene_parse_addscene(const cJSON* args,char *sceneId,int isUpdate,const c
return FAIL_RETURN;
}
}
if(pSceneShadow != NULL){
dm_msg_scene_event_post(MSG_SCENE_ADDNOTIFICATION,pSceneShadow,msgId);
}
return SUCCESS_RETURN;
}
......@@ -2499,6 +2538,51 @@ static int kk_scene_invokeService_find(const char *sceneId)
sqlite3_free(sqlCmd);
return find;
}
static int _kk_check_lock_trigger_info(char *proName,char *value,char *keyId,char *keyRole,char *keyType)
{
int cnt = 0;
cJSON *compareValue;
cJSON* propertyName;
cJSON* pSub;
if(proName == NULL ||value == NULL ||keyId == NULL){
return INVALID_PARAMETER;
}
if(!strcmp(proName,"LockOpenNotification") && strstr(value ,"[") != NULL && strstr(value ,"]") != NULL ){
cJSON* json = cJSON_Parse(value);
if(json == NULL){
return FAIL_RETURN;
}
int array_size = cJSON_GetArraySize ( json );
if(array_size == 0){
return FAIL_RETURN;
}
for(cnt = 0; cnt < array_size; cnt++){
pSub = cJSON_GetArrayItem(json, cnt);
if(NULL == pSub ){continue ; }
propertyName = cJSON_GetObjectItem(pSub,"propertyName");
if(propertyName == NULL){continue ; }
if(strcmp(propertyName->valuestring,"KeyType") == 0){
compareValue = cJSON_GetObjectItem(pSub,"compareValue");
if(strcmp(compareValue->valuestring,keyType) != 0){
return FAIL_RETURN;
}else{
continue;
}
}
if(strcmp(propertyName->valuestring,"KeyID") != 0){
compareValue = cJSON_GetObjectItem(pSub,"compareValue");
if(strcmp(compareValue->valuestring,keyId) != 0){
return FAIL_RETURN;
}
}
}
return SUCCESS_RETURN;
}else if(!strcmp(proName,"LockState") && !strcmp(value,"1")){
return SUCCESS_RETURN;
}
return FAIL_RETURN;
}
/************************************************************
*功能描述:查找是否有场景触发
*输入参数:param:属性CJSON内容
......@@ -2515,12 +2599,33 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
char *identifier = NULL;
char *compareType = NULL;
char *compareValue = NULL;
char keyRoleBuf[8] = {0};
char keyTypeBuf[8] = {0};
int propertyValueType = 0;
int isAnd = 0;
int sceneType = 0,isEnable = 0;
int LockOpenTrigger = 0;
sqlite3_stmt *stmt;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
if(param == NULL){
return res;
}
cJSON *KeyID = cJSON_GetObjectItem(param,"KeyID");
cJSON *KeyRole = cJSON_GetObjectItem(param,"KeyRole");
cJSON *KeyType = cJSON_GetObjectItem(param,"KeyType");
if(KeyID != NULL && KeyRole != NULL && KeyType != NULL){
LockOpenTrigger = 1;
if(KeyRole->type == cJSON_Number){
sprintf(keyRoleBuf,"%d",KeyRole->valueint);
}else{
strcpy(keyRoleBuf,KeyRole->valuestring);
}
if(KeyType->type == cJSON_Number){
sprintf(keyTypeBuf,"%d",KeyType->valueint);
}else{
strcpy(keyTypeBuf,KeyType->valuestring);
}
}
sqlCmd = sqlite3_mprintf("select * from SceneTriggerInfo WHERE deviceCode= '%s' and active = '%d'",deviceCode,1);//actice判断设备是否移入待分配
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
......@@ -2531,14 +2636,25 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
isAnd = sqlite3_column_int(stmt,DB_SCENETRIGGER_ISAND);
res = kk_scene_get_scene_info(sceneId,&sceneType,&isEnable);
if(res == SUCCESS_RETURN && isEnable && isAnd == 0){
if(LockOpenTrigger == 1){
res = _kk_check_lock_trigger_info(identifier,compareValue,KeyID->valuestring,keyRoleBuf,keyTypeBuf);
if(res == SUCCESS_RETURN){
INFO_PRINT("[%d]kk_scene_check_condition enter!!!\n",__LINE__);
res = kk_scene_check_condition(sceneId);
if(res == SUCCESS_RETURN){
res = kk_scene_check_trigger_condition(sceneId);
if(res == SUCCESS_RETURN){
/*check是否时场景嵌套类型*/
res = kk_scene_execute_action(sceneId,NULL);
}
}
}
}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){
INFO_PRINT("[%d]kk_scene_check_condition enter!!!\n",__LINE__);
res = kk_scene_check_condition(sceneId);
if(res == SUCCESS_RETURN){
......@@ -2551,6 +2667,8 @@ int kk_scene_query_trigger_info(const char *deviceCode,cJSON *param)
}
}
}
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
......@@ -2687,7 +2805,8 @@ static int _kk_rebuild_device_active(char *sceneid)
sqlite3_stmt *stmt;
char *pDeviceCode = NULL;
char *pSceneType = NULL;
char *gwDeviceCode =NULL;
const unsigned char *gwDeviceCode = NULL;
char gwDeviceCodeBuf[32] = {0};
int epNum = 0;
int isMuti = 0;
int count = 0;
......@@ -2695,7 +2814,7 @@ static int _kk_rebuild_device_active(char *sceneid)
dm_mgr_dev_node_t *node = NULL;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneid = '%s' and active = '%d'",sceneid,1);
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE sceneid = '%s' and active != '%d'",sceneid,0);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
cJSON *array = cJSON_CreateArray();
while(sqlite3_step(stmt) == SQLITE_ROW){
......@@ -2706,7 +2825,7 @@ static int _kk_rebuild_device_active(char *sceneid)
}
count++;
epNum = sqlite3_column_int(stmt, DB_SCENEACTION_EPNUM);
gwDeviceCode = (char *)sqlite3_column_text(stmt, DB_SCENEACTION_GWDEVICECODE);
gwDeviceCode = sqlite3_column_text(stmt, DB_SCENEACTION_GWDEVICECODE);
if(strcmp(pSceneType,"action/thing/group") == 0){
cJSON *arrayParam = cJSON_CreateObject();
cJSON_AddStringToObject(arrayParam,MSG_SCENE_TYPE,pSceneType);
......@@ -2714,6 +2833,7 @@ static int _kk_rebuild_device_active(char *sceneid)
cJSON_AddNumberToObject(arrayParam,MSG_SCENE_EPNUM,epNum);
isMuti = 1;
cJSON_AddItemToArray(array,arrayParam);
memcpy(gwDeviceCodeBuf,(char*)gwDeviceCode,strlen((char*)gwDeviceCode));
}else{
kk_scene_action_detail_t info = {0};
char *propertyName = (char *)sqlite3_column_text(stmt, DB_SCENEACTION_PROPERTYNAME);
......@@ -2725,7 +2845,6 @@ static int _kk_rebuild_device_active(char *sceneid)
info.epNum = epNum;
info.delay = idelay;
isMuti = 0;
if(strcmp(propertyName,"LightStripSpecialAction") == 0){
if(strstr(propertyValueStr,"{")!=NULL &&strstr(propertyValueStr,"}")!=NULL){
cJSON* propertyValueJson = cJSON_Parse(propertyValueStr);
......@@ -2733,7 +2852,7 @@ static int _kk_rebuild_device_active(char *sceneid)
ERROR_PRINT("cJSON_Parse ERROR!!!");
return FAIL_RETURN;
}
_kk_scene_LightStripSpecialAction_handle(propertyValueJson,pDeviceCode,epNum,idelay,(char*)sceneid,gwDeviceCode);
_kk_scene_LightStripSpecialAction_handle(propertyValueJson,pDeviceCode,epNum,idelay,(char*)sceneid,(char*)gwDeviceCode);
cJSON_Delete(propertyValueJson);
}
}else if(strcmp(propertyName,"CustomAction") == 0){//空调内机的场景属性
......@@ -2745,12 +2864,12 @@ static int _kk_rebuild_device_active(char *sceneid)
}
if(strcmp(node->productType,KK_DM_AIR_GATEWAY_TYPE) == 0 || strcmp(node->productType,"airConditioning") == 0
||strcmp(node->productType,"fanCoil") == 0){
kk_indoor_air_action_add(propertyValueStr,pDeviceCode,idelay,gwDeviceCode,sceneid,"action/thing/setProperty",epNum);
kk_indoor_air_action_add(propertyValueStr,pDeviceCode,idelay,(char*)gwDeviceCode,sceneid,"action/thing/setProperty",epNum);
}
}
}else{
memcpy(info.propertyValue,propertyValueStr,strlen(propertyValueStr));
kk_scene_action_add(gwDeviceCode,sceneid,info);
kk_scene_action_add((char*)gwDeviceCode,sceneid,info);
}
}
}
......@@ -2758,7 +2877,9 @@ static int _kk_rebuild_device_active(char *sceneid)
kk_scene_delete_send_to_gw(sceneid);
}else{
if(isMuti){
kk_scene_muticontrol_info_send(array,gwDeviceCode,sceneid,1);
kk_scene_delete_send_to_gw(sceneid);
usleep(1000*500);
kk_scene_muticontrol_info_send(array,gwDeviceCodeBuf,sceneid,1);
}else{
kk_scene_action_info_send(1);
}
......@@ -2774,14 +2895,35 @@ int kk_scene_rebuild_device_active(char *deviceCode,int epNum)
sqlite3_stmt *stmt;
char *zErrMsg = 0;
char *scene_id=NULL;
char scene_id_bak[64][16] = {0};
int i = 0,count = 0;
int repeat = 0;
kk_scene_ctx_t *ctx = _kk_scene_get_ctx();
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE deviceCode = '%s' and epNum= '%d'",deviceCode,epNum);
if(epNum == -1){
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE deviceCode = '%s'",deviceCode);//删除设备情况下
}else{
sqlCmd = sqlite3_mprintf("select * from SceneActionInfo WHERE deviceCode = '%s' and epNum= '%d'",deviceCode,epNum);//移动到待分配情况下
}
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
repeat = 0;
scene_id = (char*)sqlite3_column_text(stmt, DB_SCENEACTION_SCENEID);
for(i = 0; i < count; i++){//检测同个设备在同个场景中设置不同的动作,只需rebuild一次
if(strcmp(scene_id_bak[i],scene_id) == 0){
repeat = 1;
break;
}
}
if(repeat){
continue;
}
_kk_rebuild_device_active(scene_id);
usleep(100*1000);
if(count < 64){
memcpy(scene_id_bak[count],scene_id,strlen(scene_id));
count++;
}
usleep(500*1000);
}
sqlite3_free(sqlCmd);
sqlite3_finalize(stmt);
......
......@@ -51,6 +51,17 @@
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......@@ -141,6 +152,17 @@
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......@@ -189,6 +211,7 @@
"PowerSwitch",
"Brightness",
"ColorTemperature",
"ColorTempSwitch",
"FadeTime",
"LowBrightness",
"HighBrightness"
......@@ -260,6 +283,19 @@
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"accessMode":"rw",
"required":true,
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"accessMode": "rw",
......@@ -352,6 +388,17 @@
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......
......@@ -44,13 +44,24 @@
"specs": {
"min": "0",
"max": "100",
"unit": "K",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......@@ -134,13 +145,24 @@
"specs": {
"min": "0",
"max": "100",
"unit": "K",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......@@ -189,6 +211,7 @@
"PowerSwitch",
"Brightness",
"ColorTemperature",
"ColorTempSwitch",
"FadeTime",
"LowBrightness",
"HighBrightness"
......@@ -253,13 +276,26 @@
"specs": {
"min": "0",
"max": "100",
"unit": "K",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"accessMode":"rw",
"required":true,
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"accessMode": "rw",
......@@ -345,13 +381,24 @@
"specs": {
"min": "0",
"max": "100",
"unit": "K",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
},
"name": "色温"
},
{
"identifier": "ColorTempSwitch",
"dataType": {
"specs": {
"0": "关闭",
"1": "打开"
},
"type": "bool"
},
"name": "色温开关使能"
},
{
"identifier": "FadeTime",
"dataType": {
......
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