Procházet zdrojové kódy

1、修改通道为空时,后台越界bug;
2、统一三相进单相出版本,兼容23A和40A单相控制板;
3、添加了部分日志(暂未添加中俄翻译)

liyuezong před 2 roky
rodič
revize
61c6304097

+ 19 - 16
pro/src/app.c

@@ -314,22 +314,25 @@ void* power_thread(void* arg)
                                 }
                                 if (nTreeACType == _pTreeACPowerMangerTemp->product_ph_type)
                                 {
-                                    if (VavgTimes[nTreeACType] == 0)
+                                    if (_pTreeACPowerMangerTemp->_PowerInfo.voltage > 0)
                                     {
-                                        Vavg[nTreeACType] =_pTreeACPowerMangerTemp->_PowerInfo.voltage;
+                                        if (VavgTimes[nTreeACType] == 0)
+                                        {
+                                            Vavg[nTreeACType] = _pTreeACPowerMangerTemp->_PowerInfo.voltage;
+                                        }
+                                        else
+                                        {
+                                            Vavg[nTreeACType] = (Vavg[nTreeACType] * VavgTimes[nTreeACType] + _pTreeACPowerMangerTemp->_PowerInfo.voltage) / (VavgTimes[nTreeACType] + 1);
+                                        }
+
+                                        pTreeAPowerInfo->_PowerInfo.voltage = Vavg[nTreeACType];
+                                        pTreeAPowerInfo->_PowerInfo.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
+                                        pTreeAPowerInfo->_PowerInfo.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
+                                        pTreeAPowerInfo->_PowerInfo.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
+                                        pTreeAPowerInfo->_PowerInfo.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
+                                        pTreeAPowerInfo->_PowerInfo.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
+                                        VavgTimes[nTreeACType] += 1;
                                     }
-                                    else
-                                    {
-                                        Vavg[nTreeACType]  = (Vavg[nTreeACType]  * VavgTimes[nTreeACType]  + _pTreeACPowerMangerTemp->_PowerInfo.voltage) / (VavgTimes[nTreeACType]+1) ;
-                                    }
-
-                                    pTreeAPowerInfo->_PowerInfo.voltage = Vavg[nTreeACType];
-                                    pTreeAPowerInfo->_PowerInfo.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
-                                    pTreeAPowerInfo->_PowerInfo.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
-                                    pTreeAPowerInfo->_PowerInfo.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
-                                    pTreeAPowerInfo->_PowerInfo.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
-                                    pTreeAPowerInfo->_PowerInfo.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
-                                    VavgTimes[nTreeACType]+=1;
                                 }
                             }
 
@@ -1584,7 +1587,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
                             }
                             */
                         }
-                        if (type == AC_SINGLE_B_TYPE && _globalDeviceManager->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
+                        if ( _globalDeviceManager->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
                         {
                             // 初始化三相子通道
                             GlobalTreeACManager *_globalTACManager = NULL;
@@ -1621,7 +1624,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
                                     _globalTACManager->product_ph_id = nTac_chn;
                                     _globalTACManager->product_ph_type = indexT;
                                     _globalTACManager->product_ph_outputType = 2; // 1三相2单相
-                                    if (indexT == 0)
+                                    if (indexT == ((nTac_chn-3)/(8*3)+3)%3)
                                     {
                                         _globalTACManager->product_ph_outputStatus = 1; // 1输出2不输出
                                     }

+ 78 - 2
pro/src/appweb_handle.c

@@ -1556,7 +1556,12 @@ static void sensorStatusMonitoring(void* conn)
                 free(node);
                 break;
             }
-        } 
+        }
+
+        char temp[100];
+        //sprintf(temp,"$删除$|$传感器$|%d",sensor_id_temp);
+        sprintf(temp,"Delete sensor %d",sensor_id_temp);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id, 3, temp);
 
         ack_str = ctrl_sts_ack_to_json();
     }
@@ -1673,6 +1678,11 @@ static void sensorStatusMonitoring(void* conn)
 #endif
         }
 
+        char temp[100];
+       // sprintf(temp,"$修改$|$传感器$|%d",sensor_id_temp);
+        sprintf(temp,"Update sensor %d",sensor_id_temp);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id, 3, temp);
+
         ack_str = ctrl_sts_ack_to_json();
     }
     //添加传感器
@@ -1736,6 +1746,10 @@ static void sensorStatusMonitoring(void* conn)
         //全局接口体中也需要添加相关参数
         list_add_tail(&_globalSensorMangerTemp->list,&__globalDeviceManage._globalSensorManger.list);
 
+        char temp[100];
+       // sprintf(temp,"$新增$|$传感器$|%d",_over_all_sensor_request.sensorId);
+        sprintf(temp,"Add sensor %d",_over_all_sensor_request.sensorId);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id, 3, temp);
 
         ack_str = ctrl_sts_ack_to_json();
     }
@@ -2483,7 +2497,7 @@ static void communicationManagement(void *conn)
         {
             sprintf(buff, "$%s$|$%s$|addr:%d BD:%d",language_RS485_install[0],language_alarm_RS485_slave[0],info->product_modbus_addr,info->product_modbus_baud);
         }
-        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._globalPowerManger.product_id,4,buff);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._globalPowerManger.product_id,3,buff);
 
         ack_str = ctrl_sts_ack_to_json();
     }
@@ -2569,6 +2583,7 @@ static void serviceManagement(void *conn)
         {
             log_e("update snmp info err.");
         }
+        
     }   
     //查询snmp_trap信息
     else if(strcmp(_serviceManageRequestInfo.type,"listStQuery")==0)
@@ -2705,6 +2720,20 @@ static void serviceManagement(void *conn)
             t = mktime(&tm_new);
             set_local_timeandzone(&tm_new, _globalNTPManager.tzone);
         }
+
+        char temp[100];
+        if (0==_globalNTPManager.mode)
+        {
+           //sprintf(temp,"$设置$|$时间$|%s", _globalNTPManager.time);
+           sprintf(temp,"Set Date & Time %s", _globalNTPManager.time);
+        }
+        else{
+           // sprintf(temp,"$设置$|$时间$|NTP %s",  _globalNTPManager.ntpaddress);
+            sprintf(temp,"Set Date & Time sync from NTP %s", _globalNTPManager.ntpaddress);
+        }
+        dev_insert_alarm_ctrl(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id, 3, temp);
+
+
         ack_str = ctrl_sts_ack_to_json();
         if (_serviceManageRequestInfo._ntp_info.mode) free(_serviceManageRequestInfo._ntp_info.mode);
         if (_serviceManageRequestInfo._ntp_info.port) free(_serviceManageRequestInfo._ntp_info.port);
@@ -2790,6 +2819,12 @@ static void serviceManagement(void *conn)
             }
         }
         pthread_mutex_unlock(&__globalDeviceManage._power_ds);
+
+        char temp[100];
+        //sprintf(temp, "$设置$|定时$");
+        sprintf(temp, "Add scheduled tasks");
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         ack_str = ctrl_sts_ack_to_json();
     }
     //批量删除
@@ -2828,6 +2863,11 @@ static void serviceManagement(void *conn)
             }
         }
         pthread_mutex_unlock(&__globalDeviceManage._power_ds);
+
+        char temp[100];
+       // sprintf(temp, "$删除$|定时$");
+        sprintf(temp, "Delete scheduled tasks");
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
         ack_str = ctrl_sts_ack_to_json();
     }
     // 时序设置
@@ -3116,6 +3156,11 @@ static void serviceManagement(void *conn)
                 }
             }
         }
+        char temp[100];
+        //sprintf(temp, "$打开$|$分组$|%d", ngroup);
+        sprintf(temp, "Open group %d", ngroup);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         ack_str = ctrl_sts_ack_to_json();
     }
     else if (strcmp(_serviceManageRequestInfo.type, "fzClose") == 0) // 分组关
@@ -3214,6 +3259,10 @@ static void serviceManagement(void *conn)
                 }
             }
         }
+        char temp[100];
+       // sprintf(temp, "$关闭$|$分组$|%d", ngroup);
+        sprintf(temp, "Close group %d", ngroup);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
         ack_str = ctrl_sts_ack_to_json();
     }
     
@@ -3304,6 +3353,11 @@ static void systemManagent(void *conn)
             dev_delete_user_info(__globalDeviceManage.db,_UserRoleManageRequestInfo.userIds);
           //  pUserlist = strtok_r(NULL, ",", &pUserListSave);
        // }
+
+            char temp[100];
+            //sprintf(temp, "$删除$|$用户$|%d", _UserRoleManageRequestInfo.userIds);
+            sprintf(temp, "Delete user %d", _UserRoleManageRequestInfo.userIds);
+            dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
     }   
     //添加用户
     else if(strcmp(_UserRoleManageRequestInfo.type,"addUser")==0)
@@ -3356,6 +3410,11 @@ static void systemManagent(void *conn)
             dev_insert_user_info(__globalDeviceManage.db, new_user);
         }
 
+        char temp[100];
+        //sprintf(temp, "$添加$|$用户$|%s", _UserRoleManageRequestInfo.userName);
+        sprintf(temp, "Add user %s", _UserRoleManageRequestInfo.userName);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         ack_str=ctrl_sts_ack_to_json();
     }   
     //更新用户信息
@@ -3379,6 +3438,11 @@ static void systemManagent(void *conn)
 
         dev_update_user_info(__globalDeviceManage.db, new_user);
 
+        char temp[100];
+        //sprintf(temp, "$修改$|$用户$|%s", _UserRoleManageRequestInfo.userName);
+         sprintf(temp, "Update user %s", _UserRoleManageRequestInfo.userName);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         ack_str=ctrl_sts_ack_to_json();
     }    
 
@@ -3478,9 +3542,21 @@ static void equipmentMintenance(void *conn)
         ack_str = vendor_info_to_json(dev);
     }
     else if(strcmp(_Over_equipment_mintenance.type,"sBRestart")==0) {  //restart
+
+        char temp[100];
+        //sprintf(temp, "$系统$|$重启$");
+        sprintf(temp, "System Reboot!");
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         sys_reboot();
     }
     else if(strcmp(_Over_equipment_mintenance.type,"restoreFactorySettings")==0) {  //restore to factory
+
+        char temp[100];
+        //sprintf(temp, "$系统$|$恢复出厂设置$");
+        sprintf(temp, "System Reset!");
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._global_device_info->product_id, 3, temp);
+
         sys_set_factory();
     }
     else {

+ 7 - 7
pro/src/cascade.c

@@ -175,7 +175,7 @@ static int slave_get_info(cascade_handle_t *cas)
             info->ch[cnt].product_ch_status = tmp->product_ch_status;
             info->ch[cnt].start_delay = tmp->product_ch_start_delay;
             info->ch[cnt].stop_delay  = tmp->product_ch_stop_delay;
-            if (tmp->product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)) {
+            if (tmp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B) {
                 cnt2 = 0;
                 list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
                 {
@@ -627,7 +627,7 @@ static int master_scan(cascade_handle_t *cas)
             slave_add(cas, cas->scanAddr);
         }
         else {
-            LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
+            //LOGW("____ scan %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
         }
     }
     cas->scanAddr++;
@@ -686,7 +686,7 @@ static int power_clear(cascade_handle_t *cas)
                 continue;
             }
 
-            if (tmp->product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)) {
+            if (tmp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B) {
                 if(list_empty(&tmp->list_Tree_AC)) {
                     continue;
                 }
@@ -774,7 +774,7 @@ static int power_add(cascade_handle_t *cas)
         tmp->product_ch_start_delay = info->ch[i].start_delay;
         tmp->product_ch_stop_delay = info->ch[i].stop_delay;
 
-        if(info->ch[i].product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B)) {
+        if(info->ch[i].product_ch_type==TREE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
             INIT_LIST_HEAD(&tmp->list_Tree_AC);
             for (j=0; j<3; j++) {
                 tmp3 = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
@@ -839,7 +839,7 @@ static int power_update(cascade_handle_t *cas)
         cnt = 0;
         list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
         {
-            if(tmp->product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B)) {
+            if(tmp->product_ch_type==TREE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
                 if(list_empty(&tmp->list_Tree_AC)) {
                     continue;
                 }
@@ -1394,10 +1394,10 @@ int cascade_get_ch(_OverChnPwrAckInfo *ch)
     GlobalDeviceManager* dm2=get_dm2();
     list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
     {
-        if (tmp->product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)){
+        if (tmp->product_ch_type==TREE_AC_TYPE||dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B){
             int nStatus=-1;//-1则状态不变,0、1则是子状态
             //判断是否三相单输出情况下
-            if(tmp->product_ch_type==TREE_AC_TYPE||(tmp->product_ch_type==AC_SINGLE_B_TYPE&&dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)) {
+            if(tmp->product_ch_type==TREE_AC_TYPE||dm2->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B) {
                 list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC) {
                     if (2 == tmp3->product_ph_outputType &&1==tmp3->product_ph_outputStatus)
                     {//单项并且状态为输出

+ 6 - 6
pro/src/json_handle.c

@@ -1278,10 +1278,10 @@ char* vendor_info_to_json(GlobalDeviceInfo *dev)
 
             get_base64(&logo, &qrcode);
             cJSON_AddStringToObject(data_field,"logo", logo.buf?logo.buf:"");          //base64
-            cJSON_AddStringToObject(data_field,"sensorAddr", "wowowow");
-            cJSON_AddStringToObject(data_field,"website", "www.xxxx.com");
-            cJSON_AddStringToObject(data_field,"serviceTel","1345678");
-            cJSON_AddStringToObject(data_field,"mailbox","8888@123.com");
+            cJSON_AddStringToObject(data_field,"sensorAddr", "-");
+            cJSON_AddStringToObject(data_field,"website", "-");
+            cJSON_AddStringToObject(data_field,"serviceTel","-");
+            cJSON_AddStringToObject(data_field,"mailbox","-");
             cJSON_AddStringToObject(data_field,"qrCode",qrcode.buf?qrcode.buf:"");        //base64
 
             cJSON_AddItemToArray(root_array, data_field);
@@ -2218,7 +2218,7 @@ char* over_chn_pwr_monitor_to_json(_OverChnPwrAckInfo* _over_chn_pwr_back_info)
         cJSON_AddStringToObject(data_filed,"firingInterval",temp);
         sprintf(temp,"%d",_chnPwrTemp->product_ch_stop_delay/1000);     
         cJSON_AddStringToObject(data_filed,"closeInterval",temp);
-        if (_chnPwrTemp->product_type==TREE_AC_TYPE||(_chnPwrTemp->product_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B))
+        if (_chnPwrTemp->product_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
         {
             if (_chnPwrTemp->product_phType>=0&&_chnPwrTemp->product_phType<3)
             {
@@ -3133,7 +3133,7 @@ char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_
         cJSON_AddItemToObject(sub_data_root_array, "data", data_filed);
         sprintf(temp, "%d", _chnPwrTemp->status);
         cJSON_AddStringToObject(data_filed,"productChStatus",temp);
-        if (_chnPwrTemp->product_type == TREE_AC_TYPE||(_chnPwrTemp->product_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B))
+        if (_chnPwrTemp->product_type == TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
         {
             if (_chnPwrTemp->product_phType >= 0 && _chnPwrTemp->product_phType < 3)
             {

+ 2 - 2
pro/src/sqlite_handle.c

@@ -402,12 +402,12 @@ int dev_search_latest_power_All_info(GlobalDeviceManager* globalDeviceManger,_Ov
             /* code */
         }
         
-        if (_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||(_globalPowerMangerTemp->product_ch_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B))
+        if (_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
         {
             GlobalTreeACManager* _TreeACTemp=NULL;
             int nStatus=-1;//-1则状态不变,0、1则是子状态
             //判断是否三相单输出情况下
-            if(_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||(_globalPowerMangerTemp->product_ch_type==AC_SINGLE_B_TYPE&&__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B))
+            if(_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
             {
                 list_for_each_entry(_TreeACTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
                 {

+ 43 - 29
pro/src/websocket_handle.c

@@ -84,71 +84,82 @@ static void web_update(ws_handle_t *wh)
             gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One ||
 			gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One_B)
 		{
-            _OverAllPwrAckInfo l1,l2,l3;
+            int nRet_L1 = -1;
+            int nRet_L2 = -1;
+            int nRet_L3 = -1;
+            _OverAllPwrAckInfo l1, l2, l3;
             if (cur_dev_addr == 0)
             {
-                pthread_mutex_lock(&gdm->_power_update); 
-                dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm);
-                dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm);
-                dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm);
+                pthread_mutex_lock(&gdm->_power_update);
+                nRet_L1 = dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm);
+                nRet_L2 = dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm);
+                nRet_L3 = dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm);
                 pthread_mutex_unlock(&gdm->_power_update);
             }
             else
             {
                 cascade_lock();
-                dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm2);
-                dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm2);
-                dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm2);
+                nRet_L1 = dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm2);
+                nRet_L2 = dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm2);
+                nRet_L3 = dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm2);
                 cascade_unlock();
             }
-            json_str = over_all_pwr_monitor_Tree_AC_to_json(&l1, &l2, &l3);
+            if (0 == nRet_L1 && 0 == nRet_L2 && 0 == nRet_L3)
+            {
+                json_str = over_all_pwr_monitor_Tree_AC_to_json(&l1, &l2, &l3);
 
-            ws_broadcast(wh, json_str, strlen(json_str));
-            cJSON_free((void*)json_str);
+                ws_broadcast(wh, json_str, strlen(json_str));
+                cJSON_free((void *)json_str);
+            }
         }
         else
         {
+            int nRetTotal = -1;
             if(cur_dev_addr==0) {
                 pthread_mutex_lock(&gdm->_power_update); 
-                dev_search_latest_power_statistic_info(gdm, &allInfo);
+                nRetTotal=dev_search_latest_power_statistic_info(gdm, &allInfo);
                 pthread_mutex_unlock(&gdm->_power_update);
             }
             else {
                 cascade_lock();
-                dev_search_latest_power_statistic_info(gdm2, &allInfo);
+                nRetTotal=dev_search_latest_power_statistic_info(gdm2, &allInfo);
                 cascade_unlock();  
             }
-            json_str = ws_over_status_ack_to_json(0, &allInfo);
-
-            ws_broadcast(wh, json_str, strlen(json_str));
-            cJSON_free(json_str);
+            if (0==nRetTotal)
+            {
+                json_str = ws_over_status_ack_to_json(0, &allInfo);
+                ws_broadcast(wh, json_str, strlen(json_str));
+                cJSON_free(json_str);
+            }
         }
 
         //channel info
         {
             INIT_LIST_HEAD(&chInfo.list);
+             int nRetCh = -1;
 
             if(cur_dev_addr==0) {
                 pthread_mutex_lock(&gdm->_power_update); 
-                dev_search_latest_power_All_info(gdm,&chInfo);
+               nRetCh=dev_search_latest_power_All_info(gdm,&chInfo);
                 pthread_mutex_unlock(&gdm->_power_update);
             }
             else {
                 cascade_lock();
-                dev_search_latest_power_All_info(gdm2,&chInfo);
+                nRetCh=dev_search_latest_power_All_info(gdm2,&chInfo);
                 cascade_unlock();
             }
-
-            json_str = ws_chn_status_ack_to_json(1,&chInfo);
-            ws_broadcast(wh, json_str, strlen(json_str));
-            cJSON_free((void*)json_str);
-            
-            _OverChnPwrAckInfo *node,*next;
+            if (0 == nRetCh)
+            {
+                json_str = ws_chn_status_ack_to_json(1, &chInfo);
+                ws_broadcast(wh, json_str, strlen(json_str));
+                cJSON_free((void *)json_str);
+            }
+            _OverChnPwrAckInfo *node, *next;
             list_for_each_entry_safe(node, next, &chInfo.list, list)
             {
                 list_del(&node->list);
                 free(node);
-            } 
+            }
         }
 
         //sensor info
@@ -172,7 +183,7 @@ static void fn(mg_conn_t *c, int ev, void *ev_data)
 
     case MG_EV_CLOSE:
     {
-      if (c->is_websocket)
+      if (c->is_websocket )
       {
         if(wh->ws_cnt>0) {
             wh->ws_cnt--;
@@ -227,8 +238,11 @@ void* websocket_thread(void* arg)
 
     while(h->quit==0) {
         mg_mgr_poll(&wh->mgr, 1000);                    // Infinite event loop
-
-        web_update(wh);
+        if (wh->c)
+        {
+            web_update(wh);
+        }
+    
         usleep(500000);
     }
     wh->inited = 0;