brewer 0.0.83 → 0.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +13 -1
- data/README.md +59 -6
- data/Rakefile +11 -3
- data/bin/brewer +5 -7
- data/bin/brewer-server +61 -0
- data/lib/brewer.rb +1 -11
- data/lib/brewer/adaptibrew.rb +34 -35
- data/lib/brewer/brewer.rb +125 -106
- data/lib/brewer/communicator.rb +52 -50
- data/lib/brewer/helpers.rb +18 -1
- data/lib/brewer/procedures.rb +183 -167
- data/lib/brewer/recipe.rb +40 -39
- data/lib/brewer/settings.rb +107 -105
- data/lib/gems.rb +11 -0
- data/spec/brewer_spec.rb +3 -3
- data/spec/hardware_spec.rb +17 -13
- data/spec/helpers_spec.rb +0 -0
- data/spec/settings_spec.rb +1 -13
- data/spec/spec_helper.rb +2 -0
- data/views/index.erb +216 -0
- data/views/not_found.erb +24 -0
- metadata +45 -12
data/lib/brewer/communicator.rb
CHANGED
@@ -1,67 +1,69 @@
|
|
1
1
|
require_relative "../brewer"
|
2
2
|
|
3
|
-
|
3
|
+
module Brewer
|
4
|
+
class Communicator
|
4
5
|
|
5
|
-
|
6
|
+
attr_accessor :slack, :brewer
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def initialize
|
9
|
+
@settings = Settings.new
|
10
|
+
@brewer = Brewer.new
|
11
|
+
@slack = configure_slack
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
def configure_slack
|
15
|
+
unless @settings.settings['webhook_url']
|
16
|
+
print "Slack Webhook URL: "
|
17
|
+
webhook_url = gets.chomp
|
18
|
+
@settings.add({
|
19
|
+
'webhook_url' => webhook_url
|
20
|
+
})
|
21
|
+
end
|
22
|
+
return Slack::Notifier.new @settings.settings['webhook_url']
|
20
23
|
end
|
21
|
-
return Slack::Notifier.new @settings.settings['webhook_url']
|
22
|
-
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
def ping(message="ping at #{Time.now}")
|
26
|
+
if message.is_a? Array
|
27
|
+
final = message.join("\n")
|
28
|
+
@slack.ping(final)
|
29
|
+
end
|
30
|
+
@slack.ping(message)
|
28
31
|
end
|
29
|
-
@slack.ping(message)
|
30
|
-
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
# TODO: test these methods
|
34
|
+
def slack_monitor(delay=10)
|
35
|
+
while true do
|
36
|
+
before_temp = @brewer.pv
|
37
|
+
@brewer.wait(to_seconds(delay))
|
38
|
+
diff = @brewer.pv - before_temp
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
ping([
|
41
|
+
"Current Temperature: #{@brewer.pid['pv_temp']} F",
|
42
|
+
"Set Value Temperature: #{@brewer.pid['sv_temp']} F",
|
43
|
+
"Current temperature has climed #{diff} F since #{delay} minute(s) ago",
|
44
|
+
"Sent at #{Time.now.strftime("%H:%M")}",
|
45
|
+
""
|
46
|
+
])
|
47
|
+
end
|
48
|
+
true
|
46
49
|
end
|
47
|
-
true
|
48
|
-
end
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
51
|
+
def monitor
|
52
|
+
while true do
|
53
|
+
status_table_rows = [
|
54
|
+
["Current Temp", @brewer.pv],
|
55
|
+
["Set Value Temp", @brewer.sv],
|
56
|
+
["PID is: ", @brewer.pid['pid_running'].to_b ? "on" : "off"],
|
57
|
+
["Pump is: ", @brewer.pump]
|
58
|
+
]
|
58
59
|
|
59
|
-
|
60
|
+
status_table = Terminal::Table.new :headings ["Item", "Status"], :rows => status_table_rows
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
clear_screen
|
63
|
+
puts status_table
|
64
|
+
sleep(1)
|
65
|
+
end
|
64
66
|
end
|
65
|
-
end
|
66
67
|
|
68
|
+
end
|
67
69
|
end
|
data/lib/brewer/helpers.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
-
require_relative "../
|
1
|
+
require_relative "../gems"
|
2
2
|
|
3
3
|
module Helpers
|
4
4
|
|
5
|
+
# Returns the current time
|
5
6
|
# Formatted as: 03/07/2017 14:26
|
6
7
|
def time
|
7
8
|
Time.now.strftime("%m/%d/%Y %H:%M")
|
8
9
|
end
|
9
10
|
|
11
|
+
def view(view)
|
12
|
+
File.open(File.join(__dir__ + "/../../views/#{view}.html.erb"))
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns true if there is a network connection
|
10
16
|
def network?
|
11
17
|
connection = Net::Ping::TCP.new('google.com', 80, 5)
|
12
18
|
connection.ping?
|
@@ -39,4 +45,15 @@ module Helpers
|
|
39
45
|
return brewer_dir + "adaptibrew/#{path}"
|
40
46
|
end
|
41
47
|
|
48
|
+
def capture_stdout(&block)
|
49
|
+
original_stdout = $stdout
|
50
|
+
$stdout = fake = StringIO.new
|
51
|
+
begin
|
52
|
+
yield
|
53
|
+
ensure
|
54
|
+
$stdout = original_stdout
|
55
|
+
end
|
56
|
+
fake.string
|
57
|
+
end
|
58
|
+
|
42
59
|
end
|
data/lib/brewer/procedures.rb
CHANGED
@@ -1,202 +1,218 @@
|
|
1
1
|
require_relative "../brewer"
|
2
2
|
|
3
|
-
|
3
|
+
module Brewer
|
4
|
+
class Procedures
|
4
5
|
|
5
|
-
|
6
|
+
attr_accessor :com, :brewer, :recipe
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def master
|
14
|
-
@recipe.get_recipe_vars
|
15
|
-
boot
|
16
|
-
heat_strike_water
|
17
|
-
dough_in
|
18
|
-
mash
|
19
|
-
mashout
|
20
|
-
sparge
|
21
|
-
top_off
|
22
|
-
boil
|
23
|
-
end
|
24
|
-
|
25
|
-
def boot
|
26
|
-
puts Rainbow("booting...").yellow
|
27
|
-
@brewer.pid(0)
|
28
|
-
@brewer.pump(0)
|
29
|
-
@brewer.rims_to('mash')
|
30
|
-
@brewer.hlt_to('mash')
|
31
|
-
@brewer.all_relays_status
|
32
|
-
puts @brewer.pid
|
33
|
-
|
34
|
-
puts Rainbow("Boot finished!").green
|
35
|
-
@com.ping("🍺 boot finished 🍺")
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
# :nocov:
|
40
|
-
def heat_strike_water
|
41
|
-
puts "heat-strike-water procedure started"
|
42
|
-
|
43
|
-
# Confirm strike water is in the mash tun
|
44
|
-
print Rainbow("Is the strike water in the mash tun? ").yellow
|
45
|
-
# -> response
|
46
|
-
confirm ? nil : abort
|
47
|
-
|
48
|
-
# confirm return manifold is in the mash tun
|
49
|
-
print Rainbow("Is the return manifold in the mash tun? ").yellow
|
50
|
-
# -> response
|
51
|
-
confirm ? nil : abort
|
52
|
-
|
53
|
-
print Rainbow("Is the mash tun valve open? ").yellow
|
54
|
-
confirm ? nil : abort
|
55
|
-
|
56
|
-
# confirm RIMS relay is on
|
57
|
-
@brewer.rims_to('mash')
|
58
|
-
puts "RIMS-to-mash relay is now on"
|
59
|
-
|
60
|
-
# turn on pump
|
61
|
-
@brewer.pump(1)
|
62
|
-
puts "Pump is now on"
|
63
|
-
|
64
|
-
puts Rainbow("Is the pump running properly? ").yellow
|
65
|
-
# TODO: Test this
|
66
|
-
until confirm
|
67
|
-
puts "restarting pump"
|
68
|
-
@brewer.pump(0)
|
69
|
-
@brewer.wait(2)
|
70
|
-
@brewer.pump(1)
|
8
|
+
def initialize
|
9
|
+
@brewer = Brewer.new
|
10
|
+
@com = Communicator.new
|
11
|
+
@recipe = Recipe.new(@brewer)
|
71
12
|
end
|
72
13
|
|
73
|
-
#
|
74
|
-
|
75
|
-
#
|
76
|
-
|
77
|
-
|
14
|
+
# def minified_master(recipe_vars)
|
15
|
+
# @recipe.get_recipe_vars(recipe_vars)
|
16
|
+
# end
|
17
|
+
|
18
|
+
def master
|
19
|
+
@recipe.get_recipe_vars
|
20
|
+
boot
|
21
|
+
heat_strike_water
|
22
|
+
dough_in
|
23
|
+
mash
|
24
|
+
mashout
|
25
|
+
sparge
|
26
|
+
top_off
|
27
|
+
boil
|
28
|
+
true
|
29
|
+
end
|
78
30
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
31
|
+
def boot
|
32
|
+
puts Rainbow("booting...").yellow
|
33
|
+
@brewer.relay_config({
|
34
|
+
'pid' => 0,
|
35
|
+
'pump' => 0,
|
36
|
+
'rims_to' => 'mash',
|
37
|
+
'hlt_to' => 'mash'
|
38
|
+
})
|
39
|
+
# puts @brewer.all_relays_status
|
40
|
+
# puts @brewer.pid
|
41
|
+
|
42
|
+
puts Rainbow("Boot finished!").green
|
43
|
+
@com.ping("🍺 boot finished 🍺")
|
44
|
+
true
|
45
|
+
end
|
85
46
|
|
86
|
-
#
|
87
|
-
|
88
|
-
|
89
|
-
puts "Heating to #{@brewer.sv}"
|
47
|
+
# :nocov:
|
48
|
+
def heat_strike_water
|
49
|
+
puts Rainbow("About to heat strike water").yellow
|
90
50
|
|
91
|
-
|
51
|
+
# Confirm strike water is in the mash tun
|
52
|
+
print Rainbow("Is the strike water in the mash tun? ").yellow
|
53
|
+
confirm ? nil : abort
|
92
54
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
puts Rainbow("Strike water heated. Maintaining temp.").green
|
97
|
-
true
|
98
|
-
end
|
99
|
-
# :nocov:
|
100
|
-
|
101
|
-
def dough_in
|
102
|
-
# turn pump off
|
103
|
-
@brewer.pump(0)
|
104
|
-
# turn PID off
|
105
|
-
@brewer.pid(0)
|
106
|
-
@brewer.wait(3)
|
107
|
-
@com.ping("Ready to dough in")
|
108
|
-
puts Rainbow("Ready to dough in").green
|
109
|
-
|
110
|
-
# pour in grain
|
111
|
-
|
112
|
-
print Rainbow("Confirm when you're done with dough-in (y): ").yellow
|
113
|
-
confirm ? nil : abort
|
114
|
-
true
|
115
|
-
end
|
55
|
+
# confirm return manifold is in the mash tun
|
56
|
+
print Rainbow("Is the return manifold in the mash tun? ").yellow
|
57
|
+
confirm ? nil : abort
|
116
58
|
|
117
|
-
|
118
|
-
|
59
|
+
print Rainbow("Is the manual mash tun valve open? ").yellow
|
60
|
+
confirm ? nil : abort
|
119
61
|
|
120
|
-
|
121
|
-
|
62
|
+
# confirm RIMS relay is on
|
63
|
+
@brewer.rims_to('mash')
|
64
|
+
puts "RIMS-to-mash relay is now on"
|
122
65
|
|
123
|
-
|
66
|
+
# turn on pump
|
67
|
+
@brewer.pump(1)
|
68
|
+
puts "Pump is now on"
|
69
|
+
|
70
|
+
print Rainbow("Is the pump running properly? ").yellow
|
71
|
+
unless confirm
|
72
|
+
puts "restarting pump"
|
73
|
+
@brewer.pump(0)
|
74
|
+
@brewer.wait(2)
|
75
|
+
@brewer.pump(1)
|
76
|
+
end
|
77
|
+
|
78
|
+
# confirm that strike water is circulating well
|
79
|
+
print Rainbow("Is the strike water circulating well? ").yellow
|
80
|
+
# -> response
|
81
|
+
confirm ? nil : abort
|
82
|
+
|
83
|
+
|
84
|
+
# calculate strike temp & set PID to strike temp
|
85
|
+
# this sets PID SV to calculated strike temp automagically
|
86
|
+
@brewer.sv(@recipe.strike_water_temp)
|
87
|
+
puts "SV has been set to calculated strike water temp"
|
88
|
+
# turn on RIMS heater
|
89
|
+
@brewer.pid(1)
|
90
|
+
|
91
|
+
# measure current strike water temp and save
|
92
|
+
@recipe.starting_strike_temp = @brewer.pv
|
93
|
+
puts "current strike water temp is #{@brewer.pv}."
|
94
|
+
puts "Heating to #{@brewer.sv}"
|
95
|
+
|
96
|
+
@com.ping("Strike water beginning to heat. This may take a few minutes.")
|
97
|
+
|
98
|
+
# when strike temp is reached, @com.ping slack
|
99
|
+
@brewer.watch
|
100
|
+
puts Rainbow("Strike water heated. Maintaining temp.").green
|
101
|
+
true
|
102
|
+
end
|
103
|
+
# :nocov:
|
104
|
+
|
105
|
+
def dough_in
|
106
|
+
@brewer.relay_config({
|
107
|
+
'pid' => 0,
|
108
|
+
'pump' => 0
|
109
|
+
})
|
110
|
+
@brewer.wait(3)
|
111
|
+
@com.ping("Ready to dough in")
|
112
|
+
puts Rainbow("Ready to dough in").green
|
113
|
+
|
114
|
+
# pour in grain
|
115
|
+
|
116
|
+
print Rainbow("Confirm when you're done with dough-in (y): ").yellow
|
117
|
+
confirm ? nil : abort
|
118
|
+
true
|
119
|
+
end
|
124
120
|
|
125
|
-
|
126
|
-
|
121
|
+
def mash
|
122
|
+
@brewer.sv(@recipe.mash_temp)
|
127
123
|
|
128
|
-
|
129
|
-
|
130
|
-
@brewer.wait(@recipe.mash_time)
|
131
|
-
@com.ping("🍺 Mash complete 🍺. Check for starch conversion.")
|
132
|
-
puts Rainbow("Mash complete").green
|
133
|
-
puts "Check for starch conversion"
|
134
|
-
end
|
124
|
+
puts Rainbow("Mash started. This will take a while.").green
|
125
|
+
@com.ping("Mash started. This will take a while.")
|
135
126
|
|
136
|
-
|
137
|
-
|
127
|
+
@brewer.relay_config({
|
128
|
+
'rims_to' => 'mash',
|
129
|
+
'pid' => 1,
|
130
|
+
'pump' => 1
|
131
|
+
})
|
138
132
|
|
139
|
-
|
133
|
+
@brewer.watch
|
134
|
+
@com.ping("Starting timer for #{to_minutes(@recipe.mash_time)} minutes.")
|
135
|
+
@brewer.wait(@recipe.mash_time)
|
136
|
+
@com.ping("🍺 Mash complete 🍺. Check for starch conversion.")
|
137
|
+
puts Rainbow("Mash complete").green
|
138
|
+
puts "Check for starch conversion"
|
139
|
+
end
|
140
140
|
|
141
|
-
|
142
|
-
|
141
|
+
def mashout
|
142
|
+
@com.ping("Start heating sparge water")
|
143
143
|
|
144
|
-
|
145
|
-
@brewer.watch
|
146
|
-
@com.ping("Mashout temperature (#{@brewer.pv}) reached. Mashout complete.")
|
147
|
-
end
|
144
|
+
@brewer.sv(@recipe.mashout_temp)
|
148
145
|
|
149
|
-
|
150
|
-
|
151
|
-
|
146
|
+
@brewer.relay_config({
|
147
|
+
'pid' => 1,
|
148
|
+
'pump' => 1
|
149
|
+
})
|
150
|
+
@com.ping("Heating to #{@brewer.sv}... this could take a few minutes.")
|
151
|
+
@brewer.watch
|
152
|
+
@com.ping("Mashout complete.")
|
153
|
+
end
|
152
154
|
|
153
|
-
|
154
|
-
|
155
|
+
def sparge
|
156
|
+
print Rainbow("Is the sparge water heated to the correct temperature? ").yellow
|
157
|
+
confirm ? nil : abort
|
155
158
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
159
|
+
@brewer.relay_config({
|
160
|
+
'hlt_to' => 'mash',
|
161
|
+
'hlt' => 1
|
162
|
+
})
|
160
163
|
|
161
|
-
|
162
|
-
|
164
|
+
print "Waiting for 10 seconds. "
|
165
|
+
puts Rainbow("Regulate sparge balance.").yellow
|
166
|
+
puts "(ctrl-c to abort proccess)"
|
167
|
+
@brewer.wait(10)
|
163
168
|
|
164
|
-
|
169
|
+
@brewer.relay_config({
|
170
|
+
'rims_to' => 'boil',
|
171
|
+
'pump' => 1
|
172
|
+
})
|
165
173
|
|
166
|
-
|
167
|
-
confirm ? nil : abort
|
174
|
+
@com.ping("Please check the sparge balance and ignite boil tun burner")
|
168
175
|
|
169
|
-
|
170
|
-
|
176
|
+
print Rainbow("Waiting until intervention to turn off pump (y): ").yellow
|
177
|
+
confirm ? nil : abort
|
171
178
|
|
172
|
-
|
173
|
-
|
179
|
+
@brewer.relay_config({
|
180
|
+
'pid' => 0,
|
181
|
+
'pump' => 0,
|
182
|
+
'hlt' => 0
|
183
|
+
})
|
184
|
+
true
|
185
|
+
end
|
174
186
|
|
175
|
-
|
176
|
-
|
187
|
+
def top_off
|
188
|
+
@brewer.relay_config({
|
189
|
+
'hlt_to' => 'boil',
|
190
|
+
'hlt' => 1
|
191
|
+
})
|
177
192
|
|
178
|
-
|
193
|
+
print Rainbow("waiting for intervention to turn off hlt (y): ").yellow
|
194
|
+
confirm ? nil : abort
|
179
195
|
|
180
|
-
|
181
|
-
confirm ? nil : abort
|
196
|
+
@brewer.hlt(0)
|
182
197
|
|
183
|
-
|
198
|
+
@com.ping('Topping off complete')
|
199
|
+
puts Rainbow("Topping off complete").green
|
200
|
+
end
|
184
201
|
|
185
|
-
|
186
|
-
|
187
|
-
|
202
|
+
def boil
|
203
|
+
puts "Timers started... You'll be notified when you need to add hops."
|
204
|
+
@com.ping("starting boil procedure")
|
205
|
+
@brewer.wait(to_seconds(5))
|
206
|
+
@com.ping("Add boil hops")
|
207
|
+
@brewer.wait(to_seconds(40))
|
208
|
+
@com.ping("Add flovering hops")
|
209
|
+
@brewer.wait(to_seconds(13))
|
210
|
+
@com.ping("Add finishing hops")
|
211
|
+
@brewer.wait(30)
|
212
|
+
@com.ping("Done.")
|
213
|
+
puts Rainbow("Done.").green
|
214
|
+
true
|
215
|
+
end
|
188
216
|
|
189
|
-
def boil
|
190
|
-
@com.ping("starting boil procedure")
|
191
|
-
@brewer.wait(to_seconds(5))
|
192
|
-
@com.ping("Add boil hops")
|
193
|
-
@brewer.wait(to_seconds(40))
|
194
|
-
@com.ping("Add flovering hops")
|
195
|
-
@brewer.wait(to_seconds(13))
|
196
|
-
@com.ping("Add finishing hops")
|
197
|
-
@brewer.wait(30)
|
198
|
-
@com.ping("Done.")
|
199
|
-
puts Rainbow("Done.").green
|
200
217
|
end
|
201
|
-
|
202
218
|
end
|