Hi Aaron,
The way I have set the parameter is very clunky as it involves manually pressing once a new button that I have named INIT.
Iâm sure there is a better way of doing this as a one-time automatic start-up procedure but not figured out how to yet. I also think that the position slider and feedback could be made smoother.
Iâm also sorry, but Iâm not sure how to post the code so for now forgive me if I just list it here instead.
David
/**
*/
metadata {
definition (name: âZ-Wave Blinds - Baseâ, namespace: âsmartthingsâ, author: âDavid Websterâ) {
capability "Switch"
capability "Polling"
capability "Power Meter"
capability "Energy Meter"
capability "Refresh"
capability "Switch Level"
capability "Sensor"
capability âActuatorâ
command "reset"
fingerprint inClusters: "0x26,0x32"
}
simulator {
status "on": "command: 2603, payload: FF"
status "off": "command: 2603, payload: 00"
status "09%": "command: 2603, payload: 09"
status "10%": "command: 2603, payload: 0A"
status "33%": "command: 2603, payload: 21"
status "66%": "command: 2603, payload: 42"
status "99%": "command: 2603, payload: 63"
for (int i = 0; i <= 10000; i += 1000) {
status "power ${i} W": new physicalgraph.zwave.Zwave().meterV1.meterReport(
scaledMeterValue: i, precision: 3, meterType: 4, scale: 2, size: 4).incomingMessage()
}
for (int i = 0; i <= 100; i += 10) {
status "energy ${i} kWh": new physicalgraph.zwave.Zwave().meterV1.meterReport(
scaledMeterValue: i, precision: 3, meterType: 0, scale: 0, size: 4).incomingMessage()
}
["FF", "00", "09", "0A", "21", "42", "63"].each { val ->
reply "2001$val,delay 100,2602": "command: 2603, payload: $val"
}
}
tiles {
standardTile("switch", "device.switch", width: 2, height: 2, canChangeIcon: true) {
state "on", label:'${name}', action:"switch.off", icon:"st.switches.switch.on", backgroundColor:"#79b821", nextState:"turningOff"
state "off", label:'${name}', action:"switch.on", icon:"st.switches.switch.off", backgroundColor:"#ffffff", nextState:"turningOn"
state "turningOn", label:'${name}', icon:"st.switches.switch.on", backgroundColor:"#79b821"
state "turningOff", label:'${name}', icon:"st.switches.switch.off", backgroundColor:"#ffffff"
}
valueTile("power", "device.power") {
state "default", label:'${currentValue} W'
}
valueTile("energy", "device.energy") {
state "default", label:'${currentValue} kWh'
}
standardTile("reset", "device.energy", inactiveLabel: false, decoration: "flat") {
state "default", label:'reset kWh', action:"reset"
}
controlTile("levelSliderControl", "device.level", "slider", height: 1, width: 3, inactiveLabel: false) {
state "level", action:"switch level.setLevel"
}
standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat") {
state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
}
standardTile("Init", "device.switch", inactiveLabel: false, decoration: "flat") {
state "default", label:"Init", action:"paramInit"
}
}
main(["switch","power","energy"])
details(["switch", "power", "energy", "levelSliderControl", "refresh", "reset", "Init"])
}
// parse events into attributes
def parse(String description) {
def result = null
if (description != âupdatedâ) {
def cmd = zwave.parse(description, [0x20: 1, 0x26: 3, 0x70: 1, 0x32:3])
if (cmd) {
result = zwaveEvent(cmd)
log.debug("â$descriptionâ parsed to $result")
} else {
log.debug(âCouldnât zwave.parse â$descriptionââ)
}
}
result
}
def updated() {
response(refresh())
}
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {
dimmerEvents(cmd)
}
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd) {
dimmerEvents(cmd)
}
def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelReport cmd) {
dimmerEvents(cmd)
}
def dimmerEvents(physicalgraph.zwave.Command cmd) {
def result = []
def value = (cmd.value ? âonâ : âoffâ)
def switchEvent = createEvent(name: âswitchâ, value: value, descriptionText: â$device.displayName was turned $valueâ)
result << switchEvent
if (cmd.value) {
result << createEvent(name: âlevelâ, value: cmd.value, unit: â%â)
}
if (switchEvent.isStateChange) {
result << response([âdelay 3000â, zwave.meterV2.meterGet(scale: 2).format()])
} //Orignal value 3000
return result
}
def zwaveEvent(physicalgraph.zwave.commands.meterv3.MeterReport cmd) {
if (cmd.meterType == 1) {
if (cmd.scale == 0) {
return createEvent(name: âenergyâ, value: cmd.scaledMeterValue, unit: âkWhâ)
} else if (cmd.scale == 1) {
return createEvent(name: âenergyâ, value: cmd.scaledMeterValue, unit: âkVAhâ)
} else if (cmd.scale == 2) {
return createEvent(name: âpowerâ, value: Math.round(cmd.scaledMeterValue), unit: âWâ)
} else {
return createEvent(name: âelectricâ, value: cmd.scaledMeterValue, unit: [âpulsesâ, âVâ, âAâ, âR/Zâ, ââ][cmd.scale - 3])
}
}
}
def on() {
delayBetween([
zwave.basicV1.basicSet(value: 0xFF).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format(),
], 5000) //Orignal value 5000
}
def off() {
delayBetween([
zwave.basicV1.basicSet(value: 0x00).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format(),
], 5000) //Orignal value 5000
}
def poll() {
delayBetween([
zwave.meterV2.meterGet(scale: 0).format(),
zwave.meterV2.meterGet(scale: 2).format(),
], 1000) //Orignal value 1000
}
def refresh() {
delayBetween([
zwave.switchMultilevelV1.switchMultilevelGet().format(),
zwave.meterV2.meterGet(scale: 0).format(),
zwave.meterV2.meterGet(scale: 2).format(),
], 1000) //Orignal value 1000
}
def setLevel(level) {
if(level > 99) level = 99
delayBetween([
zwave.basicV1.basicSet(value: level).format(),
zwave.switchMultilevelV1.switchMultilevelGet().format()
], 5000) //Orignal value 5000
}
def paramInit() {
log.debug(âInitialising Parametersâ)
delayBetween([
zwave.configurationV1.configurationSet(configurationValue: [3], parameterNumber: 85, size: 1).format(), // default = 8 (800ms), range 3 â 50 = 0.3 seconds â 5 seconds (100 ms resolution)
], 500)
}