Skip to content

Commit

Permalink
new switch level to device level mapping built
Browse files Browse the repository at this point in the history
  • Loading branch information
hcarter-775 committed Jun 17, 2024
1 parent fe2ea1b commit b71ed77
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 14 deletions.
4 changes: 4 additions & 0 deletions drivers/SmartThings/matter-pump/profiles/pump-level.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ components:
version: 1
- id: switchLevel
version: 1
config:
values:
- key: "level.value"
range: [1, 100]
- id: pumpOperationMode
version: 1
- id: pumpControlMode
Expand Down
22 changes: 8 additions & 14 deletions drivers/SmartThings/matter-pump/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,7 @@ end
local function level_attr_handler(driver, device, ib, response)
if ib.data.value then
local max_level = get_field_for_endpoint(device, LEVEL_MAX, ib.endpoint_id) or DEFAULT_MAX_LEVEL
local min_level = get_field_for_endpoint(device, LEVEL_MIN, ib.endpoint_id) or DEFAULT_MIN_LEVEL
local level = math.floor(((ib.data.value - min_level) / (max_level - min_level) * MAX_CAP_SWITCH_LEVEL) + 0.5)
local level = math.floor((ib.data.value / max_level * MAX_CAP_SWITCH_LEVEL) + 0.5)
level = math.max(level, MIN_CAP_SWITCH_LEVEL)
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.switchLevel.level(level))
end
Expand Down Expand Up @@ -243,16 +242,13 @@ end

local level_bounds_handler = function(a_min_or_max_val)
return function(driver, device, ib, response)
-- if there is no reported max/min level (ib.data.value), return
if not ib.data.value then
return
if ib.data.value then
set_field_for_endpoint(device, a_min_or_max_val, ib.endpoint_id, ib.data.value, {persist = true})
local level_min = get_field_for_endpoint(device, LEVEL_MIN, ib.endpoint_id)
if level_min then
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.switchLevel.levelRange({ value = {minimum = level_min, maximum = MAX_CAP_SWITCH_LEVEL} }))
end
end
-- set the recieved, perhaps edited level for the endpoint
set_field_for_endpoint(device, a_min_or_max_val, ib.endpoint_id, ib.data.value, {persist = true})

-- we want this to occur every time the device is initialized; where else can this go?
-- minimum allowable percent to appear on the capability is 1%, not 0%
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.switchLevel.levelRange({ value = {minimum = MIN_CAP_SWITCH_LEVEL, maximum = MAX_CAP_SWITCH_LEVEL} }))
end
end

Expand All @@ -272,9 +268,7 @@ end
local function handle_set_level(driver, device, cmd)
local endpoint_id = device:component_to_endpoint(cmd.component)
local max_level = get_field_for_endpoint(device, LEVEL_MAX, endpoint_id) or DEFAULT_MAX_LEVEL
local min_level = get_field_for_endpoint(device, LEVEL_MIN, endpoint_id) or DEFAULT_MIN_LEVEL
local level = math.floor(((max_level - min_level) * cmd.args.level) / (MAX_CAP_SWITCH_LEVEL) + min_level)
level = math.max(level, MIN_CAP_SWITCH_LEVEL)
local level = math.floor((max_level * cmd.args.level) / (MAX_CAP_SWITCH_LEVEL))
local req = clusters.LevelControl.server.commands.MoveToLevelWithOnOff(device, endpoint_id, level, cmd.args.rate or 0, 0 ,0)
device:send(req)
end
Expand Down

0 comments on commit b71ed77

Please sign in to comment.