aca-device-modules 1.0.3 → 1.0.4
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/lib/aca-device-modules/version.rb +1 -1
- data/modules/biamp/nexia.rb +45 -26
- data/modules/bss/blu100.rb +49 -31
- data/modules/chiyu/cyt.rb +183 -0
- data/modules/epson/projector/esc_vp21.rb +5 -0
- data/modules/kramer/switcher/protocol3000.rb +243 -0
- data/modules/nec/display/all.rb +482 -0
- data/modules/nec/projector/np_series.rb +648 -0
- data/modules/panasonic/projector/tcp.rb +250 -0
- data/modules/screen_technics/connect.rb +73 -0
- data/modules/sony/display/{gdx_and_fwd.rb → id_talk.rb} +38 -7
- data/modules/sony/projector/pj_talk.rb +300 -0
- data/modules/transmitsms/api.rb +52 -0
- data/modules/vaddio/camera/clear_view_ptz_telnet.rb +3 -3
- metadata +11 -4
- data/modules/panasonic/projector/pj_link.rb +0 -266
@@ -0,0 +1,52 @@
|
|
1
|
+
module Transmitsms; end
|
2
|
+
|
3
|
+
# default URL: https://api.transmitsms.com
|
4
|
+
# Settings: api_key and api_secret
|
5
|
+
|
6
|
+
class Transmitsms::Api
|
7
|
+
include ::Orchestrator::Constants
|
8
|
+
|
9
|
+
|
10
|
+
DECODE_OPTIONS = {
|
11
|
+
symbolize_names: true
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
|
15
|
+
def on_load
|
16
|
+
defaults({
|
17
|
+
keepalive: false,
|
18
|
+
inactivity_timeout: 1.5, # seconds before closing the connection if no response
|
19
|
+
connect_timeout: 2 # max seconds for the initial connection to the device
|
20
|
+
})
|
21
|
+
|
22
|
+
on_update
|
23
|
+
end
|
24
|
+
|
25
|
+
def on_update
|
26
|
+
@api_key = setting(:api_key)
|
27
|
+
@api_secret = setting(:api_secret)
|
28
|
+
end
|
29
|
+
|
30
|
+
def send_sms(message, params = {})
|
31
|
+
params[:message] = message
|
32
|
+
options = {
|
33
|
+
headers: {
|
34
|
+
'authorization' => [@api_key, @api_secret]
|
35
|
+
},
|
36
|
+
body: params
|
37
|
+
}
|
38
|
+
|
39
|
+
logger.debug "Requesting SMS: #{params}"
|
40
|
+
|
41
|
+
post('/send-sms.json', options) do |data, resolve|
|
42
|
+
resp = ::JSON.parse(data[:body], DECODE_OPTIONS)
|
43
|
+
if resp[:error][:code] != 'SUCCESS'
|
44
|
+
self[:last_error] = resp[:error]
|
45
|
+
logger.error "#{resp[:error][:code]}: #{resp[:error][:description]}"
|
46
|
+
:abort
|
47
|
+
else
|
48
|
+
:success
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -76,13 +76,13 @@ class Vaddio::Camera::ClearViewPtzTelnet
|
|
76
76
|
|
77
77
|
|
78
78
|
# direction: left, right, stop
|
79
|
-
def pan(direction, speed =
|
79
|
+
def pan(direction, speed = 18)
|
80
80
|
params = direction.to_sym == :stop ? direction : "#{direction} #{speed}"
|
81
81
|
send "camera pan #{params}\r", name: :pan
|
82
82
|
end
|
83
83
|
|
84
84
|
# direction: up, down, stop
|
85
|
-
def tilt(direction, speed =
|
85
|
+
def tilt(direction, speed = 18)
|
86
86
|
params = direction.to_sym == :stop ? direction : "#{direction} #{speed}"
|
87
87
|
send "camera tilt #{params}\r", name: :tilt
|
88
88
|
end
|
@@ -97,7 +97,7 @@ class Vaddio::Camera::ClearViewPtzTelnet
|
|
97
97
|
end
|
98
98
|
|
99
99
|
# direction: in, out, stop
|
100
|
-
def zoom(direction, speed =
|
100
|
+
def zoom(direction, speed = 4)
|
101
101
|
params = direction.to_sym == :stop ? direction : "#{direction} #{speed}"
|
102
102
|
send "camera zoom #{params}\r", name: :zoom
|
103
103
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aca-device-modules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen von Takach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -55,17 +55,24 @@ files:
|
|
55
55
|
- modules/axis/camera/vapix.rb
|
56
56
|
- modules/biamp/nexia.rb
|
57
57
|
- modules/bss/blu100.rb
|
58
|
+
- modules/chiyu/cyt.rb
|
58
59
|
- modules/clipsal/c_bus.rb
|
59
60
|
- modules/epson/projector/esc_vp21.rb
|
60
61
|
- modules/extron/mixer/dmp44.rb
|
61
62
|
- modules/extron/mixer/dmp64.rb
|
62
63
|
- modules/extron/switcher/dxp.rb
|
63
64
|
- modules/global_cache/gc100.rb
|
65
|
+
- modules/kramer/switcher/protocol3000.rb
|
64
66
|
- modules/kramer/switcher/vs_hdmi.rb
|
67
|
+
- modules/nec/display/all.rb
|
68
|
+
- modules/nec/projector/np_series.rb
|
65
69
|
- modules/panasonic/camera/he50.rb
|
66
|
-
- modules/panasonic/projector/
|
70
|
+
- modules/panasonic/projector/tcp.rb
|
67
71
|
- modules/samsung/displays/md_series.rb
|
68
|
-
- modules/
|
72
|
+
- modules/screen_technics/connect.rb
|
73
|
+
- modules/sony/display/id_talk.rb
|
74
|
+
- modules/sony/projector/pj_talk.rb
|
75
|
+
- modules/transmitsms/api.rb
|
69
76
|
- modules/vaddio/camera/clear_view_ptz_telnet.rb
|
70
77
|
homepage: http://cotag.me/
|
71
78
|
licenses:
|
@@ -1,266 +0,0 @@
|
|
1
|
-
module Panasonic; end
|
2
|
-
module Panasonic::Projector; end
|
3
|
-
|
4
|
-
|
5
|
-
require 'digest/md5'
|
6
|
-
|
7
|
-
#
|
8
|
-
# Port: 1024
|
9
|
-
#
|
10
|
-
class Panasonic::Projector::PjLink
|
11
|
-
include ::Orchestrator::Constants
|
12
|
-
include ::Orchestrator::Transcoder
|
13
|
-
|
14
|
-
def on_load
|
15
|
-
# PJLink is slow
|
16
|
-
defaults({
|
17
|
-
timeout: 4000,
|
18
|
-
delay_on_receive: 400
|
19
|
-
})
|
20
|
-
|
21
|
-
config({
|
22
|
-
tokenize: true,
|
23
|
-
delimiter: "\r",
|
24
|
-
wait_ready: 'NTCONTROL'
|
25
|
-
})
|
26
|
-
|
27
|
-
@check_scheduled = false
|
28
|
-
self[:power] = false
|
29
|
-
self[:stable_state] = true # Stable by default (allows manual on and off)
|
30
|
-
self[:input_stable] = true
|
31
|
-
|
32
|
-
# Meta data for inquiring interfaces
|
33
|
-
self[:type] = :projector
|
34
|
-
end
|
35
|
-
|
36
|
-
def on_update
|
37
|
-
end
|
38
|
-
|
39
|
-
def connected
|
40
|
-
@polling_timer = schedule.every('60s', method(:do_poll))
|
41
|
-
end
|
42
|
-
|
43
|
-
def disconnected
|
44
|
-
self[:power] = false
|
45
|
-
|
46
|
-
@polling_timer.cancel unless @polling_timer.nil?
|
47
|
-
@polling_timer = nil
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
#
|
53
|
-
# Power commands
|
54
|
-
#
|
55
|
-
def power(state, opt = nil)
|
56
|
-
self[:stable_state] = false
|
57
|
-
if is_affirmative?(state)
|
58
|
-
self[:power_target] = On
|
59
|
-
do_send(:POWR, 1, {:retries => 10, :name => :power})
|
60
|
-
logger.debug "-- panasonic Proj, requested to power on"
|
61
|
-
do_send('POWR', '?', :name => :power_state)
|
62
|
-
else
|
63
|
-
self[:power_target] = Off
|
64
|
-
do_send(:POWR, 0, {:retries => 10, :name => :power})
|
65
|
-
logger.debug "-- panasonic Proj, requested to power off"
|
66
|
-
do_send('POWR', '?', :name => :power_state)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def power?(options = {}, &block)
|
71
|
-
options[:emit] = block if block_given?
|
72
|
-
options[:name] = :power_state
|
73
|
-
do_send(:POWR, options)
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
#
|
79
|
-
# Input selection
|
80
|
-
#
|
81
|
-
INPUTS = {
|
82
|
-
:hdmi => 31,
|
83
|
-
:hdmi2 => 32,
|
84
|
-
:digital => 33,
|
85
|
-
:miracast => 52
|
86
|
-
}
|
87
|
-
INPUTS.merge!(INPUTS.invert)
|
88
|
-
|
89
|
-
|
90
|
-
def switch_to(input)
|
91
|
-
input = input.to_sym
|
92
|
-
return unless INPUTS.has_key? input
|
93
|
-
|
94
|
-
do_send(:INPT, INPUTS[input], {:retries => 10, :name => :inpt_source})
|
95
|
-
do_send('INPT', '?', {:name => :inpt_query})
|
96
|
-
logger.debug "-- panasonic LCD, requested to switch to: #{input}"
|
97
|
-
|
98
|
-
self[:input] = input # for a responsive UI
|
99
|
-
self[:input_stable] = false
|
100
|
-
end
|
101
|
-
|
102
|
-
|
103
|
-
#
|
104
|
-
# Mute Audio and Video
|
105
|
-
#
|
106
|
-
def mute
|
107
|
-
logger.debug "-- panasonic Proj, requested to mute"
|
108
|
-
do_send(:AVMT, 31, {:name => :video_mute}) # Audio + Video
|
109
|
-
end
|
110
|
-
|
111
|
-
def unmute
|
112
|
-
logger.debug "-- panasonic Proj, requested to unmute"
|
113
|
-
do_send(:AVMT, 30, {:name => :video_mute})
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
ERRORS = {
|
118
|
-
:ERR1 => '1: Undefined control command'.freeze,
|
119
|
-
:ERR2 => '2: Out of parameter range'.freeze,
|
120
|
-
:ERR3 => '3: Busy state or no-acceptable period'.freeze,
|
121
|
-
:ERR4 => '4: Timeout or no-acceptable period'.freeze,
|
122
|
-
:ERR5 => '5: Wrong data length'.freeze,
|
123
|
-
:ERRA => 'A: Password mismatch'.freeze
|
124
|
-
}
|
125
|
-
|
126
|
-
|
127
|
-
def received(data, resolve, command) # Data is default received as a string
|
128
|
-
logger.debug "panasonic Proj sent: #{data}"
|
129
|
-
|
130
|
-
# This is the ready response
|
131
|
-
if data[0] == ' '
|
132
|
-
@mode = data[1]
|
133
|
-
if @mode == '1'
|
134
|
-
@pass = "#{setting(:username) || 'admin1'}:#{setting(:password) || 'panasonic'}:#{data.strip.split(/\s+/)[-1]}"
|
135
|
-
@pass = Digest::MD5.hexdigest(@hash)
|
136
|
-
end
|
137
|
-
|
138
|
-
:success
|
139
|
-
|
140
|
-
# Error Response
|
141
|
-
elsif data[0] == 'E'
|
142
|
-
error = data.to_sym
|
143
|
-
#self[:last_error] = ERRORS[error] (for error status query)
|
144
|
-
|
145
|
-
# Check for busy or timeout
|
146
|
-
if error == :ERR3 || error == :ERR4
|
147
|
-
logger.warn "Panasonic Proj busy: #{self[:last_error]}"
|
148
|
-
:retry
|
149
|
-
else
|
150
|
-
logger.error "Panasonic Proj error: #{self[:last_error]}"
|
151
|
-
:abort
|
152
|
-
end
|
153
|
-
|
154
|
-
# Success Response
|
155
|
-
else
|
156
|
-
data = data[2..-1].split('=')
|
157
|
-
|
158
|
-
if data[1] = 'OK'
|
159
|
-
return :success
|
160
|
-
else
|
161
|
-
type = data[0][2..-1].to_sym
|
162
|
-
response = data[1].to_i
|
163
|
-
resolve.call(:success)
|
164
|
-
|
165
|
-
case type
|
166
|
-
when :POWR
|
167
|
-
self[:power] = response >= 1 && response != 2
|
168
|
-
self[:warming] = response == 3
|
169
|
-
self[:cooling] = response == 2
|
170
|
-
if response >= 2 && !@check_scheduled && !self[:stable_state]
|
171
|
-
@check_scheduled = true
|
172
|
-
schedule.in('20s') do
|
173
|
-
@check_scheduled = false
|
174
|
-
logger.debug "-- checking panasonic state"
|
175
|
-
power?({:priority => 0}) do
|
176
|
-
state = self[:power]
|
177
|
-
if state != self[:power_target]
|
178
|
-
if self[:power_target] || !self[:cooling]
|
179
|
-
power(self[:power_target])
|
180
|
-
end
|
181
|
-
elsif self[:power_target] && self[:cooling]
|
182
|
-
power(self[:power_target])
|
183
|
-
else
|
184
|
-
self[:stable_state] = true
|
185
|
-
switch_to(self[:input]) if self[:power_target] == On && !self[:input].nil?
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
when :INPT
|
191
|
-
if INPUTS[response].present?
|
192
|
-
self[:input] = INPUTS[response] if self[:input].nil?
|
193
|
-
self[:actual_input] = INPUTS[response]
|
194
|
-
if self[:input] == self[:actual_input]
|
195
|
-
self[:input_stable] = true
|
196
|
-
elsif self[:input_stable] == false
|
197
|
-
schedule.in('5s') do
|
198
|
-
logger.debug "-- forcing panasonic input"
|
199
|
-
switch_to(self[:input]) if self[:input_stable] == false
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
when :AVMT
|
204
|
-
self[:mute] = response == 31 # 10 == video mute off, 11 == video mute, 20 == audio mute off, 21 == audio mute, 30 == AV mute off
|
205
|
-
when :LAMP
|
206
|
-
self[:lamp] = data[1][0..-2].to_i
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
protected
|
215
|
-
|
216
|
-
|
217
|
-
def do_poll(*args)
|
218
|
-
power?({:priority => 0}) do
|
219
|
-
if self[:power]
|
220
|
-
if self[:stable_state] == false && self[:power_target] == Off
|
221
|
-
power(Off)
|
222
|
-
else
|
223
|
-
self[:stable_state] = true
|
224
|
-
do_send(:INPT, {
|
225
|
-
:name => :inpt_query,
|
226
|
-
:priority => 0
|
227
|
-
})
|
228
|
-
do_send(:AVMT, {
|
229
|
-
:name => :mute_query,
|
230
|
-
:priority => 0
|
231
|
-
})
|
232
|
-
do_send(:LAMP, {
|
233
|
-
:name => :lamp_query,
|
234
|
-
:priority => 0
|
235
|
-
})
|
236
|
-
end
|
237
|
-
elsif self[:stable_state] == false
|
238
|
-
if self[:power_target] == On
|
239
|
-
power(On)
|
240
|
-
else
|
241
|
-
self[:stable_state] = true
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
def do_send(command, param = nil, options = {})
|
248
|
-
if param.is_a? Hash
|
249
|
-
options = param
|
250
|
-
param = nil
|
251
|
-
end
|
252
|
-
|
253
|
-
if param.nil?
|
254
|
-
pj = "#{command} ?"
|
255
|
-
else
|
256
|
-
pj = "#{command} #{param}"
|
257
|
-
end
|
258
|
-
|
259
|
-
if @mode == '0'
|
260
|
-
send("00#{pj}\r", options)
|
261
|
-
else
|
262
|
-
send("#{@pass}00#{pj}\r", options)
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|