diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js new file mode 100644 index 00000000..3164d7c8 --- /dev/null +++ b/modules/default/weather/providers/darksky.js @@ -0,0 +1,75 @@ +/* global WeatherProvider, WeatherDay */ + +/* Magic Mirror + * Module: Weather + * Provider: Dark Sky + * + * By Nicholas Hubbard https://github.com/nhubbard + * MIT Licensed + * + * This class is a provider for Dark Sky. + */ +WeatherProvider.register("darksky", { + // Set the name of the provider. + // Not strictly required, but helps for debugging. + providerName: "Dark Sky", + // Implement fetchCurrentWeather. + fetchCurrentWeather: function() { + // Create a URL from the config and base URL. + var url = `https://api.darksky.net/forecast/${this.config.apiKey}/${this.config.latLong}`; + // Run the request. + this.fetchData(url).then(data => { + Log.log(data); + if(!data || !data.main || typeof data.main.temp === "undefined") { + // No usable data? + return; + } + var currentWeather = this.generateWeatherDayFromCurrentWeather(data); + this.setCurrentWeather(currentWeather); + }).catch(function(request) { + Log.error("Could not load data!", request); + }); + }, + fetchWeatherForecast: function() { + // Also, fake data. + var forecast = []; + var today = moment(); + for(var i = 0; i < 5; i++) { + var weatherObject = new WeatherObject(); + weatherObject.date = moment(today).add(i, "days"); + weatherObject.minTemperature = Math.random() * 10 + 10; + weatherObject.maxTemperature = Math.random() * 15 + 10; + forecast.push(weatherObject); + } + this.setWeatherForecast(); + }, + // Implement WeatherDay generator. + generateWeatherDayFromCurrentWeather: function(currentWeatherData) { + var currentWeather = new WeatherObject(); + currentWeather.date = new Date(); + currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity); + currentWeather.temperature = parseFloat(currentWeatherData.currently.temperature); + currentWeather.windSpeed = parseFloat(currentWeatherData.currently.windSpeed); + currentWeather.windDirection = currentWeatherData.currently.windBearing; + currentWeather.weatherType = this.currentWeatherType(currentWeatherData.currently.icon); + currentWeather.sunrise = new Date(currentWeatherData.daily.data[0].sunriseTime); + currentWeather.sunset = new Date(currentWeatherData.daily.data[0].sunsetTime); + return currentWeather; + }, + // Map icons from Dark Sky to our icons. + convertWeatherType: function(weatherType) { + var weatherTypes = { + "clear-day": "day-sunny", + "clear-night": "night-clear", + "rain": "rain", + "snow": "snow", + "sleet": "snow", + "wind": "wind", + "fog": "fog", + "cloudy": "cloudy", + "partly-cloudy-day": "day-cloudy", + "partly-cloudy-night": "night-cloudy" + }; + return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; + } +}); \ No newline at end of file