summaryrefslogtreecommitdiff
path: root/scarecrow.rb
blob: 2fbc2ab6c773ccc72c04373d4f641f49d1f08e7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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, '::'
configure do
  mime_type :text, 'text/plain'
end
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/scarecrow.sqlite")

class Temperature
    include DataMapper::Resource
    property :id, Serial
    property :device, String
    property :timestamp, DateTime
    property :value, Float
end

class Humidity
    include DataMapper::Resource
    property :id, Serial
    property :device, String
    property :timestamp, DateTime
    property :value, Float
end

def init
    DataMapper.auto_migrate!
    DataMapper.auto_upgrade!
    # sleep 10
    Thread.new do
        MQTT::Client.connect('192.168.0.59') do |c|
            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
end

def handle_msg(topic, msg)
    puts "#{topic}: #{msg}"
    topic_parts = topic.split("/")
    device_id = topic_parts[0]
    type = topic_parts[-1]
    if type == "humidity"
        handle_humidity_msg(device_id, msg)
    elsif type == "temperature"
        handle_temp_message(device_id, msg)
    end
end

def handle_humidity_msg(device_id, msg)
    humidity = Humidity.create(timestamp: DateTime.now, device: device_id, value: msg)
    humidity.errors.each do |error|
        puts error
    end
end

def handle_temp_message(device_id, msg)
    temp = Temperature.create(timestamp: DateTime.now, device: device_id, value: msg)
    temp.errors.each do |error|
        puts error
    end
end

get '/' do
    # send_file File.join(settings.public_folder, 'index.html')
    @temp_prop = Temperature.last(device: "cricket0")[:value]
    @humidity_prop = Humidity.last(device: "cricket0")[:value]
    @temp_air = Temperature.last(device: "mercury")[:value]
    @humidity_air = Humidity.last(device: "mercury")[:value]
    time_prop = Temperature.last(device: "mercury")[:timestamp]
    time_air = Temperature.last(device: "cricket0")[:timestamp]
    @time_formatted_prop = time_prop.strftime("%A, %d %b %Y %l:%M %p")
    @time_formatted_air = time_air.strftime("%A, %d %b %Y %l:%M %p")
    erb :index
    # return "#{temp_val}°C and #{humidity_val}% humidity at #{time_formatted}"
end

get '/temperature/:device_id' do
    device_id = "mercury" if (params[:device_id] == "air" || params[:device_id] == "kitchen")
    device_id = "cricket0" if (params[:device_id] == "propagator")
    device_id ||= params[:device_id]
    temp = Temperature.last(device: device_id)[:value]
    return "#{temp}"
end

get '/humidity/:device_id' do
    device_id = "mercury" if (device_id == "air" || device_id == "basement")
    device_id = "cricket0" if (device_id == "propagator")
    humidity = Humidity.last(device: device_id)[:value]
    "#{humidity}"
end

get '/metrics' do
    content_type :text
    temp_prop = Temperature.last(device: "cricket0")[:value]
    humidity_prop = Humidity.last(device: "cricket0")[:value]
    temp_air = Temperature.last(device: "mercury")[:value]
    humidity_air = Humidity.last(device: "mercury")[:value]
    "humidity_basement #{humidity_air}
humidity_propagator #{humidity_prop}
temperature_basement #{temp_air}
temperature_propagator #{temp_prop}"
end

init