You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
371 lines
19 KiB
371 lines
19 KiB
package com.mh.quartz.task; |
|
|
|
import com.mh.common.config.MHConfig; |
|
import com.mh.common.core.domain.entity.CollectionParamsManage; |
|
import com.mh.common.core.domain.entity.CpmSpaceRelation; |
|
import com.mh.common.core.domain.entity.OrderEntity; |
|
import com.mh.common.core.domain.entity.PolicyManage; |
|
import com.mh.common.utils.DateUtils; |
|
import com.mh.framework.mqtt.service.IMqttGatewayService; |
|
import com.mh.quartz.util.AHUPIDControlUtil; |
|
import com.mh.quartz.util.FuzzyPIDControlUtil; |
|
import com.mh.system.service.device.ICollectionParamsManageService; |
|
import com.mh.system.service.operation.IOperationDeviceService; |
|
import com.mh.system.service.policy.IPolicyManageService; |
|
import com.mh.system.service.space.ICpmSpaceRelationService; |
|
import lombok.extern.slf4j.Slf4j; |
|
import org.springframework.beans.factory.annotation.Autowired; |
|
import org.springframework.beans.factory.annotation.Value; |
|
import org.springframework.stereotype.Component; |
|
|
|
import java.math.BigDecimal; |
|
import java.time.LocalTime; |
|
import java.util.*; |
|
import java.util.stream.Collectors; |
|
|
|
/** |
|
* @author LJF |
|
* @version 1.0 |
|
* @project EEMCS |
|
* @description 风柜系统任务 |
|
* @date 2025-05-30 08:36:43 |
|
*/ |
|
@Slf4j |
|
@Component("ahuTask") |
|
public class AHUTask { |
|
|
|
@Value("${control.topic}") |
|
String controlTopic; |
|
|
|
@Autowired |
|
private MHConfig mhConfig; |
|
|
|
private final ICollectionParamsManageService collectionParamsManageService; |
|
|
|
private final IPolicyManageService policyManageService; |
|
|
|
private final ICpmSpaceRelationService cpmSpaceRelationService; |
|
|
|
private final IOperationDeviceService iOperationService; |
|
|
|
private final IMqttGatewayService iMqttGatewayService; |
|
|
|
// 在 AHUTask 类中添加一个 PID 控制器成员变量 |
|
private final Map<String, FuzzyPIDControlUtil> pidControllers = new HashMap<>(); |
|
|
|
private final List<String> ahuList = List.of("ddc13_0211385", // 软件2号 |
|
"ddc13_0211485", // 软件3号 |
|
"ddc14_01185", // 硬件2号 |
|
"ddc14_01285", // 硬件3号 |
|
"ddc13_1510085", // 远程手自动启停 |
|
"ddc13_1510185" // 时间表启停 |
|
); |
|
|
|
@Autowired |
|
public AHUTask(ICollectionParamsManageService collectionParamsManageService, IPolicyManageService policyManageService, ICpmSpaceRelationService cpmSpaceRelationService, IOperationDeviceService iOperationService, IMqttGatewayService iMqttGatewayService) { |
|
this.collectionParamsManageService = collectionParamsManageService; |
|
this.policyManageService = policyManageService; |
|
this.cpmSpaceRelationService = cpmSpaceRelationService; |
|
this.iOperationService = iOperationService; |
|
this.iMqttGatewayService = iMqttGatewayService; |
|
} |
|
|
|
public void ddc13SendDataToDDC14() throws InterruptedException { |
|
HashMap<String, Object> queryMap = new HashMap<>(); |
|
queryMap.put("systemType", "2"); |
|
queryMap.put("isUse", 0); |
|
queryMap.put("mtType", "7"); |
|
List<CollectionParamsManage> collectionParamsManages = collectionParamsManageService.selectListByParams(queryMap); |
|
List<CollectionParamsManage> list = collectionParamsManages.stream() |
|
.filter(collectionParamsManage -> ahuList.contains(collectionParamsManage.getMtNum())) |
|
.toList(); |
|
if (list.isEmpty()) { |
|
return; |
|
} |
|
// Optional<CollectionParamsManage> twoHardStartStopList = list.stream().filter(val -> val.getMtNum().equals("ddc13_1510085")).findFirst(); |
|
// boolean present = twoHardStartStopList.isPresent(); |
|
// CollectionParamsManage threeHardStartStop = new CollectionParamsManage(); |
|
// if (present) { |
|
// threeHardStartStop = twoHardStartStopList.get(); |
|
// } |
|
Optional<CollectionParamsManage> twoHardParamList = list.stream().filter(val -> val.getMtNum().equals("ddc14_01185")).findFirst(); |
|
Optional<CollectionParamsManage> threeHardParamList = list.stream().filter(val -> val.getMtNum().equals("ddc14_01285")).findFirst(); |
|
CollectionParamsManage twoHardParam = new CollectionParamsManage(); |
|
if (twoHardParamList.isPresent()) { |
|
twoHardParam = twoHardParamList.get(); |
|
} |
|
CollectionParamsManage threeHardParam = new CollectionParamsManage(); |
|
if (threeHardParamList.isPresent()) { |
|
threeHardParam = threeHardParamList.get(); |
|
} |
|
int twoSoftValue = 0; |
|
int threeSoftValue = 0; |
|
// 判断远程启停或者时间表启停是否开启来,判断是否存在getCurValue,且当前时间等于今天的时间 |
|
if (list.stream().anyMatch(val -> |
|
(val.getMtNum().equals("ddc13_1510085") || val.getMtNum().equals("ddc13_1510185")) |
|
&& val.getCurValue() != null && val.getCurValue().intValue() == 1)) { |
|
// 判断curTime是否为今天 |
|
Date now = new Date(); |
|
boolean isToday = list.stream().anyMatch(val -> |
|
(val.getMtNum().equals("ddc13_1510085") || val.getMtNum().equals("ddc13_1510185")) |
|
&& val.getCurTime() != null && DateUtils.isSameDay(val.getCurTime(), now)); |
|
if (isToday) { |
|
// 如果curTime是今天,则执行相关逻辑 |
|
// 可以在这里添加需要执行的代码 |
|
for (CollectionParamsManage value : list) { |
|
if (value.getMtNum().contains("ddc13_0211385")) { |
|
// 2号软件风阀调节 |
|
twoSoftValue = value.getCurValue().intValue(); |
|
sendOrderToMqtt(List.of(new OrderEntity(twoHardParam.getId(), String.valueOf(twoSoftValue), 0, twoHardParam.getOtherName()))); |
|
} else if (value.getMtNum().contains("ddc13_0211485")) { |
|
// 3号软件风阀调节 |
|
threeSoftValue = value.getCurValue().intValue(); |
|
sendOrderToMqtt(List.of(new OrderEntity(threeHardParam.getId(), String.valueOf(threeSoftValue), 0, threeHardParam.getOtherName()))); |
|
} |
|
Thread.sleep(2000); |
|
} |
|
} |
|
} else { |
|
for (CollectionParamsManage value : list) { |
|
if (value.getMtNum().contains("ddc13_0211385")) { |
|
if (twoHardParam.getCurValue() != null && twoHardParam.getCurValue().intValue() != 0) { |
|
// 发送值给2号硬件风阀控制点位 |
|
sendOrderToMqtt(List.of(new OrderEntity(twoHardParam.getId(), "0", 0, twoHardParam.getOtherName()))); |
|
} |
|
} else if (value.getMtNum().contains("ddc13_0211485")) { |
|
if (threeHardParam.getCurValue() != null && threeHardParam.getCurValue().intValue() != 0) { |
|
// 发送值给3号硬件风阀控制点位 |
|
sendOrderToMqtt(List.of(new OrderEntity(threeHardParam.getId(), "0", 0, threeHardParam.getOtherName()))); |
|
} |
|
} |
|
Thread.sleep(2000); |
|
} |
|
} |
|
|
|
|
|
} |
|
|
|
public void sendOrderToMqtt(List<OrderEntity> changeValues) { |
|
try { |
|
String sendOrder = iOperationService.operationDevice(changeValues); |
|
String name = mhConfig.getName(); |
|
// 获取mqtt操作队列(后期通过mqtt队列配置发送主题) |
|
log.info("发送主题:{},消息:{}", name + "/" + controlTopic, sendOrder); |
|
iMqttGatewayService.publish(name + "/" + controlTopic, sendOrder, 1); |
|
} catch (Exception e) { |
|
log.error("设备操作失败", e); |
|
} |
|
} |
|
|
|
public void adjustWaterValve(String kp, String ki, String kd) { |
|
// 西餐走廊2、宴会走廊需要调整PID参数,其他的ddc自己已经处理好 |
|
String[] deviceLedgerIds = new String[]{"ddc0083b3a898d85f3a1205a2d82071e100", "ddc0133b3a898d85f3a1205a2d82071e100"}; |
|
for (String deviceLedgerId : deviceLedgerIds) { |
|
// 获取西餐走廊2的启停控制 |
|
HashMap<String, Object> queryMap = new HashMap<>(); |
|
queryMap.put("systemType", "2"); |
|
queryMap.put("deviceLedgerId", deviceLedgerId); |
|
queryMap.put("isUse", 0); |
|
// 得出 systemType =2 的数据 |
|
List<CollectionParamsManage> collectionParamsManages = collectionParamsManageService.selectListByParams(queryMap); |
|
|
|
CollectionParamsManage collectionParamsManage = new CollectionParamsManage(); |
|
// 过滤得出启停状态 |
|
Optional<CollectionParamsManage> first = collectionParamsManages.stream().filter(item -> item.getCurValue().intValue() == 1 && item.getParamType().equals("2")).findFirst(); |
|
if (first.isEmpty()) { |
|
// 如果设备停止了,则同步关掉水阀 |
|
// 过滤获取水阀调节参数 |
|
Optional<CollectionParamsManage> fourth = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getOtherName().contains("水阀调节") |
|
&& item.getParamType().equals("3")).findFirst(); |
|
if (fourth.isEmpty()) { |
|
continue; |
|
} |
|
// 得出水阀调节参数 |
|
collectionParamsManage = fourth.get(); |
|
// 先判断水阀是否已经关闭 |
|
if (collectionParamsManage.getCurValue().intValue() == 0) { |
|
continue; |
|
} |
|
// 关闭 |
|
List<OrderEntity> changeValues = new ArrayList<>(); |
|
changeValues.add(new OrderEntity(collectionParamsManage.getId(), String.valueOf(0), Integer.parseInt(collectionParamsManage.getParamType()), collectionParamsManage.getOtherName())); |
|
sendOrderToMqtt(changeValues); |
|
continue; |
|
} |
|
|
|
// 过滤获取回风温度设置值 |
|
Optional<CollectionParamsManage> second = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getOtherName().contains("回风温度") |
|
&& item.getParamType().equals("14")).findFirst(); |
|
if (second.isEmpty()) { |
|
continue; |
|
} |
|
// 得出回风温度设置值 |
|
double backTempSet = second.get().getCurValue().doubleValue(); |
|
|
|
// 设定目标温度(夏季制冷24℃) |
|
// ✅ 如果没有该设备的控制器,则创建一个新的并保存起来 |
|
FuzzyPIDControlUtil controller = pidControllers.computeIfAbsent(deviceLedgerId, k -> new FuzzyPIDControlUtil(kp, ki, kd)); |
|
|
|
log.info("开始模糊PID控制循环,查看对象是否有变化:{}", controller); |
|
|
|
// 过滤获取当前回风温度 |
|
Optional<CollectionParamsManage> third = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getOtherName().contains("回风温度") |
|
&& item.getParamType().equals("12")).findFirst(); |
|
if (third.isEmpty()) { |
|
continue; |
|
} |
|
// 得出当前回风温度 |
|
double temp = third.get().getCurValue().doubleValue(); |
|
|
|
// 2. 计算水阀开度(时间间隔1秒) |
|
double valveOpening1 = controller.calculate(backTempSet, temp, 1); |
|
int valveOpening = new BigDecimal(valveOpening1).intValue(); |
|
// 过滤获取水阀调节参数 |
|
Optional<CollectionParamsManage> fourth = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getOtherName().contains("水阀调节") |
|
&& item.getParamType().equals("3")).findFirst(); |
|
if (fourth.isEmpty()) { |
|
continue; |
|
} |
|
// 得出水阀调节参数 |
|
collectionParamsManage = fourth.get(); |
|
// 发送控制指令 |
|
if (valveOpening > 0 && valveOpening <= 100) { |
|
// 开启 |
|
List<OrderEntity> changeValues = new ArrayList<>(); |
|
changeValues.add(new OrderEntity(collectionParamsManage.getId(), String.valueOf(valveOpening), Integer.parseInt(collectionParamsManage.getParamType()), collectionParamsManage.getOtherName())); |
|
sendOrderToMqtt(changeValues); |
|
// 3. 应用水阀开度(实际应用发送给执行机构) |
|
log.info("回风温度: {} ℃ | 水阀开度: {} % ", |
|
temp, valveOpening); |
|
} |
|
|
|
} |
|
} |
|
|
|
public void startOrStopAHU() { |
|
// 扫描启动了定时开关机的风机,根据当前时间判断是否需要启动或停止 |
|
// systemType 2: 风柜系统 |
|
HashMap<String, Object> queryMap = new HashMap<>(); |
|
queryMap.put("systemType", "2"); |
|
// 得出 systemType =2 的数据 |
|
List<CollectionParamsManage> collectionParamsManages = collectionParamsManageService.selectListByParams(queryMap); |
|
// 判断当前时间是星期几 |
|
String dayOfWeekValue = DateUtils.dayOfWeekValue(); |
|
// 过滤otherName包含dayOfWeekValue,paramType=29, curValue=1的数据,代表已经启用定时开关机的功能 |
|
List<CollectionParamsManage> needStartOrStopDataList = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getOtherName().contains(dayOfWeekValue) |
|
&& item.getParamType().equals("29") |
|
&& item.getCurValue().intValue() == 1) |
|
.toList(); |
|
// 查询得出对应的houseId |
|
List<PolicyManage> policyManageList = policyManageService.selectListByCpmIds(needStartOrStopDataList); |
|
|
|
// 开始:根据houseId查询出对应的风机启停id |
|
List<CpmSpaceRelation> cpmSpaceRelationList = cpmSpaceRelationService.selectListByHouseId(policyManageList); |
|
// collectionParamsManages过滤出能够开启风机的点位,paramType=2,isUse=0 |
|
List<CollectionParamsManage> startDeviceList = collectionParamsManages |
|
.stream() |
|
.filter(item -> item.getParamType().equals("2") |
|
&& item.getIsUse() == 0) |
|
.toList(); |
|
// 结束:根据houseId查询出对应的风机启停id |
|
|
|
// 在拼接出启用定时开关机的启动时间、关闭时间 |
|
Map<String, List<PolicyManage>> groupedByHouseId = policyManageList.stream() |
|
.collect(Collectors.groupingBy( |
|
PolicyManage::getHouseId, |
|
Collectors.toList() |
|
)); |
|
// groupedByHouseId for 循环遍历 |
|
for (Map.Entry<String, List<PolicyManage>> entry : groupedByHouseId.entrySet()) { |
|
// 得出houseId |
|
String houseId = entry.getKey(); |
|
List<PolicyManage> timeList1 = entry.getValue(); |
|
if (timeList1.isEmpty()) { |
|
continue; |
|
} |
|
PolicyManage policyManage1 = timeList1.getFirst(); |
|
// 得出policyManageList |
|
List<PolicyManage> timeList = policyManageService.selectPolicyListByHouseId(houseId, policyManage1.getPolicyName()); |
|
int isHaveTime = 0; |
|
int startHour = 0; |
|
int startMinute = 0; |
|
int endHour = 0; |
|
int endMinute = 0; |
|
for (PolicyManage policyManage : timeList) { |
|
if (policyManage.getPointName().contains("开_时")) { |
|
startHour = collectionParamsManageService.selectCollectionParamsManageById(policyManage.getCpmId()).getCurValue().intValue(); |
|
isHaveTime++; |
|
} |
|
if (policyManage.getPointName().contains("开_分")) { |
|
startMinute = collectionParamsManageService.selectCollectionParamsManageById(policyManage.getCpmId()).getCurValue().intValue(); |
|
isHaveTime++; |
|
} |
|
if (policyManage.getPointName().contains("关_时")) { |
|
endHour = collectionParamsManageService.selectCollectionParamsManageById(policyManage.getCpmId()).getCurValue().intValue(); |
|
isHaveTime++; |
|
} |
|
if (policyManage.getPointName().contains("关_分")) { |
|
endMinute = collectionParamsManageService.selectCollectionParamsManageById(policyManage.getCpmId()).getCurValue().intValue(); |
|
isHaveTime++; |
|
} |
|
} |
|
if (isHaveTime == 0) { |
|
continue; |
|
} |
|
LocalTime nowTime = LocalTime.now(); |
|
LocalTime startTime = LocalTime.of(startHour, startMinute); |
|
LocalTime endTime = LocalTime.of(endHour, endMinute); |
|
// collectionParamsManages过滤出能够开启风机的点位,paramType=2,isUse=0 |
|
Set<String> validCpmIds = cpmSpaceRelationList.stream() |
|
.filter(item -> item.getHouseId().equals(houseId)) |
|
.map(CpmSpaceRelation::getCpmId) |
|
.collect(Collectors.toSet()); |
|
List<CollectionParamsManage> startDataList = startDeviceList |
|
.stream() |
|
.filter(item -> validCpmIds.contains(item.getId())) |
|
.toList(); |
|
// 判断当前风机是否在开启状态了 |
|
if (null == startDataList || startDataList.size() == 0) { |
|
return; |
|
} |
|
CollectionParamsManage first = startDataList.getFirst(); |
|
// 判断当前时间是否在开启时间范围内 |
|
if (DateUtils.isBetween(nowTime, startTime, endTime)) { |
|
// 判断当前风机是否在开启状态了 |
|
if (first.getCurValue().intValue() == 1) { |
|
// 当前风机在开启状态,不需要启动 |
|
log.info("当前风机在开启状态,不需要启动"); |
|
} else { |
|
// 当前风机不在开启状态,需要启动 |
|
log.info("当前风机不在开启状态,需要启动"); |
|
List<OrderEntity> changeValues = new ArrayList<>(); |
|
changeValues.add(new OrderEntity(first.getId(), "1", Integer.parseInt(first.getParamType()), first.getOtherName())); |
|
sendOrderToMqtt(changeValues); |
|
} |
|
; |
|
} else { |
|
// 判断当前风机是否在关闭状态了 |
|
if (first.getCurValue().intValue() == 0) { |
|
// 当前风机在关闭状态,不需要停止 |
|
log.info("当前风机在关闭状态,不需要停止"); |
|
} else { |
|
// 当前风机不在关闭状态,需要停止 |
|
log.info("当前风机不在关闭状态,需要停止"); |
|
List<OrderEntity> changeValues = new ArrayList<>(); |
|
changeValues.add(new OrderEntity(first.getId(), "0", Integer.parseInt(first.getParamType()), first.getOtherName())); |
|
sendOrderToMqtt(changeValues); |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|