<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -2,15 +2,18 @@
 
 require &quot;rubygems&quot;
 require &quot;hpricot&quot;
+require &quot;net/http&quot;
 require &quot;open-uri&quot;
 require &quot;net/telnet&quot;
-include Net
+# include Net
 
 class Stoker
   attr_accessor :host, :user, :pass, :http_port, :telnet_port
   
   attr_reader :telnet, :sensors, :blowers
   
+  ALARMS = [&quot;None&quot;, &quot;Food&quot;, &quot;Fire&quot;]
+  
   def initialize(host = nil, options = {})
     @host         = host
     @http_port    = options[:http_port]   || 80
@@ -25,7 +28,7 @@ class Stoker
   end
   
   def connect(txt = nil)
-    @telnet = Telnet.new(&quot;Host&quot; =&gt; @host, &quot;Port&quot; =&gt; @telnet_port)
+    @telnet = Net::Telnet.new(&quot;Host&quot; =&gt; @host, &quot;Port&quot; =&gt; @telnet_port)
     @telnet.login(@user, @pass)
     # bbq -k
     # gc
@@ -36,11 +39,13 @@ class Stoker
     @telnet.close
   end
   
-  def find_sensors(html = nil)
+  def find_sensors(html = nil, attempt = 1)
     @sensors    = []
     @blowers    = []
+    html      ||= open(&quot;http://#{@host}:#{@http_port}&quot;)
+    contents    = html.read
     
-    doc = Hpricot(html || open(&quot;http://#{@host}:#{@http_port}&quot;))
+    doc = Hpricot(contents)
 
     (doc/&quot;td.ser_num/b[text() = 'Blower']:first/../../../tr&quot;).each do |row|
       unless (row/&quot;td:first/b&quot;).size &gt; 0
@@ -56,13 +61,40 @@ class Stoker
         sensor.name   = row.at(&quot;td[2]/input&quot;)['value'].strip
         sensor.temp   = row.at(&quot;td[3]&quot;).inner_html
         sensor.target = row.at(&quot;td[4]/input&quot;)['value'].strip
-        sensor.alarm  = row.at(&quot;td[5]/select/option[@selected='selected']&quot;).inner_html rescue &quot;None&quot;
+        # sensor.alarm  = row.at(&quot;td[5]/select/option[@selected='selected']&quot;).inner_html rescue &quot;None&quot;
         sensor.low    = row.at(&quot;td[6]/input&quot;)['value'].strip
         sensor.high   = row.at(&quot;td[7]/input&quot;)['value'].strip
-        sensor.blower = row.at(&quot;td[8]/select/option[@selected='selected']&quot;).inner_html rescue &quot;None&quot;
+        # sensor.blower = row.at(&quot;td[8]/select/option[@selected='selected']&quot;).inner_html rescue &quot;None&quot;
         @sensors &lt;&lt; sensor
       end
     end
+    
+    if contents =~ /sel = \[(.*)\];$/
+      blower_alarm_string = $1
+    end
+    
+    count       = 0
+    for_sensor  = 0
+    blower_alarm_string.split(&quot;,&quot;).each do |val|
+      case count
+      when 0
+        @sensors[for_sensor].alarm = Stoker::ALARMS[val.to_i]
+        count += 1
+      when 1
+        @sensors[for_sensor].blower = val.gsub(/\&quot;/,'')
+        count = 0
+        for_sensor += 1
+      end
+    end
+    
+  rescue Net::HTTPBadResponse
+    if attempt &gt; 4
+      raise &quot;Web page output corrupt.  Tried too many times, giving up.&quot;
+    else
+      attempt += 1
+      puts &quot;Warning: Web page output corrupt.  Retrying... attempt #{attempt}&quot;
+      find_sensors(html, attempt)
+    end
   end
 end
 
@@ -81,6 +113,11 @@ class Sensor
     @name = str
     # TODO: update stoker
   end
+  
+  def blower=(blower_serial_number)
+    @blower = @stoker.blowers.find{|b| b.serial_number == blower_serial_number}
+    # TODO: update stoker
+  end
 end
 
 class Blower
@@ -98,5 +135,9 @@ class Blower
     @name = str
     # TODO: update stoker
   end
+  
+  def sensor
+    stoker.sensors.find{|s| s.blower.serial_number == self.serial_number}
+  end
 end
 </diff>
      <filename>lib/stoker.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,15 +3,16 @@
 require &quot;lib/stoker&quot;
 
 stoker = Stoker.new(&quot;10.1.1.8&quot;, :html =&gt; File.open(&quot;tests/test1.html&quot;))
+# stoker = Stoker.new(&quot;10.1.1.8&quot;)
 
 puts &quot;Listing blowers:&quot;
 stoker.blowers.each do |blower|
-  puts &quot;#{blower.serial_number}, #{blower.name}&quot;
+  puts &quot;#{blower.serial_number}, #{blower.name}, #{blower.sensor.name rescue ''}&quot;
 end
 
 puts &quot;Listing sensors:&quot;
 stoker.sensors.each do |sensor|
-  puts &quot;#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}&quot;
+  puts &quot;#{sensor.serial_number}, #{sensor.name}, #{sensor.temp}, #{sensor.target}, #{sensor.alarm}, #{sensor.low}, #{sensor.high}, #{sensor.blower.name rescue ''}&quot;
 end
 
 # ideas:</diff>
      <filename>test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,7 @@
 &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt;
 &lt;HTML&gt;&lt;HEAD&gt;
 
-&lt;STYLE type=&quot;text/css&quot;&gt;
-.ser_num { display: none }
-&lt;/STYLE&gt;
+
 &lt;style type=&quot;text/css&quot;&gt;
 .alarming { background-color: red }
 &lt;/style&gt;
@@ -92,7 +90,7 @@ function do_presel(sr_rows, sw_rows) {
 Powered by &lt;a href=&quot;http://www.rocksbarbque.com&quot;&gt;Rock's Bar-B-Que&lt;/a&gt;&lt;br /&gt;
 Software by kaytat, Version
 
-2.0.259
+2.1.287
 &lt;/p&gt;
 &lt;script type=&quot;text/javascript&quot;&gt;
 &lt;!--
@@ -100,7 +98,6 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 //--&gt;
 &lt;/script&gt;
 &lt;/td&gt;
-
 &lt;td align=&quot;right&quot;&gt;
 &lt;table BORDER=&quot;2&quot; CELLPADDING=&quot;5&quot;&gt;
 &lt;tr&gt;&lt;td class=&quot;ser_num&quot;&gt;&lt;b&gt;Blower&lt;/b&gt;&lt;/td&gt;
@@ -115,7 +112,6 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
-
 &lt;td colspan=&quot;2&quot;&gt;
 &lt;table BORDER=&quot;2&quot; CELLPADDING=&quot;5&quot;&gt;
 &lt;tr&gt;
@@ -126,38 +122,35 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 &lt;td&gt;&lt;b&gt;Alarm&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;Low Set&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;High Set&lt;/b&gt;&lt;/td&gt;
-
 &lt;td&gt;&lt;b&gt;Blower&lt;/b&gt;&lt;/td&gt;
 &lt;/tr&gt;
 
-&lt;tr&gt;&lt;td colspan=&quot;7&quot;&gt;&lt;b&gt;Control Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
-&lt;tr&gt;
+&lt;tr&gt;&lt;td colspan=&quot;8&quot;&gt;&lt;b&gt;Control Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
+&lt;tr class=&quot;alarming&quot;&gt;
 &lt;td class=&quot;ser_num&quot;&gt;440000112A621E30&lt;/td&gt;
 &lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n1440000112A621E30&quot; value=&quot;Pit Temp        &quot;&gt;&lt;/td&gt;
-&lt;td&gt;107.2&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta440000112A621E30&quot; value=&quot;450&quot;&gt;&lt;/td&gt;
+&lt;td&gt;72.2&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta440000112A621E30&quot; value=&quot;72&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;al440000112A621E30&quot; onchange=&quot;do_disable(0, 0)&quot;&gt;
 &lt;option value=&quot;0&quot;&gt;None
 &lt;option value=&quot;1&quot;&gt;Food
 &lt;option value=&quot;2&quot;&gt;Fire
-
 &lt;/select&gt;
 &lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;tl440000112A621E30&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th440000112A621E30&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;tl440000112A621E30&quot; value=&quot;0&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th440000112A621E30&quot; value=&quot;0&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;sw440000112A621E30&quot;&gt;
 &lt;option value=&quot;None&quot;&gt;None
 &lt;option value=&quot;140000002AA65105&quot;&gt;Fan             
 &lt;/select&gt;
 &lt;/td&gt;
 &lt;/tr&gt;
-&lt;tr&gt;&lt;td colspan=&quot;7&quot;&gt;&lt;b&gt;Alarm Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
+&lt;tr&gt;&lt;td colspan=&quot;8&quot;&gt;&lt;b&gt;Alarm Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;
 &lt;td class=&quot;ser_num&quot;&gt;0E0000112A5D1630&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n10E0000112A5D1630&quot; value=&quot;temp1           &quot;&gt;&lt;/td&gt;
-&lt;td&gt;64.6&lt;/td&gt;
-
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta0E0000112A5D1630&quot; value=&quot;95&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n10E0000112A5D1630&quot; value=&quot;Blue            &quot;&gt;&lt;/td&gt;
+&lt;td&gt;76.9&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta0E0000112A5D1630&quot; value=&quot;140&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;al0E0000112A5D1630&quot; onchange=&quot;do_disable(1, 0)&quot;&gt;
 &lt;option value=&quot;0&quot;&gt;None
 &lt;option value=&quot;1&quot;&gt;Food
@@ -165,20 +158,18 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 &lt;/select&gt;
 &lt;/td&gt;
 &lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;tl0E0000112A5D1630&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th0E0000112A5D1630&quot; value=&quot;95&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th0E0000112A5D1630&quot; value=&quot;344&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;sw0E0000112A5D1630&quot;&gt;
 &lt;option value=&quot;None&quot;&gt;None
 &lt;option value=&quot;140000002AA65105&quot;&gt;Fan             
 &lt;/select&gt;
 &lt;/td&gt;
 &lt;/tr&gt;
-&lt;tr&gt;&lt;td colspan=&quot;7&quot;&gt;&lt;b&gt;Monitoring Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
-
 &lt;tr&gt;
 &lt;td class=&quot;ser_num&quot;&gt;530000112A584E30&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n1530000112A584E30&quot; value=&quot;temp2           &quot;&gt;&lt;/td&gt;
-&lt;td&gt;65.9&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta530000112A584E30&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n1530000112A584E30&quot; value=&quot;Yellow          &quot;&gt;&lt;/td&gt;
+&lt;td&gt;75.8&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta530000112A584E30&quot; value=&quot;76&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;al530000112A584E30&quot; onchange=&quot;do_disable(2, 0)&quot;&gt;
 &lt;option value=&quot;0&quot;&gt;None
 &lt;option value=&quot;1&quot;&gt;Food
@@ -189,23 +180,22 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 &lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th530000112A584E30&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;sw530000112A584E30&quot;&gt;
 &lt;option value=&quot;None&quot;&gt;None
-
 &lt;option value=&quot;140000002AA65105&quot;&gt;Fan             
 &lt;/select&gt;
 &lt;/td&gt;
 &lt;/tr&gt;
+&lt;tr&gt;&lt;td colspan=&quot;8&quot;&gt;&lt;b&gt;Monitoring Sensors&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;tr&gt;
 &lt;td class=&quot;ser_num&quot;&gt;9C00001195DEE430&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n19C00001195DEE430&quot; value=&quot;temp3           &quot;&gt;&lt;/td&gt;
-&lt;td&gt;72.6&lt;/td&gt;
-&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta9C00001195DEE430&quot; value=&quot;180&quot;&gt;&lt;/td&gt;
-&lt;td&gt;&lt;select name=&quot;al9C00001195DEE430&quot; onchange=&quot;do_disable(3, 0)&quot;&gt;
+&lt;td&gt;&lt;input size=&quot;16&quot; maxLength=&quot;32&quot; name=&quot;n19C00001195DEE430&quot; value=&quot;Red             &quot;&gt;&lt;/td&gt;
+&lt;td&gt;74.6&lt;/td&gt;
+&lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;ta9C00001195DEE430&quot; value=&quot;130&quot;&gt;&lt;/td&gt;
+&lt;td&gt;&lt;select name=&quot;al9C00001195DEE430&quot; onchange=&quot;do_disable(2, 0)&quot;&gt;
 &lt;option value=&quot;0&quot;&gt;None
 &lt;option value=&quot;1&quot;&gt;Food
 &lt;option value=&quot;2&quot;&gt;Fire
 &lt;/select&gt;
 &lt;/td&gt;
-
 &lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;tl9C00001195DEE430&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;input size=&quot;6&quot; maxLength=&quot;6&quot; name=&quot;th9C00001195DEE430&quot; value=&quot;32&quot;&gt;&lt;/td&gt;
 &lt;td&gt;&lt;select name=&quot;sw9C00001195DEE430&quot;&gt;
@@ -216,9 +206,9 @@ document.write(Date() + &quot;&lt;br /&gt;&lt;b&gt;Temperatures in F&lt;/b&gt;&quot;);
 &lt;/tr&gt;
 &lt;SCRIPT type=&quot;text/javascript&quot;&gt;
 &lt;!--
-var sel = [0,&quot;140000002AA65105&quot;,2,&quot;&quot;,0,&quot;&quot;,0,&quot;&quot;];
+var sel = [2,&quot;140000002AA65105&quot;,1,&quot;&quot;,1,&quot;&quot;,0,&quot;&quot;];
 var sw_id = [&quot;140000002AA65105&quot;];
-var check = false
+var check = true
 //--&gt;
 &lt;/script&gt;
 
@@ -226,7 +216,6 @@ var check = false
 &lt;td class=&quot;ser_num&quot;&gt;&lt;b&gt;Temp Sensor&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;Temp&lt;/b&gt;&lt;/td&gt;
-
 &lt;td&gt;&lt;b&gt;Target&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;Alarm&lt;/b&gt;&lt;/td&gt;
 &lt;td&gt;&lt;b&gt;Low Set&lt;/b&gt;&lt;/td&gt;
@@ -239,7 +228,6 @@ var check = false
 &lt;tr&gt;
 &lt;td colspan=&quot;2&quot;&gt;
 &lt;br /&gt;
-
 &lt;input type=&quot;checkbox&quot; name=&quot;q_show_ser&quot; /&gt;Show serial numbers&lt;br /&gt;
 &lt;INPUT TYPE=&quot;submit&quot; VALUE=&quot;Save Changes&quot; /&gt;
 &lt;/td&gt;
@@ -256,5 +244,4 @@ var check = false
 &lt;/table&gt;
 &lt;/form&gt;
 &lt;/BODY&gt;
-
-&lt;/HTML&gt;
+&lt;/HTML&gt;
\ No newline at end of file</diff>
      <filename>tests/test1.html</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>27852dfbe87f6039a92db27f0a76574ea9d3508c</id>
    </parent>
  </parents>
  <author>
    <name>Tony Buser</name>
    <email>tbuser@gmail.com</email>
  </author>
  <url>http://github.com/tbuser/stoker/commit/36f809d43cafca0855b4e69b5fc441129489857e</url>
  <id>36f809d43cafca0855b4e69b5fc441129489857e</id>
  <committed-date>2008-06-16T12:47:33-07:00</committed-date>
  <authored-date>2008-06-16T12:47:33-07:00</authored-date>
  <message>can now read all the values of the sensors and blowers including alarm and blower assignment</message>
  <tree>70d179dd55ec2eaedad013da4ddbbebc23d2ab05</tree>
  <committer>
    <name>Tony Buser</name>
    <email>tbuser@gmail.com</email>
  </committer>
</commit>
