Skip to content

Commit 2edb6c6

Browse files
authored
Merge pull request #1433 from alon-tchelet/harman-websocket
Harman Luxury Change from REST HTTP API to WebSckets
2 parents 191b5ce + a3dc9a6 commit 2edb6c6

File tree

10 files changed

+1155
-883
lines changed

10 files changed

+1155
-883
lines changed

drivers/SmartThings/harman-luxury/profiles/harman-luxury.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ components:
2020
version: 1
2121
- id: audioNotification
2222
version: 1
23-
- id: keypadInput
24-
version: 1
2523
- id: refresh
2624
version: 1
2725
categories:

drivers/SmartThings/harman-luxury/profiles/maX10.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ components:
1010
version: 1
1111
- id: audioTrackData
1212
version: 1
13-
- id: mediaPresets
14-
version: 1
1513
- id: mediaPlayback
1614
version: 1
1715
- id: mediaTrackControl

drivers/SmartThings/harman-luxury/src/api/apis.lua

Lines changed: 17 additions & 249 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,12 @@ local invoke = require "api.invokes"
88

99
--- system paths -----------------------------------------
1010

11-
local UUID_PATH = "settings:/system/memberId"
12-
local MAC_PATH = "settings:/system/primaryMacAddress"
13-
local MEMBER_ID_PATH = "settings:/system/memberId"
1411
local MANUFACTURER_NAME_PATH = "settings:/system/manufacturer"
1512
local DEVICE_NAME_PATH = "settings:/deviceName"
1613
local MODEL_NAME_PATH = "settings:/system/modelName"
1714
local PRODUCT_NAME_PATH = "settings:/system/productName"
18-
19-
--- SmartThings paths ----------------------------------
20-
local SMARTTHINGS_PATH = "smartthings:"
21-
local SMARTTHINGS_AUDIO_PATH = "smartthings:audio/"
22-
local SMARTTHINGS_MEDIA_PATH = "smartthings:media/"
15+
local INIT_CREDENTIAL_PATH = "smartthings:initCredentialsToken"
16+
local CREDENTIAL_PATH = "settings:/smartthings/userToken"
2317

2418
----------------------------------------------------------
2519
--- APIs
@@ -29,27 +23,6 @@ local APIs = {}
2923

3024
--- system APIs ------------------------------------------
3125

32-
--- get UUID from Harman Luxury on ip
33-
---@param ip string
34-
---@return string|nil, nil|string
35-
function APIs.GetUUID(ip)
36-
return get.String(ip, UUID_PATH)
37-
end
38-
39-
--- get MAC address from Harman Luxury on ip
40-
---@param ip string
41-
---@return string|nil, nil|string
42-
function APIs.GetMAC(ip)
43-
return get.String(ip, MAC_PATH)
44-
end
45-
46-
--- get Member ID from Harman Luxury on ip
47-
---@param ip string
48-
---@return string|nil, nil|string
49-
function APIs.GetMemberId(ip)
50-
return get.String(ip, MEMBER_ID_PATH)
51-
end
52-
5326
--- get device manufacturer name from Harman Luxury on ip
5427
---@param ip string
5528
---@return string|nil, nil|string
@@ -86,233 +59,28 @@ function APIs.SetDeviceName(ip, value)
8659
return set.String(ip, DEVICE_NAME_PATH, value)
8760
end
8861

89-
--- get active credential token from a Harman Luxury device on ip
90-
---@param ip string
91-
---@return boolean|number|string|table|nil, nil|string
92-
function APIs.InitCredentialsToken(ip)
93-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "initCredentialsToken")
94-
end
95-
96-
--- get active credential token from a Harman Luxury device on ip
97-
---@param ip string
98-
---@return boolean|number|string|table|nil, nil|string
99-
function APIs.GetCredentialsToken(ip)
100-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "getCredentialsToken")
101-
end
102-
103-
--- get supported input sources from a Harman Luxury device on ip
62+
--- initialise a new credential token from Harman Luxury on ip
10463
---@param ip string
105-
---@return table|nil, nil|string
106-
function APIs.GetSupportedInputSources(ip)
107-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "getSupportedInputSources")
108-
end
109-
110-
--- power manager APIs -----------------------------------
111-
112-
--- invoke smartthings:setOn on ip
113-
---@param ip string
114-
---@return boolean|number|string|table|nil, nil|string
115-
function APIs.SetOn(ip)
116-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "setOn")
117-
end
118-
119-
--- invoke smartthings:setOff on ip
120-
---@param ip string
121-
---@return boolean|number|string|table|nil, nil|string
122-
function APIs.SetOff(ip)
123-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "setOff")
124-
end
125-
126-
--- get current power state Harman Luxury on ip
127-
---@param ip string
128-
---@return boolean|number|string|table|nil, nil|string
129-
function APIs.GetPowerState(ip)
130-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "powerStatus")
131-
end
132-
133-
--- audio APIs ------------------------------------
134-
135-
--- set Mute value of Harman Luxury media player on ip
136-
---@param ip string
137-
---@param value boolean
138-
---@return boolean|number|string|table|nil, nil|string
139-
function APIs.SetMute(ip, value)
140-
return set.Bool(ip, SMARTTHINGS_AUDIO_PATH .. "mute", value)
141-
end
142-
143-
--- get Mute value of Harman Luxury media player on ip
144-
---@param ip string
145-
---@return boolean|number|string|table|nil, nil|string
146-
function APIs.GetMute(ip)
147-
return get.Bool(ip, SMARTTHINGS_AUDIO_PATH .. "mute")
148-
end
149-
150-
--- set Volume value of Harman Luxury media player on ip
151-
---@param ip string
152-
---@param value integer
153-
---@return boolean|number|string|table|nil, nil|string
154-
function APIs.SetVol(ip, value)
155-
return set.I32(ip, SMARTTHINGS_AUDIO_PATH .. "volume", value)
156-
end
157-
158-
--- get Volume value of Harman Luxury media player on ip
159-
---@param ip string
160-
---@return number|nil, nil|string
161-
function APIs.GetVol(ip)
162-
return get.I32(ip, SMARTTHINGS_AUDIO_PATH .. "volume")
163-
end
164-
165-
--- invoke smartthings:audio/getAudioTrackData on ip
166-
---@class AudioTrackData
167-
---@field trackdata table<string>
168-
---@field supportedPlaybackCommands table<string>
169-
---@field supportedTrackControlCommands table<string>
170-
---@field totalTime number
171-
---@param ip string
172-
---@return AudioTrackData|nil, nil|string
173-
function APIs.getAudioTrackData(ip)
174-
local val, err = invoke.Activate(ip, SMARTTHINGS_AUDIO_PATH .. "getAudioTrackData")
175-
if val then
176-
local audioTrackData = {
177-
trackdata = {
178-
title = val.title or "",
179-
artist = val.artist or nil,
180-
album = val.album or nil,
181-
albumArtUrl = val.albumArtUrl or nil,
182-
mediaSource = val.mediaSource or nil,
183-
},
184-
supportedPlaybackCommands = val.supportedPlaybackCommands,
185-
supportedTrackControlCommands = val.supportedTrackControlCommands,
186-
totalTime = val.totalTime,
187-
}
188-
return audioTrackData, nil
189-
else
64+
---@return string|nil, nil|string
65+
function APIs.init_credential_token(ip)
66+
local val, err = invoke.Activate(ip, INIT_CREDENTIAL_PATH)
67+
if err then
19068
return nil, err
191-
end
192-
end
193-
194-
--- Audio Notification API ------------------------------------
195-
196-
--- invoke Audio Notification of Harman Luxury on ip
197-
---@param ip string
198-
---@param uri string
199-
---@param level number
200-
---@return boolean|number|string|table|nil, nil|string
201-
function APIs.SendAudioNotification(ip, uri, level)
202-
local value = {
203-
smartthingsAudioNotification = {
204-
uri = uri,
205-
level = level,
206-
},
207-
}
208-
return invoke.ActivateValue(ip, SMARTTHINGS_PATH .. "playAudioNotification", value)
209-
end
210-
211-
--- media player APIs ------------------------------------
212-
213-
--- set Input Source value of Harman Luxury on ip
214-
---@param ip string
215-
---@param source string
216-
---@return boolean|number|string|table|nil, nil|string
217-
function APIs.SetInputSource(ip, source)
218-
local value = {
219-
string_ = source,
220-
}
221-
return invoke.ActivateValue(ip, SMARTTHINGS_MEDIA_PATH .. "setInputSource", value)
222-
end
223-
224-
--- get Input Source value of Harman Luxury on ip
225-
---@param ip string
226-
---@return boolean|number|string|table|nil, nil|string
227-
function APIs.GetInputSource(ip)
228-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "getInputSource")
229-
end
230-
231-
--- play Media Preset with given id value on Harman Luxury on ip
232-
---@param ip string
233-
---@param id integer
234-
---@return boolean|number|string|table|nil, nil|string
235-
function APIs.PlayMediaPreset(ip, id)
236-
local value = {
237-
i32_ = id,
238-
}
239-
return invoke.ActivateValue(ip, SMARTTHINGS_MEDIA_PATH .. "playMediaPreset", value)
240-
end
241-
242-
--- get Media Preset list of Harman Luxury on ip
243-
---@param ip string
244-
---@return table|nil, nil|string
245-
function APIs.GetMediaPresets(ip)
246-
local val, err = invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "getMediaPresets")
247-
if val then
248-
return val.presets, nil
24969
else
250-
return nil, err
70+
if type(val) == "string" then
71+
return val, nil
72+
else
73+
err = string.format("Device with IP:%s failed to generate a valid credential", ip)
74+
return nil, err
75+
end
25176
end
25277
end
25378

254-
--- invoke smartthings:media/setPlay on ip
255-
---@param ip string
256-
---@return boolean|number|string|table|nil, nil|string
257-
function APIs.InvokePlay(ip)
258-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "setPlay")
259-
end
260-
261-
--- invoke smartthings:media/setPause on ip
79+
--- get device current active token from Harman Luxury on ip
26280
---@param ip string
263-
---@return boolean|number|string|table|nil, nil|string
264-
function APIs.InvokePause(ip)
265-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "setPause")
266-
end
267-
268-
--- invoke smartthings:media/setNextTrack on ip
269-
---@param ip string
270-
---@return boolean|number|string|table|nil, nil|string
271-
function APIs.InvokeNext(ip)
272-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "setNextTrack")
273-
end
274-
275-
--- invoke smartthings:media/setPrevTrack on ip
276-
---@param ip string
277-
---@return boolean|number|string|table|nil, nil|string
278-
function APIs.InvokePrevious(ip)
279-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "setPrevTrack")
280-
end
281-
282-
--- invoke smartthings:media/setStop on ip
283-
---@param ip string
284-
---@return boolean|number|string|table|nil, nil|string
285-
function APIs.InvokeStop(ip)
286-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "setStop")
287-
end
288-
289-
--- invoke smartthings:media/setStop on ip
290-
---@param ip string
291-
---@return boolean|number|string|table|nil, nil|string
292-
function APIs.GetPlayerState(ip)
293-
return invoke.Activate(ip, SMARTTHINGS_MEDIA_PATH .. "getPlayerState")
294-
end
295-
296-
--- key input APIs ------------------------------------
297-
298-
--- invoke smartthings:sendKey on ip
299-
---@param ip string
300-
---@param key string
301-
---@return boolean|number|string|table|nil, nil|string
302-
function APIs.InvokeSendKey(ip, key)
303-
local value = {
304-
NsdkSmartThingsKey = key,
305-
}
306-
return invoke.ActivateValue(ip, SMARTTHINGS_PATH .. "sendKey", value)
307-
end
308-
309-
--- check for values change APIs ------------------------------------
310-
311-
--- invoke smartthings:updateValues on ip
312-
---@param ip string
313-
---@return table|nil, nil|string
314-
function APIs.InvokeGetUpdates(ip)
315-
return invoke.Activate(ip, SMARTTHINGS_PATH .. "updateValues")
81+
---@return string|nil, nil|string
82+
function APIs.GetActiveCredentialToken(ip)
83+
return get.String(ip, CREDENTIAL_PATH)
31684
end
31785

31886
return APIs

drivers/SmartThings/harman-luxury/src/api/nsdk.lua

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ end
6464
---@param func_name string
6565
---@param u string
6666
---@param sink string
67-
---@param code integer
67+
---@param code integer|string
6868
---@param valLocationFunc function
6969
---@return boolean|number|string|table|nil, nil|string
7070
local function handleReply(func_name, u, sink, code, valLocationFunc)
@@ -88,7 +88,12 @@ local function handleReply(func_name, u, sink, code, valLocationFunc)
8888
end
8989
return nil, err
9090
else -- UNKNOWN VALUE
91-
local err = string.format("Error in %s: Unknown return value: code: %s, sink: %s", func_name, code, sink)
91+
local err
92+
if string.find(code, "timeout") then
93+
err = string.format("Error in %s: Connection timeout", func_name)
94+
else
95+
err = string.format("Error in %s: Unknown return value: code: %s, sink: %s", func_name, code, sink)
96+
end
9297
log.error(err)
9398
return nil, err
9499
end

drivers/SmartThings/harman-luxury/src/constants.lua

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ local Constants = {
33
IP = "device_ipv4",
44
DEVICE_INFO = "device_info",
55
CREDENTIAL = "credential",
6-
STATUS = "status",
7-
HEALTH_TIMER = "health_timer",
8-
UPDATE_TIMER = "value_updates_timer",
6+
INITIALISED = "initialised",
7+
WEBSOCKET = "websocket",
8+
9+
-- message fields
10+
MESSAGE = "message",
11+
CAPABILITY = "capability",
12+
COMMAND = "command",
13+
ARG = "arg",
914

1015
-- intervals constants (in seconds)
11-
UPDATE_INTERVAL = 1,
12-
HEALTH_CHEACK_INTERVAL = 10,
13-
HTTP_TIMEOUT = 10,
16+
WS_SOCKET_TIMEOUT = 10,
17+
WS_IDLE_PING_PERIOD = 30,
18+
WS_RECONNECT_PERIOD = 10,
19+
HTTP_TIMEOUT = 5,
1420

1521
-- discovery constants
1622
SERVICE_TYPE = "_sue-st._tcp",
@@ -28,5 +34,6 @@ local Constants = {
2834

2935
-- general consts
3036
VOL_STEP = 5,
37+
WS_PORT = 50002,
3138
}
3239
return Constants

0 commit comments

Comments
 (0)