Compartilhar via


Como escrever uma extensão meteorológica

Nesta seção, você verá um guia passo a passo para escrever sua própria extensão meteorológica.

O que é uma extensão meteorológica

A extensão meteorológica no Gerenciador de Dados para Agricultura é um arquivo JSON (manifesto) que fornece os detalhes completos sobre as APIs e um modelo para cada resposta de APIs (saída). Portanto, o arquivo de extensão é essencialmente uma estrutura de modelo de API, conforme definido pelo Gerenciador de Dados para Agricultura, para que ele entenda as características de entrada (solicitação) e saída (resposta) da API.

Estrutura da extensão meteorológica

Em um alto nível, o arquivo de extensão é um JSON que consiste em dois elementos:

  • Metadados do provedor (objeto JSON)
  • Informações da API (Matriz JSON)

Metadados do provedor

É um objeto JSON que fornece os detalhes sobre os campos abaixo que são necessários para identificar exclusivamente uma extensão e suas informações de controle de versão. Os detalhes fornecidos nesta seção da extensão são mostrados a clientes externos no marketplace do Gerenciador de Dados para Agricultura. Portanto, extensionId e extensionName (para facilitar a identificação) e description (para a proposta de valor) devem estar focados no cliente.

Metadados do provedor de exemplo

"provider": {
    "extensionId": "abc.weather", 
    "extensionName": "ABC weather",
    "description": "Get Weather data from ABC weather into Azure Data Manager for Agriculture platform using this extension",
    "dataCategory": "Weather",
    "farmBeatsSchemaVersion": "1.0",
    "extensionVersion": "1.0",
    "supportUrl": "www.abc.com/support",
    "supportEmail": "support@abc.com"
  }
Detalhes dos metadados do provedor
Nome Tipo Descrição
extensionId string A ID fornecida com o nome da organização (Contoso) e do serviço (meteorologia), exemplo: org.service. extensionId é o identificador exclusivo da extensão e aquele que os usuários estão usando na plataforma Gerenciador de Dados para Agricultura para interagir com as APIs de extensão
extensionName string Nome da extensão a ser usada no marketplace da extensão do Gerenciador de Dados para Agricultura.
descrição string Descrição informando os recursos e serviços oferecidos pela extensão.
dataCategory string Para extensões meteorológicas, use weather.
farmBeatsSchemaVersion string A versão do arquivo de manifesto no lado do Gerenciador de Dados para Agricultura. Todas as atualizações do arquivo de manifesto existente levam a uma nova atualização de versão para esse campo.
extensionVersion string A versão do arquivo de extensão. Começando com 1.0. As atualizações do arquivo de extensão incrementam esse número de versão de acordo com a convenção de atualizações principais e secundárias.
URL de suporte string Link do site para gerar consultas de suporte e perguntas frequentes
supportEmail string Email para enviar as consultas de suporte.

Informações da API

A matriz JSON de Informações da API (apiInfos) pode ser mais dividida nos seguintes elementos estruturais.

  • Metadados da API
  • Parâmetros de autenticação
  • Parâmetros de entrada de API
  • Parâmetros extraídos de entrada de API
  • Parâmetros funcionais
  • Sistema de unidades
  • Parâmetros personalizados e Plataforma
  • Modelo personalizado e Plataforma

Metadados da API

Esta seção consiste em informações básicas sobre a API usada pelo Gerenciador de Dados para Agricultura para identificar o apiName (chamado explicitamente pelos usuários) e redirecionar a solicitação de API para o endpoint correto com base no requestType apropriado.

Metadados da API de exemplo
"apiInfos": [
    {
          "apiName": "dailyforecast",
          "description": "The Daily Forecast API",
          "endpoint": "https://ag.us.clearapis.com/v1.1/forecast/daily",
          "requestType": "GET",
          "isLoadAPI": "false",
          "typeOfData": "forecast",
          "granularity": "daily",
          "defaultUnitSystem": "us"
    }
]
Detalhes dos metadados da API
Nome Tipo Descrição
apiInfos matriz A matriz JSON de objetos, em que cada API é um objeto dentro da matriz apiInfos.
apiName string O Nome da API, conforme suportado pela extensão, é o nome exato usado o qual os usuários estariam chamando as APIs de extensão. Siga a mesma convenção de nomenclatura mencionada na documentação da sua API.
descrição string Descrição da API
endpoint string Ponto de extremidade da API do Gerenciador de Dados para Agricultura para chamar o apiName.
requestType string O tipo de solicitação GET, POST ou PUT, conforme suportado pelo apiName.
isLoadAPI boolean Se o apiName for uma API de passagem, como os dados meteorológicos atuais, defina essa chave como false. Para todas as APIs de carga (histórico e previsão), mantenha esse campo como true. Quando a chave isLoadAPI é false, a resposta da API seria enviada diretamente ao usuário e não seria armazenada no serviço de armazenamento do Gerenciador de Dados para Agricultura.
typeOfData string Os valores compatíveis atualmente são Historical e Forecast.
granularidade string Os valores compatíveis atualmente são Daily e Hourly.
defaultUnitSystem string Forneça o nome do sistema de unidades padrão compatível com o apiName.

Parâmetros de autenticação

Esta seção usa os parâmetros relacionados à autenticação, conforme suportado pelo apiName. Como o Gerenciador de Dados para Agricultura dá suporte a dois tipos de chaves relacionadas à autenticação (x-ms-farmBeats-data-provider-id e x-ms-farmBeats-data-provider-key) na seção de cabeçalho da API, o arquivo de extensão precisa fornecer explicitamente o nome da chave de suas respectivas chaves de autenticação, conforme exigido pelo apiName.

Como o Gerenciador de Dados para Agricultura coleta as informações de autenticação por meio do cabeçalho da API (em Criar a API de Trabalho Meteorológico). O mapeamento de parâmetros de autenticação é feito para garantir que o Gerenciador de Dados para Agricultura possa passar a chave de acordo com a extensão, conforme necessário.

Parâmetros de autenticação de exemplo
"apiInfos": [
    "authInputParameters": [
        {
          "farmBeatsAuthMapping": "x-ms-farmBeats-data-provider-id",
          "name": "app_id",
          "isRequired": "true",
          "providerDataType": "string",
          "description": "Provide the APP ID, username etc. that your API supports",
          "location": "apiQuery"
        },
        {
          "farmBeatsAuthMapping": "x-ms-farmBeats-data-provider-key",
          "name": "app_key",
          "isRequired": "true",
          "providerDataType": "string",
          "description": "Provide the API Key or password etc. that your API supports",
          "location": "apiQuery"
        }
      ]
]
Detalhes de parâmetros de autenticação
Nome Tipo Descrição
authInputParameters matriz Matriz JSON de parâmetros de autenticação, em que cada objeto significa um tipo de autenticação com suporte. Use a chave com base no tipo de autenticação compatível com sua extensão.
farmBeatsAuthMapping string Atualmente, há suporte para dois tipos de chaves relacionadas à autenticação. Para autenticação baseada em chave de API, use apenas o objeto x-ms-farmBeats-data-provider-key, enquanto para autenticação baseada em ID de Aplicativo e Chave de Aplicativo, use objetos os x-ms-farmBeats-data-provider-id e x-ms-farmBeats-data-provider-key.
name string Nome da chave de autenticação com suporte do apiName.
IsRequired boolean Esse nome é um parâmetro necessário para o apiName? Forneça valores true ou false.
providerDataType string Forneça o tipo de dados do parâmetro name.
descrição string Descrição do Gerenciador de Dados para Agricultura do que cada farmBeatsAuthMapping significa em cada objeto.
local string O local, na API, para o qual o parâmetro name deve ser enviado. No momento, os valores com suporte são apiQuery e apiHeader.

Parâmetros de entrada de API

Esta seção fornece os detalhes sobre a assinatura da API (parâmetros de entrada) para chamar com sucesso o apiName.

Parâmetros de entrada de API de exemplo
"apiInfos": [
    "apiInputParameters": [
        {
          "name": "start",
          "isRequired": "true",
          "providerDataType": "double",
          "description": "Start of time range. Valid start values range from zero to nine. Day zero represents the current day.",
          "location": "apiQuery"
        },
        {
          "name": "end",
          "isRequired": "true",
          "providerDataType": "double",
          "description": "End of time range. Valid end values range from zero to nine.",
          "location": "apiQuery"
        },
        {
          "name": "location",
          "isRequired": "true",
          "providerDataType": "string",
          "description": "User-provided latitude and longitude coordinates. Formatted as location=[(<lat_1>,<lon_1>)].",
          "location": "apiQuery"
        },
        {
          "name": "unitcode",
          "isRequired": "false",
          "providerDataType": "string",
          "description": "Unit conversion set to be used. Default is us-std. Valid values are us-std, si-std.",
          "location": "apiQuery"
        },
      ]
]
Detalhes dos parâmetros de entrada de API
Nome Tipo Descrição
apiInputParameters matriz Matriz JSON de parâmetros de entrada de API, em que cada objeto significa um parâmetro de entrada compatível com o apiName.
name string Nome do parâmetro de entrada, conforme suportado pelo apiName.
IsRequired boolean Esse nome é um parâmetro necessário para o apiName? Forneça valores true ou false.
providerDataType string Forneça o tipo de dados do parâmetro name.
descrição string Forneça uma descrição do que o parâmetro name significa.
local string O local, na API, para o qual o parâmetro name deve ser enviado. No momento, os valores com suporte são apiQuery e apiHeader.

Parâmetros extraídos de entrada de API

Esta seção serve para o Gerenciador de Dados extrair parâmetros de entrada passados na solicitação de API para computação e armazenamento. Neste exemplo, o Gerenciador de Dados para Agricultura extrairia as informações de localização (latitude e longitude) da solicitação de Entrada da API e as armazenaria como parte de cada saída meteorológica no Gerenciador de Dados para Agricultura.

Portanto, a extensão precisa fornecer um Modelo HandleBars sobre como extrair informações de localização. O exemplo abaixo sugere que a API da extensão coleta informações de localização como "lat" para "latitude" e "lon" para "longitude".

Parâmetros extraídos de entrada de API de exemplo
"extractedApiInputParameters": [
        {
          "name": "location",
          "template": "{ \"latitude\": \"{{lat}}\", \"longitude\": \"{{lon}}\"  } "
        }
      ]
Detalhes de parâmetros extraídos de entrada de API
Nome Tipo Descrição
extractedApiInputParameters matriz Matriz JSON de funcionalidades de extração, em que cada objeto significa quais informações precisam ser extraídas. Atualmente, location é uma dessas extrações.
name string Nome da extração, atualmente o valor com suporte é location.
template string O modelo HandleBars mostra como as informações de latitude e longitude são coletadas nos parâmetros de entrada da API.

Parâmetros funcionais

Esta seção é dedicada às funcionalidades criadas pelo Gerenciador de Dados para Agricultura. Para a extensão meteorológica, o cálculo de centroide é uma dessas funcionalidades.

Quando os usuários não fornecem as coordenadas de latitude/longitude, o Gerenciador de Dados para Agricultura usa a geometria principal do campo (ID passada pelo usuário) para calcular o centroide. As coordenadas centroides computadas são passadas como latitude e longitude para a extensão (provedor de dados). Portanto, para o Gerenciador de Dados para Agricultura conseguir entender o uso de coordenadas de localização, a seção de parâmetros funcionais é usada.

Para o Gerenciador de Dados para Agricultura entender o uso de latitude e longitude nos parâmetros de entrada apiName, espera-se que a extensão forneça o name da chave usada para coletar informações de localização seguidas por um modelo handlebar para inferir como os valores de latitude e longitude precisam ser passados.

Parâmetros funcionais de exemplo
"apiInfos": [
    "functionalParameters": [
        {
          "name": "CentroidCalculation",
          "description": "Provide names of the parameters used to collect latitude and longitude information",
          "functionalParameterEntities": [
            {
              "name": "lat",
              "template": "{ \"lat\": \"{{latitude}}\" } "
            },
            {
              "name": "lon",
              "template": "{ \"lon\": \"{{longitude}}\" } "
            }
          ]
        }
      ],
]
Detalhes de parâmetros funcionais
Nome Tipo Descrição
functionalParameters matriz Matriz JSON de funcionalidades, em que cada objeto significa uma funcionalidade com suporte do Gerenciador de Dados para Agricultura. Atualmente, CentroidCalculation é uma dessas funcionalidades.
name string Nome da funcionalidade, atualmente o valor com suporte é CentroidCalculation.
descrição string Descrição da funcionalidade do Gerenciador de Dados para Agricultura.
functionalParameterEntities matriz Matriz JSON de objetos, em que cada objeto é específico para a latitude e longitude.

Sistema de unidades

Esta seção é usada pelo Gerenciador de Dados para Agricultura para entender os vários tipos de sistemas de unidade compatíveis com a extensão. Portanto, a extensão precisa fornecer o nome de key usado para coletar informações de unidades nas entradas da API e seguido pelos vários nomes do sistema de unidades (Ex.: us-std), conforme suportado pelo apiName.

Sistema de unidades de exemplo
"unitSystems": 
    {
        "key": "unitcode",
        "values": [
            "us-std",
            "si-std",
            "us-std-precise",
            "si-std-precise"
            ]
    }
Detalhes do sistema de unidades
Nome Tipo Descrição
unitSystems objeto Objeto JSON para coletar as informações do sistema de unidade.
chave string Nome do parâmetro usado para coletar as informações de unidades na entrada da API.
valores string Lista de nomes de sistema de unidades com suporte da extensão.

Parâmetros personalizados e plataforma

Em cada resposta da API meteorológica, as medidas meteorológicas, que são enviadas como parte da saída (por exemplo: temperatura, ponto de orvalho etc.) são chamadas como parâmetros.

Portanto, quando se trata de parâmetros, o Gerenciador de Dados para Agricultura dá suporte interno ao seguinte conjunto de parâmetros e os trata como Platform parameters.

  • cloudCover
  • dateTime
  • dewPoint
  • growingDegreeDay
  • precipitation
  • pressão
  • relativeHumidity
  • soilMoisture
  • soilTemperature
  • temperatura
  • visibility
  • wetBulbTemperature
  • Windchill
  • windDirection
  • windGust
  • windSpeed

Portanto, qualquer extensão que envia parâmetros meteorológicos, que não se enquadram nos parâmetros da plataforma, está enviando-os como parte de Custom parameters. A principal diferença entre os parâmetros de plataforma e cliente é que os usuários que usam APIs meteorológicas do Gerenciador de Dados para Agricultura podem consultar e filtrar os parâmetros da plataforma (Ex.: temperatura > 30) e não em parâmetros personalizados. No entanto, os parâmetros personalizados são enviados como parte da saída da consulta meteorológica.

Nesta seção, a extensão fornece as informações de unidades para cada um dos parâmetros para cada sistema de unidades com suporte. Ao usar isso, o Gerenciador de Dados para Agricultura sabe qual é a unidade de medição subjacente para cada parâmetro meteorológico com base nas informações fornecidas nesta seção da extensão.

Observação

  • Para um parâmetro específico, se as unidades não forem aplicáveis, não mencione as unidades somente para elas (Ex: weatherDescriptor)
  • Para um parâmetro específico, se as unidades forem iguais para todo o sistema de unidades, mencione o mesmo em todo o sistema de unidades. (Ex.: cloudCover)
Parâmetros personalizados e plataforma de exemplo
"apiInfos": [
     "platformParameters": [
        {
          "farmBeatsName": "cloudCover",
          "farmBeatsDataType": "double",
          "description": "The average percentage of sky covered by clouds.",
          "measurementUnits": [
            {
              "unitSystem": "us-std",
              "unit": "%"
            },
            {
              "unitSystem": "us-std-precise",
              "unit": "%"
            },
            {
              "unitSystem": "si-std",
              "unit": "%"
            },
            {
              "unitSystem": "si-std-precise",
              "unit": "%"
            }
          ]
        },
        {
          "farmBeatsName": "dewPoint",
          "farmBeatsDataType": "double",
          "description": "The air temperature at which the air will become saturated, and dew moisture will condense into fog (or dew).",
          "measurementUnits": [
            {
              "unitSystem": "us-std",
              "unit": "F"
            },
            {
              "unitSystem": "us-std-precise",
              "unit": "F"
            },
            {
              "unitSystem": "si-std",
              "unit": "C"
            },
            {
              "unitSystem": "si-std-precise",
              "unit": "C"
            }
          ]
        },
    "customParameters": [
        {
          "providerName": "weatherDescriptor",
          "providerDataType": "string",
          "description": "General weather descriptor data"
        },
        {
          "providerName": "airTempMax",
          "providerDataType": "double",
          "description": "Maximum daily air temperature at two meters above ground level.",
          "measurementUnits": [
            {
              "unitSystem": "us-std",
              "unit": "F"
            },
            {
              "unitSystem": "us-std-precise",
              "unit": "F"
            },
            {
              "unitSystem": "si-std",
              "unit": "C"
            },
            {
              "unitSystem": "si-std-precise",
              "unit": "C"
            }
          ]
        },
]
Detalhes dos parâmetros de plataforma
Nome Tipo Descrição
platformParameters matriz Matriz JSON de parâmetros de plataforma em que cada objeto é um parâmetro de plataforma.
farmBeatsName string Nome do parâmetro, conforme fornecido pelo Gerenciador de Dados para Agricultura.
farmBeatsDataType string Tipo de dados do parâmetro, conforme fornecido pelo Gerenciador de Dados para Agricultura.
descrição string Descrição do parâmetro, conforme fornecido pelo Gerenciador de Dados para Agricultura.
measurementUnits string Matriz JSON de unidades para cada sistema de unidade values com suporte pela extensão.
unitSystem string O sistema de unidade value conforme suportado pela extensão.
unidade string Unidade de medida para o parâmetro meteorológico específico. Ex.: F para dewPoint.
Detalhes de parâmetros personalizados
Nome Tipo Descrição
customParameters objeto Matriz JSON de parâmetros personalizados em que cada objeto é um parâmetro personalizado.
providerName string Nome do parâmetro, conforme fornecido pela extensão.
providerDataType string Tipo de dados do parâmetro, conforme fornecido pela extensão.
descrição string Descrição do parâmetro, conforme fornecido pela extensão.
measurementUnits string Matriz JSON de unidades para cada sistema de unidade values com suporte pela extensão.
unitSystem string O sistema de unidade value conforme suportado pela extensão.
unidade string Unidade de medida para o parâmetro meteorológico específico. Ex.: F para airTempMax.

Modelo personalizado e plataforma

Modelo são as informações de mapeamento fornecidas pela extensão para converter a saída da API da extensão (resposta JSON) no formato que o Gerenciador de Dados para Agricultura espera. O uso desse formato de saída de API diferente agora pode ser mapeado/convertido uniformemente em um único formato.

A solução de modelo é encontrada como uma das maneiras mais eficazes de analisar a saída JSON fornecida pela extensão. No caso da extensão meteorológica, o Gerenciador de Dados para Agricultura espera que a extensão seja escrita usando o modelo HandleBars. HandleBars é uma linguagem de modelagem de software livre com expressões simples de usar.

Observação

É altamente recomendável experimentar o modelo HandleBars com os exemplos fornecidos e aprender a usar as funções auxiliares para criar sua própria lógica de análise se ela ainda não for fornecida pelo Gerenciador de Dados para Agricultura.

Em um alto nível, é assim que os modelos funcionam, tomando a resposta da API como entrada e gerando a saída no formato esperado pelo Gerenciador de Dados para Agricultura.

Captura de tela do fluxo de modelo.

Conforme mostrado na figura acima, valide seu modelo em relação à respectiva resposta da API e use o modelo validado na extensão. Veja abaixo um exemplo de uma resposta da API e sua respectiva plataforma e modelo personalizado.

Resposta da API de exemplo
{
    "47,-97": {
        "2016-12-15": {
            "overall": {
                "air_temp_avg": {
                    "unit": "F",
                    "value": -3.0
                },
                "air_temp_max": {
                    "unit": "F",
                    "value": 5.0
                },
                "air_temp_min": {
                    "unit": "F",
                    "value": -11.0
                },
                "cloud_cover_avg": {
                    "unit": "%",
                    "value": 26.4
                },
                "descriptors": {
                    "cloud_cover_descriptor": {
                        "code": 21107,
                        "icon": "https://.../cover_partlycloudyday.png",
                        "text": "Increasing Clouds"
                    },
                    "precipitation_descriptor": {
                        "code": 61113,
                        "icon": "https://.../precip_flurries.png",
                        "text": "Slight Chance of Flurries"
                    },
                    "weather_descriptor": {
                        "code": 61113,
                        "icon": "https://.../precip_flurries.png",
                        "text": "Slight Chance of Flurries"
                    },
                    "wind_direction_descriptor": {
                        "code": 51600,
                        "icon": "https://.../direction_sw.png",
                        "text": "Southwest"
                    },
                    "wind_trend_descriptor": {
                        "code": 10500,
                        "icon": "https://.../error_none.png",
                        "text": "None"
                    }
                },
                "dew_point_avg": {
                    "unit": "F",
                    "value": -11.0
                },
                "dew_point_max": {
                    "unit": "F",
                    "value": -4.0
                },
                "dew_point_min": {
                    "unit": "F",
                    "value": -19.0
                },
                "ice_acc_period": {
                    "unit": "in",
                    "value": 0.0
                },
                "liquid_acc_period": {
                    "unit": "in",
                    "value": 0.0
                },
                "long_wave_radiation_avg": {
                    "unit": "W/m^2",
                    "value": 170.0
                },
                "pet_period": {
                    "unit": "in",
                    "value": 0.009
                },
                "precip_acc_period": {
                    "unit": "in",
                    "value": 0.001
                },
                "precip_prob": {
                    "unit": "%",
                    "value": 10.0
                },
                "relative_humidity_avg": {
                    "unit": "%",
                    "value": 68.0
                },
                "relative_humidity_max": {
                    "unit": "%",
                    "value": 77.0
                },
                "relative_humidity_min": {
                    "unit": "%",
                    "value": 61.0
                },
                "short_wave_radiation_avg": {
                    "unit": "W/m^2",
                    "value": 70.0
                },
                "snow_acc_period": {
                    "unit": "in",
                    "value": 0.02
                },
                "sunshine_duration": {
                    "unit": "hours",
                    "value": 6
                },
                "wind_gust_max": {
                    "unit": "n/a",
                    "value": "n/a"
                },
                "wind_speed_2m_avg": {
                    "unit": "mph",
                    "value": 6.0
                },
                "wind_speed_2m_max": {
                    "unit": "mph",
                    "value": 8.0
                },
                "wind_speed_2m_min": {
                    "unit": "mph",
                    "value": 2.0
                },
                "wind_speed_avg": {
                    "unit": "mph",
                    "value": 8.0
                },
                "wind_speed_max": {
                    "unit": "mph",
                    "value": 11.0
                },
                "wind_speed_min": {
                    "unit": "mph",
                    "value": 3.0
                }
            }
        }
    }
}
Modelo personalizado e plataforma de exemplo para a resposta da API acima
{
"apiInfos": {
    "platformTemplate": "{ {{#each .}}\"value\": [{{#each .}} {\"cloudCover\": \"{{overall.cloud_cover_avg.value}}\" ,\"dewPoint\": \"{{overall.dew_point_avg.value}}\" ,\"precipitation\": \"{{overall.precip_acc_period.value}}\" ,\"relativeHumidity\": \"{{overall.relative_humidity_avg.value}}\" ,\"dateTime\": \"{{convertDateInYYYYMMDDToDateTime @key}}\",      \"temperature\": \"{{overall.air_temp_avg.value}}\" ,\"windSpeed\": \"{{overall.wind_speed_avg.value}}\" ,   },{{/each}}]{{/each}} }",
    "customTemplate": "{ {{#each .}}\"value\": [{{#each .}} {\"air_temp_max\": \"{{overall.air_temp_max.value}}\",\"air_temp_min\": \"{{overall.air_temp_min.value}}\",\"cloudCoverDescriptor\": \"{{overall.descriptors.cloud_cover_descriptor.text}}\",\"precipitationDescriptor\": \"{{overall.descriptors.precipitation_descriptor.text}}\",\"weatherDescriptor\": \"{{overall.descriptors.weather_descriptor.text}}\",\"windDirectionDescriptor\": \"{{overall.descriptors.wind_direction_descriptor.text}}\",\"windTrendDescriptor\": \"{{overall.descriptors.wind_trend_descriptor.text}}\",\"dewPointMax\": \"{{overall.dew_point_max.value}}\",\"dewPointMin\": \"{{overall.dew_point_min.value}}\",\"iceAccPeriod\": \"{{overall.ice_acc_period.value}}\",\"liquidAccPeriod\": \"{{overall.liquid_acc_period.value}}\",\"longWaveRadiationAvg\": \"{{overall.long_wave_radiation_avg.value}}\",\"petPeriod\": \"{{overall.pet_period.value}}\",\"precipProb\": \"{{overall.precip_prob.value}}\",\"relativeHumidityMax\": \"{{overall.relative_humidity_max.value}}\",\"relativeHumidityMin\": \"{{overall.relative_humidity_min.value}}\",\"shortWaveRadiationAvg\": \"{{overall.short_wave_radiation_avg.value}}\",\"snowAccPeriod\": \"{{overall.snow_acc_period.value}}\",\"sunshineDuration\": \"{{overall.sunshine_duration.value}}\",\"windSpeed2mAvg\": \"{{overall.wind_speed_2m_avg.value}}\",\"windSpeed2mMax\": \"{{overall.wind_speed_2m_max.value}}\",\"windSpeed2mMin\": \"{{overall.wind_speed_2m_min.value}}\",\"windSpeedMax\": \"{{overall.wind_speed_max.value}}\",\"windSpeedMin\": \"{{overall.wind_speed_min.value}}\",},{{/each}}]{{/each}} }"
}
}

Observação

O modelo gerado a partir do HandleBars é colocado em cadeia de caracteres adicionando \"<text>\" para torná-lo compatível com o formato JSON.

Funções auxiliares

As funções auxiliares são usadas pelos modelos para executar uma transformação específica nos dados, que não tem suporte nativo. Aqui estão as funções auxiliares com suporte do Gerenciador de Dados para Agricultura.

Funções auxiliares de exemplo
Handlebars.registerHelper('splitAndTake', function(title, char, index) {
  var t = title.split(char);
  return t[index];
});
Handlebars.registerHelper('converttime', function(timestamp) {
    return new Date(timestamp);
});
Handlebars.registerHelper('convertunixtime', function(unix_timestamp) {
    return new Date(unix_timestamp * 1000);
});

Que ação essas funções auxiliares executam?

  • SplitAndTake(object valueObject, string separator, int index): essa função é usada para dividir uma cadeia de caracteres (Ex.: "47,-97") com base em um separador (Ex.: ",") e usa o elemento em determinado índice (Ex.: index=0 gives "47")
  • ConvertDateInFormatToDateTime(object dateObject, string format): essa função é usada para analisar uma data em determinado formato (Ex.: 2016-12-15) para a cadeia de caracteres DateTime.
  • ConvertUnixTimeToDateTime(object unixTimeStamp): essa função é usada para converter o carimbo de data/hora unix (Ex.: 1392267600) em cadeia de caracteres datetime.
  • GetObjectFromListWithKeyValuePair(Array listOfObjects, string key, string value): dada uma lista de objetos, ele busca o objeto com base no par de chave (type) e valor (RAIN). No exemplo abaixo, para escolher a precipitação de "type": "RAIN", essa função é usada.
{
"precipitation": [
      {
        "type": "SNOW",
        "amount": 0
      },
      {
        "type": "RAIN",
        "amount": 0.01
      }
    ]
}
  • GetValueFromObject(string jsonString, string key): dado um objeto json como cadeia de caracteres, ele obtém o valor com base na chave.

Observação

Se a extensão que você está escrevendo exigir funções auxiliares adicionais para analisar a resposta da API, entre em contato conosco criando um tíquete de suporte.