saal 0.2.24 → 0.3.3
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 +7 -0
- data/bin/saal_chart +49 -4
- data/bin/saal_denkovi_relays +34 -0
- data/bin/saal_envoy_generate_config +53 -0
- data/bin/saal_envoy_read +144 -0
- data/lib/chart.rb +1 -1
- data/lib/chart_data.rb +1 -1
- data/lib/dbstore.rb +15 -18
- data/lib/denkovi.rb +101 -0
- data/lib/dinrelay.rb +2 -18
- data/lib/envoy.rb +287 -0
- data/lib/http.rb +51 -0
- data/lib/outliercache.rb +1 -1
- data/lib/saal.rb +5 -2
- data/lib/sensors.rb +31 -2
- data/saal.gemspec +16 -5
- data/test/chart_data_test.rb +1 -1
- data/test/chart_test.rb +0 -3
- data/test/daemon_test.rb +2 -2
- data/test/dbstore_test.rb +5 -2
- data/test/denkovi.json.erb +39 -0
- data/test/denkovi_test.rb +212 -0
- data/test/dinrelay_test.rb +1 -1
- data/test/sensors_test.rb +5 -5
- data/test/test_db.yml +3 -3
- data/test/test_denkovi_sensors.yml +39 -0
- data/test/test_helper.rb +2 -2
- data/test/test_sensors.yml +1 -1
- metadata +72 -42
- data/bin/saal_chart~ +0 -90
- data/bin/saal_daemon~ +0 -31
data/test/chart_data_test.rb
CHANGED
@@ -78,7 +78,7 @@ class TestChartData < Test::Unit::TestCase
|
|
78
78
|
Time.utc(2012, 3, 25, 23, 59, 59),
|
79
79
|
["0"]+(2..23).map{|s| s.to_s}+["0"],
|
80
80
|
Time.utc(2012, 3, 25, 23, 59, 59),
|
81
|
-
"
|
81
|
+
"_changing_timezone_test2","Europe/Lisbon")
|
82
82
|
|
83
83
|
assert_alignment_interval(24, :hours, Time.utc(2010, 12, 29, 16, 0, 0),
|
84
84
|
Time.utc(2010, 12, 30, 15, 59, 59),
|
data/test/chart_test.rb
CHANGED
@@ -16,7 +16,6 @@ class TestChart < Test::Unit::TestCase
|
|
16
16
|
|
17
17
|
def test_average
|
18
18
|
name = 'week'
|
19
|
-
defs = @defs[name]
|
20
19
|
chart = @charts.find(name)
|
21
20
|
assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
|
22
21
|
chart.sensors.each {|s| s.mock_set(:average => 1)}
|
@@ -31,7 +30,6 @@ class TestChart < Test::Unit::TestCase
|
|
31
30
|
|
32
31
|
def test_min_max_avg_1arity
|
33
32
|
name = 'week'
|
34
|
-
defs = @defs[name]
|
35
33
|
chart = @charts.find(name)
|
36
34
|
assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
|
37
35
|
v = {:minimum => 1.0, :maximum => 2.0, :average => 1.5}
|
@@ -43,7 +41,6 @@ class TestChart < Test::Unit::TestCase
|
|
43
41
|
|
44
42
|
def test_min_max_0arity
|
45
43
|
name = 'week'
|
46
|
-
defs = @defs[name]
|
47
44
|
chart = @charts.find(name)
|
48
45
|
assert_equal ['Fri','Sat','Sun','Mon','Tue','Wed','Thu'], chart.periodnames
|
49
46
|
v = {:minimum => 1.0, :maximum => 2.0, :average => 1.5}
|
data/test/daemon_test.rb
CHANGED
@@ -18,7 +18,7 @@ class TestDaemon < Test::Unit::TestCase
|
|
18
18
|
end
|
19
19
|
|
20
20
|
db_test_query("SELECT * FROM sensor_reads") do |res|
|
21
|
-
assert res.
|
21
|
+
assert res.count > 0, "No sensor reads in DB"
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -38,7 +38,7 @@ class TestDaemon < Test::Unit::TestCase
|
|
38
38
|
end
|
39
39
|
|
40
40
|
db_test_query("SELECT * FROM sensor_reads") do |res|
|
41
|
-
assert res.
|
41
|
+
assert res.count == 0
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/test/dbstore_test.rb
CHANGED
@@ -9,8 +9,11 @@ class TestFileStore < Test::Unit::TestCase
|
|
9
9
|
@dbstore.write(:test_sensor, test_time, test_value)
|
10
10
|
|
11
11
|
db_test_query("SELECT * FROM sensor_reads") do |res|
|
12
|
-
assert_equal 1, res.
|
13
|
-
|
12
|
+
assert_equal 1, res.count
|
13
|
+
row = res.first
|
14
|
+
assert_equal "test_sensor", row["sensor"]
|
15
|
+
assert_equal test_time, row["date"].to_i
|
16
|
+
assert_equal test_value, row["value"].to_f
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
|
3
|
+
"CurrentState": {
|
4
|
+
|
5
|
+
"Output": [
|
6
|
+
|
7
|
+
<% (1..16).each do |num| %>
|
8
|
+
<% state = outlets[num] %>
|
9
|
+
<% val = state == "ON" ? "1" : "0" %>
|
10
|
+
<% if num < 16 %>
|
11
|
+
{"Name": "RELAY<%= num %>", "Value": "<%= val %>"},
|
12
|
+
<% else %>
|
13
|
+
{"Name": "RELAY<%= num %>", "Value": "<%= val %>"}
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
],
|
18
|
+
|
19
|
+
"Auto-reboot": {
|
20
|
+
|
21
|
+
"RebootsNumber": "0",
|
22
|
+
|
23
|
+
"LastReboot": "-"
|
24
|
+
|
25
|
+
},
|
26
|
+
|
27
|
+
"Device": {
|
28
|
+
|
29
|
+
"Name": "SMARTDEN_IP-16R",
|
30
|
+
|
31
|
+
"MAC": "E8:EA:DA:AA:AA:AA"
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require File.dirname(__FILE__)+'/test_helper.rb'
|
2
|
+
require 'webrick'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
class TestDenkoviRelay < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@@serv_num ||= 0
|
8
|
+
@@serv_num += 1
|
9
|
+
|
10
|
+
@og=SAAL::Denkovi::OutletGroup.new(service_opts)
|
11
|
+
@vals={1=>"OFF",2=>"OFF",3=>"ON",4=>"OFF",5=>"ON",6=>"ON",7=>"ON",8=>"OFF",
|
12
|
+
9=>"OFF",10=>"OFF",11=>"ON",12=>"OFF",13=>"ON",14=>"ON",15=>"ON",16=>"OFF"}
|
13
|
+
@rvals={1=>"ON",2=>"ON",3=>"OFF",4=>"ON",5=>"OFF",6=>"OFF",7=>"OFF",8=>"ON",
|
14
|
+
9=>"ON",10=>"ON",11=>"OFF",12=>"ON",13=>"OFF",14=>"OFF",15=>"OFF",16=>"ON"}
|
15
|
+
|
16
|
+
defs = YAML::load(File.new(TEST_SENSORS_DENKOVI_FILE))
|
17
|
+
@pass = defs["group1"]["denkovi"]["pass"]
|
18
|
+
defs['group1']['denkovi']['port'] = service_opts[:port]
|
19
|
+
tempfile = Tempfile.new('denkovi_test_yml')
|
20
|
+
File.open(tempfile.path,'w') {|f| f.write(YAML::dump defs)}
|
21
|
+
@test_sensors_denkovi_file = tempfile.path
|
22
|
+
end
|
23
|
+
|
24
|
+
def service_opts
|
25
|
+
base_opts = {:host => 'localhost', :pass =>"somepass"}
|
26
|
+
base_opts.merge(:port => 3333+@@serv_num)
|
27
|
+
end
|
28
|
+
|
29
|
+
class BasicServing < WEBrick::HTTPServlet::AbstractServlet
|
30
|
+
def self.get_instance(config, opts)
|
31
|
+
new(opts)
|
32
|
+
end
|
33
|
+
def initialize(opts)
|
34
|
+
@html = opts[:html]
|
35
|
+
@pass = opts[:pass]
|
36
|
+
@status = opts[:status] || 200
|
37
|
+
@feedback = opts[:feedback] || {}
|
38
|
+
@sleep = opts[:sleep] || 0
|
39
|
+
end
|
40
|
+
def do_GET(req, res)
|
41
|
+
sleep @sleep
|
42
|
+
@feedback[:uris] ||= []
|
43
|
+
@feedback[:uris] << req.request_uri.to_s
|
44
|
+
@feedback[:uri] = req.request_uri.to_s
|
45
|
+
@feedback[:nrequests] = (@feedback[:nrequests]||0)+1
|
46
|
+
res.body = @html
|
47
|
+
res.status = @status
|
48
|
+
res['Content-Type'] = "text/html"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def with_webrick(opts)
|
53
|
+
opts = service_opts.merge(opts)
|
54
|
+
|
55
|
+
Socket.do_not_reverse_lookup = true # Speed up startup
|
56
|
+
log = WEBrick::Log.new($stderr, WEBrick::Log::ERROR)
|
57
|
+
access_log = [[log, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
|
58
|
+
s = WEBrick::HTTPServer.new(:Port => opts[:port],
|
59
|
+
:Logger => log,
|
60
|
+
:AccessLog => access_log)
|
61
|
+
s.mount('/', BasicServing, opts.merge(:feedback => (f = {})))
|
62
|
+
|
63
|
+
thread = Thread.new do
|
64
|
+
s.start
|
65
|
+
end
|
66
|
+
while s.status != :Running; sleep 0.1; end # Make sure the server is up
|
67
|
+
yield f
|
68
|
+
s.shutdown
|
69
|
+
thread.exit
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_current_state_json(hash)
|
73
|
+
outlets = hash
|
74
|
+
erb = ERB.new(File.open(File.dirname(__FILE__)+'/denkovi.json.erb').read)
|
75
|
+
erb.result(binding)
|
76
|
+
end
|
77
|
+
|
78
|
+
def assert_path(path, uri)
|
79
|
+
assert_equal "http://localhost:#{service_opts[:port]}"+path, uri
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_read_state
|
83
|
+
with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
|
84
|
+
@vals.each do |num, state|
|
85
|
+
assert_equal state, @og.state(num)
|
86
|
+
assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_set_state
|
92
|
+
with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
|
93
|
+
@vals.each do |num, state|
|
94
|
+
newstate = state == "ON" ? "OFF" : "ON"
|
95
|
+
val = {"ON" => "1", "OFF" => "0"}[newstate]
|
96
|
+
assert @og.set_state(num,newstate), "State change not working"
|
97
|
+
assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uri]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_enumerate_sensors
|
103
|
+
sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
|
104
|
+
assert_equal((1..16).map{|i| "name#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.name}.sort)
|
105
|
+
assert_equal((1..16).map{|i| "description#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.description}.sort)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_sensor_type
|
109
|
+
SAAL::Sensors.new(TEST_SENSORS_DENKOVI_FILE, TEST_DBCONF).each do |s|
|
110
|
+
assert_equal :onoff, s.sensor_type
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_read_sensors
|
115
|
+
sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
|
116
|
+
with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
|
117
|
+
@vals.each do |num, state|
|
118
|
+
value = state == "ON" ? 1.0 : 0.0
|
119
|
+
assert_equal value, sensors.send('name'+num.to_s.rjust(2, "0")).read
|
120
|
+
assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
|
121
|
+
end
|
122
|
+
assert_equal 1, feedback[:nrequests], "denkovi request caching not working"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_set_sensors
|
127
|
+
sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
|
128
|
+
with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
|
129
|
+
@vals.each do |num, state|
|
130
|
+
newval = state == "ON" ? 0.0 : 1.0
|
131
|
+
newstate = state == "ON" ? "OFF" : "ON"
|
132
|
+
assert_equal newval, sensors.send('name'+num.to_s.rjust(2, "0")).write(newval),
|
133
|
+
"State change not working"
|
134
|
+
val = {"ON" => "1", "OFF" => "0"}[newstate]
|
135
|
+
assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uris][-2]
|
136
|
+
assert_path "/current_state.json?pw=#{@pass}", feedback[:uris][-1]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Test that write invalidates any caching
|
142
|
+
def test_write_read_sensors
|
143
|
+
sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
|
144
|
+
with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
|
145
|
+
@vals.each do |num, state|
|
146
|
+
sensors.send('name'+num.to_s.rjust(2, "0")).write(0.0)
|
147
|
+
sensors.send('name'+num.to_s.rjust(2, "0")).read
|
148
|
+
end
|
149
|
+
assert_equal 32, feedback[:nrequests], "denkovi caching too much"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Test that the cache times out
|
154
|
+
def test_cache_invalidation
|
155
|
+
_sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
|
156
|
+
@og.cache_timeout = 0.1
|
157
|
+
with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
|
158
|
+
@og.state(1)
|
159
|
+
sleep 0.2
|
160
|
+
@og.state(1)
|
161
|
+
assert_equal 2, feedback[:nrequests], "denkovi caching not invalidating"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_failed_connection
|
166
|
+
@vals.each do |num, state|
|
167
|
+
assert_equal nil, @og.state(num)
|
168
|
+
assert !@og.set_state(num,"ON"), "State change working without a server?!"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_failed_request
|
173
|
+
with_webrick(:html=>create_current_state_json(@vals),:status=>404) do |feedback|
|
174
|
+
@vals.each do |num, state|
|
175
|
+
assert_equal nil, @og.state(num)
|
176
|
+
assert !@og.set_state(num,"ON"), "State change working without a server?!"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_fast_open_timeout
|
182
|
+
#FIXME: Find a way to make this test address more generic
|
183
|
+
@og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:host => "10.254.254.254",
|
184
|
+
:timeout=>0.1))
|
185
|
+
with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
|
186
|
+
time = Benchmark.measure do
|
187
|
+
@vals.each do |num, state|
|
188
|
+
assert_equal nil, @og.state(num), "Read not timing out?"
|
189
|
+
assert !@og.set_state(num,"ON"), "State change not timing out?"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
total_time = @og.timeout*2*@vals.keys.size
|
193
|
+
assert time.total < total_time
|
194
|
+
"Doing the reads took too long, are we really timing out?"
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_fast_read_timeout
|
199
|
+
@og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:timeout=>0.1))
|
200
|
+
with_webrick(:html=>create_current_state_json(@vals),:sleep=>10) do |feedback|
|
201
|
+
time = Benchmark.measure do
|
202
|
+
@vals.each do |num, state|
|
203
|
+
assert_equal nil, @og.state(num), "Read not timing out?"
|
204
|
+
assert !@og.set_state(num,"ON"), "State change not timing out?"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
total_time = @og.timeout*2*@vals.keys.size
|
208
|
+
assert time.total < total_time
|
209
|
+
"Doing the reads took too long, are we really timing out?"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/test/dinrelay_test.rb
CHANGED
@@ -151,7 +151,7 @@ class TestDINRelay < Test::Unit::TestCase
|
|
151
151
|
|
152
152
|
# Test that the cache times out
|
153
153
|
def test_cache_invalidation
|
154
|
-
|
154
|
+
_sensors = SAAL::Sensors.new(@test_sensors_dinrelay_file, TEST_DBCONF)
|
155
155
|
@og.cache_timeout = 0.1
|
156
156
|
with_webrick(:html=>create_index_html(@vals)) do |feedback|
|
157
157
|
@og.state(1)
|
data/test/sensors_test.rb
CHANGED
@@ -67,11 +67,11 @@ class TestSensors < Test::Unit::TestCase
|
|
67
67
|
end
|
68
68
|
|
69
69
|
db_test_query("SELECT * FROM sensor_reads") do |res|
|
70
|
-
assert_equal 1, res.
|
71
|
-
row = res.
|
72
|
-
assert_equal "fake_temp", row[
|
73
|
-
assert_in_delta Time.now.utc.to_i, row[
|
74
|
-
assert_instance_of Float, row[
|
70
|
+
assert_equal 1, res.count
|
71
|
+
row = res.first
|
72
|
+
assert_equal "fake_temp", row["sensor"]
|
73
|
+
assert_in_delta Time.now.utc.to_i, row["date"].to_i, 100
|
74
|
+
assert_instance_of Float, row["value"].to_f
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
data/test/test_db.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
host: localhost
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
username: sensor_reads
|
3
|
+
password: password
|
4
|
+
database: sensor_reads_test
|
@@ -0,0 +1,39 @@
|
|
1
|
+
group1:
|
2
|
+
denkovi:
|
3
|
+
host: localhost
|
4
|
+
port: 33333
|
5
|
+
pass: somepass
|
6
|
+
outlets:
|
7
|
+
1: name01
|
8
|
+
2: name02
|
9
|
+
3: name03
|
10
|
+
4: name04
|
11
|
+
5: name05
|
12
|
+
6: name06
|
13
|
+
7: name07
|
14
|
+
8: name08
|
15
|
+
9: name09
|
16
|
+
10: name10
|
17
|
+
11: name11
|
18
|
+
12: name12
|
19
|
+
13: name13
|
20
|
+
14: name14
|
21
|
+
15: name15
|
22
|
+
16: name16
|
23
|
+
descriptions:
|
24
|
+
1: description01
|
25
|
+
2: description02
|
26
|
+
3: description03
|
27
|
+
4: description04
|
28
|
+
5: description05
|
29
|
+
6: description06
|
30
|
+
7: description07
|
31
|
+
8: description08
|
32
|
+
9: description09
|
33
|
+
10: description10
|
34
|
+
11: description11
|
35
|
+
12: description12
|
36
|
+
13: description13
|
37
|
+
14: description14
|
38
|
+
15: description15
|
39
|
+
16: description16
|
data/test/test_helper.rb
CHANGED
@@ -6,6 +6,7 @@ require File.dirname(__FILE__)+'/../lib/saal.rb'
|
|
6
6
|
class Test::Unit::TestCase
|
7
7
|
TEST_SENSORS_FILE = File.dirname(__FILE__)+'/test_sensors.yml'
|
8
8
|
TEST_SENSORS_DINRELAY_FILE = File.dirname(__FILE__)+'/test_dinrelay_sensors.yml'
|
9
|
+
TEST_SENSORS_DENKOVI_FILE = File.dirname(__FILE__)+'/test_denkovi_sensors.yml'
|
9
10
|
TEST_SENSOR_CLEANUPS_FILE = File.dirname(__FILE__)+'/test_sensor_cleanups.yml'
|
10
11
|
TEST_NONEXIST_SENSOR_FILE = File.dirname(__FILE__)+'/nonexistant_sensor.yml'
|
11
12
|
TEST_CHARTS_FILE = File.dirname(__FILE__)+'/test_charts.yml'
|
@@ -29,8 +30,7 @@ class Test::Unit::TestCase
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def db_test_query(query)
|
32
|
-
db =
|
33
|
-
TEST_DBOPTS['pass'],TEST_DBOPTS['db'])
|
33
|
+
db = Mysql2::Client.new(TEST_DBOPTS)
|
34
34
|
res = db.query(query)
|
35
35
|
yield res
|
36
36
|
db.close
|
data/test/test_sensors.yml
CHANGED
metadata
CHANGED
@@ -1,63 +1,86 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Pedro Côrte-Real
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2020-12-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ownet
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.2
|
19
|
+
version: '0.2'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mysql2
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.5'
|
25
41
|
- !ruby/object:Gem::Dependency
|
26
42
|
name: nokogiri
|
27
|
-
requirement:
|
28
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
29
44
|
requirements:
|
30
|
-
- -
|
45
|
+
- - "~>"
|
31
46
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
47
|
+
version: '1.8'
|
33
48
|
type: :runtime
|
34
49
|
prerelease: false
|
35
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.8'
|
36
55
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
39
|
-
none: false
|
56
|
+
name: net-http-digest_auth
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
40
58
|
requirements:
|
41
|
-
- -
|
59
|
+
- - "~>"
|
42
60
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
61
|
+
version: '1.4'
|
44
62
|
type: :runtime
|
45
63
|
prerelease: false
|
46
|
-
version_requirements:
|
47
|
-
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.4'
|
69
|
+
description: "A daemon and libraries to create an abstraction layer that interfaces
|
48
70
|
with \nsensors and actuators, recording their state, responding to requests \nfor
|
49
71
|
current and historical values, and allowing changes of state.\n"
|
50
72
|
email: pedro@pedrocr.net
|
51
73
|
executables:
|
52
|
-
- saal_chart~
|
53
74
|
- dinrelaystatus
|
54
|
-
- saal_readall
|
55
|
-
- saal_dump_database
|
56
|
-
- saal_daemon
|
57
|
-
- saal_chart
|
58
|
-
- saal_daemon~
|
59
75
|
- dinrelayset
|
60
76
|
- saal_import_mysql
|
77
|
+
- saal_dump_database
|
78
|
+
- saal_readall
|
79
|
+
- saal_denkovi_relays
|
80
|
+
- saal_chart
|
81
|
+
- saal_daemon
|
82
|
+
- saal_envoy_generate_config
|
83
|
+
- saal_envoy_read
|
61
84
|
extensions: []
|
62
85
|
extra_rdoc_files:
|
63
86
|
- README.rdoc
|
@@ -72,7 +95,10 @@ files:
|
|
72
95
|
- bin/dinrelaystatus
|
73
96
|
- bin/saal_chart
|
74
97
|
- bin/saal_daemon
|
98
|
+
- bin/saal_denkovi_relays
|
75
99
|
- bin/saal_dump_database
|
100
|
+
- bin/saal_envoy_generate_config
|
101
|
+
- bin/saal_envoy_read
|
76
102
|
- bin/saal_import_mysql
|
77
103
|
- bin/saal_readall
|
78
104
|
- lib/chart.rb
|
@@ -80,7 +106,10 @@ files:
|
|
80
106
|
- lib/charts.rb
|
81
107
|
- lib/daemon.rb
|
82
108
|
- lib/dbstore.rb
|
109
|
+
- lib/denkovi.rb
|
83
110
|
- lib/dinrelay.rb
|
111
|
+
- lib/envoy.rb
|
112
|
+
- lib/http.rb
|
84
113
|
- lib/outliercache.rb
|
85
114
|
- lib/owsensor.rb
|
86
115
|
- lib/saal.rb
|
@@ -92,6 +121,8 @@ files:
|
|
92
121
|
- test/charts_test.rb
|
93
122
|
- test/daemon_test.rb
|
94
123
|
- test/dbstore_test.rb
|
124
|
+
- test/denkovi.json.erb
|
125
|
+
- test/denkovi_test.rb
|
95
126
|
- test/dinrelay.html.erb
|
96
127
|
- test/dinrelay_test.rb
|
97
128
|
- test/nonexistant_sensor.yml
|
@@ -100,38 +131,36 @@ files:
|
|
100
131
|
- test/sensors_test.rb
|
101
132
|
- test/test_charts.yml
|
102
133
|
- test/test_db.yml
|
134
|
+
- test/test_denkovi_sensors.yml
|
103
135
|
- test/test_dinrelay_sensors.yml
|
104
136
|
- test/test_helper.rb
|
105
137
|
- test/test_sensor_cleanups.yml
|
106
138
|
- test/test_sensors.yml
|
107
|
-
- bin/saal_chart~
|
108
|
-
- bin/saal_daemon~
|
109
139
|
homepage: https://github.com/pedrocr/saal
|
110
|
-
licenses:
|
111
|
-
|
140
|
+
licenses:
|
141
|
+
- LGPL-2.1
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
112
144
|
rdoc_options:
|
113
|
-
- -S
|
114
|
-
- -w 2
|
115
|
-
- -N
|
116
|
-
- -c utf8
|
145
|
+
- "-S"
|
146
|
+
- "-w 2"
|
147
|
+
- "-N"
|
148
|
+
- "-c utf8"
|
117
149
|
require_paths:
|
118
150
|
- lib
|
119
151
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
-
none: false
|
121
152
|
requirements:
|
122
|
-
- -
|
153
|
+
- - ">="
|
123
154
|
- !ruby/object:Gem::Version
|
124
155
|
version: '0'
|
125
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
-
none: false
|
127
157
|
requirements:
|
128
|
-
- -
|
158
|
+
- - ">="
|
129
159
|
- !ruby/object:Gem::Version
|
130
160
|
version: '0'
|
131
161
|
requirements: []
|
132
|
-
|
133
|
-
|
134
|
-
signing_key:
|
162
|
+
rubygems_version: 3.1.2
|
163
|
+
signing_key:
|
135
164
|
specification_version: 2
|
136
165
|
summary: Thin abstraction layer for interfacing and recording sensors (currently onewire)
|
137
166
|
and actuators (currently dinrelay)
|
@@ -141,6 +170,7 @@ test_files:
|
|
141
170
|
- test/charts_test.rb
|
142
171
|
- test/daemon_test.rb
|
143
172
|
- test/dbstore_test.rb
|
173
|
+
- test/denkovi_test.rb
|
144
174
|
- test/dinrelay_test.rb
|
145
175
|
- test/outliercache_test.rb
|
146
176
|
- test/sensor_test.rb
|