rzwaveway 0.0.4 → 0.0.6

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.
@@ -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