Refactor to dedupe and add version

This commit is contained in:
Pete ba
2019-05-06 12:14:15 +01:00
parent ca21058977
commit 612f911285
3 changed files with 58 additions and 92 deletions

View File

@@ -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 );
}; };

View File

@@ -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() {

View File

@@ -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 );
} }
} ); } );