项目需求
大屏
实时数据监测模块
——概要
——用电监测
——用水监测
——蒸汽监测
——天然气监测
能源计划管理模块
——设计月计划
能源实绩管理模块
——实际使用跟计划对比图
智能分析模块
——根据历年使用情况,智能推算出今年每月用量
统计报表模块
——正点报
——日报
——月报
——年报
——表计值
以上我罗列的基本需求
设计
智能设备的测点
//电
正向有功(用电量) kW·h
反向有功 KW
有功功率 KW
无功功率 KW
功率因素
A相电流 A
B相电流 A
C相电流 A
A相电压 V
B相电压 V
C相电压 V
A相功率 KW
B相功率 KW
C相功率 KW
//水
表计值(累计) m³
流量(瞬时 m³/h
//蒸汽
累计(体积) m³
瞬时流量 m³/h
压力 Mpa
温度 ℃
//天然气
累计(体积) m³
设备跟测点表是一对多关系,表设计就不多说了
在IoTDB中设计时间序列
编码
递增浮点 GORILLA编码 TS_2DIFF RLE
数值比较接近 采用 GORILLA编码
类型
我选用flloat,保留2为小数
举例
01车间01设备用电量测点,递增浮点类型
创建时间序列语句
CREATE TIMESERIES root.test.wf01.wt01.s0 WITH DATATYPE=FLOAT, ENCODING=GORILLA
编码
涉及IoTDB整合SpringBoot就不说了,但是需要注意,采集程序插入最好用Session方式,后端管理系统用JDBC方式更快。
下面列出一些在能耗系统中常用的方法。
查询水电蒸汽天然气最新值
Statement statement = iotConnection.createStatement();
String sql = "select last s0 from "+ TimeSeriesUtil.getTimeSeriesStringByList(list);
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet != null) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
int columnIndex = -1;
while (resultSet.next()) {
columnIndex++;
for (int i = 1;i <= columnCount ; i++) {
if(i % 3 == 0){
String resultStr = resultSet.getString(i);
if(null != resultStr){
list.get(columnIndex).setLastValue(new BigDecimal(resultStr));
}
}
}
}
}
statement.close();
查询一个设备下每个测点的最新数据
Statement statement = iotConnection.createStatement();
String sql = "select last "+TimeSeriesUtil.getPointsStringByList(list)+" from "+list.get(0).getTimeseries();
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet != null) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
int columnIndex = -1;
while (resultSet.next()) {
columnIndex++;
for (int i = 1;i <= columnCount ; i++) {
if(i % 3 == 0){
String resultStr = resultSet.getString(i);
if(null != resultStr){
list.get(columnIndex).setLastValue(new BigDecimal(resultStr));
}
}
}
}
}
statement.close();
拿到 start -end 时间区间内 每个间隔点 的第一条记录
@param section h 小时 d 天 mo月 y年 注意:0.12版本修复mo,y不是自然月和自然年的问题
Statement statement = iotConnection.createStatement();
String sql = "select first_value(s0) from "+TimeSeriesUtil.getTimeSeriesStringByReportList(list)+" group by (["+start.getTime()+","+end.getTime()+"),10m,1"+section+")";
System.out.println(sql);
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet != null) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
for (int i = 2;i <= columnCount ; i++) {
String resultStr = resultSet.getString(i);
if(null != resultStr){
list.get(i-2).getList().add(new BigDecimal(resultStr));
}else {
list.get(i-2).getList().add(new BigDecimal("0"));
}
}
}
}
statement.close();