appChart.js 16.3 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

Pithon Kabiro's avatar
Pithon Kabiro committed
28
29
import { getMetadataPlusObservationsFromSingleOrMultipleDatastreams } from "./src_modules/fetchData.mjs";

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

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

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

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

/**
 * Test plotting of temp difference (dT) using heatmap
 */
const drawHeatmapHCUsingTempDifference = async function () {
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
  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) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
77
        formatDatastreamMetadataForChart(metadataObj, false)
78
79
80
81
82
      );

    // Extract the formatted metadata properties
    const extractedFormattedTempDiff225Properties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
83
84
        formattedTempDiff225MetadataNestedArr,
        false
85
86
87
88
89
90
91
      );

    // 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
92
    );
93
94
95
  } catch (err) {
    console.error(err);
  }
Pithon Kabiro's avatar
Pithon Kabiro committed
96
97
};

98
99
100
/**
 * Test drawing of scatter plot chart
 */
101
const drawScatterPlotHCTest2 = async function () {
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  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)
128
129
    );

130
131
    // Create formatted array(s) for metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
132
      formatDatastreamMetadataForChart(metadataObj, false)
133
    );
134

135
136
137
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
138
139
        formattedMetadataNestedArr,
        false
140
      );
141

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

/**
 * Test drawing of line chart with multiple series
 */
const testLineChartMultipleSeries = async function () {
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  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)
177
178
    );

179
180
    // Format the metadata
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataArr) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
181
      formatDatastreamMetadataForChart(metadataArr, false)
Pithon Kabiro's avatar
Pithon Kabiro committed
182
183
    );

184
185
186
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
187
188
        formattedMetadataNestedArr,
        false
189
190
191
192
193
194
195
196
197
      );

    drawLineChartHighcharts(
      formattedObservationsNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
198
199
};

200
/**
201
 * Test drawing of column chart using aggregation / sum result - monthly
202
 */
Pithon Kabiro's avatar
Pithon Kabiro committed
203
const drawColumnChartMonthlySumTest = async function () {
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
229
230
231
232
  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
      )
233
234
    );

235
236
237
238
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
239
240
    );

241
242
243
244
    // Unique calendar months
    const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
      (uniqueCalendarDatesArr) =>
        extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
245
246
    );

247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
    // 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) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
267
      formatDatastreamMetadataForChart(metadataObj, true)
268
269
    );

270
271
272
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
273
274
275
276
        formattedMetadataNestedArr,
        true,
        "monthly",
        "sum"
277
278
279
280
281
282
283
284
285
      );

    drawColumnChartHighcharts(
      formattedObservationsSumMonthlyNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
286
287
288
289
290
291
};

/**
 * Test drawing of column chart using aggregation / sum result - daily
 */
const drawColumnChartDailySumTest = async function () {
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
  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
      )
321
322
    );

323
324
325
326
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
327
328
    );

329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
    // 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) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
349
      formatDatastreamMetadataForChart(metadataObj, true)
350
351
    );

352
353
354
    // Extract the formatted metadata properties
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
355
356
357
358
        formattedMetadataNestedArr,
        true,
        "daily",
        "sum"
359
      );
360

361
362
363
    drawColumnChartHighcharts(
      formattedObservationsSumDailyNestedArr,
      extractedFormattedDatastreamProperties
364
    );
365
366
367
  } catch (err) {
    console.error(err);
  }
368
369
370
371
372
373
};

/**
 * Test drawing of line chart using aggregation / average result - monthly
 */
const drawLineChartMonthlyAverageTest = async function () {
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
  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
      )
403
404
    );

405
406
407
408
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
409
410
    );

411
412
413
414
    // Unique calendar months
    const uniqueCalendarMonthsNestedArr = uniqueCalendarDatesNestedArr.map(
      (uniqueCalendarDatesArr) =>
        extractUniqueCalendarMonthsFromCalendarDates(uniqueCalendarDatesArr)
415
416
    );

417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
    // 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
Pithon Kabiro's avatar
Pithon Kabiro committed
436
    // NOTE: we use the `false` flag here because line charts are meant to work with non-aggregated data
437
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
438
      formatDatastreamMetadataForChart(metadataObj, false)
439
440
    );

441
    // Extract the formatted metadata properties
Pithon Kabiro's avatar
Pithon Kabiro committed
442
    // NOTE: we use the `false` flag here because line charts are meant to work with non-aggregated data
443
444
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
445
446
        formattedMetadataNestedArr,
        false
447
448
449
450
451
452
453
454
455
      );

    drawLineChartHighcharts(
      formattedObservationsAverageMonthlyNestedArr,
      extractedFormattedDatastreamProperties
    );
  } catch (err) {
    console.error(err);
  }
456
457
458
459
460
461
};

/**
 * Test drawing of line chart using aggregation / average result - daily
 */
const drawLineChartDailyAverageTest = async function () {
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
  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
      )
491
492
    );

493
494
495
496
    // Unique calendar dates
    const uniqueCalendarDatesNestedArr = observationsNestedArr.map(
      (observationsArr) =>
        extractUniqueCalendarDatesFromTimestamp(observationsArr)
497
498
    );

499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
    // 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
Pithon Kabiro's avatar
Pithon Kabiro committed
518
    // NOTE: we use the `false` flag here because line charts are meant to work with non-aggregated data
519
    const formattedMetadataNestedArr = metadataNestedArr.map((metadataObj) =>
Pithon Kabiro's avatar
Pithon Kabiro committed
520
      formatDatastreamMetadataForChart(metadataObj, false)
521
522
    );

523
    // Extract the formatted metadata properties
Pithon Kabiro's avatar
Pithon Kabiro committed
524
    // NOTE: we use the `false` flag here because line charts are meant to work with non-aggregated data
525
526
    const extractedFormattedDatastreamProperties =
      extractPropertiesFromFormattedDatastreamMetadata(
Pithon Kabiro's avatar
Pithon Kabiro committed
527
528
        formattedMetadataNestedArr,
        false
529
      );
Pithon Kabiro's avatar
Pithon Kabiro committed
530

531
532
533
    drawLineChartHighcharts(
      formattedObservationsAverageDailyNestedArr,
      extractedFormattedDatastreamProperties
Pithon Kabiro's avatar
Pithon Kabiro committed
534
    );
535
536
537
  } catch (err) {
    console.error(err);
  }
538
539
};

540
541
// drawScatterPlotHCTest2();
// drawHeatmapHCUsingTempDifference();
Pithon Kabiro's avatar
Pithon Kabiro committed
542
543
// testLineChartMultipleSeries();
// drawColumnChartMonthlySumTest();
544
545
546
// drawColumnChartDailySumTest();
// drawLineChartMonthlyAverageTest();
// drawLineChartDailyAverageTest();