From b174d79fe58e600d5b7cbc1f89203324f1f419cd Mon Sep 17 00:00:00 2001 From: mh Date: Mon, 24 Jun 2024 17:55:07 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E9=A2=84=E6=B5=8B?= =?UTF-8?q?=E5=87=BA=E7=8E=B0null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2024数据库脚本.sql | 5 +++++ .../mh/algorithm/bpnn/BPNeuralNetworkFactory.java | 5 +++++ .../java/com/mh/algorithm/utils/MatrixUtil.java | 14 +++++++++++++- .../test/java/com/mh/algorithm/bpnn/bpnnTest.java | 2 +- .../java/com/mh/user/entity/HistoryDataPre.java | 13 +++++++++++++ .../com/mh/user/mapper/HistoryDataPreMapper.java | 6 ++++-- .../service/impl/DeviceInstallServiceImpl.java | 9 +++++++++ .../service/impl/HistoryDataPreServiceImpl.java | 15 ++++++++++----- .../com/mh/user/strategy/HeatPumpStrategy.java | 13 +++++++++++++ .../src/test/java/com/mh/user/DealDataTest.java | 2 +- 10 files changed, 74 insertions(+), 10 deletions(-) diff --git a/2024数据库脚本.sql b/2024数据库脚本.sql index 3975cfa..2576a23 100644 --- a/2024数据库脚本.sql +++ b/2024数据库脚本.sql @@ -161,3 +161,8 @@ EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'12月用量或比 EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'合计用量', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'total_value'; EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'楼栋编号', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'building_id'; EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'楼栋名称', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'building_name'; + + +-- 2024-06-24 添加楼栋人数 +alter table history_data_pre add people_num numeric(24,2) not null default 0; +exec sp_addextendedproperty N'MS_Description', N'每栋楼人数', N'schema', N'dbo',N'table', N'history_data_pre', N'column', N'people_num'; \ No newline at end of file diff --git a/algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java b/algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java index 3c6c8c8..0d11d9c 100644 --- a/algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java +++ b/algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java @@ -161,6 +161,11 @@ public class BPNeuralNetworkFactory { double[][] normalizedInput = new double[input.getMatrixRowCount()][input.getMatrixColCount()]; for (int i = 0; i < input.getMatrixRowCount(); i++) { for (int j = 0; j < input.getMatrixColCount(); j++) { + if ((input.getValOfIdx(i,j) - bpModel.getInputMin().getValOfIdx(0,j)) == 0 + || (bpModel.getInputMax().getValOfIdx(0,j) - bpModel.getInputMin().getValOfIdx(0,j)) == 0) { + normalizedInput[i][j] = bpModel.getBpParameter().getNormalizationMin(); + continue; + } normalizedInput[i][j] = bpModel.getBpParameter().getNormalizationMin() + (input.getValOfIdx(i,j) - bpModel.getInputMin().getValOfIdx(0,j)) / (bpModel.getInputMax().getValOfIdx(0,j) - bpModel.getInputMin().getValOfIdx(0,j)) diff --git a/algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java b/algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java index b242a28..55ad01e 100644 --- a/algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java +++ b/algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java @@ -249,7 +249,15 @@ public class MatrixUtil { //数据归一化(注:若max与min均为0则不需要归一化) if (max != 0 || min != 0) { for (int j = 0; j < a.getMatrixRowCount(); j++) { - res[j][i] = normalizationMin + (a.getValOfIdx(j,i) - min) / (max - min) * (normalizationMax - normalizationMin); + try { + if ((a.getValOfIdx(j,i) - min) == 0 || (max - min) == 0) { + res[j][i] = normalizationMin; + continue; + } + res[j][i] = normalizationMin + (a.getValOfIdx(j,i) - min) / (max - min) * (normalizationMax - normalizationMin); + } catch (IllegalArgumentException e) { + res[j][i] = 0; + } } } maxArr[0][i] = max; @@ -276,6 +284,10 @@ public class MatrixUtil { //数据反归一化 if (dataMin.getValOfIdx(0,i) != 0 || dataMax.getValOfIdx(0,i) != 0) { for (int j = 0; j < a.getMatrixRowCount(); j++) { + if ((a.getValOfIdx(j,i) - normalizationMin) == 0 || (normalizationMax - normalizationMin) == 0) { + res[j][i] = dataMin.getValOfIdx(0,i); + continue; + } res[j][i] = dataMin.getValOfIdx(0,i) + (dataMax.getValOfIdx(0,i) - dataMin.getValOfIdx(0,i)) * (a.getValOfIdx(j,i) - normalizationMin) / (normalizationMax - normalizationMin); } } diff --git a/algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java b/algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java index c9bc273..1a334ff 100644 --- a/algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java +++ b/algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java @@ -22,7 +22,7 @@ public class bpnnTest { bpParameter.setHiddenLayerNeuronCount(2); bpParameter.setOutputLayerNeuronCount(2); bpParameter.setPrecision(0.01); - bpParameter.setMaxTimes(100000); + bpParameter.setMaxTimes(10000); // 训练BP神经网络 System.out.println(new Date()); diff --git a/user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java b/user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java index f4fee7a..a9fa0a3 100644 --- a/user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java +++ b/user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java @@ -31,6 +31,11 @@ public class HistoryDataPre { private BigDecimal waterLevel; + /** + * 每栋楼人数 + */ + private BigDecimal peopleNum; + private BigDecimal waterValuePre; private BigDecimal electValuePre; @@ -39,6 +44,14 @@ public class HistoryDataPre { private String remark; + public BigDecimal getPeopleNum() { + return peopleNum; + } + + public void setPeopleNum(BigDecimal peopleNum) { + this.peopleNum = peopleNum; + } + public Long getId() { return id; } diff --git a/user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java b/user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java index fdacb5d..330c670 100644 --- a/user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java @@ -25,8 +25,9 @@ public interface HistoryDataPreMapper extends BaseMapper { @Result(column = "water_value", property = "waterValue"), @Result(column = "elect_value", property = "electValue"), @Result(column = "water_level", property = "waterLevel"), + @Result(column = "people_num", property = "peopleNum") }) - @Select("select env_min_temp, env_max_temp, water_value, elect_value, water_level from history_data_pre where building_id = #{buildingId} order by cur_date ") + @Select("select env_min_temp, env_max_temp, water_value, elect_value, water_level, people_num from history_data_pre where building_id = #{buildingId} order by cur_date ") List getTrainData(@Param("buildingId") String buildingId); @Results(id ="rs_recent_data",value ={ @@ -118,8 +119,9 @@ public interface HistoryDataPreMapper extends BaseMapper { @Result(column = "cur_date", property = "curDate"), @Result(column = "env_min_temp", property = "envMinTemp"), @Result(column = "env_max_temp", property = "envMaxTemp"), + @Result(column = "people_num", property = "peopleNum") }) - @Select("select top 1 id, building_id, cur_date, env_min_temp, env_max_temp from history_data_pre where building_id = #{buildingId} and cur_date = #{curDate} ") + @Select("select top 1 id, building_id, cur_date, env_min_temp, env_max_temp, people_num from history_data_pre where building_id = #{buildingId} and cur_date = #{curDate} ") HistoryDataPre selectOneData(@Param("buildingId") String buildingId, @Param("curDate") String curDate); diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java index b69a8dc..02cd0fe 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java @@ -10,6 +10,7 @@ import com.mh.user.model.DeviceModel; import com.mh.user.service.BuildingService; import com.mh.user.service.DeviceInstallService; import com.mh.user.utils.CacheUtil; +import com.mh.user.utils.ExchangeStringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -38,6 +39,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { public int saveDevice(DeviceInstallEntity deviceInstallEntity) { String buildingName = buildingService.selectBuildingNameById(deviceInstallEntity.getBuildingId()); deviceInstallEntity.setBuildingName(buildingName); + if ("电表".equalsIgnoreCase(deviceInstallEntity.getDeviceType())) { + // 000005500773 + deviceInstallEntity.setDeviceAddr(ExchangeStringUtil.addZeroForNum(deviceInstallEntity.getDeviceAddr(), 12)); + } else if ("水表".equalsIgnoreCase(deviceInstallEntity.getDeviceType()) + && deviceInstallEntity.getBrand().contains("美柯")) { + // 00000086058863 + deviceInstallEntity.setDeviceAddr(ExchangeStringUtil.addZeroForNum(deviceInstallEntity.getDeviceAddr(), 14)); + } this.createParamCode(deviceInstallEntity); return deviceInstallMapper.saveDevice(deviceInstallEntity); } diff --git a/user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java index 24446a4..ed3adff 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java @@ -65,6 +65,7 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService { return new String[] { String.valueOf(dataPre.getEnvMinTemp()), String.valueOf(dataPre.getEnvMaxTemp()), + String.valueOf(dataPre.getPeopleNum()), String.valueOf(dataPre.getWaterValue()), String.valueOf(dataPre.getElectValue()), String.valueOf(dataPre.getWaterLevel()) @@ -91,11 +92,11 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService { // 创建BP参数对象 BPParameter bpParameter = new BPParameter(); - bpParameter.setInputLayerNeuronCount(2); + bpParameter.setInputLayerNeuronCount(3); bpParameter.setHiddenLayerNeuronCount(3); bpParameter.setOutputLayerNeuronCount(3); bpParameter.setPrecision(0.01); - bpParameter.setMaxTimes(10000); + bpParameter.setMaxTimes(50000); // 训练BP神经网络 BPModel bpModel = factory.trainBP(bpParameter, trainSet); @@ -123,8 +124,8 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService { if (null == jsonObject) { return; } - String envMinTemp = ""; - String envMaxTemp = ""; + String envMinTemp = "16.50"; + String envMaxTemp = "26.00"; JSONArray jsonArray = jsonObject.getJSONArray("forecasts").getJSONObject(0).getJSONArray("casts"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject1 = jsonArray.getJSONObject(i); @@ -145,7 +146,11 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService { } // 开始预测 HistoryDataPre historyDataPre1 = historyDataPreMapper.selectOneData(buildingId, curDate); - String[] preData = new String[]{historyDataPre1.getEnvMinTemp().toString(), historyDataPre1.getEnvMaxTemp().toString()}; + String[] preData = new String[]{ + historyDataPre1.getEnvMinTemp().toString(), + historyDataPre1.getEnvMaxTemp().toString(), + historyDataPre1.getPeopleNum().toString() + }; CsvInfo csvInfo = new CsvInfo(); ArrayList list = new ArrayList<>(); diff --git a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java index 5998aeb..6a3d8c1 100644 --- a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java @@ -382,6 +382,19 @@ public class HeatPumpStrategy implements DeviceStrategy { + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(18, 22)), 2); sValue = startTime + closetTime; } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { + if (registerAddr.equalsIgnoreCase("0001")) { //运行状态 + dataType = "runState"; + data = checkStr.substring(10, 12); + if (data.equalsIgnoreCase("00")) { + sValue = "不运行"; //关机模式 + } else if (data.equalsIgnoreCase("01")) { + sValue = "运行"; //制热模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId, addr, sValue); + log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); + } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); return Constant.SUCCESS; diff --git a/user-service/src/test/java/com/mh/user/DealDataTest.java b/user-service/src/test/java/com/mh/user/DealDataTest.java index dd25c43..fe07b4a 100644 --- a/user-service/src/test/java/com/mh/user/DealDataTest.java +++ b/user-service/src/test/java/com/mh/user/DealDataTest.java @@ -52,7 +52,7 @@ public class DealDataTest extends UserServiceApplicationTests { // 训练数据 historyDataPreService.startTrainData("21"); // 预测数据 - historyDataPreService.startPredictData("21", "2024-05-15"); + historyDataPreService.startPredictData("21", "2024-03-21"); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage());