Quellcode durchsuchen

电力监控属性刷新

learshaw vor 5 Monaten
Ursprung
Commit
61e22d149c

+ 6 - 0
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/TaskExecutor.java

@@ -11,6 +11,7 @@
 package com.ruoyi.ems;
 
 import com.ruoyi.ems.core.ObjectCache;
+import com.ruoyi.ems.handle.AcrelElecMonitorHandler;
 import com.ruoyi.ems.handle.GeekOpenCbHandler;
 import com.ruoyi.ems.handle.InDoorEnergyHandler;
 import com.ruoyi.ems.handle.SquareLightCtlHandler;
@@ -55,6 +56,10 @@ public class TaskExecutor {
     @Resource
     private SquareLightCtlHandler squareLightCtlHandler;
 
+    @Qualifier("acrelElecMonitorHandler")
+    @Resource
+    private AcrelElecMonitorHandler acrelElecMonitorHandler;
+
     /**
      * 定时清理过期设备上报响应
      */
@@ -70,6 +75,7 @@ public class TaskExecutor {
     @Scheduled(cron = "0 0/5 * * * ?")
     public void refresh5min() {
         CompletableFuture.runAsync(() -> squareLightCtlHandler.execSyncDevAttrAll());
+        CompletableFuture.runAsync(() -> acrelElecMonitorHandler.execSyncDevAttrAll());
         inDoorEnergyHandler.refreshOnline();
         squareLightCtlHandler.refreshOnline();
     }

+ 0 - 1
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/controller/AcrelElecMonitorController.java

@@ -11,7 +11,6 @@
 package com.ruoyi.ems.controller;
 
 import com.ruoyi.ems.handle.AcrelElecMonitorHandler;
-import com.ruoyi.ems.handle.SquareLightCtlHandler;
 import com.ruoyi.ems.model.AbilityPayload;
 import com.ruoyi.ems.model.CallResponse;
 import io.swagger.annotations.Api;

+ 149 - 35
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/AcrelElecMonitorHandler.java

@@ -25,9 +25,8 @@ import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.model.acrel.Circuit;
 import com.ruoyi.ems.model.acrel.MeterKeyValue;
 import com.ruoyi.ems.model.acrel.MeterUse;
-import com.ruoyi.ems.model.slightctl.CcElecInfo;
-import com.ruoyi.ems.model.slightctl.SlcDevice;
 import com.ruoyi.ems.service.IEmsObjAttrService;
+import com.ruoyi.ems.util.PingUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -39,8 +38,11 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -98,6 +100,18 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
                     case "GetDeviceList":
                         CompletableFuture.runAsync(this::execGetDeviceList);
                         break;
+                    case "SyncDevAttrAll":
+                        CompletableFuture.runAsync(this::execSyncDevAttrAll);
+                        break;
+                    default:
+                        throw new UnsupportedOperationException("不支持的abilityKey");
+                }
+            }
+            else if (DevObjType.DEVC.getCode() == abilityParam.getObjType()) {
+                switch (abilityParam.getAbilityKey()) {
+                    case "SyncDevAttr":
+                        execSyncDevAttr(abilityParam.getObjCode(), abilityParam.getModelCode());
+                        break;
                     default:
                         throw new UnsupportedOperationException("不支持的abilityKey");
                 }
@@ -113,29 +127,51 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
         return callResponse;
     }
 
-    public void execSyncDevAttrAll() {
+    @Override
+    public void refreshOnline() {
         try {
-            // 执行采集
-            String[] subIds = StringUtils.split(config.getSubIds(), ",");
-            // 采集同步设备
-            Acrel3000Template template = new Acrel3000Template(config.getUrl());
+            // 1. 从URL中提取IP地址
+            String url = config.getUrl();
+            if (StringUtils.isBlank(url)) {
+                log.warn("电力监控系统URL配置为空,跳过心跳检测");
+                return;
+            }
 
-            for (String subId : subIds) {
-                List<MeterUse> meterUseList = template.getMeterUseInfoList(subId);
-                meterUseList = meterUseList.stream().filter(this::meterUseList).collect(Collectors.toList());
+            String ipAddress = PingUtils.extractIpFromUrl(url);
+            if (StringUtils.isBlank(ipAddress)) {
+                log.warn("无法从URL中提取IP地址: {}", url);
+                return;
+            }
 
-                if (CollectionUtils.isNotEmpty(meterUseList)) {
-                    Map<String, MeterUse> meterUseMap = meterUseList.stream()
-                        .collect(Collectors.toMap(MeterUse::getMeterCode, Function.identity()));
+            // 2. 执行ping检测
+            boolean isOnline = PingUtils.pingHost(ipAddress, 3000); // 3秒超时
 
-                    List<Circuit> circuitList = template.getCircuitInfoTree(subId);
+            // 3. 获取当前系统状态
+            String statusKey = "interfaceStatus";
 
-                    // TODO
-                }
+            // 查询当前状态
+            EmsObjAttrValue currentStatus = objAttrValueService.selectObjAttrValue(SYS_MODE_CODE, SUBSYSTEM_CODE,
+                statusKey);
+
+            String newStatus = isOnline ? "1" : "0";
+            String oldStatus = currentStatus != null ? currentStatus.getAttrValue() : null;
+
+            // 4. 状态发生变化时更新并记录
+            if (!StringUtils.equals(oldStatus, newStatus)) {
+                log.info("电力监控系统连接状态变化: {} -> {}, IP: {}", oldStatus, newStatus, ipAddress);
+
+                // 更新系统属性状态
+                objAttrValueService.updateObjAttrValue(SYS_MODE_CODE, SUBSYSTEM_CODE, statusKey, newStatus);
+
+                String key = isOnline ? "connect" : "disconnect";
+                triggerEvent(SYS_MODE_CODE, SUBSYSTEM_CODE, key, null, new Date());
             }
+
+            // 5. 记录心跳日志(可选,用于调试)
+            log.debug("电力监控系统心跳检测完成 - IP: {}, 状态: {}", ipAddress, isOnline ? "在线" : "离线");
         }
         catch (Exception e) {
-            log.error("execSyncDevAttrAll fail!", e);
+            log.error("电力监控系统心跳检测异常", e);
         }
     }
 
@@ -149,10 +185,12 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
             if (CollectionUtils.isNotEmpty(dbDevs)) {
                 for (EmsDevice emsDevice : dbDevs) {
                     deviceService.deleteDevice(emsDevice.getDeviceModel(), emsDevice.getDeviceCode());
-                    objAttrValueService.deleteByObjCode(emsDevice.getDeviceModel(), emsDevice.getDeviceCode());
                 }
             }
 
+            objAttrValueService.deleteByObjCode(MONITOR_BHZZ_MODE_CODE, null);
+            objAttrValueService.deleteByObjCode(MONITOR_DB_MODE_CODE, null);
+
             // 执行采集
             String[] subIds = StringUtils.split(config.getSubIds(), ",");
 
@@ -167,9 +205,58 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
         }
     }
 
-    @Override
-    public void refreshOnline() {
+    public void execSyncDevAttrAll() {
+        try {
+            // 执行采集
+            String[] subIds = StringUtils.split(config.getSubIds(), ",");
+            // 采集同步设备
+            Acrel3000Template template = new Acrel3000Template(config.getUrl());
 
+            for (String subId : subIds) {
+                List<MeterUse> meterUseList = template.getMeterUseInfoList(subId);
+                meterUseList = meterUseList.stream().filter(this::meterUseList).collect(Collectors.toList());
+                List<Circuit> circuitList = template.getCircuitInfoTree(subId);
+                Map<String, Circuit> circuitParentMap = circuitList.stream()
+                    .collect(Collectors.toMap(Circuit::getMeterCode, Function.identity()));
+
+                if (CollectionUtils.isNotEmpty(meterUseList)) {
+                    for (MeterUse meterUse : meterUseList) {
+                        String objCode = circuitParentMap.containsKey(meterUse.getMeterCode()) ?
+                            String.format("W4-E-%s", meterUse.getMeterCode()) :
+                            meterUse.getMeterCode();
+
+                        if (StringUtils.equals("01001", meterUse.getMeterTypeCode())) {
+                            refreshDevAttr(objCode, MONITOR_DB_MODE_CODE, meterUse, template);
+                        }
+                        else if (StringUtils.equals("01002", meterUse.getMeterTypeCode())) {
+                            refreshDevAttr(objCode, MONITOR_BHZZ_MODE_CODE, meterUse, template);
+                        }
+                    }
+                }
+            }
+        }
+        catch (Exception e) {
+            log.error("execSyncDevAttrAll fail!", e);
+        }
+    }
+
+    public void execSyncDevAttr(String objCode, String modelCode) {
+        try {
+            EmsObjAttrValue subIdObj = objAttrValueService.selectObjAttrValue(modelCode, objCode, "subId");
+            EmsObjAttrValue meterCodeObj = objAttrValueService.selectObjAttrValue(modelCode, objCode, "deviceCode");
+
+            if (null != subIdObj && null != meterCodeObj) {
+                MeterUse meterUse = new MeterUse();
+                meterUse.setSubId(subIdObj.getAttrValue());
+                meterUse.setMeterCode(meterCodeObj.getAttrValue());
+
+                Acrel3000Template template = new Acrel3000Template(config.getUrl());
+                refreshDevAttr(objCode, modelCode, meterUse, template);
+            }
+        }
+        catch (Exception e) {
+            log.error("execSyncDevAttr fail!", e);
+        }
     }
 
     public void getAreaDeviceList(String subId) {
@@ -193,7 +280,8 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
                     deviceService.insertEmsDevice(device);
 
                     // 设备属性
-                    List<EmsObjAttrValue> attrValues = buildDeviceAttr(circuit, device, meterUseMap, template);
+                    List<EmsObjAttrValue> attrValues = buildDeviceAttr(device.getDeviceCode(), device.getDeviceModel(),
+                        circuit, meterUseMap, template);
 
                     if (CollectionUtils.isNotEmpty(attrValues)) {
                         objAttrValueService.insertBatch(attrValues);
@@ -203,12 +291,36 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
         }
     }
 
-    private List<EmsObjAttrValue> buildDeviceAttr(Circuit circuit, EmsDevice device, Map<String, MeterUse> meterUseMap,
-        Acrel3000Template template) {
+    private void refreshDevAttr(String objCode, String modelCode, MeterUse meterUse, Acrel3000Template template) {
+        // 查询数据库对象属性集合
+        List<EmsObjAttrValue> dbAttrValues = objAttrValueService.selectByObjCode(modelCode, objCode);
+
+        if (CollectionUtils.isNotEmpty(dbAttrValues)) {
+            Map<String, EmsObjAttrValue> vMap = dbAttrValues.stream()
+                .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, Function.identity()));
+
+            checkAndUpdate(vMap, objCode, modelCode, "deviceStatus", String.valueOf(convertStatus(meterUse)));
+
+            List<EmsObjAttr> objAttrList = objAttrService.selectByModelCode(modelCode);
+            Set<String> attrKeys = objAttrList.stream().map(EmsObjAttr::getAttrKey).collect(Collectors.toSet());
+
+            List<MeterKeyValue> meterKeyValueList = template.getMeterParamValueByKey(meterUse.getSubId(),
+                meterUse.getMeterCode());
+
+            for (MeterKeyValue meterKeyValue : meterKeyValueList) {
+                if (attrKeys.contains(meterKeyValue.getParamCode())) {
+                    checkAndUpdate(vMap, objCode, modelCode, meterKeyValue.getParamCode(), meterKeyValue.getValue());
+                }
+            }
+        }
+    }
+
+    private List<EmsObjAttrValue> buildDeviceAttr(String objCode, String modelCode, Circuit circuit,
+        Map<String, MeterUse> meterUseMap, Acrel3000Template template) {
         // 主节点设备自身属性获取
+        MeterUse parentMeterUse = meterUseMap.get(circuit.getMeterCode());
         List<EmsObjAttrValue> attrValues = new ArrayList<>(
-            getDeviceAttrFromSys(device.getDeviceCode(), device.getDeviceModel(), device.getDeviceStatus(), circuit,
-                template));
+            getDeviceAttrFromSys(objCode, modelCode, convertStatus(parentMeterUse), circuit, template));
 
         if (circuit.getInComIng() && CollectionUtils.isNotEmpty(circuit.getChildren())) {
             JSONArray subDevArray = new JSONArray();
@@ -216,18 +328,17 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
             for (Circuit subCircuit : circuit.getChildren()) {
                 JSONObject jsonObject = new JSONObject();
                 jsonObject.put("deviceCode", subCircuit.getMeterCode());
-                jsonObject.put("modelCode", device.getDeviceModel());
+                jsonObject.put("modelCode", modelCode);
                 subDevArray.add(jsonObject);
 
                 MeterUse subMeterUse = meterUseMap.get(subCircuit.getMeterCode());
                 // 子节点设备属性获取
                 attrValues.addAll(
-                    getDeviceAttrFromSys(subCircuit.getMeterCode(), device.getDeviceModel(), convertStatus(subMeterUse),
-                        subCircuit, template));
+                    getDeviceAttrFromSys(subCircuit.getMeterCode(), modelCode, convertStatus(subMeterUse), subCircuit,
+                        template));
             }
 
-            attrValues.add(
-                new EmsObjAttrValue(device.getDeviceCode(), device.getDeviceModel(), "subDev", subDevArray.toString()));
+            attrValues.add(new EmsObjAttrValue(objCode, modelCode, "subDev", subDevArray.toString()));
         }
 
         return attrValues;
@@ -238,8 +349,8 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
         List<EmsObjAttrValue> retList = new ArrayList<>();
         retList.add(new EmsObjAttrValue(objCode, modelCode, "subId", circuit.getSubId()));
         retList.add(new EmsObjAttrValue(objCode, modelCode, "subName", circuit.getSubName()));
-        retList.add(new EmsObjAttrValue(objCode, modelCode, "meterName", circuit.getCircuitName()));
-        retList.add(new EmsObjAttrValue(objCode, modelCode, "meterCode", circuit.getMeterCode()));
+        retList.add(new EmsObjAttrValue(objCode, modelCode, "deviceName", circuit.getCircuitName()));
+        retList.add(new EmsObjAttrValue(objCode, modelCode, "deviceCode", circuit.getMeterCode()));
         retList.add(new EmsObjAttrValue(objCode, modelCode, "deviceStatus", deviceStatus.toString()));
 
         List<MeterKeyValue> meterKeyValueList = template.getMeterParamValueByKey(circuit.getSubId(),
@@ -295,10 +406,13 @@ public class AcrelElecMonitorHandler extends BaseMeterDevHandler {
         return device;
     }
 
-
-
     private Integer convertStatus(MeterUse meterUse) {
-        return meterUse.getDisConnect() ? 0 : 1;
+        if (null != meterUse && null != meterUse.getDisConnect()) {
+            return meterUse.getDisConnect() ? 0 : 1;
+        }
+        else {
+            return 1;
+        }
     }
 
     private boolean meterUseList(MeterUse meterUse) {

+ 5 - 5
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/SquareLightCtlHandler.java

@@ -615,7 +615,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
                 List<SlcDeviceLamp> lampList = deviceInfo.getLampList();
                 SlcDeviceLamp lamp = lampList.get(0);
                 checkAndUpdate(vMap, deviceId, DEV_MODE_CODE, "cct", String.valueOf(lamp.getCct()));
-                checkAndUpdate(vMap, deviceId, DEV_MODE_CODE, "lampOnOff", String.valueOf(lamp.getLampOnOff()));
+                checkAndUpdate(vMap, deviceId, DEV_MODE_CODE, "Switch", String.valueOf(lamp.getLampOnOff()));
             }
         }
         else {
@@ -628,7 +628,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
                 oaValues.add(new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "deviceName", slcDevice.getDeviceName()));
                 oaValues.add(new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "imageUrl", slcDevice.getImageUrl()));
                 oaValues.add(
-                    new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "abnormal", String.valueOf(slcDevice.getAbnormal())));
+                    new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "deviceStatus", String.valueOf(slcDevice.getAbnormal())));
                 oaValues.add(new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "csq", slcDevice.getCsq()));
                 oaValues.add(new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "lampList",
                     JSON.toJSONString(slcDevice.getLampList())));
@@ -670,7 +670,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
                 SlcDeviceLamp lamp = lampList.get(0);
                 oaValues.add(new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "cct", String.valueOf(lamp.getCct())));
                 oaValues.add(
-                    new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "lampOnOff", String.valueOf(lamp.getLampOnOff())));
+                    new EmsObjAttrValue(deviceId, DEV_MODE_CODE, "Switch", String.valueOf(lamp.getLampOnOff())));
             }
 
             objAttrValueService.insertBatch(oaValues);
@@ -686,7 +686,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
             if (CollectionUtils.isNotEmpty(objAttrValues)) {
                 Map<String, EmsObjAttrValue> objAttrValueMap = objAttrValues.stream()
                     .collect(Collectors.toMap(EmsObjAttrValue::getAttrKey, Function.identity()));
-                checkAndUpdate(objAttrValueMap, slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "abnormal",
+                checkAndUpdate(objAttrValueMap, slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "deviceStatus",
                     String.valueOf(slcDevice.getAbnormal()));
                 checkAndUpdate(objAttrValueMap, slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "csq", String.valueOf(slcDevice.getCsq()));
                 checkAndUpdate(objAttrValueMap, slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "kwh", String.valueOf(info.getKwh()));
@@ -717,7 +717,7 @@ public class SquareLightCtlHandler extends BaseDevHandler {
                         slcDevice.getDeviceModelId()));
                 objAttrValues.add(new EmsObjAttrValue(slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "imageUrl",
                     slcDevice.getImageUrl()));
-                objAttrValues.add(new EmsObjAttrValue(slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "abnormal",
+                objAttrValues.add(new EmsObjAttrValue(slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "deviceStatus",
                     String.valueOf(slcDevice.getAbnormal())));
                 objAttrValues.add(new EmsObjAttrValue(slcDevice.getDeviceCode(), CONCENTRATOR_MODE_CODE, "csq",
                     String.valueOf(slcDevice.getCsq())));

+ 1 - 1
ems/ems-cloud/ems-dev-adapter/src/test/java/com/huashe/test/Acrel3000Test.java

@@ -99,7 +99,7 @@ public class Acrel3000Test {
     @Test
     public void testGetMeterParamValueByKey() {
         Acrel3000Template template = new Acrel3000Template(config.getUrl());
-        List<MeterKeyValue> meterKeyValueList = template.getMeterParamValueByKey("10100002", "T102086");
+        List<MeterKeyValue> meterKeyValueList = template.getMeterParamValueByKey("10100002", "T102006");
         log.info("MeterKeyValueList: {}", meterKeyValueList);
         Assert.assertNotNull(meterKeyValueList);
     }

+ 5 - 1
ems/ems-core/src/main/resources/mapper/ems/EmsObjAttrValueMapper.xml

@@ -76,7 +76,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteByObjCode" >
-        delete from adm_ems_obj_attr_value where model_code = #{modelCode} and obj_code = #{objCode}
+        delete from adm_ems_obj_attr_value
+        <where>
+            <if test="modelCode != null  and modelCode != ''"> and model_code = #{modelCode}</if>
+            <if test="objCode != null  and objCode != ''"> and obj_code = #{objCode}</if>
+        </where>
     </delete>
 
     <delete id="deleteObjAttrValueByIds" parameterType="String">

+ 16 - 12
ems/sql/ems_init_data.sql

@@ -292,12 +292,12 @@ INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_na
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'minCct', '最小色温', NULL, 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'maxCct', '最大色温', NULL, 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'imageUrl', '图片', NULL, 'WebPic');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'abnormal', '设备状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'deviceStatus', '设备状态', NULL, 'Enum');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Base', 'csq', '信号强度', NULL, 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_SYS_SQUARE_LIGHT', 'Protocol', 'firmwareVer', '固件版本', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_SYS_SQUARE_LIGHT', 'Protocol', 'softwareVer', '软件版本', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'State', 'cct', '色温', NULL, 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'State', 'lampOnOff', '开关', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'State', 'Switch', '开关', NULL, 'Enum');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Measure', 'current', '电流', 'A', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Measure', 'power', '功率', 'W', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Measure', 'factor', '功率因数', NULL, 'Value');
@@ -310,7 +310,7 @@ INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_na
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'deviceUid', '设备sn号', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'deviceModelId', '设备型号id', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'imageUrl', '图片', NULL, 'WebPic');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'abnormal', '设备状态', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'deviceStatus', '设备状态', NULL, 'Enum');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'Base', 'csq', '信号强度', NULL, 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'State', 'kwh', '有功功率', NULL, 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'State', 'kvarh', '无功功率', NULL, 'Value');
@@ -351,8 +351,8 @@ INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_na
 
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'subId', '站点编号', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'subName', '站点名称', NULL, 'String');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'meterName', '测点名称', NULL, 'String');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'meterCode', '测点编码', NULL, 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'deviceName', '测点名称', NULL, 'String');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'deviceCode', '测点编码', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Base', 'subDev', '测点设备', NULL, 'String');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'deviceStatus', '在线状态', NULL, 'Enum');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Switch', '开关', NULL, 'Enum');
@@ -369,7 +369,7 @@ INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_na
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Ubc', 'BC线电压', 'V', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Uca', 'CA线电压', 'V', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'VUB', '电压不平衡度', '%', 'Value');
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'P', '总有功功率', 'kW', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'power', '总有功功率', 'kW', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Pa', 'A相有功功率', 'kW', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Pb', 'B相有功功率', 'kW', 'Value');
 INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_group`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'State', 'Pc', 'C相有功功率', 'kW', 'Value');
@@ -394,12 +394,12 @@ INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `at
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_SYS_SQUARE_LIGHT', 'interfaceStatus', '0', '断开');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_SYS_ELEC_MONITOR', 'interfaceStatus', '1', '正常');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_SYS_ELEC_MONITOR', 'interfaceStatus', '0', '断开');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'abnormal', '0', '正常');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'abnormal', '1', '异常');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'lampOnOff', '0', '关闭');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'lampOnOff', '1', '开启');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'abnormal', '0', '正常');
-INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'abnormal', '1', '异常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'deviceStatus', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'deviceStatus', '1', '异常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Switch', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'Switch', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'deviceStatus', '0', '正常');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_Z010_DEV_SQUARE_CONCENTRATOR', 'deviceStatus', '1', '异常');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_DEV_ELEC_MONITOR_BHZZ', 'Switch', '0', '关闭');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_DEV_ELEC_MONITOR_BHZZ', 'Switch', '1', '开启');
 INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'Switch', '0', '关闭');
@@ -490,6 +490,10 @@ INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`,
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'lightControlBrightness', '亮度设置', '亮度设置', '{"type":"Slider", "min":0, "max":100}', 1);
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_Z010_DEV_SQUARE_LIGHT', 'SyncDevAttr', '刷新状态', '全量灯组状态', null, 1);
 INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_SYS_ELEC_MONITOR', 'GetDeviceList', '同步设备列表', '同步设备列表', null, 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_SYS_ELEC_MONITOR', 'SyncDevAttrAll', '全量刷新状态', '全量刷新状态', null, 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_DEV_ELEC_MONITOR_BHZZ', 'SyncDevAttr', '刷新状态', '刷新设备状态', null, 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `param_definition`, `hidden_flag`) VALUES ('M_W4_DEV_ELEC_MONITOR_DB', 'SyncDevAttr', '刷新状态', '刷新设备状态', null, 1);
+
 
 -- 对象事件数据
 INSERT INTO `adm_ems_obj_event` (`model_code`, `event_key`, `event_type`, `event_name`, `event_desc`, `event_code`, `ext_event_code`) VALUES ('M_W4_SYS_IN_DOOR', 'connect', 1, '连接恢复', '连接正常', 'M_W4_SYS_IN_DOOR_00', NULL);