Skip to content
Open
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
5 changes: 5 additions & 0 deletions drivers/SmartThings/zwave-sensor/fingerprints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,11 @@ zwaveManufacturer:
productType: 0x0100
productId: 0x0082
deviceProfileName: shelly-wave-motion
- id: "aeotec/contact/8"
deviceLabel: Aeotec Door Window Sensor 8
manufacturerId: 0x0371
productId: 0x0037
deviceProfileName: aeotec-door-window-sensor-8
zwaveGeneric:
- id: "GenericSensorAlarm"
deviceLabel: Z-Wave Sensor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
name: aeotec-door-window-sensor-8
components:
- id: main
capabilities:
- id: contactSensor
version: 1
- id: temperatureMeasurement
config:
values:
- key: "temperature.value"
range: [-10, 60]
version: 1
- id: relativeHumidityMeasurement
version: 1
- id: dewPoint
version: 1
- id: moldHealthConcern
version: 1
- id: tamperAlert
version: 1
- id: powerSource
version: 1
- id: threeAxis
version: 1
- id: battery
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
metadata:
deviceType: ContactSensor
ocfDeviceType: x.com.st.d.sensor.contact
deviceTypeId: ContactSensor
preferences:
- name: "parameter1"
title: "1 Set threshold Check Time"
description: "When using battery power, follow this configuration, the minimum time is 30 seconds. When using USB power supply, for real-time detection."
required: false
preferenceType: integer
definition:
minimum: 0
maximum : 2678400
default: 900
- name: "parameter2"
title: "2 Min. temperature change to report"
required: false
preferenceType: integer
definition:
minimum: 0
maximum : 255
default: 20
- name: "parameter3"
title: "3 Min. humidity change to report"
required: false
preferenceType: integer
definition:
minimum: 0
maximum : 255
default: 50
- name: "parameter5"
title: "5 State when the magnet is close"
description: "This parameter allows to set the states of door/window when the magnet closes to the sensor."
required: false
preferenceType: enumeration
definition:
options:
0: "Open=magnet far, Closed=magnet near"
1: "Closed=magnet far, Open=magnet near"
default: 0
- name: "parameter13"
title: "13 Mold alarm offset"
desccription: "Increase the humidity threshold."
required: false
preferenceType: integer
definition:
minimum: -10
maximum : 10
default: 0
- name: "parameter23"
title: "23 Low battery threshold"
description: "Report low battery report when level goes under threshold setting."
required: false
preferenceType: integer
definition:
minimum: 10
maximum : 50
default: 20
- name: "parameter24"
title: "24 Periodic Reports"
description: "The period of battery, temperature and humidity report, the minimum time is 30 seconds."
required: false
preferenceType: integer
definition:
minimum: 0
maximum : 2678400
default: 43200
- name: "parameter25"
title: "25 Offset value for temperature"
description: "Calibrate temperature. Scale is defined by Param 64 .eg: Value 15 means 1.5°C or 1.5F."
required: false
preferenceType: integer
definition:
minimum: -200
maximum : 200
default: 0
- name: "parameter26"
title: "26 Offset value for Humidity"
description: "Calibrate humidity."
required: false
preferenceType: integer
definition:
minimum: -200
maximum : 200
default: 0
- name: "parameter27"
title: "27 Set tilt sensor mode"
description: "Set tilt sensor mode."
required: false
preferenceType: enumeration
definition:
options:
0: "Disable"
1: "Enabled. Needs magnet"
2: "Enabled. It can used without magnet."
default: 1
- name: "parameter28"
title: "28 State of tilt in Mode 2"
description: "This parameter allows setting the state of door/window when the sensor is tilted."
required: false
preferenceType: enumeration
definition:
options:
0: "Opened = tilted, closed = not tilted"
1: "Closed = tilted, opened = not tilted"
default: 0
- name: "parameter33"
title: "33 Tilt triggered angle"
description: "With this parameter, you can adjust the tilt triggered angle if the tilt is too low or too strong."
required: false
preferenceType: integer
definition:
minimum: 1
maximum : 90
default: 5
- name: "parameter34"
title: "34 Timeout tilt detection Mode 1"
description: "Set the timeout of tilt detection Mode 1."
required: false
preferenceType: integer
definition:
minimum: 5
maximum : 60
default: 5
- name: "parameter35"
title: "35 Timeout tilt detection Mode 2"
description: "Set the timeout of tilt detection Mode 2."
required: false
preferenceType: integer
definition:
minimum: 5
maximum : 60
default: 8
- name: "parameter36"
title: "36 Min. acc. change to report"
description: "Minimum acceleration change to trigger report"
required: false
preferenceType: integer
definition:
minimum: 0
maximum : 255
default: 0
- name: "parameter64"
title: "64 Temperature Scale"
description: "Scale for auto reports and settings."
required: false
preferenceType: enumeration
definition:
options:
0: "Celsius"
1: "Fahrenheit"
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
-- Copyright 2025 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.Battery
local Battery = (require "st.zwave.CommandClass.Battery")({ version = 1 })
--- @type st.zwave.CommandClass.SensorMultilevel
local SensorMultilevel = (require "st.zwave.CommandClass.SensorMultilevel")({ version = 11 })
--- @type st.zwave.CommandClass.Configuration
local Configuration = (require "st.zwave.CommandClass.Configuration")({ version = 4 })

local log = require "log"

local MoldHealthConcern = capabilities.moldHealthConcern
local ContactSensor = capabilities.contactSensor
local PowerSource = capabilities.powerSource
local ThreeAxis = capabilities.threeAxis
local TamperAlert = capabilities.tamperAlert

local AEOTEC_DOOR_WINDOW_SENSOR_8_FINGERPRINTS = {
{ manufacturerId = 0x0371, productId = 0x0037 } -- Aeotec Door Window Sensor 8 EU/US/AU
}

local function can_handle_aeotec_door_window_sensor_8(opts, driver, device, ...)
for _, fingerprint in ipairs(AEOTEC_DOOR_WINDOW_SENSOR_8_FINGERPRINTS) do
if device:id_match(fingerprint.manufacturerId, fingerprint.productType, fingerprint.productId) then
local subdriver = require("aeotec-door-window-sensor-8")
return true, subdriver
end
end
return false
end

local function added_handler(driver, device)
device:send(Configuration:Get({ parameter_number = 10 }))

device:emit_event(MoldHealthConcern.supportedMoldValues({"good", "moderate"}))

-- Default value
device:emit_event(MoldHealthConcern.moldHealthConcern.good())

-- Default value
device:emit_event(PowerSource.powerSource.battery())

device:send(Battery:Get({}))
end

local function device_init(driver, device)
device:set_field("three_axis_x", 0)
device:set_field("three_axis_y", 0)
device:set_field("three_axis_z", 0)
end

local function do_refresh(driver, device)
device:send(Battery:Get({}))
end

local function notification_report_handler(self, device, cmd)
local event

-- DOOR_WINDOW
if cmd.args.notification_type == Notification.notification_type.ACCESS_CONTROL then
if cmd.args.event == Notification.event.access_control.WINDOW_DOOR_IS_CLOSED then
event = ContactSensor.contact.closed()
elseif cmd.args.event == Notification.event.access_control.WINDOW_DOOR_IS_OPEN then
event = ContactSensor.contact.open()
end
end

-- POWER
if cmd.args.notification_type == Notification.notification_type.POWER_MANAGEMENT then
if cmd.args.event == Notification.event.power_management.AC_MAINS_DISCONNECTED then
event = PowerSource.powerSource.battery()
elseif cmd.args.event == Notification.event.power_management.AC_MAINS_RE_CONNECTED then
event = PowerSource.powerSource.mains()
elseif cmd.args.event == Notification.event.power_management.POWER_HAS_BEEN_APPLIED then
device:send(Battery:Get({}))
end
end

-- MOLD
if cmd.args.notification_type == Notification.notification_type.WEATHER_ALARM then
if cmd.args.event == Notification.event.weather_alarm.STATE_IDLE then
event = MoldHealthConcern.moldHealthConcern.good()
elseif cmd.args.event == Notification.event.weather_alarm.MOISTURE_ALARM then
event = MoldHealthConcern.moldHealthConcern.moderate()
end
end

-- TAMPER
if cmd.args.notification_type == Notification.notification_type.HOME_SECURITY then
if cmd.args.event == Notification.event.home_security.STATE_IDLE then
log.info("STATE_IDLE")
event = TamperAlert.tamper.clear()
elseif cmd.args.event == Notification.event.home_security.TAMPERING_PRODUCT_COVER_REMOVED then
log.info("TAMPERING_PRODUCT_COVER_REMOVED")
event = TamperAlert.tamper.detected()
end
end

if (event ~= nil) then
device:emit_event(event)
end
end

local function sensor_multilevel_report_handler(self, device, cmd)
local event
local sensor_type = cmd.args.sensor_type
local value = cmd.args.sensor_value

local x = device:get_field("three_axis_x") or 0
local y = device:get_field("three_axis_y") or 0
local z = device:get_field("three_axis_z") or 0

local MIN_VAL = -10000
local MAX_VAL = 10000
-- log.info(string.format("SensorMultilevel: type=%d, raw=%.1f", sensor_type, value))
value = math.max(MIN_VAL, math.min(MAX_VAL, value))
-- log.info(string.format("Clamped: %.1f", value))

if (sensor_type == SensorMultilevel.sensor_type.ACCELERATION_X_AXIS) then
x = value
device:set_field("three_axis_x", x)
event = ThreeAxis.threeAxis(x, y, z)
elseif (sensor_type == SensorMultilevel.sensor_type.ACCELERATION_Y_AXIS) then
y = value
device:set_field("three_axis_y", y)
event = ThreeAxis.threeAxis(x, y, z)
elseif (sensor_type == SensorMultilevel.sensor_type.ACCELERATION_Z_AXIS) then
z = value
device:set_field("three_axis_z", z)
event = ThreeAxis.threeAxis(x, y, z)
end

if (event ~= nil) then
device:emit_event(event)
end
end

local aeotec_door_window_sensor_8 = {
supported_capabilities = {
capabilities.powerSource,
capabilities.threeAxis,
},
zwave_handlers = {
[cc.NOTIFICATION] = {
[Notification.REPORT] = notification_report_handler
},
-- [cc.SENSOR_MULTILEVEL] = {
-- [SensorMultilevel.REPORT] = sensor_multilevel_report_handler
-- }
},
capability_handlers = {
[capabilities.refresh.ID] = {
[capabilities.refresh.commands.refresh.NAME] = do_refresh
}
},
lifecycle_handlers = {
init = device_init,
added = added_handler
},
NAME = "Aeotec Door Window Sensor 8",
can_handle = can_handle_aeotec_door_window_sensor_8
}

return aeotec_door_window_sensor_8
1 change: 1 addition & 0 deletions drivers/SmartThings/zwave-sensor/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ local driver_template = {
lazy_load_if_possible("timed-tamper-clear"),
lazy_load_if_possible("wakeup-no-poll"),
lazy_load_if_possible("apiv6_bugfix"),
lazy_load_if_possible("aeotec-door-window-sensor-8"),
},
lifecycle_handlers = {
added = added_handler,
Expand Down
Loading