@@ -55,163 +55,164 @@ metadata {
5555 }
5656 }
5757
58- standardTile(" indicator" , " device.indicatorStatus" , height : 2 , width : 2 , inactiveLabel : false , decoration : " flat" ) {
58+ standardTile(" indicator" , " device.indicatorStatus" , width : 2 , height : 2 , inactiveLabel : false , decoration : " flat" ) {
5959 state " when off" , action :" indicator.indicatorWhenOn" , icon :" st.indicators.lit-when-off"
6060 state " when on" , action :" indicator.indicatorNever" , icon :" st.indicators.lit-when-on"
6161 state " never" , action :" indicator.indicatorWhenOff" , icon :" st.indicators.never-lit"
6262 }
63- standardTile(" refresh" , " device.switch" , height : 2 , width : 2 , inactiveLabel : false , decoration : " flat" ) {
64- state " default" , label :" " , action :" refresh.refresh" , icon :" st.secondary.refresh"
63+
64+ standardTile(" refresh" , " device.switch" , width : 2 , height : 2 , inactiveLabel : false , decoration : " flat" ) {
65+ state " default" , label :' ' , action :" refresh.refresh" , icon :" st.secondary.refresh"
66+ }
67+
68+ valueTile(" level" , " device.level" , inactiveLabel : false , decoration : " flat" , width : 2 , height : 2 ) {
69+ state " level" , label :' ${currentValue} %' , unit :" %" , backgroundColor :" #ffffff"
6570 }
6671
6772 main([" switch" ])
68- details([" switch" , " refresh" , " indicator" ])
73+ details([" switch" , " level" , " indicator" , " refresh" ])
74+
6975 }
7076}
7177
7278def parse (String description ) {
73- def item1 = [
74- canBeCurrentState : false ,
75- linkText : getLinkText(device),
76- isStateChange : false ,
77- displayed : false ,
78- descriptionText : description,
79- value : description
80- ]
81- def result
82- def cmd = zwave. parse(description, [0x20 : 1 , 0x26 : 1 , 0x70 : 1 ])
83- if (cmd) {
84- result = createEvent(cmd, item1)
79+ def result = null
80+ if (description != " updated" ) {
81+ log. debug " parse() >> zwave.parse($description )"
82+ def cmd = zwave. parse(description, [0x20 : 1 , 0x26 : 1 , 0x70 : 1 ])
83+ if (cmd) {
84+ result = zwaveEvent(cmd)
85+ }
8586 }
86- else {
87- item1. displayed = displayed(description, item1. isStateChange)
88- result = [item1]
87+ if (result?. name == ' hail' && hubFirmwareLessThan(" 000.011.00602" )) {
88+ result = [result, response(zwave. basicV1. basicGet())]
89+ log. debug " Was hailed: requesting state update"
90+ } else {
91+ log. debug " Parse returned ${ result?.descriptionText} "
8992 }
90- log. debug " Parse returned ${ result?.descriptionText} "
91- result
93+ return result
9294}
9395
94- def createEvent (physicalgraph.zwave.commands.basicv1.BasicReport cmd , Map item1 ) {
95- def result = doCreateEvent(cmd, item1)
96- for (int i = 0 ; i < result. size(); i++ ) {
97- result[i]. type = " physical"
98- }
99- result
96+ def zwaveEvent (physicalgraph.zwave.commands.basicv1.BasicReport cmd ) {
97+ dimmerEvents(cmd)
10098}
10199
102- def createEvent (physicalgraph.zwave.commands.basicv1.BasicSet cmd , Map item1 ) {
103- def result = doCreateEvent(cmd, item1)
104- for (int i = 0 ; i < result. size(); i++ ) {
105- result[i]. type = " physical"
106- }
107- result
100+ def zwaveEvent (physicalgraph.zwave.commands.basicv1.BasicSet cmd ) {
101+ dimmerEvents(cmd)
108102}
109103
110- def createEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStartLevelChange cmd , Map item1 ) {
111- []
104+ def zwaveEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelReport cmd ) {
105+ dimmerEvents(cmd)
112106}
113107
114- def createEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd , Map item1 ) {
115- [response(zwave . basicV1 . basicGet())]
108+ def zwaveEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelSet cmd ) {
109+ dimmerEvents(cmd)
116110}
117111
118- def createEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelSet cmd , Map item1 ) {
119- def result = doCreateEvent(cmd, item1)
120- for (int i = 0 ; i < result. size(); i++ ) {
121- result[i]. type = " physical"
112+ private dimmerEvents (physicalgraph.zwave.Command cmd ) {
113+ def value = (cmd. value ? " on" : " off" )
114+ def result = [createEvent(name : " switch" , value : value)]
115+ if (cmd. value && cmd. value <= 100 ) {
116+ result << createEvent(name : " level" , value : cmd. value, unit : " %" )
122117 }
123- result
118+ return result
124119}
125120
126- def createEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelReport cmd , Map item1 ) {
127- def result = doCreateEvent(cmd, item1)
128- result[0 ]. descriptionText = " ${ item1.linkText} is ${ item1.value} "
129- result[0 ]. handlerName = cmd. value ? " statusOn" : " statusOff"
130- for (int i = 0 ; i < result. size(); i++ ) {
131- result[i]. type = " digital"
132- }
133- result
134- }
135-
136- def doCreateEvent (physicalgraph.zwave.Command cmd , Map item1 ) {
137- def result = [item1]
138-
139- item1. name = " switch"
140- item1. value = cmd. value ? " on" : " off"
141- item1. handlerName = item1. value
142- item1. descriptionText = " ${ item1.linkText} was turned ${ item1.value} "
143- item1. canBeCurrentState = true
144- item1. isStateChange = isStateChange(device, item1. name, item1. value)
145- item1. displayed = item1. isStateChange
146-
147- if (cmd. value >= 5 ) {
148- def item2 = new LinkedHashMap (item1)
149- item2. name = " level"
150- item2. value = cmd. value as String
151- item2. unit = " %"
152- item2. descriptionText = " ${ item1.linkText} dimmed ${ item2.value} %"
153- item2. canBeCurrentState = true
154- item2. isStateChange = isStateChange(device, item2. name, item2. value)
155- item2. displayed = false
156- result << item2
157- }
158- result
159- }
160121
161122def zwaveEvent (physicalgraph.zwave.commands.configurationv1.ConfigurationReport cmd ) {
123+ log. debug " ConfigurationReport $cmd "
162124 def value = " when off"
163125 if (cmd. configurationValue[0 ] == 1 ) {value = " when on" }
164126 if (cmd. configurationValue[0 ] == 2 ) {value = " never" }
165- [name : " indicatorStatus" , value : value, display : false ]
127+ createEvent( [name : " indicatorStatus" , value : value])
166128}
167129
168- def createEvent (physicalgraph.zwave.Command cmd , Map map ) {
169- // Handles any Z-Wave commands we aren't interested in
170- log. debug " UNHANDLED COMMAND $cmd "
130+ def zwaveEvent (physicalgraph.zwave.commands.hailv1.Hail cmd ) {
131+ createEvent([name : " hail" , value : " hail" , descriptionText : " Switch button was pressed" , displayed : false ])
132+ }
133+
134+ def zwaveEvent (physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd ) {
135+ log. debug " manufacturerId: ${ cmd.manufacturerId} "
136+ log. debug " manufacturerName: ${ cmd.manufacturerName} "
137+ log. debug " productId: ${ cmd.productId} "
138+ log. debug " productTypeId: ${ cmd.productTypeId} "
139+ def msr = String . format(" %04X-%04X-%04X" , cmd. manufacturerId, cmd. productTypeId, cmd. productId)
140+ updateDataValue(" MSR" , msr)
141+ createEvent([descriptionText : " $device . displayName MSR: $msr " , isStateChange : false ])
142+ }
143+
144+ def zwaveEvent (physicalgraph.zwave.commands.switchmultilevelv1.SwitchMultilevelStopLevelChange cmd ) {
145+ [createEvent(name :" switch" , value :" on" ), response(zwave. switchMultilevelV1. switchMultilevelGet(). format())]
146+ }
147+
148+ def zwaveEvent (physicalgraph.zwave.Command cmd ) {
149+ // Handles all Z-Wave commands we aren't interested in
150+ [:]
171151}
172152
173153def on () {
174- log. info " on"
175- delayBetween([zwave. basicV1. basicSet(value : 0xFF ). format(), zwave. switchMultilevelV1. switchMultilevelGet(). format()], 5000 )
154+ delayBetween([
155+ zwave. basicV1. basicSet(value : 0xFF ). format(),
156+ zwave. switchMultilevelV1. switchMultilevelGet(). format()
157+ ],5000 )
176158}
177159
178160def off () {
179- delayBetween ([zwave. basicV1. basicSet(value : 0x00 ). format(), zwave. switchMultilevelV1. switchMultilevelGet(). format()], 5000 )
161+ delayBetween([
162+ zwave. basicV1. basicSet(value : 0x00 ). format(),
163+ zwave. switchMultilevelV1. switchMultilevelGet(). format()
164+ ],5000 )
180165}
181166
182167def setLevel (value ) {
168+ log. debug " setLevel >> value: $value "
183169 def valueaux = value as Integer
184- def level = Math . min(valueaux, 99 )
170+ def level = Math . max(Math . min(valueaux, 99 ), 0 )
171+ if (level > 0 ) {
172+ sendEvent(name : " switch" , value : " on" )
173+ } else {
174+ sendEvent(name : " switch" , value : " off" )
175+ }
176+ sendEvent(name : " level" , value : level, unit : " %" )
185177 delayBetween ([zwave. basicV1. basicSet(value : level). format(), zwave. switchMultilevelV1. switchMultilevelGet(). format()], 5000 )
186178}
187179
188180def setLevel (value , duration ) {
181+ log. debug " setLevel >> value: $value , duration: $duration "
189182 def valueaux = value as Integer
190- def level = Math . min(valueaux, 99 )
183+ def level = Math . max( Math . min(valueaux, 99 ), 0 )
191184 def dimmingDuration = duration < 128 ? duration : 128 + Math . round(duration / 60 )
192- zwave. switchMultilevelV2. switchMultilevelSet(value : level, dimmingDuration : dimmingDuration). format()
185+ def getStatusDelay = duration < 128 ? (duration* 1000 )+2000 : (Math . round(duration / 60 )* 60 * 1000 )+2000
186+ delayBetween ([zwave. switchMultilevelV2. switchMultilevelSet(value : level, dimmingDuration : dimmingDuration). format(),
187+ zwave. switchMultilevelV1. switchMultilevelGet(). format()], getStatusDelay)
193188}
194189
195190def poll () {
196191 zwave. switchMultilevelV1. switchMultilevelGet(). format()
197192}
198193
199194def refresh () {
200- zwave. switchMultilevelV1. switchMultilevelGet(). format()
195+ log. debug " refresh() is called"
196+ def commands = []
197+ commands << zwave. switchMultilevelV1. switchMultilevelGet(). format()
198+ if (getDataValue(" MSR" ) == null ) {
199+ commands << zwave. manufacturerSpecificV1. manufacturerSpecificGet(). format()
200+ }
201+ delayBetween(commands,100 )
201202}
202203
203204def indicatorWhenOn () {
204- sendEvent(name : " indicatorStatus" , value : " when on" , display : false )
205+ sendEvent(name : " indicatorStatus" , value : " when on" )
205206 zwave. configurationV1. configurationSet(configurationValue : [1 ], parameterNumber : 3 , size : 1 ). format()
206207}
207208
208209def indicatorWhenOff () {
209- sendEvent(name : " indicatorStatus" , value : " when off" , display : false )
210+ sendEvent(name : " indicatorStatus" , value : " when off" )
210211 zwave. configurationV1. configurationSet(configurationValue : [0 ], parameterNumber : 3 , size : 1 ). format()
211212}
212213
213214def indicatorNever () {
214- sendEvent(name : " indicatorStatus" , value : " never" , display : false )
215+ sendEvent(name : " indicatorStatus" , value : " never" )
215216 zwave. configurationV1. configurationSet(configurationValue : [2 ], parameterNumber : 3 , size : 1 ). format()
216217}
217218
@@ -222,4 +223,4 @@ def invertSwitch(invert=true) {
222223 else {
223224 zwave. configurationV1. configurationSet(configurationValue : [0 ], parameterNumber : 4 , size : 1 ). format()
224225 }
225- }
226+ }
0 commit comments