Skip to content

Commit

Permalink
Allowing several items
Browse files Browse the repository at this point in the history
Signed-off-by: Jürgen Baginski <[email protected]>
  • Loading branch information
Jürgen Baginski committed Dec 30, 2020
1 parent 74dd751 commit a3809c3
Show file tree
Hide file tree
Showing 2 changed files with 164 additions and 158 deletions.
2 changes: 1 addition & 1 deletion RRDBulkWriter.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#Name of the item to be persisted
#Name of the item(s) to be persisted, seperated by a ","
file=filename
#Start Time format yyyy, mm (Zero based!), dd, hh, mm Example 2020. 0, 1, 0, 0 = 2020 Jan 1st, 00:00Z
start=2020,0,1,0,0
Expand Down
320 changes: 163 additions & 157 deletions src/main/java/com/juebag/rrdbulkwriter/RRDBulkWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -96,184 +96,190 @@ public static void main(String[] args) throws IOException, InterruptedException
String persistenceService=prop.getProperty("persistenceservice");
Integer archiveSetUp=Integer.parseInt(prop.getProperty("archivesetup"));

String logPath = Util.getRrd4jDemoPath(file + ".log");
PrintWriter log = new PrintWriter(new BufferedOutputStream(new FileOutputStream(logPath, false)));

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH'%3A'mm'%3A'ss.000'Z'"); // correct format for REST API call!
Date startDate = new Date(start*1000);
Date endDate = new Date(end * 1000);

String rrdPath = Util.getRrd4jDemoPath(file + ".rrd");
String imgPath = Util.getRrd4jDemoPath(file + ".png");
//files could consist of several itemnames!
String[] filenames;
if (file.contains(",")) {
filenames=file.split(",");
} else {
filenames = new String[] { file };
}
for (String f : filenames) {
String logPath = Util.getRrd4jDemoPath(f + ".log");
PrintWriter log = new PrintWriter(new BufferedOutputStream(new FileOutputStream(logPath, false)));

String rrdPath = Util.getRrd4jDemoPath(f + ".rrd");
String imgPath = Util.getRrd4jDemoPath(f + ".png");

println("== Start: " +df.format(startDate));
println("== End: " +df.format( endDate));
log.println("== Start: " +df.format(startDate));
log.println("== End: " + df.format(endDate));
if (startDate.after(endDate))
{
println("== Start: " + df.format(startDate));
println("== End: " + df.format(endDate));
log.println("== Start: " + df.format(startDate));
log.println("== End: " + df.format(endDate));
if (startDate.after(endDate)) {
println("Requested Start is after End! Can't work that way, bailing out!");
log.println("Requested Start is after End! Can't work that way, bailing out!");
log.close();
return;
}
log.println("== Creating RRD file " + rrdPath);
RrdDef rrdDef = new RrdDef(rrdPath, start - 1, MAX_STEP);
rrdDef.setVersion(2);
ConsolFun cFunc=AVERAGE;
switch (archiveSetUp) {
case 1:
//Database setup according OH2 default
cFunc=AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 60, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 480);
rrdDef.addArchive(cFunc, 0.5, 4, 360);
rrdDef.addArchive(cFunc, 0.5, 14, 644);
rrdDef.addArchive(cFunc, 0.5, 60, 720);
rrdDef.addArchive(cFunc, 0.5, 720, 730);
rrdDef.addArchive(cFunc, 0.5, 10080, 520);
break;
case 2:
//Database setup according OH3 default_numeric
cFunc=LAST;
rrdDef.addDatasource(STATE, GAUGE, 600, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 360);
rrdDef.addArchive(cFunc, 0.5, 6, 10080);
rrdDef.addArchive(cFunc, 0.5, 90, 36500);
rrdDef.addArchive(cFunc, 0.5, 360,43800);
rrdDef.addArchive(cFunc, 0.5, 8640,3650);
break;
log.println("== Creating RRD file " + rrdPath);
RrdDef rrdDef = new RrdDef(rrdPath, start - 1, MAX_STEP);
rrdDef.setVersion(2);
ConsolFun cFunc = AVERAGE;
switch (archiveSetUp) {
case 1:
//Database setup according OH2 default
cFunc = AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 60, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 480);
rrdDef.addArchive(cFunc, 0.5, 4, 360);
rrdDef.addArchive(cFunc, 0.5, 14, 644);
rrdDef.addArchive(cFunc, 0.5, 60, 720);
rrdDef.addArchive(cFunc, 0.5, 720, 730);
rrdDef.addArchive(cFunc, 0.5, 10080, 520);
break;
case 2:
//Database setup according OH3 default_numeric
cFunc = LAST;
rrdDef.addDatasource(STATE, GAUGE, 600, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 360);
rrdDef.addArchive(cFunc, 0.5, 6, 10080);
rrdDef.addArchive(cFunc, 0.5, 90, 36500);
rrdDef.addArchive(cFunc, 0.5, 360, 43800);
rrdDef.addArchive(cFunc, 0.5, 8640, 3650);
break;
case 3:
//Database setup according OH3 default_quantifiable
cFunc=AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 600, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 360);
rrdDef.addArchive(cFunc, 0.5, 6, 10080);
rrdDef.addArchive(cFunc, 0.5, 90, 36500);
rrdDef.addArchive(cFunc, 0.5, 360,43800);
rrdDef.addArchive(cFunc, 0.5, 8640,3650);
break;
default:
//Database setup according OH2 default (could be changed for custom setup!)
cFunc=AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 60, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 480);
rrdDef.addArchive(cFunc, 0.5, 4, 360);
rrdDef.addArchive(cFunc, 0.5, 14, 644);
rrdDef.addArchive(cFunc, 0.5, 60, 720);
rrdDef.addArchive(cFunc, 0.5, 720, 730);
rrdDef.addArchive(cFunc, 0.5, 10080, 520);
}
log.println(rrdDef.dump());
log.println("Estimated file size: " + rrdDef.getEstimatedSize());
try (RrdDb rrdDb = RrdDb.of(rrdDef)) {
log.println("== RRD file created.");
if (rrdDb.getRrdDef().equals(rrdDef)) {
log.println("Checking RRD file structure... OK");
} else {
println("Invalid RRD file created. This is a serious bug, bailing out!");
log.println("Invalid RRD file created. This is a serious bug, bailing out!");
log.close();
return;
//Database setup according OH3 default_quantifiable
cFunc = AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 600, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 360);
rrdDef.addArchive(cFunc, 0.5, 6, 10080);
rrdDef.addArchive(cFunc, 0.5, 90, 36500);
rrdDef.addArchive(cFunc, 0.5, 360, 43800);
rrdDef.addArchive(cFunc, 0.5, 8640, 3650);
break;
default:
//Database setup according OH2 default (could be changed for custom setup!)
cFunc = AVERAGE;
rrdDef.addDatasource(STATE, GAUGE, 60, Double.NaN, Double.NaN);
rrdDef.addArchive(cFunc, 0.5, 1, 480);
rrdDef.addArchive(cFunc, 0.5, 4, 360);
rrdDef.addArchive(cFunc, 0.5, 14, 644);
rrdDef.addArchive(cFunc, 0.5, 60, 720);
rrdDef.addArchive(cFunc, 0.5, 720, 730);
rrdDef.addArchive(cFunc, 0.5, 10080, 520);
}
}
println("== (empty) RRD file closed.");
log.println("== (empty) RRD file closed.");

log.println(rrdDef.dump());
log.println("Estimated file size: " + rrdDef.getEstimatedSize());
try (RrdDb rrdDb = RrdDb.of(rrdDef)) {
log.println("== RRD file created.");
if (rrdDb.getRrdDef().equals(rrdDef)) {
log.println("Checking RRD file structure... OK");
} else {
println("Invalid RRD file created. This is a serious bug, bailing out!");
log.println("Invalid RRD file created. This is a serious bug, bailing out!");
log.close();
return;
}
}
println("== (empty) RRD file closed.");
log.println("== (empty) RRD file closed.");

//Getting the data from REST API
println("Getting source-data via REST API call!");
log.println("Getting source-data via REST API call!");

//Getting the data from REST API
println("Getting source-data via REST API call!");
log.println("Getting source-data via REST API call!");

String resturl="http://"+ openHABServer + ":8080/rest/persistence/items/" + file + "?serviceId=" +persistenceService +"&starttime=" + df.format(startDate) + "&endtime=" + df.format(endDate);
log.println("== REST API Call: " +resturl);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(resturl))
.build();
String json="";
try {
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
json= response.body();
} catch (Exception e) {
println("HTTP Request failed, is openHABServer correctly set? Bailing out!");
log.println("HTTP Request failed, is openHABServer correctly set? Bailing out!");
log.close();
return;
}
JSONObject obj = new JSONObject(json);
JSONArray arr = obj.getJSONArray("data");
if (arr.length() == 0) {
println("No data found in JSON-String! Bailing out!");
log.println("No data found in JSON-String! Bailing out!");
log.close();
return;
}
NavigableMap<Long, Double> valueMap = new TreeMap<Long, Double>();
log.println("Reading the data");
for (int i = 0; i < arr.length(); i++) {
Long key = Long.valueOf(arr.getJSONObject(i).getLong("time"))/1000; // divide by 1000 to get time in seconds!!
Double value = Double.parseDouble(arr.getJSONObject(i).getString("state"));
valueMap.put(key, value);
log.println("key: " + key + " value: " + value);
println("key: " + key + " value: " + value);
}
// read the source data and write into .rrd file
println("== writing values into .rrd every " + MAX_STEP + " seconds");
log.println("== writing values into .rrd every " + MAX_STEP + " seconds");
Map.Entry<Long, Double> currentDataPoint = valueMap.firstEntry();
String resturl = "http://" + openHABServer + ":8080/rest/persistence/items/" + f + "?serviceId="
+ persistenceService + "&starttime=" + df.format(startDate) + "&endtime=" + df.format(endDate);
log.println("== REST API Call: " + resturl);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(resturl)).build();
String json = "";
try {
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
json = response.body();
} catch (Exception e) {
println("HTTP Request failed, is openHABServer correctly set? Bailing out!");
log.println("HTTP Request failed, is openHABServer correctly set? Bailing out!");
log.close();
return;
}
JSONObject obj = new JSONObject(json);
JSONArray arr = obj.getJSONArray("data");
if (arr.length() == 0) {
println("No data found in JSON-String! Bailing out!");
log.println("No data found in JSON-String! Bailing out!");
log.close();
return;
}
NavigableMap<Long, Double> valueMap = new TreeMap<Long, Double>();
log.println("Reading the data");
for (int i = 0; i < arr.length(); i++) {
Long key = Long.valueOf(arr.getJSONObject(i).getLong("time")) / 1000; // divide by 1000 to get time in seconds!!
Double value = Double.parseDouble(arr.getJSONObject(i).getString("state"));
valueMap.put(key, value);
log.println("key: " + key + " value: " + value);
println("key: " + key + " value: " + value);
}
// read the source data and write into .rrd file
println("== writing values into .rrd every " + MAX_STEP + " seconds");
log.println("== writing values into .rrd every " + MAX_STEP + " seconds");
Map.Entry<Long, Double> currentDataPoint = valueMap.firstEntry();

long t = start;
try (RrdDb rrdDb = RrdDb.of(rrdPath)) {
Sample sample = rrdDb.createSample();
while (t <= end + MAX_STEP) {
sample.setTime(t);
if (currentDataPoint.getKey() < t) {
currentDataPoint = valueMap.higherEntry(currentDataPoint.getKey()); // use next datapoint only if the actual timekey is lower then t!
}
if (currentDataPoint == null) {
log.println("No more saved data!");
break;
long t = start;
try (RrdDb rrdDb = RrdDb.of(rrdPath)) {
Sample sample = rrdDb.createSample();
while (t <= end + MAX_STEP) {
sample.setTime(t);
if (currentDataPoint.getKey() < t) {
currentDataPoint = valueMap.higherEntry(currentDataPoint.getKey()); // use next datapoint only if the actual timekey is lower then t!
}
if (currentDataPoint == null) {
log.println("No more saved data!");
break;
}
sample.setValue(STATE, currentDataPoint.getValue());
log.println(sample.dump());
sample.update();
t += MAX_STEP;
}
sample.setValue(STATE, currentDataPoint.getValue());
log.println(sample.dump());
sample.update();
t += MAX_STEP;
}
}

// create graph
log.println("== Creating graph from the file");
RrdGraphDef gDef = new RrdGraphDef(start,end);
gDef.setTimeLabelFormat(new CustomTimeLabelFormat());
gDef.setLocale(Locale.US);
gDef.setWidth(IMG_WIDTH);
gDef.setHeight(IMG_HEIGHT);
// create graph
log.println("== Creating graph from the file");
RrdGraphDef gDef = new RrdGraphDef(start, end);
gDef.setTimeLabelFormat(new CustomTimeLabelFormat());
gDef.setLocale(Locale.US);
gDef.setWidth(IMG_WIDTH);
gDef.setHeight(IMG_HEIGHT);

// To use rrdtool font set or not
//gDef.setFontSet(true);
// To use rrdtool font set or not
//gDef.setFontSet(true);

gDef.setFilename(imgPath);
gDef.setStartTime(start);
gDef.setEndTime(end);
df = new SimpleDateFormat("yyyy-MM-dd'T'HH':'mm'Z'"); // correct format for REST API call!
gDef.setTitle("Values from " + df.format(startDate) + " to " + df.format(endDate));
//gDef.setTitle("Values from " + start + " to " + end);
gDef.setVerticalLabel("Values");
gDef.datasource(STATE, rrdPath, STATE, cFunc);
gDef.line(STATE, Color.BLUE, "imported values");
gDef.comment("\\r");
gDef.setImageInfo("<img src='%s' width='%d' height = '%d'>");
gDef.setPoolUsed(false);
gDef.setImageFormat("png");
gDef.setDownsampler(new eu.bengreen.data.utility.LargestTriangleThreeBuckets((int)(IMG_WIDTH * 1)));
// create graph finally
RrdGraph graph = new RrdGraph(gDef);
println(graph.getRrdGraphInfo().dump());
println("== Graph created " + Util.getLapTime());
log.println(graph.getRrdGraphInfo().dump());
log.close();
gDef.setFilename(imgPath);
gDef.setStartTime(start);
gDef.setEndTime(end);
df = new SimpleDateFormat("yyyy-MM-dd'T'HH':'mm'Z'"); // correct format for REST API call!
gDef.setTitle("Values from " + df.format(startDate) + " to " + df.format(endDate));
//gDef.setTitle("Values from " + start + " to " + end);
gDef.setVerticalLabel("Values");
gDef.datasource(STATE, rrdPath, STATE, cFunc);
gDef.line(STATE, Color.BLUE, "imported values");
gDef.comment("\\r");
gDef.setImageInfo("<img src='%s' width='%d' height = '%d'>");
gDef.setPoolUsed(false);
gDef.setImageFormat("png");
gDef.setDownsampler(new eu.bengreen.data.utility.LargestTriangleThreeBuckets((int) (IMG_WIDTH * 1)));
// create graph finally
RrdGraph graph = new RrdGraph(gDef);
println(graph.getRrdGraphInfo().dump());
println("== Graph created " + Util.getLapTime());
log.println(graph.getRrdGraphInfo().dump());
log.close();
}
}

static void println(String msg) {
Expand Down

0 comments on commit a3809c3

Please sign in to comment.