rzwaveway 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module RZWaveWay
4
+ module CommandClasses
5
+ describe WakeUp do
6
+ let(:device) { ZWaveDevice.new(create_id, create_device_data) }
7
+ let(:command_class) do
8
+ WakeUp.new(
9
+ {'data' => {
10
+ 'interval' => {'value' => 300, 'updateTime' => 1394983000},
11
+ 'lastSleep' => {'value' => 1394983222, 'updateTime' => 1394983222},
12
+ 'lastWakeup' => {'value' => 1394983222, 'updateTime' => 1394983222}
13
+ }}, device)
14
+ end
15
+
16
+ describe '#new' do
17
+ it 'stores interesting properties' do
18
+ command_class
19
+ expect(device.get_property(:wakeup_interval)).to eq [300, 1394983000]
20
+ expect(device.contact_frequency).to eq 300
21
+ expect(device.get_property(:wakeup_last_sleep_time)).to eq [1394983222, 1394983222]
22
+ expect(device.get_property(:wakeup_last_wakeup_time)).to eq [1394983222, 1394983222]
23
+ expect(device.last_contact_time).to eq 1394983222
24
+ end
25
+ end
26
+
27
+ describe '#process' do
28
+ it 'does nothing when it processes no updates' do
29
+ expect(command_class.process({})).to be_nil
30
+ end
31
+
32
+ it 'returns an alive event' do
33
+ updates = {
34
+ 'data.lastWakeup' => {'value' => 1395247772, 'updateTime' => 1395247772},
35
+ 'data.lastSleep' => {'value' => 1395247772, 'updateTime' => 1395247772}
36
+ }
37
+ event = command_class.process(updates)
38
+ expect(event.class).to be RZWaveWay::AliveEvent
39
+ expect(event.device_id).to eq device.id
40
+ expect(event.time).to eq 1395247772
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,73 @@
1
+ {
2
+ "devices.11.instances.0.commandClasses.128.data": {
3
+ "name": "devices.11.instances.0.commandClasses.128.data",
4
+ "value": null,
5
+ "type": "NoneType",
6
+ "supported": {
7
+ "name": "supported",
8
+ "value": true,
9
+ "type": "bool",
10
+ "invalidateTime": 1409683007,
11
+ "updateTime": 1403337655
12
+ },
13
+ "version": {
14
+ "name": "version",
15
+ "value": 1,
16
+ "type": "int",
17
+ "invalidateTime": 1409683007,
18
+ "updateTime": 1403337810
19
+ },
20
+ "security": {
21
+ "name": "security",
22
+ "value": false,
23
+ "type": "bool",
24
+ "invalidateTime": 1403337654,
25
+ "updateTime": 1403337655
26
+ },
27
+ "interviewDone": {
28
+ "name": "interviewDone",
29
+ "value": true,
30
+ "type": "bool",
31
+ "invalidateTime": 1403337654,
32
+ "updateTime": 1403337815
33
+ },
34
+ "interviewCounter": {
35
+ "name": "interviewCounter",
36
+ "value": 9,
37
+ "type": "int",
38
+ "invalidateTime": 1403337654,
39
+ "updateTime": 1403337814
40
+ },
41
+ "lastChange": {
42
+ "name": "lastChange",
43
+ "value": 1403338820,
44
+ "type": "int",
45
+ "invalidateTime": 1409683007,
46
+ "updateTime": 1403338820
47
+ },
48
+ "history": {
49
+ "name": "history",
50
+ "value": null,
51
+ "type": "NoneType",
52
+ "96": {
53
+ "name": "96",
54
+ "value": 1403338820,
55
+ "type": "int",
56
+ "invalidateTime": 1409683007,
57
+ "updateTime": 1403338820
58
+ },
59
+ "invalidateTime": 1409683007,
60
+ "updateTime": 1403338820
61
+ },
62
+ "last": {
63
+ "name": "last",
64
+ "value": 96,
65
+ "type": "int",
66
+ "invalidateTime": 1409683007,
67
+ "updateTime": 1403338820
68
+ },
69
+ "invalidateTime": 1409683007,
70
+ "updateTime": 1403337655
71
+ },
72
+ "updateTime": 1409683018
73
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "devices.10.instances.0.commandClasses.48.data.1": {
3
+ "name": "1",
4
+ "value": null,
5
+ "type": "NoneType",
6
+ "sensorTypeString": {
7
+ "name": "sensorTypeString",
8
+ "value": "General purpose",
9
+ "type": "str",
10
+ "invalidateTime": 1400840129,
11
+ "updateTime": 1400840130
12
+ },
13
+ "level": {
14
+ "name": "level",
15
+ "value": false,
16
+ "type": "bool",
17
+ "invalidateTime": 1400840129,
18
+ "updateTime": 1409508623
19
+ },
20
+ "invalidateTime": 1400840129,
21
+ "updateTime": 1409508623
22
+ },
23
+ "updateTime": 1409508626
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "devices.6.data.lastSend": {
3
+ "name": "lastSend",
4
+ "value": 38650858,
5
+ "type": "int",
6
+ "invalidateTime": 1416820647,
7
+ "updateTime": 1417258409
8
+ },
9
+ "devices.6.data.lastReceived": {
10
+ "name": "lastReceived",
11
+ "value": 0,
12
+ "type": "int",
13
+ "invalidateTime": 1392567359,
14
+ "updateTime": 1417258409
15
+ },
16
+ "devices.6.instances.0.commandClasses.38.data.level": {
17
+ "name": "level",
18
+ "value": 0,
19
+ "type": "int",
20
+ "invalidateTime": 1417258408,
21
+ "updateTime": 1417258409
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "devices.4.data.isAwake": {
3
+ "name": "isAwake",
4
+ "value": false,
5
+ "type": "bool",
6
+ "invalidateTime": 1371901717,
7
+ "updateTime": 1409500515
8
+ },
9
+ "devices.4.data.lastSend": {
10
+ "name": "lastSend",
11
+ "value": 177270192,
12
+ "type": "int",
13
+ "invalidateTime": 1407492414,
14
+ "updateTime": 1409500515
15
+ },
16
+ "devices.4.data.lastNonceGet": {
17
+ "name": "lastNonceGet",
18
+ "value": 177269183,
19
+ "type": "int",
20
+ "invalidateTime": 1407492414,
21
+ "updateTime": 1409500514
22
+ },
23
+ "devices.4.data.lastReceived": {
24
+ "name": "lastReceived",
25
+ "value": 0,
26
+ "type": "int",
27
+ "invalidateTime": 1371901717,
28
+ "updateTime": 1409500514
29
+ },
30
+ "devices.4.instances.0.commandClasses.132.data.lastWakeup": {
31
+ "name": "lastWakeup",
32
+ "value": 1409500514,
33
+ "type": "int",
34
+ "invalidateTime": 1402383689,
35
+ "updateTime": 1409500514
36
+ },
37
+ "devices.4.instances.0.commandClasses.132.data.lastSleep": {
38
+ "name": "lastSleep",
39
+ "value": 1409500514,
40
+ "type": "int",
41
+ "invalidateTime": 1402383689,
42
+ "updateTime": 1409500514
43
+ },
44
+ "updateTime": 1409500520
45
+ }
@@ -0,0 +1,37 @@
1
+ require 'rzwaveway'
2
+ require 'log4r'
3
+ require 'securerandom'
4
+
5
+ module SpecHelpers
6
+ def create_id
7
+ SecureRandom.random_number(1000000)
8
+ end
9
+
10
+ def create_device_data(command_classes_data = {}, last_contact_time = 0)
11
+ {
12
+ 'data' => {
13
+ 'givenName' => {
14
+ 'value' => 'device name'
15
+ },
16
+ 'lastReceived' => {
17
+ 'updateTime' => last_contact_time
18
+ },
19
+ 'lastSend' => {
20
+ 'updateTime' => last_contact_time
21
+ }
22
+ },
23
+ 'instances' => {'0' => {'commandClasses' => command_classes_data}}
24
+ }
25
+ end
26
+ end
27
+
28
+ RSpec.configure do |c|
29
+ c.include SpecHelpers
30
+ end
31
+
32
+ $log = Log4r::Logger.new 'RZWaveWay'
33
+ # formatter = Log4r::PatternFormatter.new(:pattern => "[%l] %d - %m")
34
+ # outputter = Log4r::Outputter.stdout
35
+ # outputter.formatter = formatter
36
+ # outputter.level = Log4r::DEBUG
37
+ # $log.outputters = [Log4r::Outputter.stdout]
@@ -0,0 +1,217 @@
1
+ require 'spec_helper'
2
+
3
+ module RZWaveWay
4
+ describe ZWaveDevice do
5
+ let(:now) { Time.now }
6
+ let(:device) do
7
+ ZWaveDevice.new(create_id,
8
+ create_device_data({CommandClass::WAKEUP =>
9
+ {
10
+ 'data' => {
11
+ 'interval' => { 'value' => 300, 'updateTime' => 0 },
12
+ 'lastSleep' => { 'value' => 1390251561, 'updateTime' => 0 },
13
+ 'lastWakeup' => { 'value' => 1390251561, 'updateTime' => 0 }
14
+ }
15
+ }
16
+ }))
17
+ end
18
+
19
+ describe '#new' do
20
+ it 'sets last contact time from data (wake up command class)' do
21
+ expect(device.last_contact_time).to eq 1390251561
22
+ end
23
+
24
+ it 'sets the last contact time from data (device data > wake up command class)' do
25
+ battery_device = ZWaveDevice.new(create_id, create_device_data({CommandClass::WAKEUP =>
26
+ {
27
+ 'data' => {
28
+ 'interval' => { 'value' => 300, 'updateTime' => 0 },
29
+ 'lastSleep' => { 'value' => 1390251000, 'updateTime' => 0 },
30
+ 'lastWakeup' => { 'value' => 1390251000, 'updateTime' => 0 }
31
+ }
32
+ }
33
+ }, 1390252000))
34
+ expect(battery_device.last_contact_time).to eq 1390252000
35
+ end
36
+
37
+ it 'sets the last contact time from data (device data)' do
38
+ ac_powered_device = ZWaveDevice.new(create_id, create_device_data({}, 1390252000))
39
+ expect(ac_powered_device.last_contact_time).to eq 1390252000
40
+ end
41
+
42
+ it 'sets the name from data' do
43
+ expect(device.name).to eq 'device name'
44
+ end
45
+ end
46
+
47
+ describe '#contacts_controller_periodically?' do
48
+ it 'returns true if device supports wake up cc' do
49
+ expect(device.contacts_controller_periodically?).to be true
50
+ end
51
+
52
+ it 'returns false if device does not support wake up cc' do
53
+ ac_powered_device = ZWaveDevice.new(create_id, create_device_data)
54
+ expect(ac_powered_device.contacts_controller_periodically?).to be false
55
+ end
56
+ end
57
+
58
+ describe '#notify_contacted' do
59
+ it 'updates the last contact time' do
60
+ now = Time.now.to_i
61
+ device.notify_contacted(now)
62
+ expect(device.last_contact_time).to eq now
63
+ end
64
+
65
+ it 'does not update the last contact time' do
66
+ now = Time.now.to_i
67
+ device.notify_contacted(now)
68
+ expect(device.last_contact_time).to eq now
69
+ device.notify_contacted(now - 600)
70
+ expect(device.last_contact_time).to eq now
71
+ end
72
+ end
73
+
74
+ describe '#process' do
75
+ it 'updates the last contact time (from lastReceived)' do
76
+ updates = {
77
+ 'data.lastReceived' => {
78
+ 'name' => 'lastReceived',
79
+ 'value' => 176428709,
80
+ 'type' => 'int',
81
+ 'invalidateTime' => 1390251561,
82
+ 'updateTime' => 1409490977
83
+
84
+ }
85
+ }
86
+ device.process(updates)
87
+ expect(device.last_contact_time).to eq 1409490977
88
+ end
89
+
90
+ it 'updates the last contact time (from lastSend)' do
91
+ updates = {
92
+ 'data.lastSend' => {
93
+ 'name' => 'lastSend',
94
+ 'value' => 176428709,
95
+ 'type' => 'int',
96
+ 'invalidateTime' => 1390251561,
97
+ 'updateTime' => 1409490970
98
+ }
99
+ }
100
+ device.process(updates)
101
+ expect(device.last_contact_time).to eq 1409490970
102
+ end
103
+
104
+ it 'updates the last contact time' do
105
+ updates = {
106
+ 'data.lastReceived' => {
107
+ 'name' => 'lastReceived',
108
+ 'value' => 176428709,
109
+ 'type' => 'int',
110
+ 'invalidateTime' => 1390251561,
111
+ 'updateTime' => 1409490977
112
+ },
113
+ 'data.lastSend' => {
114
+ 'name' => 'lastSend',
115
+ 'value' => 176428709,
116
+ 'type' => 'int',
117
+ 'invalidateTime' => 1390251561,
118
+ 'updateTime' => 1409490970
119
+ }
120
+ }
121
+ device.process(updates)
122
+ expect(device.last_contact_time).to eq 1409490977
123
+ end
124
+
125
+ it 'generates an AliveEvent when last contact time got updated' do
126
+ device.notify_contacted(now)
127
+ updates = {
128
+ 'data.lastReceived' => {
129
+ 'name' => 'lastReceived',
130
+ 'value' => 176428709,
131
+ 'type' => 'int',
132
+ 'invalidateTime' => 1390251561,
133
+ 'updateTime' => now+100
134
+ },
135
+ 'data.lastSend' => {
136
+ 'name' => 'lastSend',
137
+ 'value' => 176428709,
138
+ 'type' => 'int',
139
+ 'invalidateTime' => 1390251561,
140
+ 'updateTime' => now+100
141
+ }
142
+ }
143
+ events = device.process(updates)
144
+ expect(events.size).to eq 1
145
+ event = events.first
146
+ expect(event.class).to be AliveEvent
147
+ expect(event.device_id).to eq device.id
148
+ expect(event.time).to eq (now+100)
149
+ end
150
+
151
+ it 'does not generate an AliveEvent when last contact time is not updated' do
152
+ device.notify_contacted(now)
153
+ updates = {
154
+ 'data.lastReceived' => {
155
+ 'name' => 'lastReceived',
156
+ 'value' => 176428709,
157
+ 'type' => 'int',
158
+ 'invalidateTime' => 1390251561,
159
+ 'updateTime' => 1409490970
160
+ },
161
+ 'data.lastSend' => {
162
+ 'name' => 'lastSend',
163
+ 'value' => 176428709,
164
+ 'type' => 'int',
165
+ 'invalidateTime' => 1390251561,
166
+ 'updateTime' => 1409490970
167
+ }
168
+ }
169
+ events = device.process(updates)
170
+ expect(events.size).to eq 0
171
+ end
172
+ end
173
+
174
+ describe '#process_alive_check' do
175
+ it 'generates no event' do
176
+ device.notify_contacted(now)
177
+ event = device.process_alive_check
178
+ expect(event).to be_nil
179
+ end
180
+
181
+ it 'generates a NotAliveEvent' do
182
+ device.notify_contacted(now - 600)
183
+ event = device.process_alive_check
184
+ expect(event.class).to be NotAliveEvent
185
+ expect(event.device_id).to eq device.id
186
+ end
187
+
188
+ it 'does not generate a NotAliveEvent at each check' do
189
+ device.notify_contacted(now - 600)
190
+ event = device.process_alive_check
191
+ event = device.process_alive_check
192
+ expect(event).to be_nil
193
+ end
194
+
195
+ it 'generates a DeadEvent' do
196
+ device.notify_contacted(now - 6000)
197
+ event = device.process_alive_check
198
+ expect(event.class).to be DeadEvent
199
+ expect(event.device_id).to eq device.id
200
+ end
201
+
202
+ it 'does not generate a DeadEvent multiple times' do
203
+ device.notify_contacted(now - 6000)
204
+ event = device.process_alive_check
205
+ event = device.process_alive_check
206
+ expect(event).to be_nil
207
+ end
208
+ end
209
+
210
+ describe '#to_json' do
211
+ it 'returns json' do
212
+ json = device.to_json
213
+ expect(json.size).not_to eq 0
214
+ end
215
+ end
216
+ end
217
+ end
data/spec/zway_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module RZWaveWay
4
+ describe ZWay do
5
+ let(:http_stubs) { Faraday::Adapter::Test::Stubs.new }
6
+ let(:zway) do
7
+ zway = ZWay.instance
8
+ zway.setup('dummy', :test, http_stubs)
9
+ zway
10
+ end
11
+
12
+ describe '#start' do
13
+ it 'starts the library' do
14
+ http_stubs.get('/ZWaveAPI/Data/0') {|env| [200, {}, { devices: {}}.to_json]}
15
+ zway.start
16
+ expect(zway.devices.size).to eq 0
17
+ end
18
+
19
+ it 'starts the library, even when ZWay HTTP is ready later' do
20
+ Thread.new do
21
+ sleep(1)
22
+ http_stubs.get('/ZWaveAPI/Data/0') {|env| [200, {}, '{}']}
23
+ sleep(2)
24
+ http_stubs.get('/ZWaveAPI/Data/') {|env| [200, {}, { devices: {}}.to_json]}
25
+ end
26
+ zway.start
27
+ expect(zway.devices.size).to eq 0
28
+ end
29
+ end
30
+ end
31
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rzwaveway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,37 +27,108 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.1.10
30
+ - !ruby/object:Gem::Dependency
31
+ name: faraday
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: httpclient
32
48
  requirement: !ruby/object:Gem::Requirement
33
49
  none: false
34
50
  requirements:
35
- - - ~>
51
+ - - ! '>='
36
52
  - !ruby/object:Gem::Version
37
- version: 2.3.4.1
53
+ version: '0'
38
54
  type: :runtime
39
55
  prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '1.0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 3.0.0
86
+ type: :development
87
+ prerelease: false
40
88
  version_requirements: !ruby/object:Gem::Requirement
41
89
  none: false
42
90
  requirements:
43
91
  - - ~>
44
92
  - !ruby/object:Gem::Version
45
- version: 2.3.4.1
93
+ version: 3.0.0
46
94
  description: A Ruby API to use the Razberry ZWave ZWay interface
47
- email: vincentoo.ignore@yahoo.com
95
+ email: touchardv@yahoo.com
48
96
  executables: []
49
97
  extensions: []
50
98
  extra_rdoc_files: []
51
99
  files:
52
100
  - .gitignore
101
+ - Gemfile
53
102
  - LICENSE
54
103
  - README.md
55
104
  - lib/rzwaveway.rb
105
+ - lib/rzwaveway/command_class.rb
56
106
  - lib/rzwaveway/command_classes.rb
107
+ - lib/rzwaveway/command_classes/battery.rb
108
+ - lib/rzwaveway/command_classes/sensor_binary.rb
109
+ - lib/rzwaveway/command_classes/switch_binary.rb
110
+ - lib/rzwaveway/command_classes/switch_multi_level.rb
111
+ - lib/rzwaveway/command_classes/wake_up.rb
57
112
  - lib/rzwaveway/events.rb
113
+ - lib/rzwaveway/extensions.rb
114
+ - lib/rzwaveway/extensions/fibaro_smoke_sensor.rb
115
+ - lib/rzwaveway/extensions/ssa_siren_strobe_alarm.rb
116
+ - lib/rzwaveway/version.rb
58
117
  - lib/rzwaveway/zwave_device.rb
59
118
  - lib/rzwaveway/zway.rb
60
119
  - rzwaveway.gemspec
120
+ - spec/command_classes/battery_spec.rb
121
+ - spec/command_classes/sensor_binary_spec.rb
122
+ - spec/command_classes/switch_binary_spec.rb
123
+ - spec/command_classes/switch_multi_level_spec.rb
124
+ - spec/command_classes/wake_up_spec.rb
125
+ - spec/data/battery_get.txt
126
+ - spec/data/sensor_level.txt
127
+ - spec/data/switch_multi_level_get.txt
128
+ - spec/data/wake_up.txt
129
+ - spec/spec_helper.rb
130
+ - spec/zwave_device_spec.rb
131
+ - spec/zway_spec.rb
61
132
  homepage: https://github.com/touchardv/rzwaveway
62
133
  licenses: []
63
134
  post_install_message:
@@ -78,9 +149,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
149
  version: '0'
79
150
  requirements: []
80
151
  rubyforge_project:
81
- rubygems_version: 1.8.23
152
+ rubygems_version: 1.8.23.2
82
153
  signing_key:
83
154
  specification_version: 3
84
155
  summary: ZWave API for ZWay
85
156
  test_files: []
86
- has_rdoc: false