Skip to content

Commit 5830ba1

Browse files
Matter RVC: Add mode id to supported_modes field (#2108)
Signed-off-by: Hunsup Jung <[email protected]> Signed-off-by: Gene Harvey <[email protected]> Co-authored-by: Gene <[email protected]>
1 parent d773c03 commit 5830ba1

File tree

2 files changed

+134
-161
lines changed

2 files changed

+134
-161
lines changed

drivers/SmartThings/matter-rvc/src/init.lua

+33-29
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ local function update_supported_arguments(device, current_run_mode, operating_st
104104
-- Get the tag of the current run mode
105105
local current_tag = 0xFFFF
106106
local supported_run_modes = device:get_field(RUN_MODE_SUPPORTED_MODES) or {}
107-
for i, mode in ipairs(supported_run_modes) do
108-
if mode[1] == current_run_mode then
109-
current_tag = mode[2]
107+
for _, mode in ipairs(supported_run_modes) do
108+
if mode.label == current_run_mode then
109+
current_tag = mode.tag
110110
break
111111
end
112112
end
@@ -126,9 +126,9 @@ local function update_supported_arguments(device, current_run_mode, operating_st
126126

127127
-- Set supported run arguments
128128
local supported_arguments = {} -- For generic plugin
129-
for i, mode in ipairs(supported_run_modes) do
130-
if mode[2] == clusters.RvcRunMode.types.ModeTag.IDLE or can_be_non_idle == true then
131-
table.insert(supported_arguments, mode[1])
129+
for _, mode in ipairs(supported_run_modes) do
130+
if mode.tag == clusters.RvcRunMode.types.ModeTag.IDLE or can_be_non_idle == true then
131+
table.insert(supported_arguments, mode.label)
132132
end
133133
end
134134

@@ -140,8 +140,8 @@ local function update_supported_arguments(device, current_run_mode, operating_st
140140
-- Set supported clean arguments
141141
local supported_clean_modes = device:get_field(CLEAN_MODE_SUPPORTED_MODES) or {}
142142
supported_arguments = {}
143-
for i, mode in ipairs(supported_clean_modes) do
144-
table.insert(supported_arguments, mode)
143+
for _, mode in ipairs(supported_clean_modes) do
144+
table.insert(supported_arguments, mode.label)
145145
end
146146

147147
-- Send event to set supported clean modes
@@ -155,13 +155,13 @@ end
155155
-- Matter Handlers --
156156
local function run_mode_supported_mode_handler(driver, device, ib, response)
157157
local supported_modes = {}
158-
local supported_modes_with_tag = {}
159-
for i, mode in ipairs(ib.data.elements) do
158+
local supported_modes_id_tag = {}
159+
for _, mode in ipairs(ib.data.elements) do
160160
if version.api < 10 then
161161
clusters.RvcRunMode.types.ModeOptionStruct:augment_type(mode)
162162
end
163163
local tag = 0xFFFF
164-
for i, t in ipairs(mode.elements.mode_tags.elements) do
164+
for _, t in ipairs(mode.elements.mode_tags.elements) do
165165
if t.elements.value.value == clusters.RvcRunMode.types.ModeTag.IDLE then
166166
tag = clusters.RvcRunMode.types.ModeTag.IDLE
167167
break
@@ -175,10 +175,10 @@ local function run_mode_supported_mode_handler(driver, device, ib, response)
175175
end
176176
if tag ~= 0xFFFF then
177177
table.insert(supported_modes, mode.elements.label.value)
178-
table.insert(supported_modes_with_tag, {mode.elements.label.value, tag})
178+
table.insert(supported_modes_id_tag, { label = mode.elements.label.value, id = mode.elements.mode.value, tag = tag })
179179
end
180180
end
181-
device:set_field(RUN_MODE_SUPPORTED_MODES, supported_modes_with_tag, { persist = true })
181+
device:set_field(RUN_MODE_SUPPORTED_MODES, supported_modes_id_tag, { persist = true })
182182

183183
-- Update Supported Modes
184184
local component = device.profile.components["runMode"]
@@ -203,12 +203,12 @@ local function run_mode_current_mode_handler(driver, device, ib, response)
203203
device.log.info(string.format("run_mode_current_mode_handler currentMode: %s", ib.data.value))
204204

205205
-- Get label of current mode
206-
local mode_index = ib.data.value
206+
local mode_id = ib.data.value
207207
local supported_run_mode = device:get_field(RUN_MODE_SUPPORTED_MODES) or {}
208208
local current_run_mode = nil
209-
for i, mode in ipairs(supported_run_mode) do
210-
if i - 1 == mode_index then
211-
current_run_mode = mode[1]
209+
for _, mode in ipairs(supported_run_mode) do
210+
if mode.id == mode_id then
211+
current_run_mode = mode.label
212212
end
213213
end
214214
if current_run_mode == nil then
@@ -231,13 +231,15 @@ end
231231
local function clean_mode_supported_mode_handler(driver, device, ib, response)
232232
device.log.info(string.format("clean_mode_supported_mode_handler"))
233233
local supported_modes = {}
234-
for i, mode in ipairs(ib.data.elements) do
234+
local supported_modes_id = {}
235+
for _, mode in ipairs(ib.data.elements) do
235236
if version.api < 10 then
236237
clusters.RvcRunMode.types.ModeOptionStruct:augment_type(mode)
237238
end
238239
table.insert(supported_modes, mode.elements.label.value)
240+
table.insert(supported_modes_id, { label = mode.elements.label.value, id = mode.elements.mode.value })
239241
end
240-
device:set_field(CLEAN_MODE_SUPPORTED_MODES, supported_modes, { persist = true })
242+
device:set_field(CLEAN_MODE_SUPPORTED_MODES, supported_modes_id, { persist = true })
241243

242244
local component = device.profile.components["cleanMode"]
243245
local event = capabilities.mode.supportedModes(supported_modes, {visibility = {displayed = false}})
@@ -248,12 +250,12 @@ end
248250

249251
local function clean_mode_current_mode_handler(driver, device, ib, response)
250252
device.log.info(string.format("clean_mode_current_mode_handler currentMode: %s", ib.data.value))
251-
local mode_index = ib.data.value
253+
local mode_id = ib.data.value
252254
local supported_clean_mode = device:get_field(CLEAN_MODE_SUPPORTED_MODES) or {}
253-
for i, mode in ipairs(supported_clean_mode) do
254-
if i - 1 == mode_index then
255+
for _, mode in ipairs(supported_clean_mode) do
256+
if mode.id == mode_id then
255257
local component = device.profile.components["cleanMode"]
256-
device:emit_component_event(component, capabilities.mode.mode(mode))
258+
device:emit_component_event(component, capabilities.mode.mode(mode.label))
257259
break
258260
end
259261
end
@@ -329,17 +331,19 @@ local function handle_robot_cleaner_mode(driver, device, cmd)
329331
local endpoint_id = device:component_to_endpoint(cmd.component)
330332
if cmd.component == "runMode" then
331333
local supported_modes = device:get_field(RUN_MODE_SUPPORTED_MODES) or {}
332-
for i, mode in ipairs(supported_modes) do
333-
if cmd.args.mode == mode[1] then
334-
device:send(clusters.RvcRunMode.commands.ChangeToMode(device, endpoint_id, i - 1))
334+
for _, mode in ipairs(supported_modes) do
335+
if cmd.args.mode == mode.label then
336+
device.log.info(string.format("mode.label: %s, mode.id: %s", mode.label, mode.id))
337+
device:send(clusters.RvcRunMode.commands.ChangeToMode(device, endpoint_id, mode.id))
335338
return
336339
end
337340
end
338341
elseif cmd.component == "cleanMode" then
339342
local supported_modes = device:get_field(CLEAN_MODE_SUPPORTED_MODES) or {}
340-
for i, mode in ipairs(supported_modes) do
341-
if cmd.args.mode == mode then
342-
device:send(clusters.RvcCleanMode.commands.ChangeToMode(device, endpoint_id, i - 1))
343+
for _, mode in ipairs(supported_modes) do
344+
if cmd.args.mode == mode.label then
345+
device.log.info(string.format("mode.label: %s, mode.id: %s", mode.label, mode.id))
346+
device:send(clusters.RvcCleanMode.commands.ChangeToMode(device, endpoint_id, mode.id))
343347
return
344348
end
345349
end

0 commit comments

Comments
 (0)