Access data from a weather station with the Raspberry Pi

Ingredient 3: Build a Web Application with Sinatra

Once Ruby is installed, Ruby libraries are managed with gem. To program web applications with Sinatra, you need to run

gem install sinatra

to install the Sinatra gem. This sample full-fledged web application,

require 'sinatra'
get '/' do
  'Hello world!'
end
}

can be accessed in the browser on http://localhost:4567/ after typing ruby webapp.rb.

Ingredient 4: Populate a Database with Measured Values

Now, you still need to store the data in an appropriate way. In general, a database is used for web applications. SQLite is a database designed for simple applications, but that still speaks SQL. The database is part of the Debian sqlite3 package. To use it in Ruby, you also need the Ruby sqlite3 gem.

To create a new database file by the name of db.sqlite3 which will store temperature values at specific times, for example, you would type:

sqlite3 db.sqlite3 'create table temperatures(time integer, t real);'

The Ruby code in Listing 1 [5] uses ActiveRecord to access the database and populate it with values parsed from a CSV file, weather.csv. The rows in the CSV file containing the data from the weather station are structured as described above.

Listing 1

Populating the Database

01 require 'csv'
02 require 'active_record'
03
04 data = CSV.read('weather.csv', { col_sep: ':' })
05 ActiveRecord::Base.establish_connection(   {"adapter"=>"sqlite3", "database"=>"db.sqlite3"})
06
07 class Temperature < ActiveRecord::Base
08       validates_uniqueness_of :time
09 end
10
11 data.each do |d|
12   values = { time: d[0], t: d[11] }
13   Temperature.create values
14 end

The beauty of ActiveRecord is that it automatically takes care of everything you need for reading and writing to databases. In Listing 1, on seeing the Temperature class, it understands that it needs to access the temperatures table, and the variable names (time, t) tell it the columns in the database table that it must write.

Ingredient 5: Read Measured Values from the Database

The data can be read conveniently from the database, again thanks to ActiveRecord. Listing 2 reads all entries in the values variable at one fell swoop. At the same time, the time values are multiplied by 1,000.

Listing 2

Read from a Database

01 require 'active_record'
02
03 ActiveRecord::Base.establish_connection({"adapter"=>"sqlite3", "database"=>"db.sqlite3"})
04 class Temperature < ActiveRecord::Base
05 end
06
07 values = Temperature.all.map {|m| [m.time * 1000, m.t]}
08 data = values.inspect
09 puts data

The array comprises pairs of times and measured values, so it can later be interpreted by the chart library to provide data points. The inspect method generates a matching string from the array ("[[1363465023000, -1.3], [1363468623000, -1.9], ...]"). In Listing 2, this string is output in the terminal. Later, the string is integrated into the website at the appropriate point in the JavaScript code.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • Charly's Column: Weather Page

    To find out what the weather is like, sys admin columnist Charly Kühnast no longer needs to go outdoors get wet, blown away, frozen to death, or sunburned.

  • Software-Defined Radio

    Armed with a US$ 20 hunk of hardware and a free software-defined radio tool, Konstantin starts the hunt for radio-transmitted data from a weather station.

  • Processing Map Data with OpenLayers

    OpenLayers is a JavaScript library that allows you to integrate maps into web pages. You can program the geodetic data directly or read it from a database.

  • Perl: Linux-based Gardening

    In this month’s Perl column, we will introduce a system to water your plants while you are away from home. With a little help from Perl, a friendly, Linux-based irrigation system waters your plants twice a day.

  • Perl: Temperature Sensors

    Linux lets tinkerers connect their hardware creations to computers. We’ll show you how you can use a simple Perl interface to check the temperature of your home or office while you’re away.

comments powered by Disqus

Direct Download

Read full article as PDF:

Price $2.95

News

njobs Europe
What:
Where:
Country:
Njobs Netherlands Njobs Deutschland Njobs United Kingdom Njobs Italia Njobs France Njobs Espana Njobs Poland
Njobs Austria Njobs Denmark Njobs Belgium Njobs Czech Republic Njobs Mexico Njobs India Njobs Colombia