appChart.js 15.6 KB
Newer Older
Pithon Kabiro's avatar
Pithon Kabiro committed
1
"use strict";
Pithon Kabiro's avatar
Pithon Kabiro committed
2

3
4
5
6
import {
  BASE_URL,
  QUERY_PARAMS_COMBINED,
} from "./src_modules/baseUrlPlusQueryParams.mjs";
7

8
9
10
import {
  formatSensorThingsApiResponseForLineChart,
  drawLineChartHighcharts,
11
} from "./src_modules/chartLine.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
12

13
14
15
import {
  formatSensorThingsApiResponseForHeatMap,
  drawHeatMapHighcharts,
16
} from "./src_modules/chartHeatmap.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
17

18
19
20
import {
  formatSensorThingsApiResponseForScatterPlot,
  drawScatterPlotHighcharts,
21
} from "./src_modules/chartScatterPlot.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
22

Pithon Kabiro's avatar
Pithon Kabiro committed
23
24
25
import {
  formatAggregationResultForColumnChart,
  drawColumnChartHighcharts,
26
} from "./src_modules/chartColumn.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
27

28
29
import {
  formatDatastreamMetadataForChart,
Pithon Kabiro's avatar
Pithon Kabiro committed
30
  extractPropertiesFromFormattedDatastreamMetadata,
31
  getMetadataPlusObservationsFromSingleOrMultipleDatastreams,
32
33
34
} from "./src_modules/fetchData.mjs";

import { calculateVorlaufMinusRuecklaufTemperature } from "./src_modules/calculateTemperatureDiff.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
35

36
import {
37
  extractObservationsWithinDatesInterval,
38
39
  extractUniqueCalendarDatesFromTimestamp,
  extractUniqueCalendarMonthsFromCalendarDates,
40
41
42
43
} from "./src_modules/aggregateHelpers.mjs";

import {
  calculateSumOfObservationValuesWithinInterval,
44
45
  calculateAverageOfObservationValuesWithinInterval,
} from "./src_modules/aggregate.mjs";
Pithon Kabiro's avatar
Pithon Kabiro committed
46
47
48
49
50

/**
 * Test plotting of temp difference (dT) using heatmap
 */
const drawHeatmapHCUsingTempDifference = async function () {
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  try {
    const [observationsTemperatureDiff225Arr, metadataTemperatureDiff225Arr] =
      await calculateVorlaufMinusRuecklaufTemperature(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        "225",
        "60min"
      );

    // We want to have nested arrays, so as to mimick the nested responses we get from fetching observations + metadata
    const observationsTemperatureDiff225NestedArr = [
      observationsTemperatureDiff225Arr,
    ];

    const metadataTemperatureDiff225NestedArr = [metadataTemperatureDiff225Arr];

    // Format the observations
    const formattedTempDiff225NestedArr =
      observationsTemperatureDiff225NestedArr.map((obsArr) =>
        formatSensorThingsApiResponseForHeatMap(obsArr)
      );

    // Format the metadata
    const formattedTempDiff225MetadataNestedArr =
      metadataTemperatureDiff225NestedArr.map((metadataObj) =>
        formatDatastreamMetadataForChart(metadataObj)
      );

    // Extract the formatted metadata properties
    const extractedFormattedTempDiff225Properties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedTempDiff225MetadataNestedArr
      );

    // First need to extract the formatted observations from the nested array
    // Heatmap only needs one set of formatted observation values
    drawHeatMapHighcharts(
      ...formattedTempDiff225NestedArr,
      extractedFormattedTempDiff225Properties
Pithon Kabiro's avatar
Pithon Kabiro committed
90
    );
91
92
93
  } catch (err) {
    console.error(err);
  }
Pithon Kabiro's avatar
Pithon Kabiro committed
94
95
};

96
97
98
/**
 * Test drawing of scatter plot chart
 */
99
const drawScatterPlotHCTest2 = async function () {
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  try {
    const sensorsOfInterestNestedArr = [
      ["weather_station_521", "outside_temp", "60min"],
      ["225", "vl", "60min"],
      ["125", "rl", "60min"],
    ];

    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the combined arrays for observations and metadata
    const [observationsNestedArr, metadataNestedArr] = observationsPlusMetadata;

    // Extract values for x-axis and y-axis
    // x-axis values are first element of nested observations array
    const [obsXAxisArr] = observationsNestedArr.slice(0, 1);
    // y-axis values are rest of elements of nested observations array
    const obsYAxisNestedArr = observationsNestedArr.slice(1);

    // Create formatted array(s) for observations
    const formattedObservationsArr = obsYAxisNestedArr.map((obsYAxisArr) =>
      formatSensorThingsApiResponseForScatterPlot(obsXAxisArr, obsYAxisArr)
126
127
    );

128
129
130
131
    // Create formatted array(s) for metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
      formatDatastreamMetadataForChart(metadataObj)
    );
132

133
134
135
136
137
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );
138

139
140
141
    drawScatterPlotHighcharts(
      formattedObservationsArr,
      extractedFormattedDatastreamProperties
Pithon Kabiro's avatar
Pithon Kabiro committed
142
    );
143
144
145
  } catch (err) {
    console.error(err);
  }
146
147
148
149
150
151
};

/**
 * Test drawing of line chart with multiple series
 */
const testLineChartMultipleSeries = async function () {
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
  try {
    const sensorsOfInterestNestedArr = [
      ["225", "vl", "60min"],
      ["125", "rl", "60min"],
      ["weather_station_521", "outside_temp", "60min"],
    ];

    const observationsPlusMetadataArr =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the observations and metadata arrays of arrays
    const [observationsNestedArr, metadataNestedArr] =
      observationsPlusMetadataArr;

    // Format the observations
    const formattedObservationsNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        formatSensorThingsApiResponseForLineChart(observationsArr)
174
175
    );

176
177
178
    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataArr) =>
      formatDatastreamMetadataForChart(metadataArr)
Pithon Kabiro's avatar
Pithon Kabiro committed
179
180
    );

181
182
183
184
185
186
187
188
189
190
191
192
193
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );

    drawLineChartHighcharts(
      formattedObservationsNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
194
195
};

196
/**
197
 * Test drawing of column chart using aggregation / sum result - monthly
198
 */
Pithon Kabiro's avatar
Pithon Kabiro committed
199
const drawColumnChartMonthlySumTest = async function () {
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  try {
    const sensorsOfInterestNestedArr = [
      ["125", "vl", "60min"],
      ["225", "vl", "60min"],
    ];

    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the observations and metadata for each sensor
    // Array elements in same order as input array
    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;

    // User-specified start date and end date
    const startDate = "2020-02-01";
    const endDate = "2020-05-31";

    // Extract observations within the user-specified start and end date
    const observationsNestedArr = obsNestedArr.map((obsArr) =>
      extractObservationsWithinDatesInterval(
        obsArr,
        "60min",
        startDate,
        endDate
      )
229
230
    );

231
232
233
234
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
235
236
    );

237
238
239
240
    // Unique calendar months
    const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
      (uniqueCalendarDatesArr) =>
        extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
241
242
    );

243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
    // Calculate sum of values of observations - monthly
    const observationsSumMonthlyNestedArr =
      calculateSumOfObservationValuesWithinInterval(
        observationsNestedArr,
        "60min",
        uniqueCalendarMonthsNestedArr,
        "monthly"
      );

    // Format the observations
    const formattedObservationsSumMonthlyNestedArr =
      observationsSumMonthlyNestedArr.map((obsSumMonthlyArr, i) =>
        formatAggregationResultForColumnChart(
          uniqueCalendarMonthsNestedArr[i],
          obsSumMonthlyArr
        )
      );

    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
      formatDatastreamMetadataForChart(metadataObj)
264
265
    );

266
267
268
269
270
271
272
273
274
275
276
277
278
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );

    drawColumnChartHighcharts(
      formattedObservationsSumMonthlyNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
279
280
281
282
283
284
};

/**
 * Test drawing of column chart using aggregation / sum result - daily
 */
const drawColumnChartDailySumTest = async function () {
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
  try {
    const sensorsOfInterestNestedArr = [
      ["125", "vl", "60min"],
      ["225", "vl", "60min"],
    ];

    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the observations and metadata for each sensor
    // Array elements in same order as input array
    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;

    // User-specified start date and end date
    const startDate = "2020-02-01";
    const endDate = "2020-05-31";

    // Extract observations within the user-specified start and end date
    const observationsNestedArr = obsNestedArr.map((obsArr) =>
      extractObservationsWithinDatesInterval(
        obsArr,
        "60min",
        startDate,
        endDate
      )
314
315
    );

316
317
318
319
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
320
321
    );

322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
    // Calculate sum of values of observations - daily
    const observationsSumDailyNestedArr =
      calculateSumOfObservationValuesWithinInterval(
        observationsNestedArr,
        "60min",
        uniqueCalendarDatesNestedArr,
        "daily"
      );

    // Format the observations - daily
    const formattedObservationsSumDailyNestedArr =
      observationsSumDailyNestedArr.map((obsSumDailyArr, i) =>
        formatAggregationResultForColumnChart(
          uniqueCalendarDatesNestedArr[i],
          obsSumDailyArr
        )
      );

    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
      formatDatastreamMetadataForChart(metadataObj)
343
344
    );

345
346
347
348
349
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );
350

351
352
353
    drawColumnChartHighcharts(
      formattedObservationsSumDailyNestedArr,
      extractedFormattedDatastreamProperties
354
    );
355
356
357
  } catch (err) {
    console.error(err);
  }
358
359
360
361
362
363
};

/**
 * Test drawing of line chart using aggregation / average result - monthly
 */
const drawLineChartMonthlyAverageTest = async function () {
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
  try {
    const sensorsOfInterestNestedArr = [
      ["125", "vl", "60min"],
      ["225", "vl", "60min"],
    ];

    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the observations and metadata for each sensor
    // Array elements in same order as input array
    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;

    // User-specified start date and end date
    const startDate = "2020-02-01";
    const endDate = "2020-05-31";

    // Extract observations within the user-specified start and end date
    const observationsNestedArr = obsNestedArr.map((obsArr) =>
      extractObservationsWithinDatesInterval(
        obsArr,
        "60min",
        startDate,
        endDate
      )
393
394
    );

395
396
397
398
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
399
400
    );

401
402
403
404
    // Unique calendar months
    const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
      (uniqueCalendarDatesArr) =>
        extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
405
406
    );

407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
    // Calculate average of values of observations - monthly
    const observationsAverageMonthlyNestedArr =
      calculateAverageOfObservationValuesWithinInterval(
        observationsNestedArr,
        "60min",
        uniqueCalendarMonthsNestedArr,
        "monthly"
      );

    // Format the observations
    const formattedObservationsAverageMonthlyNestedArr =
      observationsAverageMonthlyNestedArr.map((obsAverageMonthlyArr, i) =>
        formatAggregationResultForColumnChart(
          uniqueCalendarMonthsNestedArr[i],
          obsAverageMonthlyArr
        )
      );

    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
      formatDatastreamMetadataForChart(metadataObj)
428
429
    );

430
431
432
433
434
435
436
437
438
439
440
441
442
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );

    drawLineChartHighcharts(
      formattedObservationsAverageMonthlyNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
443
444
445
446
447
448
};

/**
 * Test drawing of line chart using aggregation / average result - daily
 */
const drawLineChartDailyAverageTest = async function () {
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
  try {
    const sensorsOfInterestNestedArr = [
      ["125", "vl", "60min"],
      ["225", "vl", "60min"],
    ];

    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromSingleOrMultipleDatastreams(
        BASE_URL,
        QUERY_PARAMS_COMBINED,
        sensorsOfInterestNestedArr
      );

    // Extract the observations and metadata for each sensor
    // Array elements in same order as input array
    const [obsNestedArr, metadataNestedArr] = observationsPlusMetadata;

    // User-specified start date and end date
    const startDate = "2020-02-01";
    const endDate = "2020-05-31";

    // Extract observations within the user-specified start and end date
    const observationsNestedArr = obsNestedArr.map((obsArr) =>
      extractObservationsWithinDatesInterval(
        obsArr,
        "60min",
        startDate,
        endDate
      )
478
479
    );

480
481
482
483
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
484
485
    );

486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
    // Calculate average of values of observations - daily
    const observationsAverageDailyNestedArr =
      calculateAverageOfObservationValuesWithinInterval(
        observationsNestedArr,
        "60min",
        uniqueCalendarDatesNestedArr,
        "daily"
      );

    // Format the observations - daily
    const formattedObservationsAverageDailyNestedArr =
      observationsAverageDailyNestedArr.map((obsAverageDailyArr, i) =>
        formatAggregationResultForColumnChart(
          uniqueCalendarDatesNestedArr[i],
          obsAverageDailyArr
        )
      );

    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
      formatDatastreamMetadataForChart(metadataObj)
507
508
    );

509
510
511
512
513
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
        formattedMetadataNestedArr
      );
Pithon Kabiro's avatar
Pithon Kabiro committed
514

515
516
517
    drawLineChartHighcharts(
      formattedObservationsAverageDailyNestedArr,
      extractedFormattedDatastreamProperties
Pithon Kabiro's avatar
Pithon Kabiro committed
518
    );
519
520
521
  } catch (err) {
    console.error(err);
  }
522
523
};

524
525
// drawScatterPlotHCTest2();
// drawHeatmapHCUsingTempDifference();
Pithon Kabiro's avatar
Pithon Kabiro committed
526
527
// testLineChartMultipleSeries();
// drawColumnChartMonthlySumTest();
528
529
530
// drawColumnChartDailySumTest();
// drawLineChartMonthlyAverageTest();
// drawLineChartDailyAverageTest();