Získání údajů o počasí pomocí Node.js

Zápisník experimentátora

Hierarchy: Node.js

V tomto článku si ukážeme, jak lze stáhnout online údaje o počasi. Využijeme na to server openweathermap.org. Programovat budeme v JavaScriptu. Toto je první článek v sérii, která zahrnuje Node.js, ESP8266 a Arduino MKR1000. V tomto článku si vysvětlíme všechny základní informace a v dalších článcích se budeme soustřeďovat pouze na programování.

openweathermap.org

Tento server poskytuje údaje o počasi. Můžete se na serveru zaregistrovat a pak získat klíč k API, pomocí kterého si můžete ze serveru stáhnout údaje o počasi a využít je pro vlastní účely. Registrace je bezplatná, pokud se spokojíte se základními funkcemi API. Přesný seznam poskytovaných služeb najdete na stránce openweathermap.org/price.

Pro naši ukázku budeme využívat funkci API Current weather data. Její kompletní popis naleznete na stránce openweathermap.org/current. Budeme používat dvě funkce.

  • By city name - Funkci zavoláte s parametrem vašeho města a získáte údaje o počasi.
  • By city ID - Funkci zavoláte s identifikátorem vašeho města a získáte údaje o počasi. Identifikátor získáte na stránce tak, že si dáte vyhledat vaše město a podíváte si parametr v URL. Například.

Server vrátí údaje o počasi ve formátu JSON. Pomocí parametrů můžete nastavit některé údaje. Můžete měnit například zobrazení teploty ve stupních Kelvina, Celsia nebo ve Fahrenheitech. Vrácené údaje vypadají takto.

{ coord: { lon: 19.15, lat: 48.74 },
  weather:
   [ { id: 801,
       main: 'Clouds',
       description: 'few clouds',
       icon: '02n' } ],
  base: 'stations',
  main:
   { temp: 19.43,
     pressure: 1011,
     humidity: 64,
     temp_min: 19,
     temp_max: 20 },
  visibility: 10000,
  wind: { speed: 0.5 },
  clouds: { all: 20 },
  dt: 1525030200,
  sys:
   { type: 1,
     id: 5909,
     message: 0.004,
     country: 'SK',
     sunrise: 1524972341,
     sunset: 1525024594 },
  id: 3061186,
  name: 'Banska Bystrica',
  cod: 200 }

Program pro Node.js

Program se skládá ze dvou souborů. V prvním souboru se nachází hlavní program. V druhém souboru se nachází třída OpenWeatherMap, která zajišťuje komunikaci se serverem. Před použitím je třeba nastavit dvě věci.

  • Nainstalovat balíčky pomocí příkazu npm install.
  • Nastavit si vlašnou klíč k API. To můžete udělat přímo úpravou zdrojového kódu v souboru index.js nebo nastavením systému, které se přenese do programu jako proměnná process.env.APPID. Například pro Windows to nastavíte příkazem set APPID=xxx.

index.js

V tomto souboru se nastaví parametry požadavky v proměnné cfg a zavolá se vhodná funkce. Jedna funkce vrátí údaje o počasi podle názvu města a druhá funkce vrátí údaje o počasí podle ID města.

const OpenWeatherMap = require('./openweathermap.js');

var cfg = {
        APPID: process.env.APPID || 'YOUR_APPID',
        units: "metric"
    };

var api = new OpenWeatherMap(cfg);

///
/// Current weather by city ID (Banska Bystrica)
///
/*api.getCurrentWeatherByCityID('3061186', (err, currentWeather) => {
    if(err) {
        console.log(err.message);
    }
    else {
        console.log(currentWeather);
    }
});*/

///
/// Current weather by city name (Banska Bystrica)
///
api.getCurrentWeatherByCityName('Banska Bystrica', (err, currentWeather) => {
    if(err) {
        console.log(err.message);
    }
    else {
        console.log(currentWeather);
    }
});

openweathermap.js

Třída OpenWeatherMap. Pro získání údajů využívá balíček request, pomocí kterého se snadno sestavují HTTP požadavky. Formát požadavky pro API vidíte přímo ve zdrojovém kódu.

const request = require("request");

module.exports = class OpenWeatherMap {

    constructor(config) {
        this.config = config;
    }

    getCurrentWeatherByCityName(cityName, callback) {
        var self = this;
        request.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&units=${this.config.units}&APPID=${this.config.APPID}`,
            (err, data) => {
            self.parseResponse(err, data, callback);
        })
    };

    getCurrentWeatherByCityID(cityId, callback) {
        var self = this;
        request.get(`https://api.openweathermap.org/data/2.5/weather?id=${cityId}&units=${this.config.units}&APPID=${this.config.APPID}`,
            (err, data) => {
            self.parseResponse(err, data, callback);
        })
    };

    parseResponse(err, data, callback){
        var error = null;
        var response = null;
    
        error = err;
        if(data) {
            if(data.statusCode != 200) {
                var e = JSON.parse(data.body)
                error = new Error(e.message);
                error.status = e.cod;
            }
            if(data.body) {
                response = JSON.parse(data.body);
            }
        }
    
        callback(error, response);
    }

} 

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


29.04.2018


Menu