public
Rubygem
Description: Ruby gem to control a Rock's Bar-B-Que Stoker
Clone URL: git://github.com/tbuser/stoker.git
Click here to lend your support to: stoker and make a donation at www.pledgie.com !
can now read all the values of the sensors and blowers including alarm and 
blower assignment
tbuser (author)
Mon Jun 16 12:47:33 -0700 2008
commit  36f809d43cafca0855b4e69b5fc441129489857e
tree    70d179dd55ec2eaedad013da4ddbbebc23d2ab05
parent  27852dfbe87f6039a92db27f0a76574ea9d3508c
...
2
3
4
 
5
6
7
 
8
9
10
11
12
13
 
 
14
15
16
...
25
26
27
28
 
29
30
31
...
36
37
38
39
 
40
41
 
 
42
43
 
44
45
46
...
56
57
58
59
 
60
61
62
 
63
64
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
67
68
...
81
82
83
 
 
 
 
 
84
85
86
...
98
99
100
 
 
 
 
101
102
...
2
3
4
5
6
7
 
8
9
10
11
12
13
14
15
16
17
18
19
...
28
29
30
 
31
32
33
34
...
39
40
41
 
42
43
44
45
46
47
 
48
49
50
51
...
61
62
63
 
64
65
66
 
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
...
113
114
115
116
117
118
119
120
121
122
123
...
135
136
137
138
139
140
141
142
143
0
@@ -2,15 +2,18 @@
0
 
0
 require "rubygems"
0
 require "hpricot"
0
+require "net/http"
0
 require "open-uri"
0
 require "net/telnet"
0
-include Net
0
+# include Net
0
 
0
 class Stoker
0
   attr_accessor :host, :user, :pass, :http_port, :telnet_port
0
   
0
   attr_reader :telnet, :sensors, :blowers
0
   
0
+ ALARMS = ["None", "Food", "Fire"]
0
+
0
   def initialize(host = nil, options = {})
0
     @host = host
0
     @http_port = options[:http_port] || 80
0
@@ -25,7 +28,7 @@ class Stoker
0
   end
0
   
0
   def connect(txt = nil)
0
- @telnet = Telnet.new("Host" => @host, "Port" => @telnet_port)
0
+ @telnet = Net::Telnet.new("Host" => @host, "Port" => @telnet_port)
0
     @telnet.login(@user, @pass)
0
     # bbq -k
0
     # gc
0
@@ -36,11 +39,13 @@ class Stoker
0
     @telnet.close
0
   end
0
   
0
- def find_sensors(html = nil)
0
+ def find_sensors(html = nil, attempt = 1)
0
     @sensors = []
0
     @blowers = []
0
+ html ||= open("http://#{@host}:#{@http_port}")
0
+ contents = html.read
0
     
0
- doc = Hpricot(html || open("http://#{@host}:#{@http_port}"))
0
+ doc = Hpricot(contents)
0
 
0
     (doc/"td.ser_num/b[text() = 'Blower']:first/../../../tr").each do |row|
0
       unless (row/"td:first/b").size > 0
0
@@ -56,13 +61,40 @@ class Stoker
0
         sensor.name = row.at("td[2]/input")['value'].strip
0
         sensor.temp = row.at("td[3]").inner_html
0
         sensor.target = row.at("td[4]/input")['value'].strip
0
- sensor.alarm = row.at("td[5]/select/option[@selected='selected']").inner_html rescue "None"
0
+ # sensor.alarm = row.at("td[5]/select/option[@selected='selected']").inner_html rescue "None"
0
         sensor.low = row.at("td[6]/input")['value'].strip
0
         sensor.high = row.at("td[7]/input")['value'].strip
0
- sensor.blower = row.at("td[8]/select/option[@selected='selected']").inner_html rescue "None"
0
+ # sensor.blower = row.at("td[8]/select/option[@selected='selected']").inner_html rescue "None"
0
         @sensors << sensor
0
       end
0
     end
0
+
0
+ if contents =~ /sel = \[(.*)\];$/
0
+ blower_alarm_string = $1
0
+ end
0
+
0
+ count = 0
0
+ for_sensor = 0
0
+ blower_alarm_string.split(",").each do |val|
0
+ case count
0
+ when 0
0
+ @sensors[for_sensor].alarm = Stoker::ALARMS[val.to_i]
0
+ count += 1
0
+ when 1
0
+ @sensors[for_sensor].blower = val.gsub(/\"/,'')
0
+ count = 0
0
+ for_sensor += 1
0
+ end
0
+ end
0
+
0
+ rescue Net::HTTPBadResponse
0
+ if attempt > 4
0
+ raise "Web page output corrupt. Tried too many times, giving up."
0
+ else
0
+ attempt += 1
0
+ puts "Warning: Web page output corrupt. Retrying... attempt #{attempt}"
0
+ find_sensors(html, attempt)
0
+ end
0
   end
0
 end
0
 
0
@@ -81,6 +113,11 @@ class Sensor
0
     @name = str
0
     # TODO: update stoker
0
   end
0
+
0
+ def blower=(blower_serial_number)
0
+ @blower = @stoker.blowers.find{|b| b.serial_number == blower_serial_number}
0
+ # TODO: update stoker
0
+ end
0
 end
0
 
0
 class Blower
0
@@ -98,5 +135,9 @@ class Blower
0
     @name = str
0
     # TODO: update stoker
0
   end
0
+
0
+ def sensor
0
+ stoker.sensors.find{|s| s.blower.serial_number == self.serial_number}
0
+ end
0
 end
0
 
...
3
4
5
 
6
7
8
9
 
10
11
12
13
14
 
15
16
17
...
3
4
5
6
7
8
9
 
10
11
12
13
14
 
15
16
17
18
0
@@ -3,15 +3,16 @@
0
 require "lib/stoker"
0
 
0
 stoker = Stoker.new("10.1.1.8", :html => File.open("tests/test1.html"))
0
+# stoker = Stoker.new("10.1.1.8")
0
 
0
 puts "Listing blowers:"
0
 stoker.blowers.each do |blower|
0
- puts "#{blower.serial_number}, #{blower.name}"
0
+ puts "#{blower.serial_number}, #{blower.name}, #{blower.sensor.name rescue ''}"
0
 end
0
 
0
 puts "Listing sensors:"
0
 stoker.sensors.each do |sensor|
0
- puts "#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}"
0
+ puts "#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}, #{sensor.target}, #{sensor.alarm}, #{sensor.low}, #{sensor.high}, #{sensor.blower.name rescue ''}"
0
 end
0
 
0
 # ideas:
...
1
2
3
4
5
6
 
7
8
9
...
92
93
94
95
 
96
97
98
...
100
101
102
103
104
105
106
...
115
116
117
118
119
120
121
...
126
127
128
129
130
131
132
133
134
 
 
135
136
137
138
 
 
139
140
141
142
143
144
145
146
147
 
 
148
149
150
151
152
153
154
 
155
156
157
158
159
160
 
 
 
161
162
163
...
165
166
167
168
 
169
170
171
172
173
174
175
176
177
178
179
180
181
 
 
 
182
183
184
...
189
190
191
192
193
194
195
196
 
197
198
199
200
201
202
 
 
 
 
203
204
205
206
207
208
209
210
211
...
216
217
218
219
 
220
221
 
222
223
224
...
226
227
228
229
230
231
232
...
239
240
241
242
243
244
245
...
256
257
258
259
260
 
261
...
1
2
3
 
 
 
4
5
6
7
...
90
91
92
 
93
94
95
96
...
98
99
100
 
101
102
103
...
112
113
114
 
115
116
117
...
122
123
124
 
125
126
127
 
 
128
129
130
131
 
 
132
133
134
135
136
137
 
138
139
 
 
140
141
142
143
144
145
146
147
 
148
149
150
 
 
 
 
151
152
153
154
155
156
...
158
159
160
 
161
162
163
164
165
166
167
 
 
168
169
 
 
 
170
171
172
173
174
175
...
180
181
182
 
183
184
185
186
187
188
189
 
 
 
 
190
191
192
193
194
195
196
197
198
 
199
200
201
...
206
207
208
 
209
210
 
211
212
213
214
...
216
217
218
 
219
220
221
...
228
229
230
 
231
232
233
...
244
245
246
 
 
247
248
0
@@ -1,9 +1,7 @@
0
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
0
 <HTML><HEAD>
0
 
0
-<STYLE type="text/css">
0
-.ser_num { display: none }
0
-</STYLE>
0
+
0
 <style type="text/css">
0
 .alarming { background-color: red }
0
 </style>
0
@@ -92,7 +90,7 @@ function do_presel(sr_rows, sw_rows) {
0
 Powered by <a href="http://www.rocksbarbque.com">Rock's Bar-B-Que</a><br />
0
 Software by kaytat, Version
0
 
0
-2.0.259
0
+2.1.287
0
 </p>
0
 <script type="text/javascript">
0
 <!--
0
@@ -100,7 +98,6 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 //-->
0
 </script>
0
 </td>
0
-
0
 <td align="right">
0
 <table BORDER="2" CELLPADDING="5">
0
 <tr><td class="ser_num"><b>Blower</b></td>
0
@@ -115,7 +112,6 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 </td>
0
 </tr>
0
 <tr>
0
-
0
 <td colspan="2">
0
 <table BORDER="2" CELLPADDING="5">
0
 <tr>
0
@@ -126,38 +122,35 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 <td><b>Alarm</b></td>
0
 <td><b>Low Set</b></td>
0
 <td><b>High Set</b></td>
0
-
0
 <td><b>Blower</b></td>
0
 </tr>
0
 
0
-<tr><td colspan="7"><b>Control Sensors</b></td></tr>
0
-<tr>
0
+<tr><td colspan="8"><b>Control Sensors</b></td></tr>
0
+<tr class="alarming">
0
 <td class="ser_num">440000112A621E30</td>
0
 <td><input size="16" maxLength="32" name="n1440000112A621E30" value="Pit Temp "></td>
0
-<td>107.2</td>
0
-<td><input size="6" maxLength="6" name="ta440000112A621E30" value="450"></td>
0
+<td>72.2</td>
0
+<td><input size="6" maxLength="6" name="ta440000112A621E30" value="72"></td>
0
 <td><select name="al440000112A621E30" onchange="do_disable(0, 0)">
0
 <option value="0">None
0
 <option value="1">Food
0
 <option value="2">Fire
0
-
0
 </select>
0
 </td>
0
-<td><input size="6" maxLength="6" name="tl440000112A621E30" value="32"></td>
0
-<td><input size="6" maxLength="6" name="th440000112A621E30" value="32"></td>
0
+<td><input size="6" maxLength="6" name="tl440000112A621E30" value="0"></td>
0
+<td><input size="6" maxLength="6" name="th440000112A621E30" value="0"></td>
0
 <td><select name="sw440000112A621E30">
0
 <option value="None">None
0
 <option value="140000002AA65105">Fan
0
 </select>
0
 </td>
0
 </tr>
0
-<tr><td colspan="7"><b>Alarm Sensors</b></td></tr>
0
+<tr><td colspan="8"><b>Alarm Sensors</b></td></tr>
0
 <tr>
0
 <td class="ser_num">0E0000112A5D1630</td>
0
-<td><input size="16" maxLength="32" name="n10E0000112A5D1630" value="temp1 "></td>
0
-<td>64.6</td>
0
-
0
-<td><input size="6" maxLength="6" name="ta0E0000112A5D1630" value="95"></td>
0
+<td><input size="16" maxLength="32" name="n10E0000112A5D1630" value="Blue "></td>
0
+<td>76.9</td>
0
+<td><input size="6" maxLength="6" name="ta0E0000112A5D1630" value="140"></td>
0
 <td><select name="al0E0000112A5D1630" onchange="do_disable(1, 0)">
0
 <option value="0">None
0
 <option value="1">Food
0
@@ -165,20 +158,18 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 </select>
0
 </td>
0
 <td><input size="6" maxLength="6" name="tl0E0000112A5D1630" value="32"></td>
0
-<td><input size="6" maxLength="6" name="th0E0000112A5D1630" value="95"></td>
0
+<td><input size="6" maxLength="6" name="th0E0000112A5D1630" value="344"></td>
0
 <td><select name="sw0E0000112A5D1630">
0
 <option value="None">None
0
 <option value="140000002AA65105">Fan
0
 </select>
0
 </td>
0
 </tr>
0
-<tr><td colspan="7"><b>Monitoring Sensors</b></td></tr>
0
-
0
 <tr>
0
 <td class="ser_num">530000112A584E30</td>
0
-<td><input size="16" maxLength="32" name="n1530000112A584E30" value="temp2 "></td>
0
-<td>65.9</td>
0
-<td><input size="6" maxLength="6" name="ta530000112A584E30" value="32"></td>
0
+<td><input size="16" maxLength="32" name="n1530000112A584E30" value="Yellow "></td>
0
+<td>75.8</td>
0
+<td><input size="6" maxLength="6" name="ta530000112A584E30" value="76"></td>
0
 <td><select name="al530000112A584E30" onchange="do_disable(2, 0)">
0
 <option value="0">None
0
 <option value="1">Food
0
@@ -189,23 +180,22 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 <td><input size="6" maxLength="6" name="th530000112A584E30" value="32"></td>
0
 <td><select name="sw530000112A584E30">
0
 <option value="None">None
0
-
0
 <option value="140000002AA65105">Fan
0
 </select>
0
 </td>
0
 </tr>
0
+<tr><td colspan="8"><b>Monitoring Sensors</b></td></tr>
0
 <tr>
0
 <td class="ser_num">9C00001195DEE430</td>
0
-<td><input size="16" maxLength="32" name="n19C00001195DEE430" value="temp3 "></td>
0
-<td>72.6</td>
0
-<td><input size="6" maxLength="6" name="ta9C00001195DEE430" value="180"></td>
0
-<td><select name="al9C00001195DEE430" onchange="do_disable(3, 0)">
0
+<td><input size="16" maxLength="32" name="n19C00001195DEE430" value="Red "></td>
0
+<td>74.6</td>
0
+<td><input size="6" maxLength="6" name="ta9C00001195DEE430" value="130"></td>
0
+<td><select name="al9C00001195DEE430" onchange="do_disable(2, 0)">
0
 <option value="0">None
0
 <option value="1">Food
0
 <option value="2">Fire
0
 </select>
0
 </td>
0
-
0
 <td><input size="6" maxLength="6" name="tl9C00001195DEE430" value="32"></td>
0
 <td><input size="6" maxLength="6" name="th9C00001195DEE430" value="32"></td>
0
 <td><select name="sw9C00001195DEE430">
0
@@ -216,9 +206,9 @@ document.write(Date() + "<br /><b>Temperatures in F</b>");
0
 </tr>
0
 <SCRIPT type="text/javascript">
0
 <!--
0
-var sel = [0,"140000002AA65105",2,"",0,"",0,""];
0
+var sel = [2,"140000002AA65105",1,"",1,"",0,""];
0
 var sw_id = ["140000002AA65105"];
0
-var check = false
0
+var check = true
0
 //-->
0
 </script>
0
 
0
@@ -226,7 +216,6 @@ var check = false
0
 <td class="ser_num"><b>Temp Sensor</b></td>
0
 <td><b>Description</b></td>
0
 <td><b>Temp</b></td>
0
-
0
 <td><b>Target</b></td>
0
 <td><b>Alarm</b></td>
0
 <td><b>Low Set</b></td>
0
@@ -239,7 +228,6 @@ var check = false
0
 <tr>
0
 <td colspan="2">
0
 <br />
0
-
0
 <input type="checkbox" name="q_show_ser" />Show serial numbers<br />
0
 <INPUT TYPE="submit" VALUE="Save Changes" />
0
 </td>
0
@@ -256,5 +244,4 @@ var check = false
0
 </table>
0
 </form>
0
 </BODY>
0
-
0
-</HTML>
0
+</HTML>
0
\ No newline at end of file

Comments

    No one has commented yet.