From 0aad889aa7c9590dcaa9c0adff2d826f3114b4a4 Mon Sep 17 00:00:00 2001 From: Joe Robinson Date: Sat, 16 Feb 2019 23:09:27 +0000 Subject: DB and endpoints --- scarecrow.rb | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/scarecrow.rb b/scarecrow.rb index ef3b694..b4fadf9 100644 --- a/scarecrow.rb +++ b/scarecrow.rb @@ -1,23 +1,67 @@ require 'sinatra' require 'mqtt' +require 'sqlite3' +require 'date' +require 'dm-core' +require 'dm-timestamps' +require 'dm-validations' +require 'dm-migrations' set :public_folder, File.dirname(__FILE__) + '/public' set :bind, '::' +DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/scarecrow.sqlite") + +class Temperature + include DataMapper::Resource + property :id, Serial + property :timestamp, DateTime + property :value, Float +end + +class Humidity + include DataMapper::Resource + property :id, Serial + property :timestamp, DateTime + property :value, Float +end def init + DataMapper.auto_migrate! + DataMapper.auto_upgrade! Thread.new do MQTT::Client.connect('192.168.0.16') do |c| - c.get('humidity') do |topic,message| - puts "#{topic}: #{message}" + c.subscribe('temperature', 'humidity') + loop do + while !c.queue_empty? do + topic, message = c.get + handle_msg(topic, message) + end + sleep 1 end end end - Thread.new do - MQTT::Client.connect('192.168.0.16') do |c| - c.get('temperature') do |topic,message| - puts "#{topic}: #{message}" - end - end +end + +def handle_msg(topic, msg) + puts "#{topic}: #{msg}" + if topic == "humidity" + handle_humidity_msg(msg) + elsif topic == "temperature" + handle_temp_message(msg) + end +end + +def handle_humidity_msg(msg) + humidity = Humidity.create(timestamp: DateTime.now, value: msg) + humidity.errors.each do |error| + puts error + end +end + +def handle_temp_message(msg) + temp = Temperature.create(timestamp: DateTime.now, value: msg) + temp.errors.each do |error| + puts error end end @@ -25,4 +69,14 @@ get '/' do send_file File.join(settings.public_folder, 'index.html') end +get '/temperature' do + temp = Temperature.last[:value] + return "#{temp}" +end + +get '/humidity' do + temp = Humidity.last[:value] + "#{temp}" +end + init -- cgit v1.2.3