In celebration of Eclipse Day we have made this app to tell you what the weather is outside so you know if you will be able to see the eclipse or not with your current local weather conditions. This guide provides step-by-step instructions for locating your general location to give you information about the weather via a series of LED animations on a Raspberry Pi with a MATRIX Creator. It demonstrates how to use the IP-API.com to find your location and then feed it to the Dark Sky API to get the relevant local weather information that will be used to show an LED animation on your MATRIX Creator. The main goal of this app was to give an interesting new way to receive your current weather conditions.
Required Hardware
Before you get started, let's review what you'll need.
- MATRIX Creator - The Raspberry Pi does not have a built-in microphone, the MATRIX Creator has an 8 mic array perfect for Alexa - Buy MATRIX Creator on Element14.
- Micro-USB power supply for Raspberry Pi - 2.5A 5V power supply recommended
- Micro SD Card (Minimum 8 GB) - You need an operating system to get started. NOOBS (New Out of the Box Software) is an easy-to-use operating system install manager for Raspberry Pi. The simplest way to get NOOBS is to buy an SD card with NOOBS pre-installed - Raspberry Pi 16GB Preloaded (NOOBS) Micro SD Card. Alternatively, you can download and install it on your SD card.
- A USB Keyboard & Mouse, and an external HDMI Monitor - we also recommend having a USB keyboard and mouse as well as an HDMI monitor handy if you're unable to remote(SSH) into your Pi.
- Internet connection (Ethernet or WiFi)
- (Optional) WiFi Wireless Adapter for Pi 2 (Buy on Element14). Note: Pi 3 has built-in WiFi.
For extra credit, enable remote(SSH) into your device, eliminating the need for a monitor, keyboard and mouse - and learn how to tail logs for troubleshooting.
Let's get started
We will be using MATRIX OS (MOS) to easily program the Raspberry Pi and MATRIX Creator in Javascript.
Step 1: Setting up MOS
Download and configure MOS and its CLI tool for your computer using the following installation guide in the MATRIX Docs: Installation Guide
Step 2: Create a MATRIX-Weather-App
To create your own MATRIX-Weather-App app on your local computer, use the command "matrix create MATRIX-Weather-App". Then you will be directed to enter a description and keywords for your app. A new folder will be created for the app with five new files. The one you will be editing is the app.js file. You will also be creating a file called weatherAnimations.js for the weather animations.
From here you can clone the MATRIX-Weather-App GitHub repo with the code or follow the guide below for an overview of the code. Either way, make sure to follow the instructions in step 4.
Step 3: Global Variables
In the app.js file you will need to set up the following libraries and global variables for the app:
//Load libraries
var weatherAnims = require(__dirname+'/weatherAnimations'); //custom weather animations
var Forecast = require('forecast'); //https://www.npmjs.com/package/forecast
var request = require('request'); //https://www.npmjs.com/package/request
////////////////////////////////
//Global Variables
////////////////////////////////
//Detailed location data
var location = {};
//Configure forecast options
var forecast = new Forecast({
service: 'darksky', //only api available
key: 'YOUR_KEY_HERE', //darksky api key (https://darksky.net/dev/account)
units: 'fahrenheit', //fahrenheit or celcius
cache: false //cache forecast data
});
Step 4: Dark Sky API
Within the forecast variable created in Step 3 change YOUR_KEY_HERE to be the API key you get once you make an account with Dark Sky here.
Step 5: Obtaining Location Data
To obtain your location data we will be using IP-API.com in order to get your Latitude and Longitude from your IP address. This is done with the following code in the app.js file:
////////////////////////////////
//Obtaining location data
////////////////////////////////
function getLocation(callback){
request.get('http://ip-api.com/json')
//catch any errors
.on('error', function(error){
return console.log(error + '\nCould Not Find Location!');
})
//get response status
.on('response', function(data) {
console.log('Status Code: '+data.statusCode)
})
//get location data
.on('data', function(data){
try{
//save location data
location = JSON.parse(data);
//log all location data
console.log(location);
callback();
}
catch(error){
console.log(error);
}
});
}
Step 6: Selecting Weather Animations
Within the app.js file there will be a function that stops and loads an LED animation corresponding to the weather information provided by Dark Sky. Use the function below:
////////////////////////////////
//Selecting Weather Animation
////////////////////////////////
function setWeatherAnim(forecast){
//clear MATRIX LEDs
weatherAnims.emit('stop');
//set MATRIX LED animation
weatherAnims.emit('start', forecast);
}
In the MATRIX-Weather-App folder you will need to create a file called weatherAnimations.js. You can find the code for the weatherAnimations.js file here.
Each LED sequence in the weatherAnimations.js file is tied to one of these responses from the Dark Sky API.
- clear-day
- clear-night
- rain
- snow
- sleet
- wind
- fog
- cloudy
- partly-cloudy-day
- Partly-cloudy-night
If there is a hazard such as hail, thunderstorms, or tornadoes than the LED's will turn red.
If there is no LED sequence created for the current weather the LED's will turn yellow.
Step 7: Obtaining Forecast Data
Using the forecast NPM module this function in the app.js file retrieves and stores relevant weather information received from Dark Sky. Use the following code:
////////////////////////////////
//Obtaining Forecast data
////////////////////////////////
function determineForecast(lat, lon){
// Retrieve weather information
forecast.get([lat, lon], true, function(error, weather) {
//stop if there's an error
if(error)
console.log(error+'\n\x1b[31mThere has been an issue retrieving the weather\nMake sure you set your API KEY \x1b[0m ');
else{
//pass weather into callback
setWeatherAnim(weather.currently.icon);
//loop every X milliseconds
setTimeout(function(){
determineForecast(lat,lon);
}, 180000);
}
});
}
The weather is updated every 3 minutes.
Step 8: Action Zone
This last function calls all the previous functions and starts the app with the following code:
////////////////////////////////
//Action Zone
////////////////////////////////
//Auto Obtain Location
getLocation(function(){
//Start Forcast requests
determineForecast(location.lat, location.lon);//input your coordinates for better accuracy ex. 25.7631,-80.1911
});
If you experience an inaccurate forecast feel free to hardcode your location in the place of the location.lat and location.lon variables. This inaccuracy with your location is due to the error margin of using your IP for location.
Comments