brewer 0.0.80 → 0.0.81

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: 011e5f126bfc6c5afd51cba59a158810d8ce1867
4
- data.tar.gz: b472cac7265388cee78da1b0de5f1aa133a615ea
3
+ metadata.gz: 4efd6b7847644421b3500fb85aa10f3ac00740d4
4
+ data.tar.gz: 2290dbd257f3326c69dd6dce62db32c1fb10edcb
5
5
  SHA512:
6
- metadata.gz: d234133b36b6122a18b7aede07e3244acd4f386e3c53812f85e761c4d78d785d9ea170025fd60eefba00641c397e52583597e5f6bc3378acd0f953f9d6bf2900
7
- data.tar.gz: dee89dc5063829a1df40acea9cf881d681ac7250fd984409c74d29e314977e3bfe29b3df24bed1cb7998e47d8906e8fb0eaf2d58be1ff1ee94a6cf02b1186b3a
6
+ metadata.gz: a6cd278c0b416367e8a2d442aaa9851672c63fbba5432b267aa0505fae8558ccd4e2743110e2a5a89c18547d2182041475245a94a2c3316425f42f289d1474ad
7
+ data.tar.gz: 7f92d9e6a6da4e4502c1ffa0571ed0b43a2b4983e999eb8c873c87d760298c819c5e3d4f2201b51a4a5c6de40b346bb9653ec42486cb4deeca97f40b7fe65d90
data/bin/brewer CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require_relative "../lib/autoload"
2
+ require_relative "../lib/brewer"
3
3
 
4
4
  adaptibrew = Adaptibrew.new.refresh
5
5
  com = Communicator.new
@@ -1,141 +1,15 @@
1
- require_relative "autoload"
2
-
3
- class Brewer
4
-
5
- attr_reader :base_path
6
- attr_accessor :temps
7
-
8
- def initialize
9
- @base_path = Dir.home + '/.brewer'
10
- Settings.new
11
- @temps = {}
12
- end
13
-
14
- public
15
-
16
- # Brewer methods ------------------------------------------------------
17
- # general utilities for the brewer class
18
-
19
- def wait(time=30)
20
- sleep(time.to_f)
21
- true
22
- end
23
-
24
- # Runs an adaptibrew script
25
- # Output will be stored in @out
26
- # you may see `echo` quite a bit. This will almost always be directly after calling a script
27
- # 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
- def script(script, params=nil)
29
- `python #{@base_path}/adaptibrew/#{script}.py #{params}`.chomp
30
- end
31
-
32
- # Adaptibrew methods ----------------------------------------------
33
- # for working with the rig
34
-
35
- def pump(state="status")
36
- if state == "status"
37
- return relay_status($settings['pumpRelay'])
38
- end
39
-
40
- if state == 1
41
- return script("set_pump_on")
42
- else
43
- if pid['pid_running'].to_b
44
- pid(0)
45
- end
46
- return script("set_pump_off")
47
- end
48
- end
49
-
50
- # Turns PID on or off, or gets state if no arg is provided
51
- def pid(state="status")
52
- if state == "status"
53
- return {
54
- 'pid_running' => script("is_pid_running"),
55
- 'sv_temp' => sv,
56
- 'pv_temp' => pv
57
- }
58
- end
59
-
60
- if state == 1
61
- script('set_pid_on')
62
- pump(1)
63
- return "Pump and PID are now on"
64
- else
65
- return script("set_pid_off")
66
- end
67
- end
68
-
69
- def sv(temp=nil)
70
- if temp
71
- return script('set_sv', temp).to_f
72
- end
73
- script('get_sv').to_f
74
- end
75
-
76
- def pv
77
- script('get_pv').to_f
78
- end
79
-
80
- def relay(relay, state)
81
- # If you try to turn the relay to a state that it is already in, this skips the wait
82
- if relay_status(relay).to_b == state.to_b
83
- return true
84
- end
85
- script("set_relay", "#{relay} #{state}")
86
- wait(10)
87
- true
88
- end
89
-
90
- def all_relays_status
91
- output = script("get_relay_status_test")
92
- puts output.split('\n')
93
- true
94
- end
95
-
96
- def relay_status(relay)
97
- if script("get_relay_status", "#{relay}").include? "on"
98
- return "on"
99
- else
100
- return "off"
101
- end
102
- end
103
-
104
- # :nocov:
105
- def watch
106
- until pv >= sv do
107
- wait(2)
108
- end
109
- self
110
- end
111
- # :nocov:
112
-
113
- def rims_to(location)
114
- if location == "mash"
115
- # we ended up swapping this relay, so the name is backwards
116
- relay($settings['rimsToMashRelay'], 0)
117
- elsif location == "boil"
118
- relay($settings['rimsToMashRelay'], 1)
119
- end
120
- self
121
- end
122
-
123
- def hlt_to(location)
124
- if location == "mash"
125
- relay($settings['spargeToMashRelay'], 0)
126
- elsif location == "boil"
127
- relay($settings['spargeToMashRelay'], 1)
128
- end
129
- self
130
- end
131
-
132
- def hlt(state)
133
- if state.to_b
134
- relay($settings['spargeRelay'], 1)
135
- elsif !state.to_b
136
- relay($settings['spargeRelay'], 0)
137
- end
138
- self
139
- end
140
-
141
- end
1
+ require "require_all"
2
+ require 'git'
3
+ require 'fileutils'
4
+ require 'slack-notifier'
5
+ require 'yaml'
6
+ require 'yaml/store'
7
+ require 'net/ping'
8
+ require 'ripl'
9
+ require 'wannabe_bool'
10
+ require 'terminal-table'
11
+ require "rainbow"
12
+
13
+ require_rel 'brewer/'
14
+
15
+ include Helpers
@@ -5,4 +5,4 @@ require 'simplecov'
5
5
  SimpleCov.command_name 'RSpec'
6
6
  SimpleCov.start
7
7
 
8
- require_relative "../lib/autoload"
8
+ require_relative "../lib/brewer"
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.80
4
+ version: 0.0.81
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Sweeney
@@ -248,14 +248,7 @@ files:
248
248
  - README.md
249
249
  - Rakefile
250
250
  - bin/brewer
251
- - lib/adaptibrew.rb
252
- - lib/autoload.rb
253
251
  - lib/brewer.rb
254
- - lib/communicator.rb
255
- - lib/helpers.rb
256
- - lib/procedures.rb
257
- - lib/recipe.rb
258
- - lib/settings.rb
259
252
  - spec/adaptibrew_spec.rb
260
253
  - spec/brewer_spec.rb
261
254
  - spec/hardware_spec.rb
@@ -1,45 +0,0 @@
1
- require_relative "autoload"
2
-
3
- # This is the 'manager' for the adaptibrew repo. It handles cloning and such.
4
- class Adaptibrew
5
-
6
- def initialize
7
- refresh
8
- end
9
-
10
- # This will clone adaptibrew into ~/.brewer/adaptibrew/
11
- def clone
12
- raise "🛑 Cannot clone, no network connection" unless network?
13
- if !Dir.exists?(adaptibrew_dir)
14
- Git.clone('https://github.com/llamicron/adaptibrew.git', 'adaptibrew', :path => brewer_dir)
15
- end
16
- self
17
- end
18
-
19
- # Danger zone...
20
- def clear
21
- # :nocov: since this requires network to be off
22
- if !network?
23
- print "Warning: you have no network connection. If you clear, you will not be able to clone again, and you'll be stuck without the adaptibrew source. Are you sure? "
24
- confirm ? nil : abort
25
- end
26
- # :nocov:
27
- FileUtils.rm_rf(adaptibrew_dir)
28
- self
29
- end
30
-
31
- # This is a good catch-all method
32
- # If it's not there, it will clone.
33
- # If it is, it will delete and re-clone
34
- def refresh
35
- raise "🛑 Cannot refresh, no network connection" unless network?
36
- clear
37
- clone
38
- self
39
- end
40
-
41
- def present?
42
- return Dir.exists?(adaptibrew_dir) ? true : false
43
- end
44
-
45
- end
@@ -1,15 +0,0 @@
1
- require "require_all"
2
- require 'git'
3
- require 'fileutils'
4
- require 'slack-notifier'
5
- require 'yaml'
6
- require 'yaml/store'
7
- require 'net/ping'
8
- require 'ripl'
9
- require 'wannabe_bool'
10
- require 'terminal-table'
11
- require "rainbow"
12
-
13
- require_rel '.'
14
-
15
- include Helpers
@@ -1,67 +0,0 @@
1
- require_relative "autoload"
2
-
3
- class Communicator
4
-
5
- attr_accessor :slack, :brewer
6
-
7
- def initialize
8
- @settings = Settings.new
9
- @brewer = Brewer.new
10
- @slack = configure_slack
11
- end
12
-
13
- def configure_slack
14
- unless @settings.settings['webhook_url']
15
- print "Slack Webhook URL: "
16
- webhook_url = gets.chomp
17
- @settings.add({
18
- 'webhook_url' => webhook_url
19
- })
20
- end
21
- return Slack::Notifier.new @settings.settings['webhook_url']
22
- end
23
-
24
- def ping(message="ping at #{Time.now}")
25
- if message.is_a? Array
26
- final = message.join("\n")
27
- @slack.ping(final)
28
- end
29
- @slack.ping(message)
30
- end
31
-
32
- # TODO: test these methods
33
- def slack_monitor(delay=10)
34
- while true do
35
- before_temp = @brewer.pv
36
- @brewer.wait(to_seconds(delay))
37
- diff = @brewer.pv - before_temp
38
-
39
- ping([
40
- "Current Temperature: #{@brewer.pid['pv_temp']} F",
41
- "Set Value Temperature: #{@brewer.pid['sv_temp']} F",
42
- "Current temperature has climed #{diff} F since #{delay} minute(s) ago",
43
- "Sent at #{Time.now.strftime("%H:%M")}",
44
- ""
45
- ])
46
- end
47
- true
48
- end
49
-
50
- def monitor
51
- while true do
52
- status_table_rows = [
53
- ["Current Temp", @brewer.pv],
54
- ["Set Value Temp", @brewer.sv],
55
- ["PID is: ", @brewer.pid['pid_running'].to_b ? "on" : "off"],
56
- ["Pump is: ", @brewer.pump]
57
- ]
58
-
59
- status_table = Terminal::Table.new :headings ["Item", "Status"], :rows => status_table_rows
60
-
61
- clear_screen
62
- puts status_table
63
- sleep(1)
64
- end
65
- end
66
-
67
- end
@@ -1,42 +0,0 @@
1
- require_relative "autoload"
2
-
3
- module Helpers
4
-
5
- # Formatted as: 03/07/2017 14:26
6
- def time
7
- Time.now.strftime("%m/%d/%Y %H:%M")
8
- end
9
-
10
- def network?
11
- connection = Net::Ping::TCP.new('google.com', 80, 5)
12
- connection.ping?
13
- end
14
-
15
- def confirm(input=gets.chomp)
16
- if input.to_b
17
- return true
18
- end
19
- false
20
- end
21
-
22
- def to_minutes(seconds)
23
- seconds.to_f / 60
24
- end
25
-
26
- def to_seconds(minutes)
27
- minutes.to_f * 60
28
- end
29
-
30
- def clear_screen
31
- Gem.win_platform? ? (system "cls") : (system "clear")
32
- end
33
-
34
- def brewer_dir(path="")
35
- return Dir.home + "/.brewer/#{path}"
36
- end
37
-
38
- def adaptibrew_dir(path="")
39
- return brewer_dir + "adaptibrew/#{path}"
40
- end
41
-
42
- end
@@ -1,202 +0,0 @@
1
- require_relative "autoload"
2
-
3
- class Procedures
4
-
5
- attr_accessor :com, :brewer, :recipe
6
-
7
- def initialize
8
- @brewer = Brewer.new
9
- @com = Communicator.new
10
- @recipe = Recipe.new(@brewer)
11
- end
12
-
13
- def master
14
- @recipe.get_recipe_vars
15
- boot
16
- heat_strike_water
17
- dough_in
18
- mash
19
- mashout
20
- sparge
21
- top_off
22
- boil
23
- end
24
-
25
- def boot
26
- puts Rainbow("booting...").yellow
27
- @brewer.pid(0)
28
- @brewer.pump(0)
29
- @brewer.rims_to('mash')
30
- @brewer.hlt_to('mash')
31
- @brewer.all_relays_status
32
- puts @brewer.pid
33
-
34
- puts Rainbow("Boot finished!").green
35
- @com.ping("🍺 boot finished 🍺")
36
- true
37
- end
38
-
39
- # :nocov:
40
- def heat_strike_water
41
- puts "heat-strike-water procedure started"
42
-
43
- # Confirm strike water is in the mash tun
44
- print Rainbow("Is the strike water in the mash tun? ").yellow
45
- # -> response
46
- confirm ? nil : abort
47
-
48
- # confirm return manifold is in the mash tun
49
- print Rainbow("Is the return manifold in the mash tun? ").yellow
50
- # -> response
51
- confirm ? nil : abort
52
-
53
- print Rainbow("Is the mash tun valve open? ").yellow
54
- confirm ? nil : abort
55
-
56
- # confirm RIMS relay is on
57
- @brewer.rims_to('mash')
58
- puts "RIMS-to-mash relay is now on"
59
-
60
- # turn on pump
61
- @brewer.pump(1)
62
- puts "Pump is now on"
63
-
64
- puts Rainbow("Is the pump running properly? ").yellow
65
- # TODO: Test this
66
- until confirm
67
- puts "restarting pump"
68
- @brewer.pump(0)
69
- @brewer.wait(2)
70
- @brewer.pump(1)
71
- end
72
-
73
- # confirm that strike water is circulating well
74
- print Rainbow("Is the strike water circulating well? ").yellow
75
- # -> response
76
- confirm ? nil : abort
77
-
78
-
79
- # calculate strike temp & set PID to strike temp
80
- # this sets PID SV to calculated strike temp automagically
81
- @brewer.sv(@recipe.strike_water_temp)
82
- puts "SV has been set to calculated strike water temp"
83
- # turn on RIMS heater
84
- @brewer.pid(1)
85
-
86
- # measure current strike water temp and save
87
- @recipe.starting_strike_temp = @brewer.pv
88
- puts "current strike water temp is #{@brewer.pv}. Saved."
89
- puts "Heating to #{@brewer.sv}"
90
-
91
- @com.ping("Strike water beginning to heat. This may take a few minutes.")
92
-
93
- # when strike temp is reached, @com.ping slack
94
- @brewer.watch
95
- @com.ping("Strike water heated to #{@brewer.pv}. Maintaining temperature.")
96
- puts Rainbow("Strike water heated. Maintaining temp.").green
97
- true
98
- end
99
- # :nocov:
100
-
101
- def dough_in
102
- # turn pump off
103
- @brewer.pump(0)
104
- # turn PID off
105
- @brewer.pid(0)
106
- @brewer.wait(3)
107
- @com.ping("Ready to dough in")
108
- puts Rainbow("Ready to dough in").green
109
-
110
- # pour in grain
111
-
112
- print Rainbow("Confirm when you're done with dough-in (y): ").yellow
113
- confirm ? nil : abort
114
- true
115
- end
116
-
117
- def mash
118
- @brewer.sv(@recipe.mash_temp)
119
-
120
- puts Rainbow("mash stated. This will take a while.").green
121
- @com.ping("Mash started. This will take a while.")
122
-
123
- @brewer.rims_to('mash')
124
-
125
- @brewer.pump(1)
126
- @brewer.pid(1)
127
-
128
- @brewer.watch
129
- @com.ping("Mash temp (#{@brewer.pv} F) reached. Starting timer for #{@recipe.mash_time} minutes.")
130
- @brewer.wait(@recipe.mash_time)
131
- @com.ping("🍺 Mash complete 🍺. Check for starch conversion.")
132
- puts Rainbow("Mash complete").green
133
- puts "Check for starch conversion"
134
- end
135
-
136
- def mashout
137
- @com.ping("Start heating sparge water")
138
-
139
- @brewer.sv(@recipe.mashout_temp)
140
-
141
- @brewer.pump(1)
142
- @brewer.pid(1)
143
-
144
- @com.ping("Heating to #{@brewer.sv}... this could take a few minutes.")
145
- @brewer.watch
146
- @com.ping("Mashout temperature (#{@brewer.pv}) reached. Mashout complete.")
147
- end
148
-
149
- def sparge
150
- print Rainbow("Is the sparge water heated to the correct temperature? ").yellow
151
- confirm ? nil : abort
152
-
153
- @brewer.hlt_to('mash')
154
- @brewer.hlt(1)
155
-
156
- print "Waiting for 10 seconds. "
157
- puts Rainbow("Regulate sparge balance.").yellow
158
- puts "(ctrl-c to abort proccess)"
159
- @brewer.wait(30)
160
-
161
- @brewer.rims_to('boil')
162
- @brewer.pump(1)
163
-
164
- @com.ping("Please check the sparge balance and ignite boil tun burner")
165
-
166
- puts Rainbow("Waiting until intervention to turn off pump (y): ").yellow
167
- confirm ? nil : abort
168
-
169
- @brewer.pid(0)
170
- @brewer.pump(0)
171
-
172
- @brewer.hlt(0)
173
- end
174
-
175
- def top_off
176
- @brewer.hlt_to('boil')
177
-
178
- @brewer.hlt(1)
179
-
180
- print Rainbow("waiting for intervention to turn off hlt (y): ").yellow
181
- confirm ? nil : abort
182
-
183
- @brewer.hlt(0)
184
-
185
- @com.ping('Topping off complete')
186
- puts Rainbow("Topping off complete").green
187
- end
188
-
189
- def boil
190
- @com.ping("starting boil procedure")
191
- @brewer.wait(to_seconds(5))
192
- @com.ping("Add boil hops")
193
- @brewer.wait(to_seconds(40))
194
- @com.ping("Add flovering hops")
195
- @brewer.wait(to_seconds(13))
196
- @com.ping("Add finishing hops")
197
- @brewer.wait(30)
198
- @com.ping("Done.")
199
- puts Rainbow("Done.").green
200
- end
201
-
202
- end
@@ -1,56 +0,0 @@
1
- require_relative "autoload"
2
-
3
- class Recipe
4
-
5
- attr_accessor :mash_temp, :mash_time, :mashout_temp, :water, :grain, :grain_temp, :desired_mash_temp, :strike_water_temp, :starting_strike_temp
6
-
7
- def initialize(brewer)
8
- @brewer = brewer
9
- end
10
-
11
- def get_recipe_vars(vars=false)
12
- if vars
13
- raise "Vars must be a hash" unless vars.is_a? Hash
14
- vars.each do |recipe_key, value|
15
- instance_variable_set("@" + recipe_key, value)
16
- end
17
- end
18
-
19
- puts "Variables for heating strike water"
20
- get_strike_temp
21
-
22
- puts "Variables for mash ---"
23
- print "Enter mash temperature: "
24
- @mash_temp = gets.chomp.to_f
25
- print "Enter mash time in minutes: "
26
- @mash_time = to_seconds(gets.chomp.to_f)
27
-
28
- puts "Variables for mashout ---"
29
- print "Enter mashout temp: "
30
- @mashout_temp = gets.chomp.to_f
31
- end
32
-
33
- def get_strike_temp
34
- print "Input amount of water in quarts: "
35
- @water = gets.chomp.to_f
36
-
37
- print "Input amount of grain in lbs: "
38
- @grain = gets.chomp.to_f
39
-
40
- print "Input current grain temp (#{@brewer.pv.to_s} F): "
41
- @grain_temp = gets.chomp.to_f
42
- if @grain_temp == ""
43
- @grain_temp = @brewer.pv
44
- end
45
-
46
- print "Input desired mash temp (150 F): "
47
- @desired_mash_temp = gets.chomp
48
- if @desired_mash_temp == ""
49
- @desired_mash_temp = 150
50
- end
51
- @desired_mash_temp
52
-
53
- @strike_water_temp = script('get_strike_temp', "#{@water} #{@grain} #{@grain_temp} #{@desired_mash_temp}").to_f
54
- end
55
-
56
- end
@@ -1,137 +0,0 @@
1
- require_relative "autoload"
2
-
3
- class Settings
4
-
5
- attr_accessor :settings
6
- attr_reader :cache_file, :source
7
-
8
- def initialize(testing=false)
9
-
10
- @source = adaptibrew_dir('settings.py')
11
- @cache_file = brewer_dir('settings.yml')
12
-
13
- @settings = Hash.new
14
-
15
- if !testing
16
- Adaptibrew.new.clone
17
-
18
- unless cache?
19
- parse_and_cache
20
- else
21
- load_cached_settings
22
- end
23
-
24
- load_global
25
- end
26
- end
27
-
28
- # This will create the cache and populate
29
- # it with settings from settings.py
30
- def parse_and_cache
31
- parse
32
- cache
33
- end
34
-
35
- # Loads cached settings
36
- # If no cached settings, it returns false
37
- def load_cached_settings
38
- if cache?
39
- @settings = YAML.load(File.open(@cache_file))
40
- return true
41
- end
42
- false
43
- end
44
-
45
- # Checks if there are settings in the cache
46
- def cache?
47
- if File.exists?(@cache_file) and File.readlines(@cache_file).grep(/DEBUG/).size > 0
48
- return true
49
- end
50
- false
51
- end
52
-
53
- # Parse the settings from the source file into @settings
54
- def parse
55
- File.open(@source, 'r') do |file|
56
- file.each_line do |line|
57
- if line.include? "=" and line[0] != "#"
58
- key, value = line.match(/(.+)=(.+)/).captures
59
- @settings[key.strip.chomp] = value.strip.chomp
60
- end
61
- end
62
- type_cast
63
- return true
64
- end
65
- false
66
- end
67
-
68
- # Creates the cache if there isn't one already
69
- def create_cache
70
- unless File.exists?(@cache_file)
71
- File.open(@cache_file, 'w')
72
- end
73
- true
74
- end
75
-
76
- # This will add a new element to the @settings hash
77
- # AND re-cache the settings
78
- def add(setting)
79
- raise "Setting needs to be a hash" unless setting.is_a? Hash
80
- setting.each do |key, value|
81
- @settings[key] = value
82
- end
83
- cache
84
- end
85
-
86
- # Stores the currents @settings in settings.yml
87
- def cache
88
- create_cache
89
- store = YAML::Store.new @cache_file
90
- store.transaction {
91
- @settings.each do |k, v|
92
- store[k] = v
93
- end
94
- }
95
- true
96
- end
97
-
98
- # This deletes the cache file
99
- def clear_cache
100
- if File.exists?(@cache_file)
101
- FileUtils.rm_f @cache_file
102
- end
103
- true
104
- end
105
-
106
- # This is so that the settings are easier to use in my code
107
- # and for backwards compatability purposes
108
- def load_global
109
- parse_and_cache
110
- $settings = @settings
111
- end
112
-
113
- def change(values)
114
- raise "Values to change must be a hash" unless values.is_a? Hash
115
- values.each do |k, v|
116
- @settings[k] = v
117
- end
118
- return true
119
- end
120
-
121
- # This method is r/badcode, i know
122
- def type_cast
123
- # Super janky
124
- change({
125
- 'rimsaddressint' => @settings['rimsaddressint'].to_i,
126
- 'switchaddressint' => @settings['switchaddressint'].to_i,
127
- 'baudrate' => @settings['baudrate'].to_i,
128
- 'timeout' => @settings['timeout'].to_i,
129
- 'spargeToMashRelay' => @settings['spargeToMashRelay'].to_i,
130
- 'spargeRelay' => @settings['spargeRelay'].to_i,
131
- 'rimsToMashRelay' => @settings['rimsToMashRelay'].to_i,
132
- 'pumpRelay' => @settings['pumpRelay'].to_i,
133
- 'DEBUG' => @settings['DEBUG'].to_b,
134
- })
135
- end
136
-
137
- end