diff --git a/public/js/appChart.js b/public/js/appChart.js index 3dfad8eb42c18d47a8096576f567b5a847b8908c..81de4543060fcf9d5a591a561b1b97a1c689dd3c 100644 --- a/public/js/appChart.js +++ b/public/js/appChart.js @@ -182,6 +182,7 @@ const getMetadataFromSingleDatastream = async function (urlDatastream) { /** * Retrieve metadata from multiple datastreams + * @async * @param {Array} datastreamsUrlArr An array that contains N Datastream URL strings * @returns {Promise} A promise that contains an array of N Datastream metadata objects when fulfilled */ @@ -193,7 +194,9 @@ const getMetadataFromMultipleDatastreams = async function (datastreamsUrlArr) { // Use for/of loop - we need to maintain the order of execution of the async operations for (const datastreamUrl of datastreamsUrlArr) { // Metadata from a single Datastream - const datastreamMetadata = await getDatastreamMetadata(datastreamUrl); + const datastreamMetadata = await getMetadataFromSingleDatastream( + datastreamUrl + ); datastreamMetadataArr.push(datastreamMetadata); } @@ -525,7 +528,7 @@ const getCombinedObservationsFromAllNextLinks = function ( * @param {Promise} metadataPlusObsPromiseArray An array that contains two promises, one for datastream metadata, the other for observations * @returns {Promise} A promise that contains two arrays when fulfilled, one for datastream metadata and the other for observations */ -const getMetadataPlusObservationsForChart = async function ( +const getMetadataPlusObservationsFromSingleDatastream = async function ( metadataPlusObsPromiseArray ) { try { @@ -571,57 +574,93 @@ const getObservationsFromMultipleDatastreams = async function ( } }; -// Building + phenomenon + sampling rate -const buildingsSensorSamplingRateRLArr = [ - ["101", "rl", "60min"], - ["102", "rl", "60min"], - ["107", "rl", "60min"], - ["112, 118", "rl", "60min"], - ["125", "rl", "60min"], - ["225", "rl", "60min"], -]; - -// Datastreams IDs -const datastreamsRLArr = buildingsSensorSamplingRateRLArr.map((bldg) => - getDatastreamIdFromBuildingNumber(...bldg) -); +/** + * Retrieve the metadata from multiple Datastreams and the Observations corresponding to these Datastreams + * @async + * @param {Array} bldgSensorSamplingRateArr A 3*N array containing buildings, sensors & sampling rates as strings, e.g. ["101", "rl", "60min"] + * @returns {Promise} A promise that contains a N*2 array (the first element is an array of Observations and the second element is an array of Datastream metadata objects) when fulfilled + */ +const getMetadataPlusObservationsFromMultipleDatastreams = async function ( + bldgSensorSamplingRateArr +) { + try { + if (!bldgSensorSamplingRateArr) return; -// Datastreams URLs -const datastreamsUrlRLArr = datastreamsRLArr.map((datastreamId) => - getObservationsUrl(BASE_URL, datastreamId) -); + // Datastreams IDs + const datastreamsIdsArr = bldgSensorSamplingRateArr.map( + (bldgSensorSamplingRate) => + getDatastreamIdFromBuildingNumber(...bldgSensorSamplingRate) + ); -// Promise objects - Observations / RL -const observationsPromisesRLArr = datastreamsUrlRLArr.map((obsUrl) => - getCombinedObservationsFromAllNextLinks( - axiosGetRequest(obsUrl, QUERY_PARAMS_COMBINED) - ) -); + // Observations URLs + const observationsUrlArr = datastreamsIdsArr.map((datastreamId) => + getObservationsUrl(BASE_URL, datastreamId) + ); + + // Datastreams URLs + const datastreamsUrlArr = datastreamsIdsArr.map((datastreamId) => + getDatastreamUrl(BASE_URL, datastreamId) + ); + + // Promise objects - Observations + const observationsPromisesArr = observationsUrlArr.map((obsUrl) => + getCombinedObservationsFromAllNextLinks( + axiosGetRequest(obsUrl, QUERY_PARAMS_COMBINED) + ) + ); + + // Observations array + const observationsArr = await getObservationsFromMultipleDatastreams( + observationsPromisesArr + ); + + // Metadata array + const metadataArr = await getMetadataFromMultipleDatastreams( + datastreamsUrlArr + ); -// getObservationsFromMultipleDatastreams(observationsPromisesRLArr).then((x) => -// console.log(x) -// ); + return [observationsArr, metadataArr]; + } catch (err) { + console.error(err); + } +}; const drawScatterPlotHC = function ( formattedObsArrayForSeriesOne, - formattedDatastreamMetadataSeriesOne = "", + formattedDatastreamMetadataSeriesOne, formattedObsArrayForSeriesTwo, - formattedDatastreamMetadataSeriesTwo = "" + formattedDatastreamMetadataSeriesTwo ) { - const CHART_TITLE = "Height Versus Weight of 507 Individuals by Gender"; - const CHART_SUBTITLE = "Source: Heinz 2003"; + const { + datastreamDescription: DATASTREAM_DESCRIPTION_SERIES_1, + datastreamName: DATASTREAM_NAME_SERIES_1, + phenomenonName: PHENOMENON_NAME_SERIES_1, + unitOfMeasurementSymbol: PHENOMENON_SYMBOL_SERIES_1, + } = formattedDatastreamMetadataSeriesOne; - const X_AXIS_TITLE = "Height (cm)"; + const { + datastreamDescription: DATASTREAM_DESCRIPTION_SERIES_2, + datastreamName: DATASTREAM_NAME_SERIES_2, + phenomenonName: PHENOMENON_NAME_SERIES_2, + unitOfMeasurementSymbol: PHENOMENON_SYMBOL_SERIES_2, + } = formattedDatastreamMetadataSeriesTwo; + + const CHART_TITLE = `${PHENOMENON_NAME_SERIES_1} Versus ${PHENOMENON_NAME_SERIES_2}`; + const CHART_SUBTITLE = `Source: ${DATASTREAM_NAME_SERIES_1} & ${DATASTREAM_NAME_SERIES_2}`; + + const X_AXIS_TITLE = `Date / Time`; - const SERIES_1_NAME = "Rücklauftemp"; - const SERIES_1_SYMBOL_COLOR = "rgba(119, 152, 191, .5)"; - const SERIES_1_TEXT_COLOR = "rgb(119, 152, 191)"; // remove transparency from symbol color for a more "intense" color - const SERIES_1_SYMBOL = "°C"; + const SERIES_1_NAME = `${PHENOMENON_NAME_SERIES_1}`; + const SERIES_1_SYMBOL_COLOR_RGB_ELEMENTS = "119, 152, 191"; + const SERIES_1_SYMBOL_COLOR = `rgba(${SERIES_1_SYMBOL_COLOR_RGB_ELEMENTS}, .5)`; + const SERIES_1_TEXT_COLOR = `rgb(${SERIES_1_SYMBOL_COLOR_RGB_ELEMENTS})`; // remove transparency from symbol color for a more "intense" color + const SERIES_1_SYMBOL = `${PHENOMENON_SYMBOL_SERIES_1}`; - const SERIES_2_NAME = "Power"; - const SERIES_2_SYMBOL_COLOR = "rgba(223, 83, 83, .5)"; - const SERIES_2_TEXT_COLOR = "rgb(223, 83, 83)"; // remove transparency from symbol color for a more "intense" color - const SERIES_2_SYMBOL = "kW"; + const SERIES_2_NAME = `${PHENOMENON_NAME_SERIES_2}`; + const SERIES_2_SYMBOL_COLOR_RGB_ELEMENTS = "223, 83, 83"; + const SERIES_2_SYMBOL_COLOR = `rgba(${SERIES_2_SYMBOL_COLOR_RGB_ELEMENTS}, .5)`; + const SERIES_2_TEXT_COLOR = `rgb(${SERIES_2_SYMBOL_COLOR_RGB_ELEMENTS})`; // remove transparency from symbol color for a more "intense" color + const SERIES_2_SYMBOL = `${PHENOMENON_SYMBOL_SERIES_2}`; Highcharts.chart("chart-scatter-plot", { chart: { @@ -744,75 +783,29 @@ const drawScatterPlotHC = function ( }; (async () => { - const DATASTREAM_ID_SERIES_1 = getDatastreamIdFromBuildingNumber( - "weather_station_521", - "outside_temp", - "60min" - ); - const URL_DATASTREAM_SERIES_1 = getDatastreamUrl( - BASE_URL, - DATASTREAM_ID_SERIES_1 - ); - const URL_OBSERVATIONS_SERIES_1 = getObservationsUrl( - BASE_URL, - DATASTREAM_ID_SERIES_1 - ); - - const DATASTREAM_ID_SERIES_2 = getDatastreamIdFromBuildingNumber( - "225", - "vl", - "60min" - ); - const URL_DATASTREAM_SERIES_2 = getDatastreamUrl( - BASE_URL, - DATASTREAM_ID_SERIES_2 - ); - const URL_OBSERVATIONS_SERIES_2 = getObservationsUrl( - BASE_URL, - DATASTREAM_ID_SERIES_2 - ); - - // Create promises - const promiseDatastreamMetadataSeries1 = getMetadataFromSingleDatastream( - URL_DATASTREAM_SERIES_1 - ); - const promiseCombinedObservationsSeries1 = - getCombinedObservationsFromAllNextLinks( - axiosGetRequest(URL_OBSERVATIONS_SERIES_1, QUERY_PARAMS_COMBINED) - ); - - const promiseDatastreamMetadataSeries2 = getMetadataFromSingleDatastream( - URL_DATASTREAM_SERIES_2 - ); - const promiseCombinedObservationsSeries2 = - getCombinedObservationsFromAllNextLinks( - axiosGetRequest(URL_OBSERVATIONS_SERIES_2, QUERY_PARAMS_COMBINED) + // Input array - building, sensor, samplingRate + const sensorsOfInterestArr = [ + ["weather_station_521", "outside_temp", "60min"], + ["225", "vl", "60min"], + ]; + + const observationsPlusMetadata = + await getMetadataPlusObservationsFromMultipleDatastreams( + sensorsOfInterestArr ); - // Pass promises to our async function - const metadataPlusObservationsSeries1 = - await getMetadataPlusObservationsForChart([ - promiseCombinedObservationsSeries1, - promiseDatastreamMetadataSeries1, - ]); - const metadataPlusObservationsSeries2 = - await getMetadataPlusObservationsForChart([ - promiseCombinedObservationsSeries2, - promiseDatastreamMetadataSeries2, - ]); - - // Extract the metadata and the observations from resulting arrays - const combinedObsSeries1 = metadataPlusObservationsSeries1[0]; - const datastreamMetadataSeries1 = metadataPlusObservationsSeries1[1]; - - const combinedObsSeries2 = metadataPlusObservationsSeries2[0]; - const datastreamMetadataSeries2 = metadataPlusObservationsSeries2[1]; + // Extract the observations and metadata for each sensor + // Array elements in same order as input array + const [ + [obsSensorOneArr, obsSensorTwoArr], + [metadataSensorOne, metadataSensorTwo], + ] = observationsPlusMetadata; drawScatterPlotHC( - formatSTAResponseForLineChartOrScatterPlot(combinedObsSeries1), - formatDatastreamMetadataForChart(datastreamMetadataSeries1), - formatSTAResponseForLineChartOrScatterPlot(combinedObsSeries2), - formatDatastreamMetadataForChart(datastreamMetadataSeries2) + formatSTAResponseForLineChartOrScatterPlot(obsSensorOneArr), + formatDatastreamMetadataForChart(metadataSensorOne), + formatSTAResponseForLineChartOrScatterPlot(obsSensorTwoArr), + formatDatastreamMetadataForChart(metadataSensorTwo) ); })(); @@ -831,5 +824,5 @@ export { formatSTAResponseForLineChartOrScatterPlot, drawLineChartHC, getCombinedObservationsFromAllNextLinks, - getMetadataPlusObservationsForChart, + getMetadataPlusObservationsFromSingleDatastream, }; diff --git a/public/js/dropDownList.js b/public/js/dropDownList.js index e39dbcfebd35bed4df426c56c2acae0a70eb935f..ac3a750c2a202da17d00e82360584771320082ca 100644 --- a/public/js/dropDownList.js +++ b/public/js/dropDownList.js @@ -14,7 +14,7 @@ import { formatSTAResponseForLineChartOrScatterPlot, drawLineChartHC, getCombinedObservationsFromAllNextLinks, - getMetadataPlusObservationsForChart, + getMetadataPlusObservationsFromSingleDatastream, } from "./appChart.js"; const buildingsAvailableSensorsArr = [ @@ -296,10 +296,11 @@ const selectChartTypeFromDropDown = async function () { ); // Pass promises to our async function - const metadataPlusObservations = await getMetadataPlusObservationsForChart([ - promiseCombinedObservations, - promiseDatastreamMetadata, - ]); + const metadataPlusObservations = + await getMetadataPlusObservationsFromSingleDatastream([ + promiseCombinedObservations, + promiseDatastreamMetadata, + ]); // Extract the metadata and the observations from resulting array const combinedObs = metadataPlusObservations[0];