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.
- data/lib/stoker.rb +109 -46
- data/test.rb +32 -5
- data/tests/test1.html +24 -37
- 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
|
-
|
|
31
|
+
read_sensors
|
|
25
32
|
end
|
|
26
33
|
|
|
27
|
-
def connect
|
|
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
|
|
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(
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
98
|
-
|
|
99
|
-
|
|
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"
|
|
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
|
-
|
|
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.
|
|
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="
|
|
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>
|
|
138
|
-
<td><input size="6" maxLength="6" name="ta440000112A621E30" value="
|
|
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="
|
|
147
|
-
<td><input size="6" maxLength="6" name="th440000112A621E30" value="
|
|
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="
|
|
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="
|
|
158
|
-
<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="
|
|
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="
|
|
180
|
-
<td>
|
|
181
|
-
<td><input size="6" maxLength="6" name="ta530000112A584E30" value="
|
|
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="
|
|
200
|
-
<td>
|
|
201
|
-
<td><input size="6" maxLength="6" name="ta9C00001195DEE430" value="
|
|
202
|
-
<td><select name="al9C00001195DEE430" onchange="do_disable(
|
|
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 = [
|
|
209
|
+
var sel = [2,"140000002AA65105",1,"",1,"",0,""];
|
|
220
210
|
var sw_id = ["140000002AA65105"];
|
|
221
|
-
var check =
|
|
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.
|
|
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-
|
|
12
|
+
date: 2008-06-17 00:00:00 -07:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|