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í.
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.
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 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.
npm install.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.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);
}
});
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 se nachází na serveru GitHub.
29.04.2018