tbuser-stoker 0.0.1 → 0.0.2

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.
Files changed (4) hide show
  1. data/lib/stoker.rb +109 -46
  2. data/test.rb +32 -5
  3. data/tests/test1.html +24 -37
  4. metadata +2 -2
data/lib/stoker.rb CHANGED
@@ -2,14 +2,21 @@
2
2
 
3
3
  require "rubygems"
4
4
  require "hpricot"
5
+ require "net/http"
6
+ require "cgi"
5
7
  require "open-uri"
6
8
  require "net/telnet"
7
9
  include Net
8
10
 
9
11
  class Stoker
12
+ require File.join(File.dirname(__FILE__), 'sensor')
13
+ require File.join(File.dirname(__FILE__), 'blower')
14
+
10
15
  attr_accessor :host, :user, :pass, :http_port, :telnet_port
11
16
 
12
- attr_reader :telnet, :sensors, :blowers
17
+ attr_reader :telnet, :sensors, :blowers, :sensor_opts, :blower_opts
18
+
19
+ ALARMS = ["None", "Food", "Fire"]
13
20
 
14
21
  def initialize(host = nil, options = {})
15
22
  @host = host
@@ -21,11 +28,11 @@ class Stoker
21
28
  @sensors = []
22
29
  @blowers = []
23
30
 
24
- find_sensors(options[:html])
31
+ read_sensors
25
32
  end
26
33
 
27
- def connect(txt = nil)
28
- @telnet = Telnet.new("Host" => @host, "Port" => @telnet_port)
34
+ def connect
35
+ @telnet = Net::Telnet.new("Host" => @host, "Port" => @telnet_port)
29
36
  @telnet.login(@user, @pass)
30
37
  # bbq -k
31
38
  # gc
@@ -36,67 +43,123 @@ class Stoker
36
43
  @telnet.close
37
44
  end
38
45
 
39
- def find_sensors(html = nil)
46
+ def read_sensors(attempt = 1)
40
47
  @sensors = []
41
48
  @blowers = []
49
+ html = TEST_HTML if TEST
50
+ html ||= open("http://#{@host}:#{@http_port}")
51
+ contents = html.read
52
+ @sensor_opts = []
53
+ @blower_opts = []
42
54
 
43
- doc = Hpricot(html || open("http://#{@host}:#{@http_port}"))
55
+ doc = Hpricot(contents)
44
56
 
45
57
  (doc/"td.ser_num/b[text() = 'Blower']:first/../../../tr").each do |row|
46
58
  unless (row/"td:first/b").size > 0
47
- blower = Blower.new(self, row.at("td[1]").inner_html)
48
- blower.name = row.at("td[2]/input")['value'].strip
49
- @blowers << blower
59
+ @blower_opts << {
60
+ :serial_number => row.at("td[1]").inner_html,
61
+ :name => row.at("td[2]/input")['value'].strip
62
+ }
50
63
  end
51
64
  end
52
65
 
53
66
  (doc/"td.ser_num/b[text() = 'Temp Sensor']:first/../../../tr").each do |row|
54
67
  unless (row/"td:first/b").size > 0
55
- sensor = Sensor.new(self, row.at("td[1]").inner_html)
56
- sensor.name = row.at("td[2]/input")['value'].strip
57
- sensor.temp = row.at("td[3]").inner_html
58
- sensor.target = row.at("td[4]/input")['value'].strip
59
- sensor.alarm = row.at("td[5]/select/option[@selected='selected']").inner_html rescue "None"
60
- sensor.low = row.at("td[6]/input")['value'].strip
61
- sensor.high = row.at("td[7]/input")['value'].strip
62
- sensor.blower = row.at("td[8]/select/option[@selected='selected']").inner_html rescue "None"
63
- @sensors << sensor
68
+ @sensor_opts << {
69
+ :serial_number => row.at("td[1]").inner_html,
70
+ :name => row.at("td[2]/input")['value'].strip,
71
+ :temp => row.at("td[3]").inner_html,
72
+ :target => row.at("td[4]/input")['value'].strip,
73
+ :low => row.at("td[6]/input")['value'].strip,
74
+ :high => row.at("td[7]/input")['value'].strip
75
+ }
64
76
  end
65
77
  end
66
- end
67
- end
68
78
 
69
- class Sensor
70
- attr_accessor :name, :serial_number, :temp, :target, :alarm, :low, :high, :blower
79
+ if contents =~ /sel = \[(.*)\];$/
80
+ blower_alarm_string = $1
81
+ end
82
+
83
+ count = 0
84
+ for_sensor = 0
85
+ blower_alarm_string.split(",").each do |val|
86
+ case count
87
+ when 0
88
+ @sensor_opts[for_sensor][:alarm] = Stoker::ALARMS[val.to_i]
89
+ count += 1
90
+ when 1
91
+ @sensor_opts[for_sensor][:blower_serial_number] = val.gsub(/\"/,'') unless val == '""'
92
+ count = 0
93
+ for_sensor += 1
94
+ end
95
+ end
71
96
 
72
- attr_reader :stoker
73
-
74
- def initialize(stoker, serial_number, name = nil)
75
- @stoker = stoker
76
- @serial_number = serial_number
77
- @name = name || serial_number
78
- end
79
-
80
- def name=(str)
81
- @name = str
82
- # TODO: update stoker
97
+ @sensor_opts.each do |s|
98
+ if s[:blower_serial_number].to_s != ""
99
+ @blower_opts.each do |b|
100
+ if b[:serial_number] == s[:blower_serial_number]
101
+ b[:sensor_serial_number] = s[:serial_number]
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ @sensor_opts.each do |s|
108
+ @sensors << Sensor.new(self, s)
109
+ end
110
+
111
+ @blower_opts.each do |b|
112
+ @blowers << Blower.new(self, b)
113
+ end
114
+
115
+ rescue Net::HTTPBadResponse
116
+ if attempt > 4
117
+ raise "Web page output corrupt. Tried too many times, giving up."
118
+ else
119
+ attempt += 1
120
+ warn "Warning: Web page output corrupt. Retrying... attempt #{attempt}"
121
+ read_sensors(attempt)
122
+ end
83
123
  end
84
- end
85
124
 
86
- class Blower
87
- attr_accessor :name, :serial_number
125
+ def sensor(str)
126
+ str = str.downcase
127
+ @sensors.find{|s| s.name.downcase == str or s.serial_number.downcase == str}
128
+ end
88
129
 
89
- attr_reader :stoker
90
-
91
- def initialize(stoker, serial_number, name = nil)
92
- @stoker = stoker
93
- @serial_number = serial_number
94
- @name = name || serial_number
130
+ def blower(str)
131
+ str = str.downcase
132
+ @blowers.find{|b| b.name.downcase == str or b.serial_number.downcase == str}
95
133
  end
96
134
 
97
- def name=(str)
98
- @name = str
99
- # TODO: update stoker
135
+ def post(params = {})
136
+ post_url = "http://#{@host}:#{@http_port}/stoker.Post_Handler"
137
+
138
+ queries = []
139
+
140
+ if TEST
141
+ params.each do |k,v|
142
+ queries << "#{k}=#{CGI::escape(v)}"
143
+ end
144
+
145
+ q = queries.join("&")
146
+
147
+ warn "#{post_url}?#{q}"
148
+ else
149
+ # stoker http doesn't like keep alive, so have to do post request the long way
150
+ # res = HTTP.post_form(URI.parse(post_url), params)
151
+ url = URI.parse(post_url)
152
+ req = HTTP::Post.new(url.path)
153
+ req["Keep-Alive"] = false
154
+ req.set_form_data(params)
155
+ res = HTTP.new(url.host, url.port).start {|http| http.request(req) }
156
+ case res
157
+ when Net::HTTPSuccess, Net::HTTPRedirection
158
+ # OK
159
+ true
160
+ else
161
+ res.error!
162
+ end
163
+ end
100
164
  end
101
165
  end
102
-
data/test.rb CHANGED
@@ -1,19 +1,48 @@
1
1
  #!/usr/bin/env ruby
2
+ # TODO: make this into a proper testing framework :)
3
+
4
+ TEST = false
5
+ TEST_HTML = File.open("tests/test1.html")
6
+ TEST_TELNET = File.open("tests/telnet.txt")
2
7
 
3
8
  require "lib/stoker"
4
9
 
5
- stoker = Stoker.new("10.1.1.8", :html => File.open("tests/test1.html"))
10
+ stoker = Stoker.new("10.1.1.8")
6
11
 
7
12
  puts "Listing blowers:"
8
13
  stoker.blowers.each do |blower|
9
- puts "#{blower.serial_number}, #{blower.name}"
14
+ puts "#{blower.serial_number}, #{blower.name}, #{blower.sensor.name rescue ''}"
10
15
  end
11
16
 
12
17
  puts "Listing sensors:"
13
18
  stoker.sensors.each do |sensor|
14
- puts "#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}"
19
+ puts "#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}, #{sensor.target}, #{sensor.alarm}, #{sensor.low}, #{sensor.high}, #{sensor.blower.name rescue ''}"
15
20
  end
16
21
 
22
+ puts "Red: #{stoker.sensor("Red").temp}"
23
+ puts "9C00001195DEE430: #{stoker.sensor("9C00001195DEE430").name}"
24
+ puts "Pit Temp Blower: #{stoker.sensor("pit temp").blower.name}"
25
+
26
+ puts "Fan Sensor: #{stoker.blower("Fan").sensor.name}"
27
+ puts "140000002AA65105: #{stoker.blower("140000002AA65105").name}"
28
+
29
+ # stoker.sensor("Red").name = "Rouge"
30
+ # stoker.blower("Fan").name = "Blower"
31
+
32
+ # stoker.sensor("Pit Temp").target = 42
33
+ # stoker.sensor("Pit Temp").alarm = "none"
34
+
35
+ # stoker.sensor("Pit Temp").target = 100
36
+ # stoker.sensor("Pit Temp").alarm = "fire"
37
+ # stoker.sensor("Pit Temp").low = 90
38
+ # stoker.sensor("Pit Temp").high = 110
39
+
40
+ stoker.sensor("Red").blower = stoker.blower("Fan")
41
+
42
+ puts stoker.sensor("Pit Temp").blower_serial_number
43
+ puts stoker.sensor("Red").blower_serial_number
44
+ puts stoker.blower("Fan").sensor.name
45
+
17
46
  # ideas:
18
47
 
19
48
  # stoker.sensor("440000112A621E30").name = "meat"
@@ -25,8 +54,6 @@ end
25
54
 
26
55
  # stoker.blower("140000002AA65105").name = "main"
27
56
 
28
- # stoker.blower("main").control("meat")
29
-
30
57
  # puts stoker.meat_sensor.temp
31
58
 
32
59
  # stoker.blower("main").on
data/tests/test1.html CHANGED
@@ -1,9 +1,7 @@
1
1
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2
2
  <HTML><HEAD>
3
3
 
4
- <STYLE type="text/css">
5
- .ser_num { display: none }
6
- </STYLE>
4
+
7
5
  <style type="text/css">
8
6
  .alarming { background-color: red }
9
7
  </style>
@@ -92,7 +90,7 @@ function do_presel(sr_rows, sw_rows) {
92
90
  Powered by <a href="http://www.rocksbarbque.com">Rock's Bar-B-Que</a><br />
93
91
  Software by kaytat, Version
94
92
 
95
- 2.0.259
93
+ 2.1.287
96
94
  </p>
97
95
  <script type="text/javascript">
98
96
  <!--
@@ -100,7 +98,6 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
100
98
  //-->
101
99
  </script>
102
100
  </td>
103
-
104
101
  <td align="right">
105
102
  <table BORDER="2" CELLPADDING="5">
106
103
  <tr><td class="ser_num"><b>Blower</b></td>
@@ -115,7 +112,6 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
115
112
  </td>
116
113
  </tr>
117
114
  <tr>
118
-
119
115
  <td colspan="2">
120
116
  <table BORDER="2" CELLPADDING="5">
121
117
  <tr>
@@ -126,38 +122,35 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
126
122
  <td><b>Alarm</b></td>
127
123
  <td><b>Low Set</b></td>
128
124
  <td><b>High Set</b></td>
129
-
130
125
  <td><b>Blower</b></td>
131
126
  </tr>
132
127
 
133
- <tr><td colspan="7"><b>Control Sensors</b></td></tr>
134
- <tr>
128
+ <tr><td colspan="8"><b>Control Sensors</b></td></tr>
129
+ <tr class="alarming">
135
130
  <td class="ser_num">440000112A621E30</td>
136
131
  <td><input size="16" maxLength="32" name="n1440000112A621E30" value="Pit Temp "></td>
137
- <td>107.2</td>
138
- <td><input size="6" maxLength="6" name="ta440000112A621E30" value="450"></td>
132
+ <td>72.2</td>
133
+ <td><input size="6" maxLength="6" name="ta440000112A621E30" value="72"></td>
139
134
  <td><select name="al440000112A621E30" onchange="do_disable(0, 0)">
140
135
  <option value="0">None
141
136
  <option value="1">Food
142
137
  <option value="2">Fire
143
-
144
138
  </select>
145
139
  </td>
146
- <td><input size="6" maxLength="6" name="tl440000112A621E30" value="32"></td>
147
- <td><input size="6" maxLength="6" name="th440000112A621E30" value="32"></td>
140
+ <td><input size="6" maxLength="6" name="tl440000112A621E30" value="0"></td>
141
+ <td><input size="6" maxLength="6" name="th440000112A621E30" value="0"></td>
148
142
  <td><select name="sw440000112A621E30">
149
143
  <option value="None">None
150
144
  <option value="140000002AA65105">Fan
151
145
  </select>
152
146
  </td>
153
147
  </tr>
154
- <tr><td colspan="7"><b>Alarm Sensors</b></td></tr>
148
+ <tr><td colspan="8"><b>Alarm Sensors</b></td></tr>
155
149
  <tr>
156
150
  <td class="ser_num">0E0000112A5D1630</td>
157
- <td><input size="16" maxLength="32" name="n10E0000112A5D1630" value="temp1 "></td>
158
- <td>64.6</td>
159
-
160
- <td><input size="6" maxLength="6" name="ta0E0000112A5D1630" value="95"></td>
151
+ <td><input size="16" maxLength="32" name="n10E0000112A5D1630" value="Blue "></td>
152
+ <td>76.9</td>
153
+ <td><input size="6" maxLength="6" name="ta0E0000112A5D1630" value="140"></td>
161
154
  <td><select name="al0E0000112A5D1630" onchange="do_disable(1, 0)">
162
155
  <option value="0">None
163
156
  <option value="1">Food
@@ -165,20 +158,18 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
165
158
  </select>
166
159
  </td>
167
160
  <td><input size="6" maxLength="6" name="tl0E0000112A5D1630" value="32"></td>
168
- <td><input size="6" maxLength="6" name="th0E0000112A5D1630" value="95"></td>
161
+ <td><input size="6" maxLength="6" name="th0E0000112A5D1630" value="344"></td>
169
162
  <td><select name="sw0E0000112A5D1630">
170
163
  <option value="None">None
171
164
  <option value="140000002AA65105">Fan
172
165
  </select>
173
166
  </td>
174
167
  </tr>
175
- <tr><td colspan="7"><b>Monitoring Sensors</b></td></tr>
176
-
177
168
  <tr>
178
169
  <td class="ser_num">530000112A584E30</td>
179
- <td><input size="16" maxLength="32" name="n1530000112A584E30" value="temp2 "></td>
180
- <td>65.9</td>
181
- <td><input size="6" maxLength="6" name="ta530000112A584E30" value="32"></td>
170
+ <td><input size="16" maxLength="32" name="n1530000112A584E30" value="Yellow "></td>
171
+ <td>75.8</td>
172
+ <td><input size="6" maxLength="6" name="ta530000112A584E30" value="76"></td>
182
173
  <td><select name="al530000112A584E30" onchange="do_disable(2, 0)">
183
174
  <option value="0">None
184
175
  <option value="1">Food
@@ -189,23 +180,22 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
189
180
  <td><input size="6" maxLength="6" name="th530000112A584E30" value="32"></td>
190
181
  <td><select name="sw530000112A584E30">
191
182
  <option value="None">None
192
-
193
183
  <option value="140000002AA65105">Fan
194
184
  </select>
195
185
  </td>
196
186
  </tr>
187
+ <tr><td colspan="8"><b>Monitoring Sensors</b></td></tr>
197
188
  <tr>
198
189
  <td class="ser_num">9C00001195DEE430</td>
199
- <td><input size="16" maxLength="32" name="n19C00001195DEE430" value="temp3 "></td>
200
- <td>72.6</td>
201
- <td><input size="6" maxLength="6" name="ta9C00001195DEE430" value="180"></td>
202
- <td><select name="al9C00001195DEE430" onchange="do_disable(3, 0)">
190
+ <td><input size="16" maxLength="32" name="n19C00001195DEE430" value="Red "></td>
191
+ <td>74.6</td>
192
+ <td><input size="6" maxLength="6" name="ta9C00001195DEE430" value="130"></td>
193
+ <td><select name="al9C00001195DEE430" onchange="do_disable(2, 0)">
203
194
  <option value="0">None
204
195
  <option value="1">Food
205
196
  <option value="2">Fire
206
197
  </select>
207
198
  </td>
208
-
209
199
  <td><input size="6" maxLength="6" name="tl9C00001195DEE430" value="32"></td>
210
200
  <td><input size="6" maxLength="6" name="th9C00001195DEE430" value="32"></td>
211
201
  <td><select name="sw9C00001195DEE430">
@@ -216,9 +206,9 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
216
206
  </tr>
217
207
  <SCRIPT type="text/javascript">
218
208
  <!--
219
- var sel = [0,"140000002AA65105",2,"",0,"",0,""];
209
+ var sel = [2,"140000002AA65105",1,"",1,"",0,""];
220
210
  var sw_id = ["140000002AA65105"];
221
- var check = false
211
+ var check = true
222
212
  //-->
223
213
  </script>
224
214
 
@@ -226,7 +216,6 @@ var check = false
226
216
  <td class="ser_num"><b>Temp Sensor</b></td>
227
217
  <td><b>Description</b></td>
228
218
  <td><b>Temp</b></td>
229
-
230
219
  <td><b>Target</b></td>
231
220
  <td><b>Alarm</b></td>
232
221
  <td><b>Low Set</b></td>
@@ -239,7 +228,6 @@ var check = false
239
228
  <tr>
240
229
  <td colspan="2">
241
230
  <br />
242
-
243
231
  <input type="checkbox" name="q_show_ser" />Show serial numbers<br />
244
232
  <INPUT TYPE="submit" VALUE="Save Changes" />
245
233
  </td>
@@ -256,5 +244,4 @@ var check = false
256
244
  </table>
257
245
  </form>
258
246
  </BODY>
259
-
260
- </HTML>
247
+ </HTML>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tbuser-stoker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Buser
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-11 00:00:00 -07:00
12
+ date: 2008-06-17 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency