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