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 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