Zápisník experimentátora
Hierarchy: Node.js
V tomto článku si ukážeme, ako sa dajú stiahnuť online údaje o počasi. Využijeme na to server openweathermap.org. Programovať budeme v javascripte. Toto je prvý článok v sérii, ktorá zahŕňa Node.js, ESP8266 a Arduino MKR1000. V tomto článku si vysvetlíme všetky základné informácie a v ďalších článkoch sa budeme sústreďovať iba na programovanie.
Tento server poskytuje údaje o počasi. Môžete sa na serveri zaregistrovať a potom získate kľúč k API, pomocou ktorého si môžete zo servera stiahnuť údaje o počasi a využiť ich pre vlastné účely. Registrácia je bezplatná, pokiaľ sa uspokojíte so základnými funkciami API. Presný zoznam poskytovaných služieb nájdete na stránke openweathermap.org/price.
Pre našu ukážku budeme využívať funkciu API Current weather data
. Jej kompletný popis nájdete na stránke openweathermap.org/current. Budeme používať dve funkcie.
Server vráti údaje o počasi vo formáte JSON. Pomocou parametrov môžete nastaviť niektoré údaje. Môžete meniť napríklad zobrazenie teploty v stupňoch Kelvina, Celzia alebo vo Fahrenheitoch. Vrátené údaje vyzerajú 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 sa skladá z dvoch súborov. V prvom súbore sa nachádza hlavný program. V druhom súbore sa nachádza trieda OpenWeatherMap
, ktorá zabezpečuje komunikáciu so serverom. Pred použitím je potrebné nastaviť dve veci.
npm install
.index.js
alebo nastavením v systéme, ktoré sa prenesie do programu ako premenná process.env.APPID
. Napríklad pre Windows to nastavíte príkazom set APPID=xxx
.V tomto súbore sa nastavia parametre požiadavky v premennej cfg
a zavolá sa vhodná funkcia. Jedna funkcia vráti údaje o počasi podľa názvu mesta a druhá funkcia vráti údaje o počasi podla ID mesta.
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);
}
});
Trieda OpenWeatherMap
. Na získanie údajov využíva balíček request, pomocou ktorého sa ľahko zostavujú HTTP požiadavky. Formát požiadavky pre API vidíte priamo v zdrojovom kóde.
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 sa nachádza na serveri GitHub.
29.04.2018