添加电表规则
分类: springboot 专栏: 物联网项目 标签: 电表规则
2024-07-06 15:12:55 251浏览
场景需求
主要是三个规则:A路总功率,A路时间段(几点拉闸 几点合闸),B路时间段(几点拉闸 几点合闸)。结合学生寝室实际分析,A路就是卧室灯和插座,B路就是卫生间的灯和空调的电,这两路不是一趟线。
需求:配置电表规则,可以控制A路的电线使用电器的功率,功率大于配置的功率就会跳闸,还可以配置每个电表在固定时间的拉闸和合闸
这个只能给电表一个一个设置规则。
这里点击确定,只是保存规则记录
点击提交并下发的话就是要真实的给电表发指令了。真正的设置到电表中(通过tcp协议,先把指令发给网关。网关根据地址域转发到对应的电表设备)
最后怎么判断咱有没有设置成功呢?
用厂家提供的电表调试工具软件读取。
暂时关注下这三个地方:
A路总功率阀值,大功率电器不让用,超过就断电
A路合闸延时时间:假设这个值设置的是5,那么功率超过A路设定的总功率阀值后,会断电,但5分钟后会来电。
跳闸次数:假设这个值设置的是3,上面说的5分钟来电后,继续使用大功率的话就会又断电,累计跳闸3次后就彻底断电了。
具体实现思路
点击提交并下发的时候,把三种规则都设置进电表,这就意味着要发三条指令
@PostMapping("/saveOrUpdate")
public CommonResult saveOrUpdate(@RequestBody ElectricMeterRules meterRules, HttpServletRequest request) {
if (meterRules.getType() == 1) {//提交并下发
send(meterRules, request);
}
meterRulesService.saveOrUpdate(meterRules);
return CommonResult.success();
}
@PostMapping("/issue")
public void send(ElectricMeterRules meterRules, HttpServletRequest request) {
LambdaQueryWrapper<TManagerDevice> wrapper = new LambdaQueryWrapper<>();
if (meterRules.getMeterName() != null) {
wrapper.eq(TManagerDevice::getDeviceName, meterRules.getMeterName());
}
TManagerDevice tManagerDevice = tManagerDeviceDao.selectOne(wrapper);
WaterGateway ssDeviceGateway = waterGatewayDao.selectById(tManagerDevice.getGatewayId());
String address = ElectricityMeterUtil.deviceAddressConvert(tManagerDevice.getDeviceCode());
String meterAPower = meterRules.getPowerA() + "0";
String addMeterAPower = addDataLength(meterAPower);
//处理后的发送数据
String sendAPowerData = ElectricityMeterUtil.deviceAddressConvert(addMeterAPower);
sendAPowerData = ElectricityMeterUtil.dataAreaPlus33(sendAPowerData);
//获取发送指令
String instruce = ElectricityMeterUtil.getCompleteInstructSetUp(address, InstructConstant.ELECTRICITY_A_POWER_SETUP, sendAPowerData);
//发送服务器地址端口
String newIp = "/" + ssDeviceGateway.getGatewayIp() + ":" + ssDeviceGateway.getGatewayPort();
//下发A路最高使用功率配置
sendInstructsService.sendInstructs1(instruce, newIp, request, tManagerDevice.getDeviceCode(), InstructTypeConstant.E_A_POWER_SETUP.getKey());
//A路工作日时段控制设置
String a1 = getTimeStr(meterRules.getTimeRangeA1(), meterRules.getOperationA1());
String a2 = getTimeStr(meterRules.getTimeRangeA2(), meterRules.getOperationA2());
String a3 = getTimeStr(meterRules.getTimeRangeA3(), meterRules.getOperationA3());
String a4 = getTimeStr(meterRules.getTimeRangeA4(), meterRules.getOperationA4());
String aDataStr = a1 + " " + a2 + " " + a3 + " " + a4;
String aPlush33Data = ElectricityMeterUtil.dataAreaPlus33(aDataStr);
String aTimeWorkInstruce = ElectricityMeterUtil.getCompleteInstructSetUp(address, InstructConstant.ELECTRICITY_A_TIME_WORK_SETUP, aPlush33Data);
sendInstructsService.sendInstructs1(aTimeWorkInstruce, newIp, request, tManagerDevice.getDeviceCode(), InstructTypeConstant.E_A_TIME_WORK_SETUPA.getKey());
//B路工作日时段控制设置
String b1 = getTimeStr(meterRules.getTimeRangeB1(), meterRules.getOperationB1());
String b2 = getTimeStr(meterRules.getTimeRangeB2(), meterRules.getOperationB2());
String b3 = getTimeStr(meterRules.getTimeRangeB3(), meterRules.getOperationB3());
String b4 = getTimeStr(meterRules.getTimeRangeB4(), meterRules.getOperationB4());
String bDataStr = b1 + " " + b2 + " " + b3 + " " + b4;
String bPlush33Data = ElectricityMeterUtil.dataAreaPlus33(bDataStr);
String bTimeWorkInstruce = ElectricityMeterUtil.getCompleteInstructSetUp(address, InstructConstant.ELECTRICITY_B_TIME_WORK_SETUP, bPlush33Data);
sendInstructsService.sendInstructs1(bTimeWorkInstruce, newIp, request, tManagerDevice.getDeviceCode(), InstructTypeConstant.E_B_TIME_WORK_SETUPA.getKey());
}
辅助方法
private String getTimeStr(String time, String status) {//时段控制数据域字符串
if (StringUtils.isEmpty(time) || StringUtils.isEmpty(status)) {
return "11 00 00";
}
String repStr = time.replace(":", "");
String iStr = "";
if (status.equals("1")) {
iStr = "22 ";
} else {
iStr = "11 ";
}
String conStr = ElectricityMeterUtil.deviceAddressConvert(repStr);
return iStr + conStr;
}
private String addDataLength(String str) {//补全6位数字
String s = "";
if (str.length() < 6) {
int num = 6 - str.length();
for (int i = 0; i < num; i++) {
s += "0";
}
}
return s + str;
}
电表规则实体类
/**
* 电表规则配置表
* 在这个设计中:
* <p>
* MeterName 是电表的名称,用于识别不同的电表。
* TotalPower 是电表的总功率,使用DECIMAL类型以支持精确的数值表示。
* PowerA 和 PowerB 分别是电表A路和B路的功率。
* TimeRangeAx 和 TimeRangeBx 分别是A路和B路的时间段,使用TIME类型。
* OperationAx 和 OperationBx 分别是对应时间段的操作,如“开启”、“关闭”或具体的功率限制等。
* 请注意,实际的数据库设计可能需要考虑更多的因素,比如是否需要记录规则的创建时间、最后修改时间等。
* 此外,根据实际需求,可能还需要考虑索引的创建以优化查询性能,特别是对于MeterName字段。
* 如果时间段和操作有更复杂的逻辑或格式,可能需要设计更复杂的数据结构来存储这些规则。
*
* @TableName ss_electric_meter_rules
*/
@TableName(value = "ss_electric_meter_rules")
@Data
public class ElectricMeterRules implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 电表名称
*/
private String meterName;
/**
* 电表总功率
*/
private String totalPower;
@TableField(exist = false)
private Integer type=1;
/**
* 电表A路功率
*/
private String powerA;
/**
* 电表B路功率
*/
private String powerB;
/**
* A路时间段1
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeA1;
/**
* A路时间段1操作
*/
private String operationA1;
/**
* A路时间段2
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeA2;
/**
* A路时间段2操作
*/
private String operationA2;
/**
* A路时间段3
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeA3;
/**
* A路时间段3操作
*/
private String operationA3;
/**
* A路时间段4
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeA4;
/**
* A路时间段4操作
*/
private String operationA4;
/**
* B路时间段1
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeB1;
/**
* B路时间段1操作
*/
private String operationB1;
/**
* B路时间段2
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeB2;
/**
* B路时间段2操作
*/
private String operationB2;
/**
* B路时间段3
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeB3;
/**
* B路时间段3操作
*/
private String operationB3;
/**
* B路时间段4
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private String timeRangeB4;
/**
* B路时间段4操作
*/
private String operationB4;
/**
* 创建人
*/
private String createdBy;
/**
* 更新人
*/
private String updatedBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createdAt;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updatedAt;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableField(exist = false)
private String deviceName;
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论