brewer 0.0.89 β 0.0.90
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/README.md +1 -1
- data/Rakefile +0 -0
- data/bin/brewer +3 -2
- data/bin/brewer-server +2 -7
- data/lib/brewer/adaptibrew.rb +13 -2
- data/lib/brewer/brewer.rb +76 -35
- data/lib/brewer/helpers.rb +15 -6
- data/lib/brewer/procedures.rb +22 -18
- data/lib/brewer/recipe.rb +61 -17
- data/lib/brewer/{communicator.rb β slacker.rb} +16 -27
- data/lib/gems.rb +2 -0
- data/spec/brewer_spec.rb +0 -0
- data/spec/hardware_spec.rb +0 -0
- data/views/index.erb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff9777547e993c71abde8a3cb0ef655b1e35af34
|
4
|
+
data.tar.gz: 131e57b9e7b484407d52c7f212f1f2f5992de946
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0d92e3c6f570b4f8d6a522d305438dd28118d4d99c48cfd792672f808f3f1f915a48699285bb9db8d81b8bca168e2d51b2319dd0d97a42814e9721365e1e619
|
7
|
+
data.tar.gz: c9f8e759f63d4e6265f6ad1a4ebc9c8060602dbc19860c706c26472c31bbc430ad29eab8a0b3c10a3923af43cb1f3ed263e8037f5846c51e5dd3ff1641c6f556
|
data/README.md
CHANGED
data/Rakefile
CHANGED
File without changes
|
data/bin/brewer
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
require_relative "../lib/brewer"
|
3
3
|
|
4
4
|
adaptibrew = Brewer::Adaptibrew.new
|
5
|
-
|
5
|
+
slack = Brewer::Slacker.new
|
6
6
|
brewer = Brewer::Brewer.new
|
7
7
|
procedures = Brewer::Procedures.new
|
8
|
+
|
8
9
|
puts "πΊ have fun πΊ"
|
9
|
-
binding.pry
|
10
|
+
binding.pry(quiet: true)
|
10
11
|
# πΊπΊπΊ
|
data/bin/brewer-server
CHANGED
@@ -1,9 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'sinatra/base'
|
3
|
-
require "rainbow"
|
4
|
-
require 'rack-flash'
|
5
|
-
|
6
|
-
require_relative "../lib/gems"
|
7
2
|
require_relative "../lib/brewer"
|
8
3
|
|
9
4
|
include Brewer
|
@@ -28,8 +23,8 @@ module Brewer
|
|
28
23
|
end
|
29
24
|
|
30
25
|
# Configuration
|
31
|
-
set :bind, '0.0.0.0'
|
32
26
|
set :port, port
|
27
|
+
set :bind, '0.0.0.0'
|
33
28
|
set :views, Proc.new { File.join(File.expand_path("..", __dir__), "views") }
|
34
29
|
enable :run
|
35
30
|
enable :sessions
|
@@ -42,7 +37,6 @@ module Brewer
|
|
42
37
|
erb :not_found
|
43
38
|
end
|
44
39
|
|
45
|
-
|
46
40
|
get '/' do
|
47
41
|
@relays_status = $brewer.relays_status
|
48
42
|
@pid_status = $brewer.pid
|
@@ -53,6 +47,7 @@ module Brewer
|
|
53
47
|
post '/apply-relay-config' do
|
54
48
|
$brewer.relay_config(params)
|
55
49
|
flash[:config_done] = "Relay Configuration Applied"
|
50
|
+
|
56
51
|
redirect '/'
|
57
52
|
end
|
58
53
|
|
data/lib/brewer/adaptibrew.rb
CHANGED
@@ -3,18 +3,29 @@ require_relative "helpers.rb"
|
|
3
3
|
include Helpers
|
4
4
|
|
5
5
|
module Brewer
|
6
|
+
# This class handles the adaptibrew repo
|
7
|
+
# It is stored in ~/.brewer/adaptibrew/
|
6
8
|
class Adaptibrew
|
7
9
|
|
10
|
+
def initialize
|
11
|
+
if !Dir.exists?(adaptibrew_dir)
|
12
|
+
Dir.mkdir(adaptibrew_dir)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
8
16
|
# This will clone adaptibrew into ~/.brewer/adaptibrew/
|
9
17
|
def clone
|
10
18
|
raise "π Cannot clone, no network connection" unless network?
|
19
|
+
|
11
20
|
if !Dir.exists?(adaptibrew_dir)
|
12
21
|
Git.clone('https://github.com/llamicron/adaptibrew.git', 'adaptibrew', :path => brewer_dir)
|
13
22
|
end
|
23
|
+
|
14
24
|
self
|
15
25
|
end
|
16
26
|
|
17
27
|
# Danger zone...
|
28
|
+
# This deletes adaptibrew
|
18
29
|
def clear
|
19
30
|
# :nocov: since this requires network to be off
|
20
31
|
if !network?
|
@@ -27,8 +38,7 @@ module Brewer
|
|
27
38
|
end
|
28
39
|
|
29
40
|
# This is a good catch-all method
|
30
|
-
#
|
31
|
-
# If it is, it will delete and re-clone
|
41
|
+
# This deletes and re-clones adaptibrew
|
32
42
|
def refresh
|
33
43
|
raise "π Cannot refresh, no network connection" unless network?
|
34
44
|
clear
|
@@ -36,6 +46,7 @@ module Brewer
|
|
36
46
|
self
|
37
47
|
end
|
38
48
|
|
49
|
+
# Returns true if adaptibrew is present
|
39
50
|
def present?
|
40
51
|
return Dir.exists?(adaptibrew_dir) ? true : false
|
41
52
|
end
|
data/lib/brewer/brewer.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require_relative "../brewer"
|
2
2
|
|
3
3
|
module Brewer
|
4
|
+
# This class handles the physical brewing rig.
|
5
|
+
# Turning on valves, the pump, RIMS and such
|
4
6
|
class Brewer
|
5
7
|
|
6
8
|
attr_reader :base_path
|
7
9
|
attr_accessor :temps, :relays
|
8
10
|
|
9
11
|
def initialize
|
12
|
+
if !Dir.exists?(brewer_dir)
|
13
|
+
Dir.mkdir(brewer_dir)
|
14
|
+
end
|
10
15
|
@base_path = Dir.home + '/.brewer'
|
11
16
|
Settings.new
|
12
17
|
@temps = {}
|
@@ -14,26 +19,20 @@ module Brewer
|
|
14
19
|
|
15
20
|
public
|
16
21
|
|
17
|
-
#
|
18
|
-
# general utilities for the brewer class
|
19
|
-
|
22
|
+
# sleeps for a number of seconds
|
20
23
|
def wait(time=30)
|
21
24
|
sleep(time.to_f)
|
22
|
-
|
25
|
+
self
|
23
26
|
end
|
24
27
|
|
25
|
-
# Runs an adaptibrew script
|
26
|
-
# Output will be stored in @out
|
27
|
-
# you may see `echo` quite a bit. This will almost always be directly after calling a script
|
28
|
-
# It will be set to the output of the last script. I can't just return the output because i need to return self
|
28
|
+
# Runs an adaptibrew script (written in python)
|
29
29
|
def script(script, params=nil)
|
30
30
|
`python #{@base_path}/adaptibrew/#{script}.py #{params}`.chomp
|
31
31
|
end
|
32
32
|
|
33
33
|
|
34
|
-
#
|
35
|
-
#
|
36
|
-
|
34
|
+
# Turns the pump on and off, or returns the status if no arg
|
35
|
+
# Turning the pump off will turn the pid off too, as it should not be on when the pump is off
|
37
36
|
def pump(state="status")
|
38
37
|
if state == "status"
|
39
38
|
return relay_status($settings['pumpRelay'])
|
@@ -49,7 +48,7 @@ module Brewer
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
# Turns PID on or off, or gets
|
51
|
+
# Turns PID on or off, or gets status if no arg is provided
|
53
52
|
def pid(state="status")
|
54
53
|
if state == "status"
|
55
54
|
return {
|
@@ -68,6 +67,7 @@ module Brewer
|
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
70
|
+
# Sets the setpoint value (sv) on the PID, or returns the current SV
|
71
71
|
def sv(temp=nil)
|
72
72
|
if temp
|
73
73
|
return script('set_sv', temp).to_f
|
@@ -75,25 +75,74 @@ module Brewer
|
|
75
75
|
script('get_sv').to_f
|
76
76
|
end
|
77
77
|
|
78
|
+
# Returns the proccess value (this one can't be changed)
|
78
79
|
def pv
|
79
80
|
script('get_pv').to_f
|
80
81
|
end
|
81
82
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
# This method will wait until the pv >= sv
|
84
|
+
# Basically when the mash tun is at the set temperate, it will ping and return self.
|
85
|
+
# It will also display a status table every 2 seconds
|
86
|
+
# :nocov:
|
87
|
+
def watch
|
88
|
+
until pv >= sv do
|
89
|
+
wait(2)
|
86
90
|
end
|
91
|
+
Slacker.new.ping("Temperature is now at #{pv.to_f} F")
|
92
|
+
self
|
93
|
+
end
|
94
|
+
# :nocov:
|
95
|
+
|
96
|
+
# This will display an updated status table every second
|
97
|
+
def monitor
|
98
|
+
while true do
|
99
|
+
# Making a new table with TerminalTable takes about 1 second. I assign
|
100
|
+
# it here so it has time to start up, and there's minimal lag between clearing
|
101
|
+
# and displaying the table
|
102
|
+
table = status_table
|
103
|
+
wait(1)
|
104
|
+
clear_screen
|
105
|
+
puts table
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# This returns a status table
|
110
|
+
def status_table
|
111
|
+
status_table_rows = [
|
112
|
+
["Current Temp", pv],
|
113
|
+
["Set Value Temp", sv],
|
114
|
+
["PID is: ", pid['pid_running'].to_b ? "on" : "off"],
|
115
|
+
["Pump is: ", pump]
|
116
|
+
]
|
117
|
+
|
118
|
+
status_table = Terminal::Table.new :headings => ["Item", "Status"], :rows => status_table_rows
|
119
|
+
status_table
|
120
|
+
end
|
121
|
+
|
122
|
+
# Turns a relay on or off
|
123
|
+
def relay(relay, state)
|
87
124
|
script("set_relay", "#{relay} #{state}")
|
88
125
|
true
|
89
126
|
end
|
90
127
|
|
128
|
+
# Returns the status of a single relay
|
129
|
+
def relay_status(relay)
|
130
|
+
if script("get_relay_status", "#{relay}").include? "on"
|
131
|
+
return "on"
|
132
|
+
else
|
133
|
+
return "off"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns the status of all relays
|
91
138
|
def all_relays_status
|
92
139
|
output = script("get_relay_status_test").split("\n")
|
93
140
|
output.shift(3)
|
94
141
|
return output
|
95
142
|
end
|
96
143
|
|
144
|
+
# This returns a prettier version of all_relays_status, and only returns the
|
145
|
+
# relays in use, being 0-3.
|
97
146
|
def relays_status
|
98
147
|
statuses = {}
|
99
148
|
all_relays_status.shift(4).each do |status|
|
@@ -101,9 +150,12 @@ module Brewer
|
|
101
150
|
relay_names = $settings.select { |key, value| key.to_s.match(/Relay/) }
|
102
151
|
statuses[relay_names.key(relay_num.to_i)] = status
|
103
152
|
end
|
104
|
-
|
153
|
+
statuses
|
105
154
|
end
|
106
155
|
|
156
|
+
# Give this a relay configuration hash and it will set the relays to that configuration
|
157
|
+
# eg. {'hlt' => 0, 'rims_to' => 'boil', 'pump' => 1}
|
158
|
+
# This is so that we can set multiple valves at effectively the same time
|
107
159
|
def relay_config(params)
|
108
160
|
raise "Params must be a hash" unless params.is_a? Hash
|
109
161
|
params.each do |method, setting|
|
@@ -114,43 +166,32 @@ module Brewer
|
|
114
166
|
end
|
115
167
|
end
|
116
168
|
|
117
|
-
|
118
|
-
if script("get_relay_status", "#{relay}").include? "on"
|
119
|
-
return "on"
|
120
|
-
else
|
121
|
-
return "off"
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
# :nocov:
|
126
|
-
def watch
|
127
|
-
until pv >= sv do
|
128
|
-
wait(2)
|
129
|
-
end
|
130
|
-
Communicator.new.ping("Temperature is now at #{pv.to_f} F")
|
131
|
-
self
|
132
|
-
end
|
133
|
-
# :nocov:
|
134
|
-
|
169
|
+
# Diverts rims valve to mash or boil tun
|
135
170
|
def rims_to(location)
|
136
171
|
if location == "mash"
|
137
172
|
# we ended up swapping this relay, so the name is backwards
|
138
173
|
relay($settings['rimsToMashRelay'], 0)
|
139
174
|
elsif location == "boil"
|
140
175
|
relay($settings['rimsToMashRelay'], 1)
|
176
|
+
else
|
177
|
+
raise "Not a valid location for rims valve"
|
141
178
|
end
|
142
179
|
self
|
143
180
|
end
|
144
181
|
|
182
|
+
# Diverts hlt valve to mash or boil tun
|
145
183
|
def hlt_to(location)
|
146
184
|
if location == "mash"
|
147
185
|
relay($settings['spargeToMashRelay'], 0)
|
148
186
|
elsif location == "boil"
|
149
187
|
relay($settings['spargeToMashRelay'], 1)
|
188
|
+
else
|
189
|
+
raise "Not a valid location for the hlt valve"
|
150
190
|
end
|
151
191
|
self
|
152
192
|
end
|
153
193
|
|
194
|
+
# Opens or closes hlt valve
|
154
195
|
def hlt(state)
|
155
196
|
relay($settings['spargeRelay'], state)
|
156
197
|
self
|
data/lib/brewer/helpers.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative "../gems"
|
2
2
|
|
3
|
+
# Just some helper methods
|
3
4
|
module Helpers
|
4
5
|
|
5
6
|
# Returns the current time
|
@@ -8,16 +9,13 @@ module Helpers
|
|
8
9
|
Time.now.strftime("%m/%d/%Y %H:%M")
|
9
10
|
end
|
10
11
|
|
11
|
-
def view(view)
|
12
|
-
File.open(File.join(__dir__ + "/../../views/#{view}.html.erb"))
|
13
|
-
end
|
14
|
-
|
15
12
|
# Returns true if there is a network connection
|
16
13
|
def network?
|
17
14
|
connection = Net::Ping::TCP.new('google.com', 80, 5)
|
18
15
|
connection.ping?
|
19
16
|
end
|
20
17
|
|
18
|
+
# waits for user input, if 'y' return true, else return false
|
21
19
|
def confirm(input=gets.chomp)
|
22
20
|
if input.to_b
|
23
21
|
return true
|
@@ -25,26 +23,37 @@ module Helpers
|
|
25
23
|
false
|
26
24
|
end
|
27
25
|
|
26
|
+
# Converts seconds to minutes
|
28
27
|
def to_minutes(seconds)
|
29
28
|
seconds.to_f / 60
|
30
29
|
end
|
31
30
|
|
31
|
+
# Converts minutes to seconds
|
32
32
|
def to_seconds(minutes)
|
33
33
|
minutes.to_f * 60
|
34
34
|
end
|
35
35
|
|
36
|
+
# Clears the terminal screen
|
36
37
|
def clear_screen
|
37
38
|
Gem.win_platform? ? (system "cls") : (system "clear")
|
38
39
|
end
|
39
40
|
|
41
|
+
# Returns the path of the ~/.brewer directory, where everything is stored
|
40
42
|
def brewer_dir(path="")
|
41
|
-
|
43
|
+
Dir.home + "/.brewer/#{path}"
|
42
44
|
end
|
43
45
|
|
46
|
+
# Returns the path of the adaptibrew directory
|
47
|
+
# ~/.brewer/adaptibrew/
|
44
48
|
def adaptibrew_dir(path="")
|
45
|
-
|
49
|
+
brewer_dir + "adaptibrew/#{path}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def recipe_dir(path="")
|
53
|
+
brewer_dir + "recipes/#{path}"
|
46
54
|
end
|
47
55
|
|
56
|
+
# Captures standard output, mostly used for testing
|
48
57
|
def capture_stdout(&block)
|
49
58
|
original_stdout = $stdout
|
50
59
|
$stdout = fake = StringIO.new
|
data/lib/brewer/procedures.rb
CHANGED
@@ -7,14 +7,10 @@ module Brewer
|
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
@brewer = Brewer.new
|
10
|
-
@com =
|
10
|
+
@com = Slacker.new
|
11
11
|
@recipe = Recipe.new(@brewer)
|
12
12
|
end
|
13
13
|
|
14
|
-
# def minified_master(recipe_vars)
|
15
|
-
# @recipe.get_recipe_vars(recipe_vars)
|
16
|
-
# end
|
17
|
-
|
18
14
|
def master
|
19
15
|
@recipe.get_recipe_vars
|
20
16
|
boot
|
@@ -46,7 +42,7 @@ module Brewer
|
|
46
42
|
|
47
43
|
# :nocov:
|
48
44
|
def heat_strike_water
|
49
|
-
puts Rainbow("About to heat strike water").
|
45
|
+
puts Rainbow("About to heat strike water").green
|
50
46
|
|
51
47
|
# Confirm strike water is in the mash tun
|
52
48
|
print Rainbow("Is the strike water in the mash tun? ").yellow
|
@@ -61,11 +57,9 @@ module Brewer
|
|
61
57
|
|
62
58
|
# confirm RIMS relay is on
|
63
59
|
@brewer.rims_to('mash')
|
64
|
-
puts "RIMS-to-mash relay is now on"
|
65
60
|
|
66
61
|
# turn on pump
|
67
62
|
@brewer.pump(1)
|
68
|
-
puts "Pump is now on"
|
69
63
|
|
70
64
|
print Rainbow("Is the pump running properly? ").yellow
|
71
65
|
unless confirm
|
@@ -83,13 +77,13 @@ module Brewer
|
|
83
77
|
|
84
78
|
# calculate strike temp & set PID to strike temp
|
85
79
|
# this sets PID SV to calculated strike temp automagically
|
86
|
-
@brewer.sv(@recipe.strike_water_temp)
|
80
|
+
@brewer.sv(@recipe.vars['strike_water_temp'])
|
87
81
|
puts "SV has been set to calculated strike water temp"
|
88
82
|
# turn on RIMS heater
|
89
83
|
@brewer.pid(1)
|
90
84
|
|
91
85
|
# measure current strike water temp and save
|
92
|
-
@recipe.starting_strike_temp = @brewer.pv
|
86
|
+
@recipe.vars['starting_strike_temp'] = @brewer.pv
|
93
87
|
puts "current strike water temp is #{@brewer.pv}."
|
94
88
|
puts "Heating to #{@brewer.sv}"
|
95
89
|
|
@@ -119,7 +113,7 @@ module Brewer
|
|
119
113
|
end
|
120
114
|
|
121
115
|
def mash
|
122
|
-
@brewer.sv(@recipe.mash_temp)
|
116
|
+
@brewer.sv(@recipe.vars['mash_temp'])
|
123
117
|
|
124
118
|
puts Rainbow("Mash started. This will take a while.").green
|
125
119
|
@com.ping("Mash started. This will take a while.")
|
@@ -131,8 +125,8 @@ module Brewer
|
|
131
125
|
})
|
132
126
|
|
133
127
|
@brewer.watch
|
134
|
-
@com.ping("Starting timer for #{to_minutes(@recipe.mash_time)} minutes.")
|
135
|
-
@brewer.wait(@recipe.mash_time)
|
128
|
+
@com.ping("Starting timer for #{to_minutes(@recipe.vars['mash_time'])} minutes.")
|
129
|
+
@brewer.wait(@recipe.vars['mash_time'])
|
136
130
|
@com.ping("πΊ Mash complete πΊ. Check for starch conversion.")
|
137
131
|
puts Rainbow("Mash complete").green
|
138
132
|
puts "Check for starch conversion"
|
@@ -140,22 +134,28 @@ module Brewer
|
|
140
134
|
|
141
135
|
def mashout
|
142
136
|
@com.ping("Start heating sparge water")
|
137
|
+
puts Rainbow("start heating sparge water").yellow
|
138
|
+
puts Rainbow("Mashout started").green
|
143
139
|
|
144
|
-
@brewer.sv(@recipe.mashout_temp)
|
140
|
+
@brewer.sv(@recipe.vars['mashout_temp'])
|
145
141
|
|
146
142
|
@brewer.relay_config({
|
147
143
|
'pid' => 1,
|
148
144
|
'pump' => 1
|
149
145
|
})
|
150
146
|
@com.ping("Heating to #{@brewer.sv}... this could take a few minutes.")
|
147
|
+
puts Rainbow("Heating to #{@brewer.sv}... this could take a few minutes.").yellow
|
151
148
|
@brewer.watch
|
152
149
|
@com.ping("Mashout complete.")
|
150
|
+
puts Rainbow("Mashout complete").green
|
153
151
|
end
|
154
152
|
|
155
153
|
def sparge
|
156
154
|
print Rainbow("Is the sparge water heated to the correct temperature? ").yellow
|
157
155
|
confirm ? nil : abort
|
158
156
|
|
157
|
+
puts Rainbow("Sparging started").green
|
158
|
+
|
159
159
|
@brewer.relay_config({
|
160
160
|
'hlt_to' => 'mash',
|
161
161
|
'hlt' => 1
|
@@ -163,7 +163,6 @@ module Brewer
|
|
163
163
|
|
164
164
|
print "Waiting for 10 seconds. "
|
165
165
|
puts Rainbow("Regulate sparge balance.").yellow
|
166
|
-
puts "(ctrl-c to abort proccess)"
|
167
166
|
@brewer.wait(10)
|
168
167
|
|
169
168
|
@brewer.relay_config({
|
@@ -172,19 +171,24 @@ module Brewer
|
|
172
171
|
})
|
173
172
|
|
174
173
|
@com.ping("Please check the sparge balance and ignite boil tun burner")
|
174
|
+
puts Rainbow("Ignite boil tun burner").yellow
|
175
175
|
|
176
|
-
print Rainbow("Waiting
|
177
|
-
confirm ? nil :
|
176
|
+
print Rainbow("Waiting for intervention to turn off pump (y): ").yellow
|
177
|
+
confirm ? nil : nil
|
178
178
|
|
179
179
|
@brewer.relay_config({
|
180
180
|
'pid' => 0,
|
181
181
|
'pump' => 0,
|
182
182
|
'hlt' => 0
|
183
183
|
})
|
184
|
+
|
185
|
+
puts Rainbow("Sparging complete").green
|
184
186
|
true
|
185
187
|
end
|
186
188
|
|
187
189
|
def top_off
|
190
|
+
puts Rainbow("Top off started").green
|
191
|
+
|
188
192
|
@brewer.relay_config({
|
189
193
|
'hlt_to' => 'boil',
|
190
194
|
'hlt' => 1
|
@@ -200,7 +204,7 @@ module Brewer
|
|
200
204
|
end
|
201
205
|
|
202
206
|
def boil
|
203
|
-
puts "Timers started... You'll be notified when you need to add hops."
|
207
|
+
puts Rainbow("Timers started for 1 hour... You'll be notified when you need to add hops.").yellow
|
204
208
|
@com.ping("starting boil procedure")
|
205
209
|
@brewer.wait(to_seconds(5))
|
206
210
|
@com.ping("Add boil hops")
|
data/lib/brewer/recipe.rb
CHANGED
@@ -3,18 +3,28 @@ require_relative "../brewer"
|
|
3
3
|
module Brewer
|
4
4
|
class Recipe
|
5
5
|
|
6
|
-
attr_accessor :
|
6
|
+
attr_accessor :vars
|
7
7
|
|
8
8
|
def initialize(brewer)
|
9
9
|
@brewer = brewer
|
10
|
+
if !Dir.exists?(recipe_dir)
|
11
|
+
Dir.mkdir(recipe_dir)
|
12
|
+
end
|
13
|
+
@vars = Hash.new(0)
|
10
14
|
end
|
11
15
|
|
12
16
|
def get_recipe_vars(vars=false)
|
17
|
+
print "Enter a recipe name to load an existing recipe, or nothing to start a new one: "
|
18
|
+
name = gets.chomp.strip
|
19
|
+
|
20
|
+
unless name.empty?
|
21
|
+
load_recipe(name)
|
22
|
+
return true
|
23
|
+
end
|
24
|
+
|
13
25
|
if vars
|
14
26
|
raise "Vars must be a hash" unless vars.is_a? Hash
|
15
|
-
vars
|
16
|
-
instance_variable_set("@" + recipe_key, value)
|
17
|
-
end
|
27
|
+
@vars = vars
|
18
28
|
end
|
19
29
|
|
20
30
|
puts Rainbow("Variables for the brew").green
|
@@ -22,35 +32,69 @@ module Brewer
|
|
22
32
|
get_strike_temp
|
23
33
|
|
24
34
|
print Rainbow("Enter mash temperature: ").yellow
|
25
|
-
@mash_temp = gets.chomp.to_f
|
35
|
+
@vars['mash_temp'] = gets.chomp.to_f
|
26
36
|
print Rainbow("Enter mash time in minutes: ").yellow
|
27
|
-
@mash_time = to_seconds(gets.chomp.to_f)
|
37
|
+
@vars['mash_time'] = to_seconds(gets.chomp.to_f)
|
28
38
|
|
29
39
|
print Rainbow("Enter mashout temp: ").yellow
|
30
|
-
@mashout_temp = gets.chomp.to_f
|
40
|
+
@vars['mashout_temp'] = gets.chomp.to_f
|
41
|
+
|
42
|
+
true
|
31
43
|
end
|
32
44
|
|
33
45
|
def get_strike_temp
|
34
46
|
print Rainbow("Input amount of water in quarts: ").yellow
|
35
|
-
@water = gets.chomp.to_f
|
47
|
+
@vars['water'] = gets.chomp.to_f
|
36
48
|
|
37
49
|
print Rainbow("Input amount of grain in lbs: ").yellow
|
38
|
-
@grain = gets.chomp.to_f
|
50
|
+
@vars['grain'] = gets.chomp.to_f
|
39
51
|
|
40
52
|
print Rainbow("Input current grain temp (#{@brewer.pv.to_s} F): ").yellow
|
41
|
-
@grain_temp = gets.chomp.to_f
|
42
|
-
if @grain_temp == ""
|
43
|
-
@grain_temp = @brewer.pv
|
53
|
+
@vars['grain_temp'] = gets.chomp.to_f
|
54
|
+
if @vars['grain_temp'] == ""
|
55
|
+
@vars['grain_temp'] = @brewer.pv
|
44
56
|
end
|
45
57
|
|
46
58
|
print Rainbow("Input desired mash temp (150 F): ").yellow
|
47
|
-
@desired_mash_temp = gets.chomp
|
48
|
-
if @desired_mash_temp == ""
|
49
|
-
@desired_mash_temp = 150
|
59
|
+
@vars['desired_mash_temp'] = gets.chomp
|
60
|
+
if @vars['desired_mash_temp'] == ""
|
61
|
+
@vars['desired_mash_temp'] = 150
|
50
62
|
end
|
51
|
-
@desired_mash_temp
|
63
|
+
@vars['desired_mash_temp']
|
64
|
+
|
65
|
+
@vars['strike_water_temp'] = @brewer.script('get_strike_temp', "#{@vars['water']} #{@vars['grain']} #{@vars['grain_temp']} #{@vars['desired_mash_temp']}").to_f
|
66
|
+
end
|
52
67
|
|
53
|
-
|
68
|
+
def store
|
69
|
+
print "Please enter a name for this recipe: "
|
70
|
+
name = gets.chomp
|
71
|
+
|
72
|
+
store = YAML::Store.new recipe_dir(name + ".yml")
|
73
|
+
store.transaction {
|
74
|
+
store["name"] = name
|
75
|
+
@vars.each do |k, v|
|
76
|
+
store[k] = v
|
77
|
+
end
|
78
|
+
store["created_on"] = time
|
79
|
+
}
|
80
|
+
return true
|
81
|
+
end
|
82
|
+
|
83
|
+
def load_recipe(recipe)
|
84
|
+
raise "Recipe does not exist" unless File.exists?(recipe_dir(recipe) + ".yml")
|
85
|
+
@vars = YAML.load(File.open(recipe_dir(recipe) + ".yml"))
|
86
|
+
puts "Recipe Loaded"
|
87
|
+
true
|
88
|
+
end
|
89
|
+
|
90
|
+
def list_recipes
|
91
|
+
recipes = Dir.entries(recipe_dir)
|
92
|
+
recipes.delete(".")
|
93
|
+
recipes.delete("..")
|
94
|
+
recipes.each do |recipe|
|
95
|
+
recipe.slice! ".yml"
|
96
|
+
end
|
97
|
+
return recipes
|
54
98
|
end
|
55
99
|
|
56
100
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require_relative "../brewer"
|
2
2
|
|
3
3
|
module Brewer
|
4
|
-
class
|
4
|
+
# This class is responsible for slack communication
|
5
|
+
class Slacker
|
5
6
|
|
6
7
|
attr_accessor :slack, :brewer
|
7
8
|
|
@@ -11,6 +12,7 @@ module Brewer
|
|
11
12
|
@slack = configure_slack
|
12
13
|
end
|
13
14
|
|
15
|
+
# This will look for a webhook in settings.yml and ask you for one if it doesn't find one
|
14
16
|
def configure_slack
|
15
17
|
unless @settings.settings['webhook_url']
|
16
18
|
print "Slack Webhook URL: "
|
@@ -22,48 +24,35 @@ module Brewer
|
|
22
24
|
return Slack::Notifier.new @settings.settings['webhook_url']
|
23
25
|
end
|
24
26
|
|
27
|
+
# This sends a message in slack.
|
28
|
+
# If an array is passed in, it will send it as one message with
|
29
|
+
# new lines between each array item
|
25
30
|
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
31
|
@slack.ping(message)
|
31
32
|
end
|
32
33
|
|
33
|
-
#
|
34
|
-
|
34
|
+
# This does the same thing as Brewer#monitor, but it also sends a slack message
|
35
|
+
# after a specified wait, normally 10 minutes
|
36
|
+
def monitor(delay=10)
|
35
37
|
while true do
|
38
|
+
table = @brewer.status_table
|
39
|
+
|
36
40
|
before_temp = @brewer.pv
|
37
41
|
@brewer.wait(to_seconds(delay))
|
38
42
|
diff = @brewer.pv - before_temp
|
39
43
|
|
44
|
+
clear_screen
|
45
|
+
puts table
|
46
|
+
|
40
47
|
ping([
|
41
48
|
"Current Temperature: #{@brewer.pid['pv_temp']} F",
|
42
49
|
"Set Value Temperature: #{@brewer.pid['sv_temp']} F",
|
43
50
|
"Current temperature has climed #{diff} F since #{delay} minute(s) ago",
|
44
|
-
"Sent at #{Time.now.strftime("%H:%M")}"
|
45
|
-
|
46
|
-
])
|
51
|
+
"Sent at #{Time.now.strftime("%H:%M")}"
|
52
|
+
].join("\n"))
|
47
53
|
end
|
48
54
|
true
|
49
55
|
end
|
50
56
|
|
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
|
-
]
|
59
|
-
|
60
|
-
status_table = Terminal::Table.new :headings ["Item", "Status"], :rows => status_table_rows
|
61
|
-
|
62
|
-
clear_screen
|
63
|
-
puts status_table
|
64
|
-
sleep(1)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
57
|
end
|
69
58
|
end
|
data/lib/gems.rb
CHANGED
data/spec/brewer_spec.rb
CHANGED
File without changes
|
data/spec/hardware_spec.rb
CHANGED
File without changes
|
data/views/index.erb
CHANGED
@@ -88,8 +88,8 @@
|
|
88
88
|
<br>
|
89
89
|
<!-- HLT on option -->
|
90
90
|
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="hlt">
|
91
|
-
<input type="hidden" name="hlt" value="
|
92
|
-
<input type="checkbox" id="hlt" name="hlt" value="
|
91
|
+
<input type="hidden" name="hlt" value="0">
|
92
|
+
<input type="checkbox" id="hlt" name="hlt" value="1" class="mdl-switch__input" <%= @relays_status['spargeRelay'].to_b ? "checked" : nil %>>
|
93
93
|
<span class="mdl-switch__label">HLT Flowing?</span>
|
94
94
|
</label>
|
95
95
|
<br><br><hr><br>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brewer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.90
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Sweeney
|
@@ -281,11 +281,11 @@ files:
|
|
281
281
|
- lib/brewer.rb
|
282
282
|
- lib/brewer/adaptibrew.rb
|
283
283
|
- lib/brewer/brewer.rb
|
284
|
-
- lib/brewer/communicator.rb
|
285
284
|
- lib/brewer/helpers.rb
|
286
285
|
- lib/brewer/procedures.rb
|
287
286
|
- lib/brewer/recipe.rb
|
288
287
|
- lib/brewer/settings.rb
|
288
|
+
- lib/brewer/slacker.rb
|
289
289
|
- lib/gems.rb
|
290
290
|
- spec/adaptibrew_spec.rb
|
291
291
|
- spec/brewer_spec.rb
|