rzwaveway 0.0.11 → 0.0.13
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 +4 -4
- data/README.md +4 -4
- data/lib/rzwaveway.rb +3 -1
- data/lib/rzwaveway/command_class.rb +21 -10
- data/lib/rzwaveway/command_classes.rb +25 -11
- data/lib/rzwaveway/command_classes/alarm.rb +43 -0
- data/lib/rzwaveway/command_classes/alarm_sensor.rb +17 -0
- data/lib/rzwaveway/command_classes/battery.rb +8 -12
- data/lib/rzwaveway/command_classes/sensor_binary.rb +8 -16
- data/lib/rzwaveway/command_classes/switch_binary.rb +10 -19
- data/lib/rzwaveway/command_classes/switch_multi_level.rb +10 -19
- data/lib/rzwaveway/command_classes/wake_up.rb +23 -26
- data/lib/rzwaveway/events.rb +15 -63
- data/lib/rzwaveway/extensions/ssa_siren_strobe_alarm.rb +1 -6
- data/lib/rzwaveway/properties_cache.rb +38 -0
- data/lib/rzwaveway/property.rb +47 -0
- data/lib/rzwaveway/version.rb +1 -1
- data/lib/rzwaveway/zwave_device.rb +77 -82
- data/lib/rzwaveway/zway.rb +54 -48
- data/rzwaveway.gemspec +2 -1
- data/spec/command_classes/alarm_spec.rb +37 -0
- data/spec/command_classes/battery_spec.rb +16 -14
- data/spec/command_classes/sensor_binary_spec.rb +15 -13
- data/spec/command_classes/switch_binary_spec.rb +15 -13
- data/spec/command_classes/switch_multi_level_spec.rb +15 -13
- data/spec/command_classes/wake_up_spec.rb +59 -20
- data/spec/data/alarm.json +69 -0
- data/spec/data/alarm_v1.json +69 -0
- data/spec/events_spec.rb +27 -0
- data/spec/property_spec.rb +83 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/zwave_device_spec.rb +12 -149
- metadata +25 -2
data/lib/rzwaveway/events.rb
CHANGED
@@ -1,73 +1,25 @@
|
|
1
|
-
|
2
|
-
class AliveEvent
|
3
|
-
attr_reader :device_id
|
4
|
-
attr_reader :time
|
5
|
-
|
6
|
-
def initialize device_id, time
|
7
|
-
@device_id = device_id
|
8
|
-
@time = time
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class NotAliveEvent
|
13
|
-
attr_reader :device_id
|
14
|
-
attr_reader :time_delay
|
15
|
-
attr_reader :missed_count
|
16
|
-
|
17
|
-
def initialize(device_id, time_delay, missed_count)
|
18
|
-
@device_id = device_id
|
19
|
-
@time_delay = time_delay
|
20
|
-
@missed_count = missed_count
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class DeadEvent
|
25
|
-
attr_reader :device_id
|
26
|
-
|
27
|
-
def initialize(device_id)
|
28
|
-
@device_id = device_id
|
29
|
-
end
|
30
|
-
end
|
1
|
+
require 'ostruct'
|
31
2
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
3
|
+
module RZWaveWay
|
4
|
+
class Event < OpenStruct
|
5
|
+
def initialize(hash)
|
6
|
+
raise ArgumentError, 'Hash can not be nil' unless hash
|
7
|
+
raise ArgumentError, 'Missing device_id' unless hash.has_key? :device_id
|
8
|
+
hash[:time] = Time.now.to_i unless hash.has_key? :time
|
36
9
|
|
37
|
-
|
38
|
-
@device_id = device_id
|
39
|
-
@time = time
|
40
|
-
@level = level
|
10
|
+
super(hash)
|
41
11
|
end
|
42
12
|
end
|
43
13
|
|
44
|
-
class
|
45
|
-
end
|
46
|
-
|
47
|
-
class BatteryValueEvent
|
48
|
-
attr_reader :device_id
|
49
|
-
attr_reader :time
|
50
|
-
attr_reader :value
|
14
|
+
class AlarmEvent < Event ; end
|
51
15
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
@value = value
|
56
|
-
end
|
57
|
-
end
|
16
|
+
class AliveDevice < Event ; end
|
17
|
+
class InactiveDevice < Event ; end
|
18
|
+
class DeadDevice < Event ; end
|
58
19
|
|
59
|
-
class
|
60
|
-
attr_reader :device_id
|
61
|
-
attr_reader :time
|
62
|
-
end
|
20
|
+
class LevelEvent < Event ; end
|
63
21
|
|
64
|
-
class
|
65
|
-
attr_reader :device_id
|
66
|
-
attr_reader :time
|
67
|
-
end
|
22
|
+
class MultiLevelEvent < LevelEvent ; end
|
68
23
|
|
69
|
-
class
|
70
|
-
attr_reader :device_id
|
71
|
-
attr_reader :time
|
72
|
-
end
|
24
|
+
class BatteryValueEvent < Event ; end
|
73
25
|
end
|
@@ -34,11 +34,6 @@ module RZWaveWay
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def level!
|
38
|
-
@device.SwitchMultiLevel.get
|
39
|
-
nil
|
40
|
-
end
|
41
|
-
|
42
37
|
private
|
43
38
|
|
44
39
|
DISABLED = 0
|
@@ -46,7 +41,7 @@ module RZWaveWay
|
|
46
41
|
SIREN = 66
|
47
42
|
|
48
43
|
def set level
|
49
|
-
@device.SwitchMultiLevel.
|
44
|
+
@device.SwitchMultiLevel.level = level
|
50
45
|
end
|
51
46
|
end
|
52
47
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module RZWaveWay
|
2
|
+
module PropertiesCache
|
3
|
+
def save_properties
|
4
|
+
properties.values.each {|property| property.save}
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_hash
|
8
|
+
properties.each_with_object({}) {|property, hash| hash[property[0]] = property[1].to_hash}
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def define_property(property_name, key, read_only, data)
|
14
|
+
options = {
|
15
|
+
value: find("#{key}.value", data),
|
16
|
+
update_time: find("#{key}.updateTime", data),
|
17
|
+
read_only: read_only
|
18
|
+
}
|
19
|
+
property = Property.new(options)
|
20
|
+
properties[property_name] = property
|
21
|
+
(class << self; self end).send(:define_method, property_name) { property.value }
|
22
|
+
end
|
23
|
+
|
24
|
+
def find(name, data)
|
25
|
+
parts = name.split '.'
|
26
|
+
result = data
|
27
|
+
parts.each do | part |
|
28
|
+
raise "Could not find part '#{part}' in '#{name}'" unless result.has_key? part
|
29
|
+
result = result[part]
|
30
|
+
end
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def properties
|
35
|
+
@properties ||= {}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module RZWaveWay
|
2
|
+
class Property
|
3
|
+
attr_reader :value
|
4
|
+
attr_reader :update_time
|
5
|
+
|
6
|
+
def initialize(options)
|
7
|
+
@previous_value = @value = options[:value]
|
8
|
+
@previous_update_time = @update_time = options[:update_time]
|
9
|
+
@read_only = options[:read_only]
|
10
|
+
end
|
11
|
+
|
12
|
+
def changed?
|
13
|
+
@previous_value != @value
|
14
|
+
end
|
15
|
+
|
16
|
+
def read_only?
|
17
|
+
@read_only == true
|
18
|
+
end
|
19
|
+
|
20
|
+
def save
|
21
|
+
@previous_value = @value
|
22
|
+
@previous_update_time = @update_time
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_hash
|
26
|
+
{
|
27
|
+
read_only: read_only?,
|
28
|
+
value: @value,
|
29
|
+
update_time: @update_time
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def update(value, update_time)
|
34
|
+
if @update_time <= update_time
|
35
|
+
@update_time = update_time
|
36
|
+
if @value != value
|
37
|
+
@value = value
|
38
|
+
true
|
39
|
+
else
|
40
|
+
false
|
41
|
+
end
|
42
|
+
else
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/rzwaveway/version.rb
CHANGED
@@ -1,133 +1,120 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
1
|
module RZWaveWay
|
4
2
|
class ZWaveDevice
|
5
|
-
include CommandClass
|
6
3
|
include CommandClasses
|
7
4
|
include Logger
|
5
|
+
include PropertiesCache
|
8
6
|
|
9
|
-
attr_reader :name
|
10
7
|
attr_reader :id
|
11
8
|
attr_reader :last_contact_time
|
12
|
-
|
9
|
+
attr_reader :status
|
13
10
|
|
14
11
|
def initialize(id, data)
|
15
12
|
@id = id
|
13
|
+
@command_classes = {}
|
16
14
|
initialize_from data
|
17
|
-
|
15
|
+
update_status
|
16
|
+
log.info "Created device with name='#{name}' status=#{status} (id='#{id}')"
|
17
|
+
end
|
18
|
+
|
19
|
+
def contact
|
20
|
+
RZWaveWay::ZWay.instance.run_zway_no_operation(id)
|
18
21
|
end
|
19
22
|
|
20
23
|
def contacts_controller_periodically?
|
21
24
|
support_commandclass? CommandClass::WAKEUP
|
22
25
|
end
|
23
26
|
|
24
|
-
def
|
25
|
-
|
27
|
+
def inspect
|
28
|
+
output = [to_s]
|
29
|
+
output += @command_classes.collect {|id, command_class| "#{id} - #{command_class}"}
|
30
|
+
output.join "\n"
|
26
31
|
end
|
27
32
|
|
28
33
|
def support_commandclass?(command_class_id)
|
29
34
|
@command_classes.has_key? command_class_id
|
30
35
|
end
|
31
36
|
|
32
|
-
def process
|
33
|
-
events = []
|
37
|
+
def process(updates)
|
34
38
|
updates_per_commandclass = group_per_commandclass updates
|
35
39
|
updates_per_commandclass.each do |cc, values|
|
36
40
|
if @command_classes.has_key? cc
|
37
|
-
|
38
|
-
events << event if event
|
41
|
+
@command_classes[cc].process(values) {|event| yield event}
|
39
42
|
else
|
40
43
|
log.warn "Could not find command class: '#{cc}'"
|
41
44
|
end
|
42
45
|
end
|
43
|
-
process_device_data(updates
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def process_alive_check
|
48
|
-
return if @dead
|
49
|
-
if @contact_frequency > 0
|
50
|
-
current_time = Time.now.to_i
|
51
|
-
delta = current_time - next_contact_time
|
52
|
-
if delta > 0
|
53
|
-
count = ((current_time - @last_contact_time) / @contact_frequency).to_i
|
54
|
-
if count > MAXIMUM_MISSED_CONTACT
|
55
|
-
@dead = true
|
56
|
-
DeadEvent.new(@id)
|
57
|
-
elsif count > @missed_contact_count
|
58
|
-
@missed_contact_count = count
|
59
|
-
NotAliveEvent.new(@id, delta, count)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
46
|
+
process_device_data(updates)
|
47
|
+
save_changes
|
63
48
|
end
|
64
49
|
|
65
50
|
def notify_contacted(time)
|
66
|
-
if time
|
67
|
-
@
|
68
|
-
@last_contact_time = time.to_i
|
69
|
-
@missed_contact_count = 0
|
70
|
-
true
|
51
|
+
if time > @last_contact_time
|
52
|
+
@last_contact_time = time
|
71
53
|
end
|
72
54
|
end
|
73
55
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
56
|
+
def refresh
|
57
|
+
@command_classes.values.each do |command_class|
|
58
|
+
command_class.refresh if command_class.respond_to? :refresh
|
59
|
+
end
|
78
60
|
end
|
79
61
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
@properties[name][:update_time]
|
84
|
-
]
|
62
|
+
def state
|
63
|
+
hash = to_hash
|
64
|
+
@command_classes.values.each_with_object(hash) {|cc, hash| hash.merge!(cc.to_hash)}
|
85
65
|
end
|
86
66
|
|
87
|
-
def
|
88
|
-
|
67
|
+
def to_s
|
68
|
+
"#{id} (#{name}) - #{status} (#{Time.at(last_contact_time)})"
|
89
69
|
end
|
90
70
|
|
91
|
-
def
|
92
|
-
if
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
71
|
+
def update_status
|
72
|
+
@status = if contacts_controller_periodically?
|
73
|
+
if self.WakeUp.on_time?
|
74
|
+
:alive
|
75
|
+
elsif self.WakeUp.missed_contact_count < 10 # times
|
76
|
+
:inactive
|
77
|
+
else
|
78
|
+
:dead
|
79
|
+
end
|
80
|
+
else
|
81
|
+
if elapsed_minutes_since_last_contact > 60 # minutes
|
82
|
+
:dead
|
83
|
+
elsif elapsed_minutes_since_last_contact > 5 # minutes
|
84
|
+
:inactive
|
85
|
+
else
|
86
|
+
:alive
|
98
87
|
end
|
99
88
|
end
|
100
89
|
end
|
101
90
|
|
102
91
|
private
|
103
92
|
|
104
|
-
MAXIMUM_MISSED_CONTACT = 10
|
105
|
-
|
106
93
|
def create_commandclasses_from data
|
107
|
-
cc_classes = {}
|
108
94
|
data['instances']['0']['commandClasses'].each do |id, sub_tree|
|
109
95
|
cc_id = id.to_i
|
110
|
-
cc_class = CommandClasses::Factory.instance.instantiate(cc_id,
|
111
|
-
|
96
|
+
cc_class = CommandClasses::Factory.instance.instantiate(cc_id, self)
|
97
|
+
cc_class.build_from(sub_tree)
|
98
|
+
@command_classes[cc_id] = cc_class
|
112
99
|
cc_class_name = cc_class.class.name.split('::').last
|
113
|
-
(class << self; self end).send(:define_method, cc_class_name) { cc_class } unless cc_class_name == '
|
100
|
+
(class << self; self end).send(:define_method, cc_class_name) { cc_class } unless cc_class_name == 'Unsupported'
|
114
101
|
end
|
115
|
-
cc_classes
|
116
102
|
end
|
117
103
|
|
118
|
-
def
|
119
|
-
|
120
|
-
|
121
|
-
find('data.lastReceived.updateTime', data),
|
122
|
-
find('data.lastSend.updateTime', data)
|
123
|
-
]
|
124
|
-
@last_contact_time = last_contact_times.max
|
104
|
+
def elapsed_minutes_since_last_contact(time = Time.now)
|
105
|
+
(time.to_i - last_contact_time) / 60
|
106
|
+
end
|
125
107
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
108
|
+
def initialize_from data
|
109
|
+
define_property(:name, 'data.givenName', true, data)
|
110
|
+
define_property(:is_failed, 'data.isFailed', true, data)
|
111
|
+
define_property(:failure_count, 'data.failureCount', true, data)
|
112
|
+
|
113
|
+
@last_contact_time = find('data.lastReceived.updateTime', data)
|
114
|
+
notify_contacted(properties[:is_failed].update_time) unless is_failed
|
115
|
+
|
116
|
+
create_commandclasses_from data
|
117
|
+
save_changes
|
131
118
|
end
|
132
119
|
|
133
120
|
def group_per_commandclass updates
|
@@ -137,7 +124,7 @@ module RZWaveWay
|
|
137
124
|
match_data = key.match(/\Ainstances.0.commandClasses.(\d+)./)
|
138
125
|
if match_data
|
139
126
|
command_class = match_data[1].to_i
|
140
|
-
updates_per_commandclass[command_class]
|
127
|
+
updates_per_commandclass[command_class] ||= {}
|
141
128
|
updates_per_commandclass[command_class][match_data.post_match] = value
|
142
129
|
else
|
143
130
|
other_updates[key] = value
|
@@ -148,15 +135,23 @@ module RZWaveWay
|
|
148
135
|
updates_per_commandclass
|
149
136
|
end
|
150
137
|
|
151
|
-
def process_device_data(
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
138
|
+
def process_device_data(data)
|
139
|
+
data.each do | key, value |
|
140
|
+
case key
|
141
|
+
when /^(?:data.)?failureCount/
|
142
|
+
properties[:failure_count].update(value['value'], value['updateTime'])
|
143
|
+
when /^(?:data.)?isFailed/
|
144
|
+
properties[:is_failed].update(value['value'], value['updateTime'])
|
145
|
+
notify_contacted(value['updateTime']) unless is_failed
|
146
|
+
when /^(?:data.)?lastReceived/
|
147
|
+
notify_contacted(value['updateTime'])
|
156
148
|
end
|
157
149
|
end
|
158
|
-
|
159
|
-
|
150
|
+
end
|
151
|
+
|
152
|
+
def save_changes
|
153
|
+
save_properties
|
154
|
+
@command_classes.values.each {|cc| cc.save_properties}
|
160
155
|
end
|
161
156
|
end
|
162
157
|
end
|
data/lib/rzwaveway/zway.rb
CHANGED
@@ -13,7 +13,10 @@ module RZWaveWay
|
|
13
13
|
attr_reader :log
|
14
14
|
|
15
15
|
def initialize
|
16
|
+
@devices = {}
|
17
|
+
@event_handlers = {}
|
16
18
|
@log = default_logger
|
19
|
+
@update_time = '0'
|
17
20
|
end
|
18
21
|
|
19
22
|
def execute(device_id, command_class, command_class_function, argument = nil)
|
@@ -30,19 +33,31 @@ module RZWaveWay
|
|
30
33
|
clazz.new(device)
|
31
34
|
end
|
32
35
|
|
36
|
+
def inspect
|
37
|
+
content = to_s
|
38
|
+
devices.values.each {|device| content << "\n#{device}"}
|
39
|
+
content
|
40
|
+
end
|
41
|
+
|
42
|
+
def run_zway_no_operation device_id
|
43
|
+
run_zway "devices[#{device_id}].SendNoOperation()"
|
44
|
+
end
|
45
|
+
|
33
46
|
def setup(options, *adapter_params)
|
34
47
|
hostname = options[:hostname] || '127.0.0.1'
|
35
48
|
port = options[:port] || 8083
|
49
|
+
username = options[:username] || 'admin'
|
50
|
+
password = options[:password] || 'changeme'
|
36
51
|
adapter_params = :httpclient if adapter_params.compact.empty?
|
37
52
|
@base_uri="http://#{hostname}:#{port}"
|
38
|
-
@connection = Faraday.new
|
53
|
+
@connection = Faraday.new do |connection|
|
54
|
+
connection.basic_auth username, password
|
55
|
+
connection.adapter *adapter_params
|
56
|
+
end
|
39
57
|
@log = options[:logger] if options.has_key? :logger
|
40
58
|
end
|
41
59
|
|
42
60
|
def start
|
43
|
-
@devices = {}
|
44
|
-
@event_handlers = {}
|
45
|
-
@update_time = '0'
|
46
61
|
loop do
|
47
62
|
results = get_zway_data_tree_updates
|
48
63
|
if results.has_key?('devices')
|
@@ -59,43 +74,52 @@ module RZWaveWay
|
|
59
74
|
@event_handlers[event] = listener
|
60
75
|
end
|
61
76
|
|
62
|
-
def
|
63
|
-
check_devices
|
77
|
+
def process
|
64
78
|
updates = get_zway_data_tree_updates
|
65
|
-
|
66
|
-
check_not_alive_devices(events)
|
67
|
-
deliver_to_handlers(events)
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
79
|
+
updates_per_device = group_per_device updates
|
71
80
|
|
72
|
-
|
73
|
-
|
81
|
+
events = []
|
82
|
+
devices.each do |device_id, device|
|
83
|
+
previous_status = device.status
|
74
84
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
# TODO ensure last_contact_time is set in the device initializer
|
80
|
-
if (current_time % 10 == 0) && (current_time > device.next_contact_time - 60)
|
81
|
-
run_zway_no_operation device.id
|
85
|
+
if updates_per_device.has_key? device_id
|
86
|
+
device_updates = updates_per_device[device_id]
|
87
|
+
device.process(device_updates) do |event|
|
88
|
+
events << event
|
82
89
|
end
|
83
90
|
end
|
91
|
+
|
92
|
+
if previous_status != device.update_status
|
93
|
+
events << create_status_event_for(device)
|
94
|
+
end
|
84
95
|
end
|
96
|
+
deliver_to_handlers(events)
|
85
97
|
end
|
86
98
|
|
87
|
-
def
|
88
|
-
@devices.
|
89
|
-
event = device.process_alive_check
|
90
|
-
events << event if event
|
91
|
-
end
|
99
|
+
def to_s
|
100
|
+
"ZWay at '#{@base_uri}' with #{devices.count} device(s)"
|
92
101
|
end
|
93
102
|
|
103
|
+
private
|
104
|
+
|
105
|
+
DATA_TREE_BASE_PATH='/ZWaveAPI/Data/'
|
106
|
+
RUN_BASE_PATH='/ZWaveAPI/Run/'
|
107
|
+
|
94
108
|
def create_device(device_id, device_data_tree)
|
95
109
|
if device_id > 1
|
96
|
-
|
97
|
-
|
98
|
-
|
110
|
+
@devices[device_id] = ZWaveDevice.new(device_id, device_data_tree)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def create_status_event_for(device)
|
115
|
+
log.debug "Device '#{device.name}' is now #{device.status}"
|
116
|
+
case device.status
|
117
|
+
when :alive
|
118
|
+
AliveDevice.new(device_id: device.id, time: device.last_contact_time)
|
119
|
+
when :inactive
|
120
|
+
InactiveDevice.new(device_id: device.id)
|
121
|
+
when :dead
|
122
|
+
DeadDevice.new(device_id: device.id)
|
99
123
|
end
|
100
124
|
end
|
101
125
|
|
@@ -114,20 +138,6 @@ module RZWaveWay
|
|
114
138
|
end
|
115
139
|
end
|
116
140
|
|
117
|
-
def devices_process updates
|
118
|
-
events = []
|
119
|
-
updates_per_device = group_per_device updates
|
120
|
-
updates_per_device.each do | id, updates |
|
121
|
-
if @devices[id]
|
122
|
-
device_events = @devices[id].process updates
|
123
|
-
events += device_events unless device_events.empty?
|
124
|
-
else
|
125
|
-
log.warn "Could not find device with id '#{id}'"
|
126
|
-
end
|
127
|
-
end
|
128
|
-
events
|
129
|
-
end
|
130
|
-
|
131
141
|
def group_per_device updates
|
132
142
|
updates_per_device = {}
|
133
143
|
updates.each do | key, value |
|
@@ -152,7 +162,7 @@ module RZWaveWay
|
|
152
162
|
results = JSON.parse response.body
|
153
163
|
@update_time = results.delete('updateTime')
|
154
164
|
else
|
155
|
-
log.error(response.
|
165
|
+
log.error("#{response.status} - #{response.reason_phrase}" )
|
156
166
|
end
|
157
167
|
rescue StandardError => e
|
158
168
|
log.error("Failed to communicate with ZWay HTTP server: #{e}")
|
@@ -190,10 +200,6 @@ module RZWaveWay
|
|
190
200
|
run_zway command_path
|
191
201
|
end
|
192
202
|
|
193
|
-
def run_zway_no_operation device_id
|
194
|
-
run_zway "devices[#{device_id}].SendNoOperation()"
|
195
|
-
end
|
196
|
-
|
197
203
|
def run_zway command_path
|
198
204
|
begin
|
199
205
|
uri = URI.encode(@base_uri + RUN_BASE_PATH + command_path, '[]')
|