Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions drivers/SmartThings/zwave-safety-shutoff/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
name: 'Z-Wave Appliance Safety'
packageKey: 'zwave-appliance-safety'
permissions:
zwave: {}
description: "SmartThings driver for Z-Wave appliance safety devices."
vendorSupportInformation: "https://support.smartthings.com"
26 changes: 26 additions & 0 deletions drivers/SmartThings/zwave-safety-shutoff/fingerprints.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
zwaveManufacturer:
- id: "FireAvert/Shutoff/Gas"
deviceLabel: FireAvert Shutoff for Gas Appliances
manufacturerId: 0x045D
productType: 0x0004
productId: 0x1601
deviceProfileName: fireavert-appliance-shutoff-gas
- id: "FireAvert/Shutoff/120v"
deviceLabel: FireAvert Shutoff for Electric Appliances
manufacturerId: 0x045D
productType: 0x0004
productId: 0x0601
deviceProfileName: fireavert-appliance-shutoff-electric
- id: "FireAvert/Shutoff/240v3"
deviceLabel: FireAvert Shutoff for Electric Appliances
manufacturerId: 0x045D
productType: 0x0004
productId: 0x0602
deviceProfileName: fireavert-appliance-shutoff-electric
- id: "FireAvert/Shutoff/240v4"
deviceLabel: FireAvert Shutoff for Electric Appliances
manufacturerId: 0x045D
productType: 0x0004
productId: 0x0603
deviceProfileName: fireavert-appliance-shutoff-electric

Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: fireavert-appliance-shutoff-electric
components:
- id: main
label: "Appliance Information"
capabilities:
- id: refresh
version: 1
- id: soundDetection
version: 1
config:
values:
- key: soundDetected.value
enabledValues:
- fireAlarm
- id: switch
version: 1
- id: applianceUtilization
version: 1
categories:
- name: SmokeDetector
deviceConfig:
dashboard:
states:
- component: main
capability: soundDetection
version: 1
detailView:
- component: main
capability: soundDetection
version: 1
- component: main
capability: switch
version: 1
- component: main
capability: applianceUtilization
version: 1
label: "Appliance Power"
values:
- key: status.value
alternatives:
- key: inUse
value: "Appliance Powered On"
type: active
- key: notInUse
value: "Appliance Powered Off"
type: inactive
# automation:
# conditions:
# - label: "Smoke Detection Status"
# displayType: list
# list:
# alternatives:
# - key: fireAlarm
# value: Smoke Alarm Detected
# type: active
# - key: noSound
# value: No Smoke Alarm Detected
# type: inactive
# value: soundDetection.value
# valueType: string
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: fireavert-appliance-shutoff-gas
components:
- id: main
label: "Appliance Control"
capabilities:
- id: refresh
version: 1
- id: soundDetection
version: 1
config:
values:
- key: soundDetected.value
enabledValues:
- noSound
- fireAlarm
- id: safetyValve
version: 1
categories:
- name: SmokeDetector
# automation:
# conditions:
# - label: "Smoke Detection Status"
# displayType: list
# list:
# alternatives:
# - key: fireAlarm
# value: Smoke Alarm Detected
# type: active
# - key: noSound
# value: No Smoke Alarm Detected
# type: inactive
# value: soundDetection.value
# valueType: string
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
-- Copyright 2022 SmartThings
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

local capabilities = require "st.capabilities"
--- @type st.zwave.CommandClass
local cc = require "st.zwave.CommandClass"
--- @type st.zwave.CommandClass.ApplicationStatus
local ApplicationStatus = (require "st.zwave.CommandClass.ApplicationStatus")({ version = 1 })
--- @type st.zwave.CommandClass.Notification
local Notification = (require "st.zwave.CommandClass.Notification")({ version = 3 })
--- @type st.zwave.CommandClass.SwitchBinary
local SwitchBinary = (require "st.zwave.CommandClass.SwitchBinary")({ version = 2 })

local FIREAVERT_APPLIANCE_SHUTOFF_FINGERPRINTS = {
{ manufacturerId = 0x045D, productType = 0x0004, productId = 0x0601 }, -- FireAvert Appliance Shutoff - 120V
{ manufacturerId = 0x045D, productType = 0x0004, productId = 0x0602 }, -- FireAvert Appliance Shutoff - 240V 3 Prong
{ manufacturerId = 0x045D, productType = 0x0004, productId = 0x0603 }, -- FireAvert Appliance Shutoff - 240V 4 Prong
}
--- Determine whether the passed device is a FireAvert shutoff device. All devices use the same driver.
local function can_handle_fireavert_appliance_shutoff_e(opts, driver, device, ...)
local isDevice = false
for _, fingerprint in ipairs(FIREAVERT_APPLIANCE_SHUTOFF_FINGERPRINTS) do
if device:id_match(fingerprint.manufacturerId, fingerprint.productType, fingerprint.productId) then
isDevice = true
break
end
end
if true == isDevice then
local subdriver = require("fireavert-appliance-shutoff-electric")
return true, subdriver
else return false end
end

--- Only ever fires when the device attempts to turn the switch back on and this is rejected.
--- @param driver st.zwave.Driver
--- @param device st.zwave.Device
--- @param cmd st.zwave.CommandClass.ApplicationStatus.ApplicationRejectedRequest
local function app_rejected_handler(driver, device, cmd)
print("Application rejected received from device, unable to rearm")
--- Reset the UI switch to match the current relay state.
device:emit_event(capabilities.switch.switch.off({state_change = true}))
end


--- Handle a Switch OFF command from the application.
---
--- @param driver st.zwave.Driver
--- @param device st.zwave.Device
--- @param command ST level capability command
local function st_switch_off_handler(driver, device, command)
device:send(SwitchBinary:Set({
target_value = SwitchBinary.value.OFF_DISABLE,
duration = 0
})
)
device:send(SwitchBinary:Get({}))
end

--- Handle a Switch ON command from the application.
--- Switching on is not allowed in some cases, so that is handled through the ApplicationRejected
--- handler.
---
--- @param driver st.zwave.Driver
--- @param device st.zwave.Device
--- @param command ST level capability command
local function st_switch_on_handler(driver, device, command)
device:send(SwitchBinary:Set({
target_value = SwitchBinary.value.ON_ENABLE,
duration = 0
})
)
device:send(SwitchBinary:Get({}))
end


--- Configuration lifecycle event handler.
---
--- Send refresh GETs and manufacturer-specific configuration for
--- the FireAvert Appliance Shutoff device
---
--- @param self st.zwave.Driver
--- @param device st.zwave.Device
local function do_configure(self, device)
device:refresh()
end

local fireavert_appliance_shutoff_e = {
zwave_handlers = {
[cc.APPLICATION_STATUS] = {
[ApplicationStatus.APPLICATION_REJECTED_REQUEST] = app_rejected_handler,
}
},
capability_handlers = {
[capabilities.switch.ID] = {
[capabilities.switch.commands.off.NAME] = st_switch_off_handler,
[capabilities.switch.commands.on.NAME] = st_switch_on_handler
},
},
lifecycle_handlers = {
doConfigure = do_configure,
},
NAME = "FireAvert Appliance Shutoff - Electric",
can_handle = can_handle_fireavert_appliance_shutoff_e
}

return fireavert_appliance_shutoff_e
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
-- Copyright 2022 SmartThings
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

local capabilities = require "st.capabilities"
--- @type st.zwave.CommandClass
local cc = require "st.zwave.CommandClass"
--- @type st.zwave.CommandClass.Notification
local Notification = (require "st.zwave.CommandClass.Notification")({ version = 3 })
--- @type st.zwave.CommandClass.SwitchBinary
local SwitchBinary = (require "st.zwave.CommandClass.SwitchBinary")({ version = 2 })

local FIREAVERT_APPLIANCE_SHUTOFF_FINGERPRINTS = {
{ manufacturerId = 0x045D, productType = 0x0004, productId = 0x1601 } -- FireAvert Appliance Shutoff - Gas
}
--- Determine whether the passed device is a FireAvert shutoff device. All devices use the same driver.
local function can_handle_fireavert_appliance_shutoff_gas(opts, driver, device, ...)
local isDevice = false
for _, fingerprint in ipairs(FIREAVERT_APPLIANCE_SHUTOFF_FINGERPRINTS) do
if device:id_match(fingerprint.manufacturerId, fingerprint.productType, fingerprint.productId) then
isDevice = true
break
end
end
if true == isDevice then
local subdriver = require("fireavert-appliance-shutoff-gas")
return true, subdriver
else return false end
end

--- Handle a Valve Close command from the application.
---
--- @param driver st.zwave.Driver
--- @param device st.zwave.Device
--- @param command ST close valve command
local function st_close_valve(driver, device, command)
device:send(SwitchBinary:Set({
target_value = SwitchBinary.value.OFF_DISABLE,
duration = 0
})
)
-- Refresh valve state
device:send(SwitchBinary:Get({}))
end

--- Configuration lifecycle event handler.
---
--- Send refresh GETs and manufacturer-specific configuration for
--- the FireAvert Appliance Shutoff device
---
--- @param self st.zwave.Driver
--- @param device st.zwave.Device
local function do_configure(self, device)
device:refresh()
end

local fireavert_appliance_shutoff_g = {
capability_handlers = {
[capabilities.safetyValve.ID] = {
[capabilities.safetyValve.commands.close.NAME] = st_close_valve
}
},
lifecycle_handlers = {
doConfigure = do_configure,
},
NAME = "FireAvert Appliance Shutoff - Gas",
can_handle = can_handle_fireavert_appliance_shutoff_gas
}

return fireavert_appliance_shutoff_g
Loading