alex-vancoillie-thermostat-exercise 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/app +114 -0
- data/lib/alex-vancoillie-thermostat-exercise.rb +7 -0
- data/lib/led.rb +28 -0
- data/lib/log.rb +16 -0
- data/lib/relais.rb +22 -0
- data/lib/temperature.rb +15 -0
- data/lib/transport.rb +30 -0
- data/lib/user_input.rb +31 -0
- data/lib/web.rb +12 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a451d9e4fc8e92c3c98d58ffdb2a5e8ce985af2a
|
4
|
+
data.tar.gz: f8c70a710491a874f417a7479c01e8b196ae62b1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 96c51c4bfbd4e19cd2a41673825b4323af1d492bdff147f9d49cce3d30c82cda2ff4b45166d6dfecd2a4c2c43d6b143018773ba79cb56c5ae6f0176d86a173a0
|
7
|
+
data.tar.gz: 8f20b5f1c46218e231de9957fddd8932d55cc91863abfab29293e5a16794f2a37a5230f5b0067177e8da8da255885ac6f6edc4da4e1f5f9829daa64875827c03
|
data/bin/app
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'alex-vancoillie-thermostat-exercise'
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
led = Led.new
|
5
|
+
relais = Relais.new
|
6
|
+
log = Log.new
|
7
|
+
temp = Temperature.new
|
8
|
+
web = Web.new
|
9
|
+
transport = Transport.new
|
10
|
+
input = UserInput.new
|
11
|
+
|
12
|
+
# this hash will hold all of the options
|
13
|
+
# parsed from the command-line by
|
14
|
+
# OptionParser
|
15
|
+
options = {}
|
16
|
+
|
17
|
+
# We give a block argument with the constructor
|
18
|
+
optparse = OptionParser.new do |opts|
|
19
|
+
# set a banner, displayed at the top
|
20
|
+
# of the help screen
|
21
|
+
opts.banner = "Usage: app.rb [options]"
|
22
|
+
|
23
|
+
# define the options, and what they do
|
24
|
+
opts.on('-m', '--method M', String, 'How to get temperature [user], [url], [mqtt]') do |method|
|
25
|
+
options[:method] = method
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('-c', '--celsius TEMP', Float, 'Enter the temperature in Celsius') do |celsius|
|
29
|
+
options[:temperature] = temp.convert('c', celsius)
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on('-k', '--kelvin TEMP', Float, 'Enter the temperature in Kelvin') do |kelvin|
|
33
|
+
options[:temperature] = temp.convert('k', kelvin)
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on('-f', '--fahrenheit TEMP', Float, 'Enter the temperature in Fahrenheit') do |fahrenheit|
|
37
|
+
options[:temperature] = temp.convert('f', fahrenheit)
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on('-r', '--range R', Float, 'Enter the range') do |range|
|
41
|
+
options[:range] = range
|
42
|
+
end
|
43
|
+
|
44
|
+
opts.on('-w', '--wanted W', Float, 'Enter the wanted temperature (in Celsius)') do |set|
|
45
|
+
options[:set] = set
|
46
|
+
end
|
47
|
+
|
48
|
+
opts.on('-h', '--help', 'Get this help screen') do
|
49
|
+
puts opts
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
optparse.parse!
|
55
|
+
|
56
|
+
if options[:method] == 'user'
|
57
|
+
input.askData
|
58
|
+
conversion = temp.convert(input.get_temp, input.get_unit)
|
59
|
+
|
60
|
+
led.check_led(conversion, input.get_set, input.get_range)
|
61
|
+
relais.set(conversion, input.get_set, input.get_range)
|
62
|
+
|
63
|
+
puts relais.get_heating
|
64
|
+
puts relais.get_cooling
|
65
|
+
puts led.get_led
|
66
|
+
|
67
|
+
log.addContent(relais.get_heating)
|
68
|
+
log.addContent(relais.get_cooling)
|
69
|
+
log.addContent(led.get_fcolor)
|
70
|
+
end
|
71
|
+
|
72
|
+
if options[:method] == 'url'
|
73
|
+
update = Thread.new do
|
74
|
+
|
75
|
+
while true do
|
76
|
+
puts "\n"
|
77
|
+
temp = web.url
|
78
|
+
|
79
|
+
led.check_led(temp, options[:set], options[:range])
|
80
|
+
relais.set(temp, options[:set], options[:range])
|
81
|
+
|
82
|
+
puts relais.get_heating
|
83
|
+
puts relais.get_cooling
|
84
|
+
puts led.get_led
|
85
|
+
|
86
|
+
log.addContent(relais.get_heating)
|
87
|
+
log.addContent(relais.get_cooling)
|
88
|
+
log.addContent(led.get_fcolor)
|
89
|
+
|
90
|
+
sleep(10)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
update.join
|
94
|
+
end
|
95
|
+
|
96
|
+
if options[:method] == 'mqtt'
|
97
|
+
transport.on_change do |temp|
|
98
|
+
puts temp
|
99
|
+
|
100
|
+
led.check_led(temp, options[:set], options[:range])
|
101
|
+
relais.set(temp, options[:set], options[:range])
|
102
|
+
|
103
|
+
puts relais.get_heating
|
104
|
+
puts relais.get_cooling
|
105
|
+
puts led.get_led
|
106
|
+
|
107
|
+
log.addContent(relais.get_heating)
|
108
|
+
log.addContent(relais.get_cooling)
|
109
|
+
log.addContent(led.get_fcolor)
|
110
|
+
|
111
|
+
transport.send_color(led.get_color)
|
112
|
+
end
|
113
|
+
transport.get_connection
|
114
|
+
end
|
data/lib/led.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
class Led
|
4
|
+
def check_led(temp, set, range)
|
5
|
+
if(temp < (set - range))
|
6
|
+
@color = "0000FF".colorize(:blue)
|
7
|
+
@fcolor = "0000FF"
|
8
|
+
elsif(temp > (set + range))
|
9
|
+
@color = "FF0000".colorize(:red)
|
10
|
+
@fcolor = "FF0000"
|
11
|
+
else
|
12
|
+
@color = "00FF00".colorize(:green)
|
13
|
+
@fcolor = "00FF00"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_led
|
18
|
+
"The LED is #{@color}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_color
|
22
|
+
return @fcolor
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_fcolor
|
26
|
+
"The LED is #{@fcolor}"
|
27
|
+
end
|
28
|
+
end
|
data/lib/log.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
class Log
|
4
|
+
def initialize()
|
5
|
+
@file = "log.txt"
|
6
|
+
end
|
7
|
+
|
8
|
+
def addContent(content)
|
9
|
+
date = Time.now.strftime("%d/%m/%Y %H:%M")
|
10
|
+
File.open(@file, 'a+') do |file|
|
11
|
+
file.puts("#{date}: \n")
|
12
|
+
file.puts("#{content} \n")
|
13
|
+
file.puts("\n")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/relais.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
class Relais
|
2
|
+
def set(temp, set, range)
|
3
|
+
if temp < (set - range)
|
4
|
+
@heating = true
|
5
|
+
@cooling = false
|
6
|
+
elsif temp > (set + range)
|
7
|
+
@heating = false
|
8
|
+
@cooling = true
|
9
|
+
else
|
10
|
+
@heating = false
|
11
|
+
@cooling = false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_heating
|
16
|
+
"The heating is #{@heating}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_cooling
|
20
|
+
"The cooling is #{@cooling}"
|
21
|
+
end
|
22
|
+
end
|
data/lib/temperature.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
class Temperature
|
2
|
+
def convert(temp, unit)
|
3
|
+
if(unit == "C")
|
4
|
+
@temp = temp
|
5
|
+
elsif(unit == "K")
|
6
|
+
# normally it need to be '273.15', but if we do this the led will never
|
7
|
+
# be "green"
|
8
|
+
@temp = temp - 273
|
9
|
+
elsif(unit == "F")
|
10
|
+
@temp = ((temp - 32) * 5 / 9)
|
11
|
+
else
|
12
|
+
@temp = temp
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/transport.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'mqtt'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class Transport
|
5
|
+
def get_connection
|
6
|
+
puts "MQTT:"
|
7
|
+
temperature_topic = 'softwareengineering/thermostat/cfbnik/temperature'
|
8
|
+
MQTT::Client.connect('mqtt.labict.be') do |client|
|
9
|
+
while(true)
|
10
|
+
client.get(temperature_topic) do |topic, message|
|
11
|
+
json = message
|
12
|
+
hash = JSON.parse(json)
|
13
|
+
temp = (hash["temperature"]).to_f
|
14
|
+
@on_change_block.call(temp) unless @on_change_block.nil?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_change &block
|
21
|
+
@on_change_block = block
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_color(color)
|
25
|
+
connection = MQTT::Client.connect('mqtt.labict.be')
|
26
|
+
my_hash = {"color" => color}
|
27
|
+
payload = JSON.generate(my_hash) # convert my_hash to JSON
|
28
|
+
connection.publish('softwareengineering/thermostat/cfbnik/led', payload, retain = false)
|
29
|
+
end
|
30
|
+
end
|
data/lib/user_input.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
class UserInput
|
2
|
+
def askData
|
3
|
+
puts "Enter the temperature:"
|
4
|
+
@temp = gets.chomp.to_f
|
5
|
+
|
6
|
+
puts "Enter the wanted temperature:"
|
7
|
+
@set = gets.chomp.to_f
|
8
|
+
|
9
|
+
puts "Enter the unit:"
|
10
|
+
@unit = gets.chomp
|
11
|
+
|
12
|
+
puts "Enter the range:"
|
13
|
+
@range = gets.chomp.to_f
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_temp
|
17
|
+
return @temp
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_set
|
21
|
+
return @set
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_unit
|
25
|
+
return @unit
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_range
|
29
|
+
return @range
|
30
|
+
end
|
31
|
+
end
|
data/lib/web.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
|
5
|
+
|
6
|
+
class Web
|
7
|
+
def url
|
8
|
+
@temp = (URI.parse("https://labict.be/software-engineering/temperature/api/temperature/fake").read).to_f
|
9
|
+
puts @temp
|
10
|
+
return @temp
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: alex-vancoillie-thermostat-exercise
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Vancoillie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-09 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A thermostat gem
|
14
|
+
email: alex.vancoillie@student.vives.be
|
15
|
+
executables:
|
16
|
+
- app
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/app
|
21
|
+
- lib/alex-vancoillie-thermostat-exercise.rb
|
22
|
+
- lib/led.rb
|
23
|
+
- lib/log.rb
|
24
|
+
- lib/relais.rb
|
25
|
+
- lib/temperature.rb
|
26
|
+
- lib/transport.rb
|
27
|
+
- lib/user_input.rb
|
28
|
+
- lib/web.rb
|
29
|
+
homepage: http://git.labict.be/alexvancoillie/Ruby_Temperature
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 2.5.2
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: Thermostat
|
53
|
+
test_files: []
|