filter variable by date

filter variable by date

Estou com dificuldade para filtrar as variáveis ​​de um determinado período, neste caso, quero saber seu valor acumulado mensalmente, mês a mês, e quando a análise for executada, aparece apenas os dados mais recentes inseridos. Aqui está a análise:


const { Analysis, Device, Utils } = require("@tago-io/sdk");

async function myAnalysis(context) {
  // Lê os tokens de dispositivo dos parâmetros de ambiente
  const env_vars = Utils.envToJson(context.environment);
  const deviceTokens = [
    env_vars.device_token_1,
    env_vars.device_token_2,
    // Adicione mais tokens conforme necessário
  ];

  // Loop através dos tokens de dispositivo
  for (const deviceToken of deviceTokens) {
    if (!deviceToken) {
      context.log("Token de dispositivo ausente nos parâmetros de ambiente");
      continue;
    }

    const device = new Device({ token: deviceToken });

    // Loop para cada mês do ano
    for (let month = 1; month <= 12; month++) {
      // Formata o mês para ter dois dígitos (por exemplo, "01" para janeiro)
      const formattedMonth = month < 10 ? `0${month}` : `${month}`;

      const year = new Date().getFullYear(); // Obtém o ano corrente

      // Filtro para obter todos os valores da variável "vazaopoco1" para o mês atual
      const vazaoFilter1 = {
        variable: "vazaopoco1",
        start_date: `${year}-${formattedMonth}-01T00:00:00Z`,
        end_date: `${year}-${formattedMonth}-31T23:59:59Z`,
      };

      // Filtro para obter todos os valores da variável "vazaopoco2" para o mês atual
      const vazaoFilter2 = {
        variable: "vazaopoco2",
        start_date: `${year}-${formattedMonth}-01T00:00:00Z`,
        end_date: `${year}-${formattedMonth}-31T23:59:59Z`,
      };

      try {
        // Obtém todos os valores da variável "vazaopoco1" para o dispositivo atual e o mês atual
        const dataVazao1 = await device.getData(vazaoFilter1);

        // Obtém todos os valores da variável "vazaopoco2" para o dispositivo atual e o mês atual
        const dataVazao2 = await device.getData(vazaoFilter2);

        // Calcula a soma de todos os valores da variável "vazaopoco1" para o mês atual
        const somaTotal1 = dataVazao1.reduce((total, data) => total + parseFloat(data.value), 0);

        // Calcula a soma de todos os valores da variável "vazaopoco2" para o mês atual
        const somaTotal2 = dataVazao2.reduce((total, data) => total + parseFloat(data.value), 0);

        // Define o nome da variável de consumo com base no mês atual para "vazaopoco1"
        const nomeVariavelConsumo1 = `vazaopoco1_${formattedMonth}`;

        // Define o nome da variável de consumo com base no mês atual para "vazaopoco2"
        const nomeVariavelConsumo2 = `vazaopoco2_${formattedMonth}`;

        // Cria objetos para enviar para as variáveis de consumo correspondentes ao mês atual
        const consumoValue1 = {
          variable: nomeVariavelConsumo1,
          value: somaTotal1,
        };

        const consumoValue2 = {
          variable: nomeVariavelConsumo2,
          value: somaTotal2,
        };

        // Envia os valores calculados para as variáveis de consumo correspondentes ao mês atual
        await device
          .sendData(consumoValue1)
          .then(() => context.log(`Somatório total da variável 'vazaopoco1' atribuído à '${nomeVariavelConsumo1}' para o dispositivo ${deviceToken}`))
          .catch((error) => context.log(`Erro ao enviar dados para '${nomeVariavelConsumo1}' no dispositivo ${deviceToken}: ${error}`));

        await device
          .sendData(consumoValue2)
          .then(() => context.log(`Somatório total da variável 'vazaopoco2' atribuído à '${nomeVariavelConsumo2}' para o dispositivo ${deviceToken}`))
          .catch((error) => context.log(`Erro ao enviar dados para '${nomeVariavelConsumo2}' no dispositivo ${deviceToken}: ${error}`));
      } catch (error) {
        context.log(`Erro ao obter ou enviar dados para o dispositivo ${deviceToken}: ${error}`);
      }
    }
  }
}

module.exports = new Analysis(myAnalysis);