brewer 0.0.89 β 0.0.90
Sign up to get free protection for your applications and to get access to all the features.
- 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
|