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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d8bb3d0d515993f778a4aeac172e3eafef9402c8
4
- data.tar.gz: 0e7c1aa4c511b6a441c575afaed60e43fb594dbe
3
+ metadata.gz: ff9777547e993c71abde8a3cb0ef655b1e35af34
4
+ data.tar.gz: 131e57b9e7b484407d52c7f212f1f2f5992de946
5
5
  SHA512:
6
- metadata.gz: 8ca12ae113bcf9d5eb5b16e07c4af5a18f147fb8ac3b11fb4e6923c7f578bafd4416b4d592ad2b85162f07c696635da0d9a7f19072b3d9b609c13e0e93b0fcc9
7
- data.tar.gz: 40658e53decd3f843ee1eb33c7b7d3cfa87fb848686a8b870219745d0c504881a81b95f1b3a945d931dd692d2fc1f1f9a9ecf5be670a479dcc57e63c43e22dea
6
+ metadata.gz: f0d92e3c6f570b4f8d6a522d305438dd28118d4d99c48cfd792672f808f3f1f915a48699285bb9db8d81b8bca168e2d51b2319dd0d97a42814e9721365e1e619
7
+ data.tar.gz: c9f8e759f63d4e6265f6ad1a4ebc9c8060602dbc19860c706c26472c31bbc430ad29eab8a0b3c10a3923af43cb1f3ed263e8037f5846c51e5dd3ff1641c6f556
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Brewer [![Build Status](https://travis-ci.org/llamicron/brewer.svg?branch=master)](https://travis-ci.org/llamicron/brewer)
1
+ # Brewer
2
2
  ### A Ruby gem for [adaptiman/adaptibrew](http://github.com/adaptiman/adaptibrew)
3
3
 
4
4
  # Disclaimer
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
- com = Brewer::Communicator.new
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
  # 🍺🍺🍺
@@ -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
 
@@ -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
- # If it's not there, it will clone.
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
@@ -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
- # Brewer methods ------------------------------------------------------
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
- true
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
- # Adaptibrew methods ----------------------------------------------
35
- # for working with the rig
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 state if no arg is provided
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
- def relay(relay, state)
83
- # If you try to turn the relay to a state that it is already in, this skips the wait
84
- if relay_status(relay).to_b == state.to_b
85
- return true
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
- return statuses
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
- def relay_status(relay)
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
@@ -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
- return Dir.home + "/.brewer/#{path}"
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
- return brewer_dir + "adaptibrew/#{path}"
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
@@ -7,14 +7,10 @@ module Brewer
7
7
 
8
8
  def initialize
9
9
  @brewer = Brewer.new
10
- @com = Communicator.new
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").yellow
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 until intervention to turn off pump (y): ").yellow
177
- confirm ? nil : abort
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")
@@ -3,18 +3,28 @@ require_relative "../brewer"
3
3
  module Brewer
4
4
  class Recipe
5
5
 
6
- attr_accessor :mash_temp, :mash_time, :mashout_temp, :water, :grain, :grain_temp, :desired_mash_temp, :strike_water_temp, :starting_strike_temp
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.each do |recipe_key, value|
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
- @strike_water_temp = @brewer.script('get_strike_temp', "#{@water} #{@grain} #{@grain_temp} #{@desired_mash_temp}").to_f
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 Communicator
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
- # TODO: test these methods
34
- def slack_monitor(delay=10)
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
@@ -9,3 +9,5 @@ require 'net/ping'
9
9
  require 'wannabe_bool'
10
10
  require 'terminal-table'
11
11
  require "rainbow"
12
+ require 'rack-flash'
13
+ require 'sinatra/base'
File without changes
File without changes
@@ -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="false">
92
- <input type="checkbox" id="hlt" name="hlt" value="true" class="mdl-switch__input" <%= @relays_status['spargeRelay'].to_b ? "checked" : nil %>>
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.89
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