appChart.js 36.9 KB
Newer Older
1001

1002
1003
1004
1005
1006
    return [observationsArr, metadataArr];
  } catch (err) {
    console.error(err);
  }
};
1007

Pithon Kabiro's avatar
Pithon Kabiro committed
1008
1009
1010
1011
1012
/**
 * Calculates the temperature difference, dT, between Vorlauf temperature [VL] and Rücklauf temperature [RL] (i.e., dT = VL - RL)
 * @async
 * @param {String} buildingId The building ID as a string
 * @param {String} samplingRate The sampling rate as a string
1013
 * @returns {Promise} A promise that contains an array (that is made up of a temperature difference array and a metadata object) when fulfilled
Pithon Kabiro's avatar
Pithon Kabiro committed
1014
1015
1016
1017
1018
 */
const calculateVorlaufMinusRuecklaufTemperature = async function (
  buildingId,
  samplingRate
) {
1019
1020
1021
1022
1023
  try {
    const bldgSensorSamplingRateArr = [
      [buildingId, "vl", samplingRate],
      [buildingId, "rl", samplingRate],
    ];
Pithon Kabiro's avatar
Pithon Kabiro committed
1024

1025
1026
    const BUILDING_ID = buildingId;
    const SAMPLING_RATE = samplingRate;
Pithon Kabiro's avatar
Pithon Kabiro committed
1027

1028
1029
1030
1031
    const observationsPlusMetadata =
      await getMetadataPlusObservationsFromMultipleDatastreams(
        bldgSensorSamplingRateArr
      );
Pithon Kabiro's avatar
Pithon Kabiro committed
1032

1033
1034
1035
    // Extract Vorlauf temperature, Ruecklauf temperature and metadata
    const [[vorlaufTemp, ruecklaufTemp], [metadataVorlauf, metadataRuecklauf]] =
      observationsPlusMetadata;
Pithon Kabiro's avatar
Pithon Kabiro committed
1036

1037
1038
1039
    // Extract the temperature values
    const vorlaufTempValues = vorlaufTemp.map((obs) => obs[1]);
    const ruecklaufTempValues = ruecklaufTemp.map((obs) => obs[1]);
Pithon Kabiro's avatar
Pithon Kabiro committed
1040

1041
1042
1043
1044
1045
1046
    // The arrays have equal length, we need only use one of them for looping
    // Resulting array contains the following pairs (timestamp + dT)
    const vorlaufMinusRuecklaufTemp = vorlaufTemp.map((obs, i) => [
      obs[0],
      vorlaufTempValues[i] - ruecklaufTempValues[i],
    ]);
Pithon Kabiro's avatar
Pithon Kabiro committed
1047

1048
1049
1050
1051
1052
    // From Vorlauf metadata, extract `name` and `unitOfMeasurement`
    const {
      name: datastreamNameVorlauf,
      unitOfMeasurement: unitOfMeasurementVorlauf,
    } = metadataVorlauf;
Pithon Kabiro's avatar
Pithon Kabiro committed
1053

1054
1055
    // From Ruecklauf metadata, extract `name`
    const { name: datastreamNameRuecklauf } = metadataRuecklauf;
Pithon Kabiro's avatar
Pithon Kabiro committed
1056

1057
1058
1059
1060
1061
1062
1063
    // Extract the phenomenon names from the Datastream names
    const phenomenonNameVorlauf = extractPhenomenonNameFromDatastreamName(
      datastreamNameVorlauf
    );
    const phenomenonNameRuecklauf = extractPhenomenonNameFromDatastreamName(
      datastreamNameRuecklauf
    );
Pithon Kabiro's avatar
Pithon Kabiro committed
1064

1065
1066
1067
1068
1069
1070
1071
1072
    // Create our custom datastream description text
    // The resulting datastream description string has two `temperature` substrings;
    // replace the first occurence with an empty string
    const descriptionTempDifference =
      `Computed dT: ${phenomenonNameVorlauf} minus ${phenomenonNameRuecklauf}`.replace(
        "temperature",
        ""
      );
Pithon Kabiro's avatar
Pithon Kabiro committed
1073

1074
1075
    // Create our custom datastream name text
    const nameTempDifference = `BOSCH_${BUILDING_ID} / dT Temperature difference (VL-RL) DS:${SAMPLING_RATE}`;
Pithon Kabiro's avatar
Pithon Kabiro committed
1076

1077
1078
1079
1080
    // The datastream object that we return needs to have these property names
    const description = descriptionTempDifference;
    const name = nameTempDifference;
    const unitOfMeasurement = unitOfMeasurementVorlauf;
Pithon Kabiro's avatar
Pithon Kabiro committed
1081

1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
    return [
      vorlaufMinusRuecklaufTemp,
      {
        description,
        name,
        unitOfMeasurement,
      },
    ];
  } catch (err) {
    console.error(err);
  }
Pithon Kabiro's avatar
Pithon Kabiro committed
1093
1094
1095
1096
1097
1098
1099
1100
1101
};

/**
 * Test plotting of temp difference (dT) using heatmap
 */
const drawHeatmapHCUsingTempDifference = async function () {
  const [tempDifferenceObsArrBau225, tempDifferenceMetadataBau225] =
    await calculateVorlaufMinusRuecklaufTemperature("225", "60min");

1102
1103
  drawHeatMapHighcharts(
    formatSensorThingsApiResponseForHeatMap(tempDifferenceObsArrBau225),
Pithon Kabiro's avatar
Pithon Kabiro committed
1104
1105
1106
1107
    formatDatastreamMetadataForChart(tempDifferenceMetadataBau225)
  );
};

1108
1109
1110
/**
 * Test drawing of scatter plot chart
 */
1111
const drawScatterPlotHCTest2 = async function () {
1112
1113
  const sensorsOfInterestArr = [
    ["225", "vl", "60min"],
1114
1115
    // ["125", "rl", "60min"],
    ["weather_station_521", "outside_temp", "60min"],
1116
1117
1118
1119
1120
  ];

  const observationsPlusMetadata =
    await getMetadataPlusObservationsFromMultipleDatastreams(
      sensorsOfInterestArr
1121
1122
    );

1123
1124
1125
1126
1127
1128
  // Extract the observations and metadata for each sensor
  // Array elements in same order as input array
  const [
    [obsSensorOneArr, obsSensorTwoArr],
    [metadataSensorOne, metadataSensorTwo],
  ] = observationsPlusMetadata;
1129

1130
1131
1132
1133
1134
  drawScatterPlotHighcharts(
    formatSensorThingsApiResponseForScatterPlot(
      obsSensorOneArr,
      obsSensorTwoArr
    ),
1135
1136
    formatDatastreamMetadataForChart(metadataSensorOne),
    formatDatastreamMetadataForChart(metadataSensorTwo)
1137
  );
1138
1139
1140
};

(async () => {
Pithon Kabiro's avatar
Pithon Kabiro committed
1141
1142
  // await drawScatterPlotHCTest2();
  await drawHeatmapHCUsingTempDifference();
1143
})();
1144

1145
1146
1147
1148
export {
  BASE_URL,
  QUERY_PARAMS_COMBINED,
  getDatastreamIdFromBuildingNumber,
1149
1150
  createDatastreamUrl,
  createObservationsUrl,
1151
  createTemporalFilterString,
1152
  performGetRequestUsingAxios,
1153
  getMetadataFromSingleDatastream,
1154
  formatDatastreamMetadataForChart,
1155
1156
1157
1158
1159
  formatSensorThingsApiResponseForHeatMap,
  drawHeatMapHighcharts,
  formatSensorThingsApiResponseForLineChart,
  drawLineChartHighcharts,
  extractCombinedObservationsFromAllPages,
1160
  getMetadataPlusObservationsFromSingleDatastream,
1161
};
For faster browsing, not all history is shown. View entire blame