瀏覽代碼

设备属性更新调测

learshaw 4 月之前
父節點
當前提交
a219014f21

+ 77 - 26
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/handle/GeekOpenCbHandler.java

@@ -18,13 +18,16 @@ import com.ruoyi.ems.core.MessageCache;
 import com.ruoyi.ems.core.MqttTemplate;
 import com.ruoyi.ems.domain.EmsDevice;
 import com.ruoyi.ems.domain.EmsObjAbilityCallLog;
+import com.ruoyi.ems.domain.EmsObjAttrDto;
 import com.ruoyi.ems.domain.EmsObjAttrValue;
 import com.ruoyi.ems.model.AbilityPayload;
 import com.ruoyi.ems.model.MqttCacheMsg;
 import com.ruoyi.ems.service.IEmsDeviceService;
 import com.ruoyi.ems.service.IEmsObjAbilityCallLogService;
+import com.ruoyi.ems.service.IEmsObjAttrService;
 import com.ruoyi.ems.service.IEmsObjAttrValueService;
 import com.ruoyi.ems.util.IdUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,6 +38,11 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * GeekOpen 断路器服务层
@@ -60,11 +68,19 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
     private IEmsDeviceService deviceService;
 
     @Autowired
+    private IEmsObjAttrService objAttrService;
+
+    @Autowired
     private IEmsObjAttrValueService objAttrValueService;
 
     @Autowired
     private IEmsObjAbilityCallLogService objAbilityCallLogService;
 
+    /**
+     * 缓存设备属性
+     */
+    public static final Map<String, Map<String, String>> attrCache = new ConcurrentHashMap<>();
+
     private static final String TOPIC_PREFIX = "/device/dlq/";
 
     /**
@@ -147,6 +163,7 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
 
     /**
      * 刷新设备状态
+     *
      * @param device 设备信息
      */
     private void refreshStatus(EmsDevice device) {
@@ -155,45 +172,79 @@ public class GeekOpenCbHandler extends MqttBaseHandler {
     }
 
     /**
+     * 更新基础属性值
+     *
+     * @param device   设备信息
+     * @param objType  对象类型
+     * @param jsonBody jsonBody 消息体
+     */
+    private void updateBaseAttr(EmsDevice device, Integer objType, JSONObject jsonBody) {
+        checkForUpdate(objType, device, jsonBody, "key");
+        checkForUpdate(objType, device, jsonBody, "iccid");
+        checkForUpdate(objType, device, jsonBody, "signal");
+        checkForUpdate(objType, device, jsonBody, "version");
+        checkForUpdate(objType, device, jsonBody, "timerEnable");
+        checkForUpdate(objType, device, jsonBody, "timerInterval");
+        checkForUpdate(objType, device, jsonBody, "keyLock");
+        checkForUpdate(objType, device, jsonBody, "onState");
+        checkForUpdate(objType, device, jsonBody, "resetLock");
+    }
+
+    /**
      * 更新自动上报属性值
-     * @param device 设备信息
-     * @param objType 对象类型
+     *
+     * @param device   设备信息
+     * @param objType  对象类型
      * @param jsonBody jsonBody 消息体
      */
     private void updateAutoAttr(EmsDevice device, Integer objType, JSONObject jsonBody) {
-        if (jsonBody.containsKey("voltage")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "voltage", jsonBody.getString("voltage"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
-        }
+        checkForUpdate(objType, device, jsonBody, "voltage");
+        checkForUpdate(objType, device, jsonBody, "current");
+        checkForUpdate(objType, device, jsonBody, "power");
+        checkForUpdate(objType, device, jsonBody, "energy");
+    }
 
-        if (jsonBody.containsKey("current")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "current", jsonBody.getString("current"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
+    /**
+     * 校验是否需要更新属性值
+     *
+     * @param jsonBody jsonBody 消息体
+     * @param attrKey  属性key
+     * @return true 更新,false 不更新
+     */
+    private void checkForUpdate(Integer objType, EmsDevice device, JSONObject jsonBody, String attrKey) {
+        if (!jsonBody.containsKey(attrKey)) {
+            return;
         }
+        String currentValue = jsonBody.getString(attrKey);
+
+        // Atomically initialize the cache entry if absent
+        Map<String, String> attrMap = attrCache.computeIfAbsent(device.getDeviceCode(), k -> {
+            List<EmsObjAttrValue> attrList = objAttrValueService.selectByObjCode(objType, k);
+            if (CollectionUtils.isNotEmpty(attrList)) {
+                return attrList.stream().collect(
+                    Collectors.toMap(EmsObjAttrValue::getAttrKey, EmsObjAttrValue::getAttrValue, (v1, v2) -> v1,
+                        ConcurrentHashMap::new));
+            }
+            else {
+                return new ConcurrentHashMap<>();
+            }
+        });
 
-        if (jsonBody.containsKey("power")) {
-            EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "power", jsonBody.getString("power"));
-            objAttrValueService.mergeObjAttrValue(attrValue);
-        }
+        String cachedValue = attrMap.get(attrKey);
 
-        if (jsonBody.containsKey("energy")) {
+        if (!StringUtils.equals(currentValue, cachedValue)){
             EmsObjAttrValue attrValue = new EmsObjAttrValue(device.getDeviceCode(), objType, device.getDeviceModel(),
-                "energy", jsonBody.getString("energy"));
+                attrKey, currentValue);
             objAttrValueService.mergeObjAttrValue(attrValue);
+            updateCacheAfterSuccess(device, attrKey, currentValue);
         }
     }
 
-    /**
-     * 更新基础属性值
-     * @param device 设备信息
-     * @param objType 对象类型
-     * @param jsonBody jsonBody 消息体
-     */
-    private void updateBaseAttr(EmsDevice device, Integer objType, JSONObject jsonBody) {
-
+    public void updateCacheAfterSuccess(EmsDevice device, String attrKey, String newValue) {
+        attrCache.computeIfPresent(device.getDeviceCode(), (k, attrMap) -> {
+            attrMap.put(attrKey, newValue);
+            return attrMap;
+        });
     }
 
     private boolean checkResult(AbilityPayload abilityParam, MqttCacheMsg cacheMsg) {

+ 0 - 68
ems/ems-cloud/ems-dev-adapter/src/main/java/com/ruoyi/ems/util/DataSourceUtils.java

@@ -1,68 +0,0 @@
-/*
- * 文 件 名:  DataSourceUtils
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  learshaw
- * 修改时间:  2019/7/16
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
-package com.ruoyi.ems.util;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-
-import javax.sql.DataSource;
-
-/**
- * DataSource工具类 <功能详细描述>
- *
- * @author learshaw
- * @version [版本号, 2019/7/16]
- * @see [相关类/方法]
- * @since [产品/模块版本]
- */
-public abstract class DataSourceUtils {
-    private static final Logger log = LoggerFactory.getLogger(DataSourceUtils.class);
-
-    /**
-     * 数据源配置
-     *
-     * @param driverClass 驱动
-     * @param url         地址
-     * @param user        用户名
-     * @param password    密码
-     * @return 数据源
-     */
-    public static DruidDataSource buildDataSource(String driverClass, String url, String user, String password) {
-        DruidDataSource dataSource = new DruidDataSource();
-        dataSource.setDriverClassName(driverClass);
-        dataSource.setUrl(url);
-        dataSource.setUsername(user);
-        dataSource.setPassword(password);
-
-        return dataSource;
-    }
-
-    public static SqlSessionFactory buildSqlSessionFactory(DataSource dataSource, String mapperLocation,
-        String mybatisConfig) {
-        SqlSessionFactory factory = null;
-        try {
-            SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-            sessionFactory.setDataSource(dataSource);
-            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocation));
-            sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(mybatisConfig));
-            factory = sessionFactory.getObject();
-        }
-        catch (Exception e) {
-            log.error("buildSqlSessionFactory fail!", e);
-        }
-
-        return factory;
-    }
-}

+ 51 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/task/FacTask.java

@@ -0,0 +1,51 @@
+package com.ruoyi.ems.task;
+
+import com.huashe.common.utils.DateUtils;
+import com.ruoyi.ems.core.BaseTask;
+import com.ruoyi.ems.domain.AdmOpInspectionReport;
+import com.ruoyi.ems.enums.ResultStatus;
+import com.ruoyi.ems.service.impl.AdmOpInspectionReportServiceImpl;
+import com.ruoyi.ems.service.impl.EmsFacsServiceImpl;
+import com.ruoyi.quartz.domain.SysJob;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author ruoyi
+ */
+@Component("facInspectionTask")
+public class FacTask extends BaseTask {
+
+    @Autowired
+    private EmsFacsServiceImpl emsFacsService;
+
+    @Autowired
+    private AdmOpInspectionReportServiceImpl admOpInspectionReportService;
+
+    @Override
+    public void run(SysJob taskProperties) {
+        List<String> errorReport = emsFacsService.inspectFacIndex();
+        AdmOpInspectionReport facInspectionTask = new AdmOpInspectionReport() {
+            {
+                setTaskCode(taskProperties.getJobGroup() + "." + taskProperties.getJobId());
+                setResultStatus(ResultStatus.NORMAL.getCode());
+                setSubTime(DateUtils.getNowDate());
+                setFinishTime(DateUtils.getNowDate());
+                setSubmitter("facInspectionTask");
+            }
+        };
+        if (!errorReport.isEmpty()) {
+            log.error("facs index error report: {}", errorReport);
+            facInspectionTask.setResultStatus(ResultStatus.ABNORMAL.getCode());
+            facInspectionTask.setSubTime(DateUtils.getNowDate());
+            facInspectionTask.setFinishTime(DateUtils.getNowDate());
+            facInspectionTask.setResultMsg(StringUtils.join(errorReport, "\\r\\n"));
+        }
+        admOpInspectionReportService.insertAdmOpInspectionReport(facInspectionTask);
+    }
+}

+ 41 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseCache.java

@@ -0,0 +1,41 @@
+/*
+ * 文 件 名:  IEmsCommonCache
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/2/13
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.core;
+
+import com.ruoyi.ems.domain.FacsCategory;
+import com.ruoyi.ems.domain.FacsSubCategory;
+
+/**
+ * 公共缓存
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/2/13]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+public interface BaseCache {
+    /**
+     * 根据编码获取子分类信息
+     *
+     * @param code 编码
+     * @return 子分类信息
+     */
+    FacsCategory getCategory(String code);
+
+    /**
+     * 根据编码获取子分类信息
+     *
+     * @param code 编码
+     * @return 子分类信息
+     */
+    FacsSubCategory getSubCategory(String code);
+}

+ 32 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/core/BaseTask.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ems.core;
+
+import cn.hutool.core.map.MapUtil;
+import com.ruoyi.quartz.domain.SysJob;
+import org.quartz.Scheduler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Map;
+
+public abstract class BaseTask {
+    public static final Logger log = LoggerFactory.getLogger(BaseTask.class);
+
+    @Autowired
+    private Scheduler scheduler;
+
+    public abstract void run(SysJob taskProperties);
+
+    public void execute() {
+        try {
+            Map<String, Object> wrappedMap = scheduler.getCurrentlyExecutingJobs().get(0).getJobDetail().getJobDataMap()
+                .getWrappedMap();
+            SysJob taskProperties = MapUtil.get(wrappedMap, "TASK_PROPERTIES", SysJob.class);
+            log.info("开始执行任务,任务名:{}", taskProperties);
+            run(taskProperties);
+        }
+        catch (Exception e) {
+            log.error("执行任务失败:{}",e.getMessage(), e);
+        }
+    }
+}

+ 5 - 7
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsCommonCacheImpl.java → ems/ems-core/src/main/java/com/ruoyi/ems/service/EmsCommonCache.java

@@ -8,13 +8,11 @@
  * 修改单号:  <修改单号>
  * 修改内容:  <修改内容>
  */
-package com.ruoyi.ems.service.impl;
+package com.ruoyi.ems.service;
 
+import com.ruoyi.ems.core.BaseCache;
 import com.ruoyi.ems.domain.FacsCategory;
 import com.ruoyi.ems.domain.FacsSubCategory;
-import com.ruoyi.ems.service.IEmsCommonCache;
-import com.ruoyi.ems.service.IFacsCategoryService;
-import com.ruoyi.ems.service.IFacsSubCategoryService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,9 +36,9 @@ import java.util.stream.Collectors;
  * @see [相关类/方法]
  * @since [产品/模块版本]
  */
-@Service
-public class EmsCommonCacheImpl implements IEmsCommonCache, ApplicationRunner {
-    private static final Logger log = LoggerFactory.getLogger(EmsCommonCacheImpl.class);
+@Service("emsCommonCache")
+public class EmsCommonCache implements BaseCache, ApplicationRunner {
+    private static final Logger log = LoggerFactory.getLogger(EmsCommonCache.class);
 
     @Autowired
     private IFacsCategoryService facsCategoryService;

+ 4 - 2
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/BoundaryObjServiceImpl.java

@@ -12,6 +12,7 @@ package com.ruoyi.ems.service.impl;
 
 import com.huashe.common.exception.Assert;
 import com.huashe.common.exception.BusinessException;
+import com.ruoyi.ems.core.BaseCache;
 import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.ElecMeter;
 import com.ruoyi.ems.domain.ElecMeterH;
@@ -24,7 +25,6 @@ import com.ruoyi.ems.model.QueryMeter;
 import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IBoundaryObjService;
 import com.ruoyi.ems.service.IElecMeterHService;
-import com.ruoyi.ems.service.IEmsCommonCache;
 import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IMeterBoundaryRelService;
 import org.apache.commons.collections4.CollectionUtils;
@@ -32,6 +32,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -55,8 +56,9 @@ import java.util.stream.Collectors;
 public class BoundaryObjServiceImpl implements IBoundaryObjService {
     private static final Logger log = LoggerFactory.getLogger(BoundaryObjServiceImpl.class);
 
+    @Qualifier("emsCommonCache")
     @Autowired
-    private IEmsCommonCache emsCommonCache;
+    private BaseCache emsCommonCache;
 
     // 注入区域服务
     @Autowired

+ 51 - 16
ems/sql/ems_init_data.sql

@@ -260,29 +260,64 @@ INSERT INTO `adm_op_energy_strategy_param` (`strategy_code`, `param_group`, `par
 
 
 -- 对象模型表
-INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`) VALUES ('M_Z010', '照明设备模型', 2);
+INSERT INTO `adm_ems_obj_model` (`model_code`, `model_name`, `obj_type`, `ability_handler`, `event_handler`) VALUES ('M_W2_QF_GEEKOPEN', 'GeekOpen断路器', 2, 'http://172.192.13.95:9203/ems-dev-adapter/circuit-breaker/GeekOpen/abilityCall', NULL);
 
 
 -- 对象属性DEMO数据
-INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`) VALUES ('M_Z010', 0, 'power',   '功率', 'kW-h');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 0, 'version', '固件版本号', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 0, 'iccid', '物联网卡ICCID号', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 0, 'imei', '设备imei', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'timerEnable', '上报定时开关', '', 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'timerInterval', '上报时间间隔', '秒(S)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'signal', '信号强度', NULL, 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'power', '实时功率', '瓦(W)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'voltage', '实时电压', '伏特(V)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'current', '实时电流值', '安培(A)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'keyLock', '状态-按键锁定', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'key', '状态-通断', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'energy', '累计电量值', '千瓦时(kW·h)', 'Value');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'resetLock', '重置锁', NULL, 'Enum');
+INSERT INTO `adm_ems_obj_attr` (`model_code`, `attr_type`, `attr_key`, `attr_name`, `attr_unit`, `attr_value_type`) VALUES ('M_W2_QF_GEEKOPEN', 1, 'onState', '设备上电的默认状态', '1', 'Enum');
+
 
 -- 对象属性DEMO数据
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QR_00', 3, 'M_W2_QR', 'onOffState', 'on');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QF_01', 3, 'M_W2_QF', 'onOffState', 'off');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-1001-QF_02', 3, 'M_W2_QF', 'onOffState', 'on');
-
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedCapacity', '1000');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedVoltage', '10');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'ratedFrequency', '50');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-B-T-1001', 2, 'M_W2_T', 'phaseNumber', '3');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedCapacity', '1000');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedVoltage', '10');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'ratedFrequency', '50');
-INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`) VALUES ('D-N-T-1002', 2, 'M_W2_T', 'phaseNumber', '3');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'current', '0.050', '2025-03-05 16:07:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'energy', '421.787', '2025-03-05 16:02:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'iccid', '898604E6192390306801', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'key', '1', '2025-03-05 15:57:59');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'keyLock', '0', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'onState', '2', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'power', '5.108', '2025-03-05 16:07:36');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'resetLock', '0', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'signal', '31', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'timerEnable', '1', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'timerInterval', '300', '2025-03-05 15:51:00');
+INSERT INTO `adm_ems_obj_attr_value` (`obj_code`, `obj_type`, `model_code`, `attr_key`, `attr_value`, `update_time`) VALUES ('864142073640059', 2, 'M_W2_QF_GEEKOPEN', 'version', '1.0.1', '2025-03-05 15:51:00');
+
+-- 对象属性值枚举
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '1', '断开');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '1', '通电');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'key', '0', '断电');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'timerEnable', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '0', '关闭');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'resetLock', '1', '开启');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '0', '记忆');
+INSERT INTO `adm_ems_obj_attr_enum` (`model_code`, `attr_key`, `attr_value`, `attr_value_name`) VALUES ('M_W2_QF_GEEKOPEN', 'onState', '2', '通电');
 
 -- 对象能力DEMO数据
-INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`) VALUES ('M_W2', 'checkLine', '线路检测', '执行xx方法进行测试', '{\"enable\":\"1\"}');
-
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'event-0', '设备-断电', '控制设备通断', '{\"type\":\"event\",\"key\":0}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'event-1', '设备-通电', '控制设备通断', '{\"type\":\"event\",\"key\":1}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock-0', '按键锁定-关闭', '设置按键控制锁-关闭', '{\"type\":\"setting\",\"keyLock\":0}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'keyLock-1', '按键锁定-开启', '设置按键控制锁-开启', '{\"type\":\"setting\",\"keyLock\":1}', 1);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'restart', '软重启', '设备软重启', '{\"type\":\"setting\",\"system\":\"restart\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'settAutoReport', '设置电量信息定时上报', '开关(timerEnable:0:关闭上报 1:开启上报) 时间间隔(timerInterval: 上报时间间隔 单位秒)', '{\"type\":\"setting\",\"timerEnable\":1,\"timerInterval\":10}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setReset', '重置/恢复出厂', '设备恢复出厂设置固定传\"reset\"', '{\"type\":\"setting\",\"system\":\"reset\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'setOnState', '设置设备上电默认状态', '0:记忆;1:关闭,即断开;2:开启,即通电,默认=1', '{\"type\":\"setting\",\"onState\":1}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncProtocol', '同步设备通讯信息', '获取设备通讯信息', '{\"type\":\"protocol\"}', 0);
+INSERT INTO `adm_ems_obj_ability` (`model_code`, `ability_key`, `ability_name`, `ability_desc`, `ability_param`, `hidden_flag`) VALUES ('M_W2_QF_GEEKOPEN', 'syncStatistic', '同步设备电量信息', '获取设备电量信息', '{\"type\":\"statistic\"}', 1);
 
 -- 对象事件DEMO数据
 INSERT INTO `adm_ems_obj_event` (`model_code`, `event_type`, `event_key`, `event_name`, `event_desc`, `event_code`, `ext_event_code`) VALUES ('M_W2', 2, 'overload', '过载', '功率过载', 'e-gy-0001', '0x0001');