-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Device Type for the Express Controls EZMtultiPli (aka HSM200) plug-in Z-Wave multi-sensor - Motion - Temperature - Luminance. See ExpressControls.com for more details.
- Loading branch information
Eric Ryherd
committed
Feb 10, 2015
1 parent
0039f98
commit 4a97101
Showing
1 changed file
with
142 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
// Express Controls EZMultiPli Multi-sensor driver for SmartThings | ||
// The EZMultiPli is also known as the HSM200 - it's the same device. | ||
|
||
metadata { | ||
definition (name: "EZmultiPli", namespace: "DrZWave", author: "Eric Ryherd", oauth: true) { | ||
capability "Motion Sensor" | ||
capability "Temperature Measurement" | ||
capability "Illuminance Measurement" | ||
capability "Color Control" | ||
capability "Configuration" | ||
|
||
fingerprint deviceId: "0x0701", inClusters: "0x5E, 0x71, 0x31, 0x33, 0x72, 0x86, 0x59, 0x85, 0x70, 0x77, 0x5A, 0x7A, 0x73, 0xEF, 0x20" | ||
} | ||
|
||
simulator { | ||
// messages the device returns in response to commands it receives | ||
status "motion" : "command: 7105000000FF07, payload: 07" | ||
status "no motion" : "command: 7105000000FF07, payload: 00" | ||
|
||
for (int i = 0; i <= 100; i += 20) { | ||
status "temperature ${i}F": new physicalgraph.zwave.Zwave().sensorMultilevelV5.sensorMultilevelReport( | ||
scaledSensorValue: i, precision: 1, sensorType: 1, scale: 1).incomingMessage() | ||
} | ||
|
||
|
||
for (int i = 0; i <= 100; i += 20) { | ||
status "luminance ${i} %": new physicalgraph.zwave.Zwave().sensorMultilevelV5.sensorMultilevelReport( | ||
scaledSensorValue: i, precision: 0, sensorType: 3).incomingMessage() | ||
} | ||
|
||
} | ||
|
||
tiles { | ||
standardTile("motion", "device.motion", width: 2, height: 2, canChangeIcon: true, canChangeBackground: true) { | ||
state "active", label:'motion', icon:"st.motion.motion.active", backgroundColor:"#53a7c0" | ||
state "inactive", label:'no motion', icon:"st.motion.motion.inactive", backgroundColor:"#ffffff" | ||
} | ||
valueTile("temperature", "device.temperature", inactiveLabel: false) { | ||
state "temperature", label:'${currentValue}� ${unit}', | ||
backgroundColors:[ | ||
[value: 31, color: "#153591"], | ||
[value: 44, color: "#1e9cbb"], | ||
[value: 59, color: "#90d2a7"], | ||
[value: 74, color: "#44b621"], | ||
[value: 84, color: "#f1d801"], | ||
[value: 95, color: "#d04e00"], | ||
[value: 96, color: "#bc2323"] | ||
] | ||
} | ||
valueTile("illuminance", "device.illuminance", inactiveLabel: false) { | ||
state "luminosity", label:'${currentValue} ${unit}' | ||
backgroundColors:[ | ||
[value: 25, color: "#404040"], | ||
[value: 50, color: "#808080"], | ||
[value: 75, color: "#a0a0a0"], | ||
[value: 90, color: "#f0f0f0"] | ||
] | ||
} | ||
standardTile("configure", "device.configure", inactiveLabel: false, decoration: "flat") { | ||
state "configure", label:'', action:"configuration.configure", icon:"st.secondary.configure" | ||
} | ||
|
||
main "motion" | ||
details(["motion", "temperature", "illuminance", "configure"]) | ||
} | ||
} | ||
|
||
// Parse incoming device messages to generate events | ||
def parse(String description) | ||
{ | ||
def result = [] | ||
def cmd = zwave.parse(description, [0x31: 5]) // 0x31=SensorMultilevel which we force to be version 5 | ||
if (cmd) { | ||
result << createEvent(zwaveEvent(cmd)) | ||
} | ||
log.debug "Parse returned ${result}" | ||
return result | ||
} | ||
|
||
// Event Generation | ||
|
||
def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv5.SensorMultilevelReport cmd) | ||
{ | ||
def map = [:] | ||
switch (cmd.sensorType) { | ||
case 0x01: // SENSOR_TYPE_TEMPERATURE_VERSION_1 | ||
// temperature | ||
def cmdScale = cmd.scale == 1 ? "F" : "C" | ||
map.value = convertTemperatureIfNeeded(cmd.scaledSensorValue, cmdScale, cmd.precision) | ||
map.unit = getTemperatureScale() | ||
map.name = "temperature" | ||
log.debug "Temperature report" | ||
break; | ||
case 0x03 : // SENSOR_TYPE_LUMINANCE_VERSION_1 | ||
// luminance | ||
map.value = cmd.scaledSensorValue.toInteger().toString() | ||
map.unit = "%" | ||
map.name = "illuminance" | ||
log.debug "Luminance report" | ||
break; | ||
} | ||
map | ||
} | ||
|
||
|
||
def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd) { | ||
def map = [:] | ||
if (cmd.notificationType==0x07) { // NOTIFICATION_TYPE_BURGLAR | ||
if (cmd.event==0x07 || cmd.event==0x08) { | ||
map.name = "motion" | ||
map.value = "active" | ||
map.descriptionText = "$device.displayName motion detected" | ||
log.debug "motion recognized" | ||
} else if (cmd.event==0) { | ||
map.name = "motion" | ||
map.value = "inactive" | ||
map.descriptionText = "$device.displayName no motion detected" | ||
log.debug "No motion recognized" | ||
} | ||
} | ||
if (map.name != "motion") { | ||
log.debug "unmatched parameters for cmd: ${cmd.toString()}}" | ||
} | ||
map | ||
} | ||
|
||
/* | ||
def zwaveEvent(physicalgraph.zwave.Command cmd) { | ||
log.debug "Catchall reached for cmd: ${cmd.toString()}}" | ||
[:] | ||
} | ||
*/ | ||
def configure() { // TODO need to change these to allow the user to set each value to their desired setting | ||
delayBetween([ | ||
zwave.configurationV1.configurationSet(parameterNumber: 1, size: 1, scaledConfigurationValue: 5).format(), // set the OnTime to 5 min for quicker testing | ||
|
||
zwave.configurationV1.configurationSet(parameterNumber: 3, size: 1, scaledConfigurationValue: 10).format(), // send a luminance reading every 10 min | ||
|
||
zwave.configurationV1.configurationSet(parameterNumber: 4, size: 1, scaledConfigurationValue: 6).format(), // send a temperature reading every 6 min | ||
]) | ||
} | ||
|