Refactor to dedupe and add version
This commit is contained in:
@@ -37,7 +37,7 @@ exports.captureWUStream = function( req, res ) {
|
|||||||
res.send( "success\n" );
|
res.send( "success\n" );
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.hasLocalWeather = function() {
|
exports.useLocalWeather = function() {
|
||||||
return ( server.pws !== "false" ? true : false );
|
return ( server.pws !== "false" ? true : false );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -17,40 +17,25 @@ var http = require( "http" ),
|
|||||||
// location using Weather Underground autocomplete API
|
// location using Weather Underground autocomplete API
|
||||||
function resolveCoordinates( location, callback ) {
|
function resolveCoordinates( location, callback ) {
|
||||||
|
|
||||||
|
if ( filters.pws.test( location ) ) {
|
||||||
|
callback( false );
|
||||||
|
} else if ( filters.gps.test( location ) ) {
|
||||||
|
location = location.split( "," );
|
||||||
|
location = [ parseFloat( location[ 0 ] ), parseFloat( location[ 1 ] ) ];
|
||||||
|
callback( location );
|
||||||
|
} else {
|
||||||
// Generate URL for autocomplete request
|
// Generate URL for autocomplete request
|
||||||
var url = "http://autocomplete.wunderground.com/aq?h=0&query=" +
|
var url = "http://autocomplete.wunderground.com/aq?h=0&query=" +
|
||||||
encodeURIComponent( location );
|
encodeURIComponent( location );
|
||||||
|
|
||||||
httpRequest( url, function( data ) {
|
httpJSONRequest( url, function( data ) {
|
||||||
|
if ( typeof data.RESULTS === "object" && data.RESULTS.length ) {
|
||||||
// Parse the reply for JSON data
|
callback( [ data.RESULTS[ 0 ].lat, data.RESULTS[ 0 ].lon ] );
|
||||||
data = JSON.parse( data );
|
|
||||||
|
|
||||||
// Check if the data is valid
|
|
||||||
if ( typeof data.RESULTS === "object" && data.RESULTS.length && data.RESULTS[ 0 ].tz !== "MISSING" ) {
|
|
||||||
|
|
||||||
// If it is, reply with an array containing the GPS coordinates
|
|
||||||
callback( [ data.RESULTS[ 0 ].lat, data.RESULTS[ 0 ].lon ], moment().tz( data.RESULTS[ 0 ].tz ).utcOffset() );
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Otherwise, indicate no data was found
|
|
||||||
callback( false );
|
callback( false );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
}
|
|
||||||
|
|
||||||
function getData( url, callback ) {
|
|
||||||
|
|
||||||
httpRequest( url, function( data ) {
|
|
||||||
try {
|
|
||||||
data = JSON.parse( data );
|
|
||||||
} catch (err) {
|
|
||||||
callback( {} );
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
callback( data );
|
|
||||||
return;
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve data from Open Weather Map for water level calculations
|
// Retrieve data from Open Weather Map for water level calculations
|
||||||
@@ -61,7 +46,7 @@ function getOWMWateringData( location, callback ) {
|
|||||||
getTimeData( location, function( weather ) {
|
getTimeData( location, function( weather ) {
|
||||||
|
|
||||||
// Perform the HTTP request to retrieve the weather data
|
// Perform the HTTP request to retrieve the weather data
|
||||||
getData( forecastUrl, function( forecast ) {
|
httpJSONRequest( forecastUrl, function( forecast ) {
|
||||||
|
|
||||||
if ( !forecast || !forecast.list ) {
|
if ( !forecast || !forecast.list ) {
|
||||||
callback( weather );
|
callback( weather );
|
||||||
@@ -97,9 +82,9 @@ function getOWMWeatherData( location, callback ) {
|
|||||||
|
|
||||||
getTimeData( location, function( weather ) {
|
getTimeData( location, function( weather ) {
|
||||||
|
|
||||||
getData( currentUrl, function( current ) {
|
httpJSONRequest( currentUrl, function( current ) {
|
||||||
|
|
||||||
getData( forecastDailyUrl, function( forecast ) {
|
httpJSONRequest( forecastDailyUrl, function( forecast ) {
|
||||||
|
|
||||||
if ( !current || !current.main || !current.wind || !current.weather || !forecast || !forecast.list ) {
|
if ( !current || !current.main || !current.wind || !current.weather || !forecast || !forecast.list ) {
|
||||||
callback( weather );
|
callback( weather );
|
||||||
@@ -234,18 +219,6 @@ function checkWeatherRestriction( adjustmentValue, weather ) {
|
|||||||
exports.getWeatherData = function( req, res ) {
|
exports.getWeatherData = function( req, res ) {
|
||||||
var location = req.query.loc;
|
var location = req.query.loc;
|
||||||
|
|
||||||
if ( filters.gps.test( location ) ) {
|
|
||||||
|
|
||||||
// Handle GPS coordinates by storing each coordinate in an array
|
|
||||||
location = location.split( "," );
|
|
||||||
location = [ parseFloat( location[ 0 ] ), parseFloat( location[ 1 ] ) ];
|
|
||||||
|
|
||||||
// Continue with the weather request
|
|
||||||
getOWMWeatherData( location, function( data ) {
|
|
||||||
data.location = location;
|
|
||||||
res.json( data );
|
|
||||||
} );
|
|
||||||
} else {
|
|
||||||
// Attempt to resolve provided location to GPS coordinates when it does not match
|
// Attempt to resolve provided location to GPS coordinates when it does not match
|
||||||
// a GPS coordinate or Weather Underground location using Weather Underground autocomplete
|
// a GPS coordinate or Weather Underground location using Weather Underground autocomplete
|
||||||
resolveCoordinates( location, function( result ) {
|
resolveCoordinates( location, function( result ) {
|
||||||
@@ -260,7 +233,6 @@ exports.getWeatherData = function( req, res ) {
|
|||||||
res.json( data );
|
res.json( data );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// API Handler when using the weatherX.py where X represents the
|
// API Handler when using the weatherX.py where X represents the
|
||||||
@@ -328,7 +300,9 @@ exports.getWateringData = function( req, res ) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if ( local.useLocalWeather() ) {
|
||||||
console.log( "OpenSprinkler Weather Response: %s", JSON.stringify( data ) );
|
console.log( "OpenSprinkler Weather Response: %s", JSON.stringify( data ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Return the response to the client in the requested format
|
// Return the response to the client in the requested format
|
||||||
if ( outputFormat === "json" ) {
|
if ( outputFormat === "json" ) {
|
||||||
@@ -345,7 +319,9 @@ exports.getWateringData = function( req, res ) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if ( local.useLocalWeather() ) {
|
||||||
console.log( "OpenSprinkler Weather Query: %s", JSON.stringify( req.query ) );
|
console.log( "OpenSprinkler Weather Query: %s", JSON.stringify( req.query ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Exit if no location is provided
|
// Exit if no location is provided
|
||||||
if ( !location ) {
|
if ( !location ) {
|
||||||
@@ -371,21 +347,6 @@ exports.getWateringData = function( req, res ) {
|
|||||||
adjustmentOptions = false;
|
adjustmentOptions = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse location string
|
|
||||||
if ( filters.pws.test( location ) ) {
|
|
||||||
|
|
||||||
// Weather Underground is discontinued and PWS or ICAO cannot be resolved
|
|
||||||
res.send( "Error: Weather Underground is discontinued." );
|
|
||||||
return;
|
|
||||||
} else if ( filters.gps.test( location ) ) {
|
|
||||||
|
|
||||||
// Handle GPS coordinates by storing each coordinate in an array
|
|
||||||
location = location.split( "," );
|
|
||||||
location = [ parseFloat( location[ 0 ] ), parseFloat( location[ 1 ] ) ];
|
|
||||||
|
|
||||||
// Continue with the weather request
|
|
||||||
getOWMWateringData( location, finishRequest );
|
|
||||||
} else {
|
|
||||||
// Attempt to resolve provided location to GPS coordinates when it does not match
|
// Attempt to resolve provided location to GPS coordinates when it does not match
|
||||||
// a GPS coordinate or Weather Underground location using Weather Underground autocomplete
|
// a GPS coordinate or Weather Underground location using Weather Underground autocomplete
|
||||||
resolveCoordinates( location, function( result ) {
|
resolveCoordinates( location, function( result ) {
|
||||||
@@ -395,14 +356,17 @@ exports.getWateringData = function( req, res ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location = result;
|
location = result;
|
||||||
|
if ( local.useLocalWeather() ) {
|
||||||
|
getLocalWateringData( location, finishRequest );
|
||||||
|
} else {
|
||||||
getOWMWateringData( location, finishRequest );
|
getOWMWateringData( location, finishRequest );
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
} );
|
||||||
};
|
};
|
||||||
|
|
||||||
// Generic HTTP request handler that parses the URL and uses the
|
// Generic HTTP request handler that parses the URL and uses the
|
||||||
// native Node.js http module to perform the request
|
// native Node.js http module to perform the request. Returns a Json object
|
||||||
function httpRequest( url, callback ) {
|
function httpJSONRequest( url, callback ) {
|
||||||
url = url.match( filters.url );
|
url = url.match( filters.url );
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
@@ -421,6 +385,7 @@ function httpRequest( url, callback ) {
|
|||||||
|
|
||||||
// Once the data is completely received, return it to the callback
|
// Once the data is completely received, return it to the callback
|
||||||
response.on( "end", function() {
|
response.on( "end", function() {
|
||||||
|
data = JSON.parse( data );
|
||||||
callback( data );
|
callback( data );
|
||||||
} );
|
} );
|
||||||
} ).on( "error", function() {
|
} ).on( "error", function() {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
var express = require( "express" ),
|
var package = require( "./package.json" ),
|
||||||
|
express = require( "express" ),
|
||||||
weather = require( "./routes/weather.js" ),
|
weather = require( "./routes/weather.js" ),
|
||||||
local = require( "./routes/local.js" ),
|
local = require( "./routes/local.js" ),
|
||||||
cors = require( "cors" ),
|
cors = require( "cors" ),
|
||||||
@@ -30,7 +31,7 @@ if ( pws === "WU" ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
app.get( "/", function( req, res ) {
|
app.get( "/", function( req, res ) {
|
||||||
res.send( "OpenSprinkler Weather Service" );
|
res.send( package.description + " v" + package.version );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Handle 404 error
|
// Handle 404 error
|
||||||
@@ -41,10 +42,10 @@ app.use( function( req, res ) {
|
|||||||
|
|
||||||
// Start listening on the service port
|
// Start listening on the service port
|
||||||
app.listen( port, host, function() {
|
app.listen( port, host, function() {
|
||||||
console.log( "OpenSprinkler Weather Service now listening on %s:%s", host, port );
|
console.log( "%s now listening on %s:%s", package.description, host, port );
|
||||||
|
|
||||||
if (pws !== "none" ) {
|
if (pws !== "none" ) {
|
||||||
console.log( "OpenSprinkler Weather Service now listening for local weather stream" );
|
console.log( "%s now listening for local weather stream", package.description );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user