添加电表规则

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: 物联网项目 标签: 电表规则

2024-07-06 15:12:55 465浏览

给电表设定规则

场景需求

主要是三个规则: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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695