@@ -7,24 +7,43 @@ local switch_utils = require "switch_utils.utils"
77
88local CameraEventHandlers = {}
99
10+ local function has_triggered_zone (triggered_zones , zone_id )
11+ for _ , zone in ipairs (triggered_zones or {}) do
12+ if zone .zoneId == zone_id then
13+ return true
14+ end
15+ end
16+ return false
17+ end
18+
1019function CameraEventHandlers .zone_triggered_handler (driver , device , ib , response )
1120 local triggered_zones = device :get_field (camera_fields .TRIGGERED_ZONES ) or {}
12- if not switch_utils .tbl_contains (triggered_zones , ib .data .elements .zone .value ) then
13- table.insert (triggered_zones , {zoneId = ib .data .elements .zone .value })
21+ local zone_id = ib .data .elements .zone .value
22+ if not has_triggered_zone (triggered_zones , zone_id ) then
23+ table.insert (triggered_zones , {zoneId = zone_id })
1424 device :set_field (camera_fields .TRIGGERED_ZONES , triggered_zones )
1525 device :emit_event_for_endpoint (ib , capabilities .zoneManagement .triggeredZones (triggered_zones ))
1626 end
1727end
1828
1929function CameraEventHandlers .zone_stopped_handler (driver , device , ib , response )
2030 local triggered_zones = device :get_field (camera_fields .TRIGGERED_ZONES ) or {}
21- for i , v in pairs (triggered_zones ) do
22- if v .zoneId == ib .data .elements .zone .value then
23- table.remove (triggered_zones , i )
24- device :set_field (camera_fields .TRIGGERED_ZONES , triggered_zones )
25- device :emit_event_for_endpoint (ib , capabilities .zoneManagement .triggeredZones (triggered_zones ))
31+ local zone_id = ib .data .elements .zone .value
32+ local updated_triggered_zones = {}
33+ local zone_removed = false
34+
35+ for _ , zone in ipairs (triggered_zones ) do
36+ if zone .zoneId ~= zone_id then
37+ table.insert (updated_triggered_zones , zone )
38+ else
39+ zone_removed = true
2640 end
2741 end
42+
43+ if zone_removed then
44+ device :set_field (camera_fields .TRIGGERED_ZONES , updated_triggered_zones )
45+ device :emit_event_for_endpoint (ib , capabilities .zoneManagement .triggeredZones (updated_triggered_zones ))
46+ end
2847end
2948
3049return CameraEventHandlers
0 commit comments