Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improoved functionality #2

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,14 @@
* 0.99: Final release code cleanup and commenting
* 1.00: Added comments to code for readability
* 1.10: Added Stop button to stop vertical axis motion
* 1.11: Added switch capability for access the device via Google Home
* 1.20: Layout change and Dedicated open/close and preset1,2,3 buttons
*/
metadata {
definition (name: "Qubino Flush Shutter", namespace: "Goap", author: "Kristjan Jamšek") {
capability "Actuator"
capability "Window Shade"
capability "Switch"//Needed for show in google home
capability "Switch Level"
capability "Power Meter"

Expand All @@ -51,17 +54,23 @@ metadata {
attribute "kwhConsumption", "number" //attribute used to store and display power consumption in KWH
attribute "venetianLevel", "number" //attribute used to control and store venetian blinds level
attribute "venetianState", "string" //attribute for the binary control element of the venetian blinds control

attribute "preset1", "number"
attribute "preset2", "number"
attribute "preset3", "number"

command "setConfiguration" //command to issue Configuration Set commands to the module according to user preferences
command "setAssociation" //command to issue Association Set commands to the modules according to user preferences
command "refreshPowerConsumption" //command to issue Meter Get requests for KWH measurements from the device, W are already shown as part of Pwer Meter capability
command "resetPower" //command to issue Meter Reset commands to reset accumulated pwoer measurements
command "calibrate" //command to calibrate the shutter module
command "stop" //command to stop the vertical blind movement
command "setSlatLevel" //command to issue slat tilting controls
command "openSlats" //command to set maximum level for slats
command "closeSlats" //command to set minimum level for slats
command "preset1"
command "preset2"
command "preset3"

//command "setSlatLevel" //command to issue slat tilting controls
//command "openSlats" //command to set maximum level for slats
//command "closeSlats" //command to set minimum level for slats

fingerprint mfr:"0159", prod:"0003", model:"0052" //Manufacturer Information value for Qubino Flush Shutter
}
Expand All @@ -75,6 +84,7 @@ metadata {
multiAttributeTile(name:"shade", type: "generic", width: 6, height: 4, canChangeIcon: true){
tileAttribute ("device.windowShade", key: "PRIMARY_CONTROL") {
attributeState "open", label:'${name}', action:"close", icon:"st.Home.home9", backgroundColor:"#79b821", nextState:"closing"
attributeState "partially open", label:'${name}', action:"open", icon:"st.Home.home9", backgroundColor:"#b77600", nextState:"opening"
attributeState "closed", label:'${name}', action:"open", icon:"st.Home.home9", backgroundColor:"#ffffff", nextState:"opening"
attributeState "opening", label:'${name}', action:"close", icon:"st.Home.home9", backgroundColor:"#79b821", nextState:"open"
attributeState "closing", label:'${name}', action:"open", icon:"st.Home.home9", backgroundColor:"#ffffff", nextState:"closed"
Expand All @@ -86,9 +96,7 @@ metadata {
attributeState "power", label:'Power level: ${currentValue} W', icon: "st.Appliances.appliances17"
}
}
standardTile("stop", "device.stop", decoration: "flat", width: 6, height: 2) {
state("stop", label:'', action:'stop', icon: "st.sonos.stop-btn")
}
/*
standardTile("venetianLabel", "device.venetianLabel", decoration: "flat", width: 6, height: 2) {
state("venetianLabel", label:'SLAT TILT CONTROLS:')
}
Expand All @@ -103,16 +111,47 @@ metadata {
attributeState "venetianLevel", action:"setSlatLevel"
}
}
standardTile("power", "device.power", decoration: "flat", width: 3, height: 3) {
*/
standardTile("open", "device.open", decoration: "flat", width: 2, height: 2) {
state("open", label:'OPEN', action:'open', icon: "st.doors.garage.garage-opening")
}
standardTile("stop", "device.stop", decoration: "flat", width: 2, height: 2) {
state("stop", label:'STOP', action:'stop', icon: "st.Transportation.transportation13")
}
standardTile("close", "device.close", decoration: "flat", width: 2, height: 2) {
state("close", label:'CLOSE', action:'close', icon: "st.doors.garage.garage-closing")
}

standardTile("preset1", "device.preset1", decoration: "flat", width: 2, height: 2) {
state("preset1", label:'${currentValue}%', action:'preset1', backgroundColors: [
[value: 20, color: "#333333"],
[value: 99, color: "#cccccc"]
])
}
standardTile("preset2", "device.preset2", decoration: "flat", width: 2, height: 2) {
state("preset2", label:'${currentValue}%', action:'preset2', backgroundColors: [
[value: 20, color: "#333333"],
[value: 99, color: "#cccccc"]
])
}
standardTile("preset3", "device.preset3", decoration: "flat", width: 2, height: 2) {
state("preset3", label:'${currentValue}%', action:'preset3', , backgroundColors: [
[value: 20, color: "#333333"],
[value: 99, color: "#cccccc"]
])
}

standardTile("power", "device.power", decoration: "flat", width: 3, height: 2) {
state("power", label:'${currentValue} W', icon: 'st.Appliances.appliances17')
}
standardTile("kwhConsumption", "device.kwhConsumption", decoration: "flat", width: 3, height: 3) {
standardTile("kwhConsumption", "device.kwhConsumption", decoration: "flat", width: 3, height: 2) {
state("kwhConsumption", label:'${currentValue} kWh', icon: 'st.Appliances.appliances17')
}
standardTile("resetPower", "device.resetPower", decoration: "flat", width: 3, height: 3) {

standardTile("resetPower", "device.resetPower", decoration: "flat", width: 3, height: 1) {
state("resetPower", label:'Reset Power', action:'resetPower')
}
standardTile("refreshPowerConsumption", "device.refreshPowerConsumption", decoration: "flat", width: 3, height: 3) {
standardTile("refreshPowerConsumption", "device.refreshPowerConsumption", decoration: "flat", width: 3, height: 1) {
state("refreshPowerConsumption", label:'Refresh power', action:'refreshPowerConsumption')
}
/* //THIS VERSION DOESN?T SUPPORT TEMPERATURE SENSORS YET
Expand All @@ -137,20 +176,32 @@ metadata {
])
}
*/
standardTile("setConfiguration", "device.setConfiguration", decoration: "flat", width: 3, height: 3) {
standardTile("setConfiguration", "device.setConfiguration", decoration: "flat", width: 3, height: 1) {
state("setConfiguration", label:'Set Configuration', action:'setConfiguration')
}
standardTile("setAssociation", "device.setAssociation", decoration: "flat", width: 3, height: 3) {
standardTile("setAssociation", "device.setAssociation", decoration: "flat", width: 3, height: 1) {
state("setAssociation", label:'Set Associations', action:'setAssociation')
}
standardTile("calibrate", "device.calibrate", decoration: "flat", width: 6, height: 2) {
standardTile("calibrate", "device.calibrate", decoration: "flat", width: 6, height: 1) {
state("calibrate", label:'Calibrate', action:'calibrate')
}

main("shade")
details(["shade", "stop", "venetianLabel", "venetianTile", "power", "kwhConsumption", "resetPower", "refreshPowerConsumption", "setConfiguration", "setAssociation", "calibrate"])
details(["shade", "open", "stop", "close"/*, "venetianLabel", "venetianTile"*/, "preset1", "preset2", "preset3", "power", "kwhConsumption", "resetPower", "refreshPowerConsumption", "setConfiguration", "setAssociation", "calibrate"])
}
preferences {
input (
type: "paragraph",
element: "paragraph",
title: "GENERAL SETTINGS:",
description: "General settings."
)
input name: "preset1level", type: "number", required: false,
title: "Preset#1 level:", range: "0..99", defaultValue: 25
input name: "preset2level", type: "number", required: false,
title: "Preset#2 level:", range: "0..99", defaultValue: 50
input name: "preset3level", type: "number", required: false,
title: "Preset#3 level:", range: "0..99", defaultValue: 75
/**
* -------- CONFIGURATION PARAMETER SECTION --------
*/
Expand Down Expand Up @@ -403,6 +454,57 @@ def configure() {
assocCmds << zwave.multiChannelV3.multiChannelEndPointGet().format()
return delayBetween(assocCmds, 500)
}

def installed() {
log.debug "Qubino Flush Shutter: installed()"
updated()
}

def updated() {
log.debug "Qubino Flush Shutter: updated()"
def level1=preset1level
if(!level1) { level1=25 }
sendEvent(name: "preset1", value: level1, displayed: false)
def level2=preset2level
if(!level2) { level2=50 }
sendEvent(name: "preset2", value: level2, displayed: false)
def level3=preset3level
if(!level3) { level3=75 }
sendEvent(name: "preset3", value: level3, displayed: false)
}

def preset1() {
def level=preset1level
if (!level) { level=25 }
log.debug "Qubino Flush Shutter: preset1(${level})"
setLevel(level)
}

def preset2() {
def level=preset2level
if (!level) { level=50 }
log.debug "Qubino Flush Shutter: preset2(${level})"
setLevel(level)
}

def preset3() {
def level=preset3level
if (!level) { level=75 }
log.debug "Qubino Flush Shutter: preset3(${level})"
setLevel(level)
}


def on() {
log.debug "Qubino Flush Shutter: on()"
open()
}

def off() {
log.debug "Qubino Flush Shutter: off()"
close()
}

/**
* Stop command handler. Issues StopLevelChange when operating as singlechannel device handler.
*
Expand Down Expand Up @@ -555,7 +657,8 @@ def refreshPowerConsumption() {
log.debug "Qubino Flush Shutter: refreshPowerConsumption()"
delayBetween([
zwave.meterV2.meterGet(scale: 0).format(),
zwave.meterV2.meterGet(scale: 2).format()
zwave.meterV2.meterGet(scale: 2).format(),
zwave.switchMultilevelV3.switchMultilevelGet().format()
], 1000)
}
/**
Expand Down Expand Up @@ -776,11 +879,22 @@ def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv5.SensorMultilevelR
def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelReport cmd){
log.debug "Qubino Flush Shutter: firing switch multilevel event"
def result = []
result << createEvent(name:"windowShade", value: cmd.value ? "open" : "closed", isStateChange: true)
def currentState = device.currentState("windowShade")
def currentSwitch = device.currentState("switch")
def currentLevel = device.currentState("level")
def desiredState = "closed"
if (cmd.value<99 && cmd.value>0) {
desiredState = "partially open"
} else if (cmd.value >= 99) {
desiredState = "open"
}
def desiredSwitch = cmd.value ? "on" : "off"
result << createEvent(name:"switch", value: desiredSwitch, isStateChange: (currentSwitch?.value!=desiredSwitch))
result << createEvent(name:"windowShade", value: desiredState, isStateChange: (currentState?.value!=desiredState))
if(cmd.value > 99){
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} is uncalibrated! Please press calibrate!", isStateChange: true)
}else{
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: true)
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: (currentLevel?.value.toInteger()!=cmd.value.toInteger()))
}
return result
}
Expand All @@ -795,12 +909,23 @@ def zwaveEvent(physicalgraph.zwave.commands.switchmultilevelv3.SwitchMultilevelR
def result = []
switch(command.sourceEndPoint){
case 1:
result << createEvent(name:"windowShade", value: cmd.value ? "open" : "closed", isStateChange: true)
if(cmd.value > 99){
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} is uncalibrated! Please press calibrate!")
}else{
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: true)
}
def currentState = device.currentState("windowShade")
def currentSwitch = device.currentState("switch")
def currentLevel = device.currentState("level")
def desiredState = "closed"
if (cmd.value<99 && cmd.value>0) {
desiredState = "partially open"
} else if (cmd.value >= 99) {
desiredState = "open"
}
def desiredSwitch = cmd.value ? "on" : "off"
result << createEvent(name:"switch", value: desiredSwitch, isStateChange: (currentSwitch?.value!=desiredSwitch))
result << createEvent(name:"windowShade", value: desiredState, isStateChange: (currentState?.value!=desiredState))
if(cmd.value > 99){
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} is uncalibrated! Please press calibrate!", isStateChange: true)
}else{
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: (currentLevel?.value.toInteger()!=cmd.value.toInteger()))
}
break;
case 2:
log.debug "Received command from EP2"
Expand Down Expand Up @@ -845,10 +970,12 @@ def zwaveEvent(physicalgraph.zwave.commands.meterv3.MeterReport cmd) {
def result = []
switch(cmd.scale){
case 0:
result << createEvent(name:"kwhConsumption", value: cmd.scaledMeterValue, unit:"kWh", descriptionText:"${device.displayName} consumed ${cmd.scaledMeterValue} kWh", isStateChange: true)
def currentPower = device.currentState("kwhConsumption")
result << createEvent(name:"kwhConsumption", value: cmd.scaledMeterValue, unit:"kWh", descriptionText:"${device.displayName} consumed ${cmd.scaledMeterValue} kWh", isStateChange: (cmd.scaledMeterValue?.toDouble() != currentPower?.value?.toDouble()))
break;
case 2:
result << createEvent(name:"power", value: cmd.scaledMeterValue, unit:"W", descriptionText:"${device.displayName} consumes ${cmd.scaledMeterValue} W", isStateChange: true)
def currentPower = device.currentState("power")
result << createEvent(name:"power", value: cmd.scaledMeterValue, unit:"W", descriptionText:"${device.displayName} consumes ${cmd.scaledMeterValue} W", isStateChange: (cmd.scaledMeterValue?.toDouble() != currentPower?.value?.toDouble()))
break;
}
return result
Expand All @@ -871,14 +998,25 @@ def zwaveEvent(physicalgraph.zwave.commands.configurationv2.ConfigurationReport
* @return Main roller level state events.
*/
def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd){
log.debug "Qubino Flush Shutter: firing basic report event"
def currentState = device.currentState("windowShade")
def currentSwitch = device.currentState("switch")
def currentLevel = device.currentState("level")
def desiredState = "closed"
if (cmd.value<99 && cmd.value>0) {
desiredState = "partially open"
} else if (cmd.value >= 99) {
desiredState = "open"
}
def desiredSwitch = cmd.value ? "on" : "off"
log.debug "Qubino Flush Shutter: firing basic report event (currentState: ${currentState?.value}, currentLevel: ${currentLevel?.value}, desiredState: $desiredState, desiredLevel: ${cmd.value})"
def result = []
result << createEvent(name:"windowShade", value: cmd.value ? "open" : "closed", isStateChange: true)
if(cmd.value > 99){
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} is uncalibrated! Please press calibrate!", isStateChange: true)
}else{
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: true)
}
result << createEvent(name:"switch", value: desiredSwitch, isStateChange: (currentSwitch?.value!=desiredSwitch))
result << createEvent(name:"windowShade", value: desiredState, isStateChange: (currentState?.value!=desiredState))
if(cmd.value > 99){
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} is uncalibrated! Please press calibrate!", isStateChange: true)
}else{
result << createEvent(name:"level", value: cmd.value, unit:"%", descriptionText:"${device.displayName} moved to ${cmd.value==99 ? 100 : cmd.value}%", isStateChange: (currentLevel?.value.toInteger()!=cmd.value.toInteger()))
}
return result
}
/**
Expand Down