Advertisement
erocm123

Aeon Dual Nano

Dec 7th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.65 KB | None | 0 0
  1. /**
  2. *
  3. * Aeotec Inc Dual Nano Switch without Energy Reading
  4. *
  5. * github: Eric Maycock (erocm123)
  6. * Date: 2018-01-02
  7. * Copyright Eric Maycock
  8. *
  9. * Includes all configuration parameters and ease of advanced configuration.
  10. *
  11. * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  12. * in compliance with the License. You may obtain a copy of the License at:
  13. *
  14. * http://www.apache.org/licenses/LICENSE-2.0
  15. *
  16. * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
  17. * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
  18. * for the specific language governing permissions and limitations under the License.
  19. *
  20. */
  21.  
  22. metadata {
  23. definition (name: "Aeotec Inc Dual Nano Switch (ZW140)", namespace: "erocm123", author: "Eric Maycock") {
  24. capability "Actuator"
  25. capability "Switch"
  26. capability "Polling"
  27. capability "Configuration"
  28. capability "Refresh"
  29. capability "Power Meter"
  30. capability "Energy Meter"
  31. capability "Temperature Measurement"
  32. capability "Health Check"
  33.  
  34. command "childOn"
  35. command "childOff"
  36. command "childRefresh"
  37.  
  38. fingerprint mfr: "0086", model: "008C" // Aeon brand
  39. //inClusters:"0x5E,0x25,0x27,0x32,0x81,0x71,0x60,0x8E,0x2C,0x2B,0x70,0x86,0x72,0x73,0x85,0x59,0x98,0x7A,0x5A"
  40. }
  41.  
  42. simulator {
  43. }
  44.  
  45. preferences {
  46. input description: "Once you change values on this page, the corner of the \"configuration\" icon will change orange until all configuration parameters are updated.", title: "Settings", displayDuringSetup: false, type: "paragraph", element: "paragraph"
  47. generate_preferences(configuration_model())
  48. }
  49.  
  50.  
  51. }
  52.  
  53. def parse(String description) {
  54. def result = []
  55. def cmd = zwave.parse(description)
  56. if (cmd) {
  57. result += zwaveEvent(cmd)
  58. logging("Parsed ${cmd} to ${result.inspect()}", 1)
  59. } else {
  60. logging("Non-parsed event: ${description}", 2)
  61. }
  62.  
  63. def statusTextmsg = ""
  64.  
  65. result.each {
  66. if ((it instanceof Map) == true && it.find{ it.key == "name" }?.value == "power") {
  67. statusTextmsg = "${it.value} W ${device.currentValue('energy')? device.currentValue('energy') : "0"} kWh"
  68. }
  69. if ((it instanceof Map) == true && it.find{ it.key == "name" }?.value == "energy") {
  70. statusTextmsg = "${device.currentValue('power')? device.currentValue('power') : "0"} W ${it.value} kWh"
  71. }
  72. }
  73. if (statusTextmsg != "") sendEvent(name:"statusText", value:statusTextmsg, displayed:false)
  74.  
  75. return result
  76. }
  77.  
  78. def zwaveEvent(hubitat.zwave.commands.basicv1.BasicReport cmd) {
  79. logging("BasicReport ${cmd}", 2)
  80. }
  81.  
  82. def zwaveEvent(hubitat.zwave.commands.basicv1.BasicSet cmd) {
  83. logging("BasicSet ${cmd}", 2)
  84. def result = createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "digital")
  85. def cmds = []
  86. cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
  87. cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
  88. return [result, response(commands(cmds))] // returns the result of reponse()
  89. }
  90.  
  91. def zwaveEvent(hubitat.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd, ep=null) {
  92. logging("SwitchBinaryReport ${cmd} , ${ep}", 2)
  93. if (ep) {
  94. def childDevice = childDevices.find{it.deviceNetworkId == "$device.deviceNetworkId-ep$ep"}
  95. if (childDevice)
  96. childDevice.sendEvent(name: "switch", value: cmd.value ? "on" : "off")
  97. } else {
  98. def result = createEvent(name: "switch", value: cmd.value ? "on" : "off", type: "digital")
  99. def cmds = []
  100. cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 1)
  101. cmds << encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
  102. return [result, response(commands(cmds))] // returns the result of reponse()
  103. }
  104. }
  105.  
  106. def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
  107. logging("MultiChannelCmdEncap ${cmd}", 2)
  108. def encapsulatedCommand = cmd.encapsulatedCommand([0x32: 3, 0x25: 1, 0x20: 1])
  109. if (encapsulatedCommand) {
  110. zwaveEvent(encapsulatedCommand, cmd.sourceEndPoint as Integer)
  111. }
  112. }
  113.  
  114. def zwaveEvent(hubitat.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
  115. logging("ManufacturerSpecificReport ${cmd}", 2)
  116. def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
  117. logging("msr: $msr", 2)
  118. updateDataValue("MSR", msr)
  119. }
  120.  
  121. def zwaveEvent(hubitat.zwave.Command cmd) {
  122. // This will capture any commands not handled by other instances of zwaveEvent
  123. // and is recommended for development so you can see every command the device sends
  124. logging("Unhandled Event: ${cmd}", 2)
  125. }
  126.  
  127. def on() {
  128. logging("on()", 1)
  129. commands([
  130. zwave.switchAllV1.switchAllOn(),
  131. encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
  132. encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
  133. ])
  134. }
  135.  
  136. def off() {
  137. logging("off()", 1)
  138. commands([
  139. zwave.switchAllV1.switchAllOff(),
  140. encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
  141. encap(zwave.switchBinaryV1.switchBinaryGet(), 2)
  142. ])
  143. }
  144.  
  145. def childOn(String dni) {
  146. logging("childOn($dni)", 1)
  147. def cmds = []
  148. cmds << new hubitat.device.HubAction(command(encap(zwave.basicV1.basicSet(value: 0xFF), channelNumber(dni))), hubitat.device.Protocol.ZWAVE)
  149. cmds << new hubitat.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))), hubitat.device.Protocol.ZWAVE)
  150. cmds
  151. }
  152.  
  153. def childOff(String dni) {
  154. logging("childOff($dni)", 1)
  155. def cmds = []
  156. cmds << new hubitat.device.HubAction(command(encap(zwave.basicV1.basicSet(value: 0x00), channelNumber(dni))), hubitat.device.Protocol.ZWAVE)
  157. cmds << new hubitat.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))), hubitat.device.Protocol.ZWAVE)
  158. cmds
  159. }
  160.  
  161. def childRefresh(String dni) {
  162. logging("childRefresh($dni)", 1)
  163. def cmds = []
  164. cmds << new hubitat.device.HubAction(command(encap(zwave.switchBinaryV1.switchBinaryGet(), channelNumber(dni))), hubitat.device.Protocol.ZWAVE)
  165. cmds
  166. }
  167.  
  168. def poll() {
  169. logging("poll()", 1)
  170. commands([
  171. encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
  172. encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
  173. ])
  174. }
  175.  
  176. def refresh() {
  177. logging("refresh()", 1)
  178. commands([
  179. encap(zwave.switchBinaryV1.switchBinaryGet(), 1),
  180. encap(zwave.switchBinaryV1.switchBinaryGet(), 2),
  181. ])
  182. }
  183.  
  184. def ping() {
  185. logging("ping()", 1)
  186. refresh()
  187. }
  188.  
  189. def installed() {
  190. logging("installed()", 1)
  191. command(zwave.manufacturerSpecificV1.manufacturerSpecificGet())
  192. createChildDevices()
  193. }
  194.  
  195. def configure() {
  196. logging("configure()", 1)
  197. def cmds = []
  198. cmds = update_needed_settings()
  199. if (cmds != []) commands(cmds)
  200. }
  201.  
  202. def updated() {
  203. logging("updated()", 1)
  204. if (!childDevices) {
  205. createChildDevices()
  206. } else if (device.label != state.oldLabel) {
  207. childDevices.each {
  208. if (it.label == "${state.oldLabel} (Q${channelNumber(it.deviceNetworkId)})") {
  209. def newLabel = "${device.displayName} (Q${channelNumber(it.deviceNetworkId)})"
  210. it.setLabel(newLabel)
  211. }
  212. }
  213. state.oldLabel = device.label
  214. }
  215. def cmds = []
  216. cmds = update_needed_settings()
  217. sendEvent(name: "checkInterval", value: 2 * 15 * 60 + 2 * 60, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
  218. sendEvent(name:"needUpdate", value: device.currentValue("needUpdate"), displayed:false, isStateChange: true)
  219. if (cmds != []) commands(cmds)
  220. }
  221.  
  222. def generate_preferences(configuration_model) {
  223. def configuration = new XmlSlurper().parseText(configuration_model)
  224.  
  225. configuration.Value.each {
  226. if(it.@hidden != "true" && it.@disabled != "true") {
  227. switch(it.@type) {
  228. case ["number"]:
  229. input "${it.@index}", "number",
  230. title:"${it.@label}\n" + "${it.Help}",
  231. range: "${it.@min}..${it.@max}",
  232. defaultValue: "${it.@value}",
  233. displayDuringSetup: "${it.@displayDuringSetup}"
  234. break
  235. case "list":
  236. def items = []
  237. it.Item.each { items << ["${it.@value}":"${it.@label}"] }
  238. input "${it.@index}", "enum",
  239. title:"${it.@label}\n" + "${it.Help}",
  240. defaultValue: "${it.@value}",
  241. displayDuringSetup: "${it.@displayDuringSetup}",
  242. options: items
  243. break
  244. case "decimal":
  245. input "${it.@index}", "decimal",
  246. title:"${it.@label}\n" + "${it.Help}",
  247. range: "${it.@min}..${it.@max}",
  248. defaultValue: "${it.@value}",
  249. displayDuringSetup: "${it.@displayDuringSetup}"
  250. break
  251. case "boolean":
  252. input "${it.@index}", "boolean",
  253. title:"${it.@label}\n" + "${it.Help}",
  254. defaultValue: "${it.@value}",
  255. displayDuringSetup: "${it.@displayDuringSetup}"
  256. break
  257. }
  258. }
  259. }
  260. }
  261.  
  262. /* Code has elements from other community source @CyrilPeponnet (Z-Wave Parameter Sync). */
  263.  
  264. def update_current_properties(cmd) {
  265. def currentProperties = state.currentProperties ?: [:]
  266.  
  267. currentProperties."${cmd.parameterNumber}" = cmd.configurationValue
  268.  
  269. def parameterSettings = new XmlSlurper().parseText(configuration_model()).Value.find{it.@index == "${cmd.parameterNumber}"}
  270.  
  271. if (settings."${cmd.parameterNumber}" != null || parameterSettings.@hidden == "true") {
  272. if (convertParam(cmd.parameterNumber, parameterSettings.@hidden != "true"? settings."${cmd.parameterNumber}" : parameterSettings.@value) == cmd2Integer(cmd.configurationValue)) {
  273. sendEvent(name:"needUpdate", value:"NO", displayed:false, isStateChange: true)
  274. } else {
  275. sendEvent(name:"needUpdate", value:"YES", displayed:false, isStateChange: true)
  276. }
  277. }
  278.  
  279. state.currentProperties = currentProperties
  280. }
  281.  
  282. def update_needed_settings() {
  283. def cmds = []
  284. def currentProperties = state.currentProperties ?: [:]
  285.  
  286. def configuration = new XmlSlurper().parseText(configuration_model())
  287. def isUpdateNeeded = "NO"
  288.  
  289. //cmds << zwave.multiChannelAssociationV2.multiChannelAssociationRemove(groupingIdentifier: 1, nodeId: [0,zwaveHubNodeId,1])
  290. //cmds << zwave.multiChannelAssociationV2.multiChannelAssociationGet(groupingIdentifier: 1)
  291. cmds << zwave.associationV2.associationSet(groupingIdentifier: 1, nodeId: zwaveHubNodeId)
  292. cmds << zwave.associationV2.associationGet(groupingIdentifier: 1)
  293.  
  294. configuration.Value.each {
  295. if ("${it.@setting_type}" == "zwave" && it.@disabled != "true") {
  296. if (currentProperties."${it.@index}" == null) {
  297. if (it.@setonly == "true") {
  298. logging("Parameter ${it.@index} will be updated to " + convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}"), 2)
  299. def convertedConfigurationValue = convertParam(it.@index.toInteger(), settings."${it.@index}"? settings."${it.@index}" : "${it.@value}")
  300. cmds << zwave.configurationV1.configurationSet(configurationValue: integer2Cmd(convertedConfigurationValue, it.@byteSize.toInteger()), parameterNumber: it.@index.toInteger(), size: it.@byteSize.toInteger())
  301. } else {
  302. isUpdateNeeded = "YES"
  303. logging("Current value of parameter ${it.@index} is unknown", 2)
  304. cmds << zwave.configurationV1.configurationGet(parameterNumber: it.@index.toInteger())
  305. }
  306. } else if ((settings."${it.@index}" != null || "${it.@hidden}" == "true") && cmd2Integer(currentProperties."${it.@index}") != convertParam(it.@index.toInteger(), "${it.@hidden}" != "true"? settings."${it.@index}" : "${it.@value}")) {
  307. isUpdateNeeded = "YES"
  308. logging("Parameter ${it.@index} will be updated to " + convertParam(it.@index.toInteger(), "${it.@hidden}" != "true"? settings."${it.@index}" : "${it.@value}"), 2)
  309. def convertedConfigurationValue = convertParam(it.@index.toInteger(), "${it.@hidden}" != "true"? settings."${it.@index}" : "${it.@value}")
  310. cmds << zwave.configurationV1.configurationSet(configurationValue: integer2Cmd(convertedConfigurationValue, it.@byteSize.toInteger()), parameterNumber: it.@index.toInteger(), size: it.@byteSize.toInteger())
  311. cmds << zwave.configurationV1.configurationGet(parameterNumber: it.@index.toInteger())
  312. }
  313. }
  314. }
  315.  
  316. sendEvent(name:"needUpdate", value: isUpdateNeeded, displayed:false, isStateChange: true)
  317. return cmds
  318. }
  319.  
  320. def convertParam(number, value) {
  321. def parValue
  322. switch (number) {
  323. case 110:
  324. if (value < 0)
  325. parValue = value * -1 + 1000
  326. else
  327. parValue = value
  328. break
  329. default:
  330. parValue = value
  331. break
  332. }
  333. return parValue.toInteger()
  334. }
  335.  
  336. private def logging(message, level) {
  337. log.debug message
  338. /*if (logLevel != "0") {
  339. switch (logLevel) {
  340. case "1":
  341. if (level > 1)
  342. log.debug "$message"
  343. break
  344. case "99":
  345. log.debug "$message"
  346. break
  347. }
  348. }*/
  349. }
  350.  
  351. /**
  352. * Convert byte values to integer
  353. */
  354. def cmd2Integer(array) {
  355. switch(array.size()) {
  356. case 1:
  357. array[0]
  358. break
  359. case 2:
  360. ((array[0] & 0xFF) << 8) | (array[1] & 0xFF)
  361. break
  362. case 3:
  363. ((array[0] & 0xFF) << 16) | ((array[1] & 0xFF) << 8) | (array[2] & 0xFF)
  364. break
  365. case 4:
  366. ((array[0] & 0xFF) << 24) | ((array[1] & 0xFF) << 16) | ((array[2] & 0xFF) << 8) | (array[3] & 0xFF)
  367. break
  368. }
  369. }
  370.  
  371. def integer2Cmd(value, size) {
  372. switch(size) {
  373. case 1:
  374. [value]
  375. break
  376. case 2:
  377. def short value1 = value & 0xFF
  378. def short value2 = (value >> 8) & 0xFF
  379. [value2, value1]
  380. break
  381. case 3:
  382. def short value1 = value & 0xFF
  383. def short value2 = (value >> 8) & 0xFF
  384. def short value3 = (value >> 16) & 0xFF
  385. [value3, value2, value1]
  386. break
  387. case 4:
  388. def short value1 = value & 0xFF
  389. def short value2 = (value >> 8) & 0xFF
  390. def short value3 = (value >> 16) & 0xFF
  391. def short value4 = (value >> 24) & 0xFF
  392. [value4, value3, value2, value1]
  393. break
  394. }
  395. }
  396.  
  397. def zwaveEvent(hubitat.zwave.commands.configurationv2.ConfigurationReport cmd) {
  398. update_current_properties(cmd)
  399. logging("${device.displayName} parameter '${cmd.parameterNumber}' with a byte size of '${cmd.size}' is set to '${cmd2Integer(cmd.configurationValue)}'", 2)
  400. }
  401.  
  402. private encap(cmd, endpoint) {
  403. if (endpoint) {
  404. zwave.multiChannelV3.multiChannelCmdEncap(destinationEndPoint:endpoint).encapsulate(cmd)
  405. } else {
  406. cmd
  407. }
  408. }
  409.  
  410. private command(hubitat.zwave.Command cmd) {
  411. if (state.sec) {
  412. zwave.securityV1.securityMessageEncapsulation().encapsulate(cmd).format()
  413. } else {
  414. cmd.format()
  415. }
  416. }
  417.  
  418. private commands(commands, delay=1000) {
  419. delayBetween(commands.collect{ command(it) }, delay)
  420. }
  421.  
  422. private channelNumber(String dni) {
  423. dni.split("-ep")[-1] as Integer
  424. }
  425.  
  426. private void createChildDevices() {
  427. state.oldLabel = device.label
  428. try {
  429. for (i in 1..2) {
  430. addChildDevice("Metering Switch Child Device", "${device.deviceNetworkId}-ep${i}",
  431. [completedSetup: true, label: "${device.displayName} (Q${i})",
  432. isComponent: false, componentName: "ep$i", componentLabel: "Output $i"])
  433. }
  434. } catch (e) {
  435. log.debug e
  436. runIn(2, "sendAlert")
  437. }
  438. }
  439.  
  440. private sendAlert() {
  441. sendEvent(
  442. descriptionText: "Child device creation failed. Please make sure that the \"Metering Switch Child Device\" is installed and published.",
  443. eventType: "ALERT",
  444. name: "childDeviceCreation",
  445. value: "failed",
  446. displayed: true,
  447. )
  448. }
  449.  
  450. def configuration_model() {
  451. '''
  452. <configuration>
  453. <Value type="list" byteSize="1" index="4" label="Overheat Protection. " min="0" max="1" value="0" setting_type="zwave" fw="">
  454. <Help>
  455. The output load will automatically turn off after 30 seconds if temperature is over 100 C.
  456. 0 - Disable
  457. 1 - Enable
  458. Range: 0~1
  459. Default: 0 (Previous State)
  460. </Help>
  461. <Item label="Disable" value="0" />
  462. <Item label="Enable" value="1" />
  463. </Value>
  464. <Value type="list" byteSize="1" index="20" label="After a power outage" min="0" max="2" value="0" setting_type="zwave" fw="">
  465. <Help>
  466. Configure the output load status after re-power from a power outage.
  467. 0 - Last status before power outage.
  468. 1 - Always ON
  469. 2 - Always OFF
  470. Range: 0~2
  471. Default: 0 (Previous State)
  472. </Help>
  473. <Item label="Last Status" value="0" />
  474. <Item label="Always On" value="1" />
  475. <Item label="Always Off" value="2" />
  476. </Value>
  477. <Value type="list" byteSize="1" index="80" label="Instant Notification" min="0" max="3" value="2" setting_type="zwave" fw="">
  478. <Help>
  479. Notification report of status change sent to Group Assocation #1 when state of output load changes. Used to instantly update status to your gateway typically.
  480. 0 - Nothing
  481. 1 - Hail CC (uses more bandwidth)
  482. 2 - Basic Report CC
  483. 3 - Hail CC when external switch is used to change status of either load.
  484. Range: 0~3
  485. Default: 2 (Previous State)
  486. </Help>
  487. <Item label="None" value="0" />
  488. <Item label="Hail CC" value="1" />
  489. <Item label="Basic Report CC" value="2" />
  490. <Item label="Hail when External Switch used" value="3" />
  491. </Value>
  492. <Value type="list" byteSize="1" index="81" label="Notification send with S1 Switch" min="0" max="1" value="1" setting_type="zwave" fw="">
  493. <Help>
  494. To set which notification would be sent to the associated nodes in association group 3 when using the external switch 1 to switch the loads.
  495. 0 = Send Nothing
  496. 1 = Basic Set CC.
  497. Range: 0~1
  498. Default: 1 (Previous State)
  499. </Help>
  500. <Item label="Nothing" value="0" />
  501. <Item label="Basic Set CC" value="1" />
  502. </Value>
  503. <Value type="list" byteSize="1" index="82" label="Notification send with S2 Switch" min="0" max="1" value="1" setting_type="zwave" fw="">
  504. <Help>
  505. To set which notification would be sent to the associated nodes in association group 4 when using the external switch 2 to switch the loads.
  506. 0 = Send Nothing
  507. 1 = Basic Set CC.
  508. Range: 0~1
  509. Default: 1 (Previous State)
  510. </Help>
  511. <Item label="Nothing" value="0" />
  512. <Item label="Basic Set CC" value="1" />
  513. </Value>
  514. <Value type="list" byteSize="1" index="83" label="State of Internal LED use" min="0" max="2" value="0" setting_type="zwave" fw="">
  515. <Help>
  516. Configure the state of LED when it is in 3 modes below:
  517. 0 = Energy mode. The LED will follow the status (on/off).
  518. 1 = Momentary indicate mode. When the state of Switch’s load changed, the LED will follow the status (on/off) of its load, but the LED will turn off after 5 seconds if there is no any switch action.
  519. 2 = Night light mode. The LED will remain ON state.
  520. </Help>
  521. <Item label="Energy Mode" value="0" />
  522. <Item label="Momentary Mode" value="1" />
  523. <Item label="Night Light Mode" value="2" />
  524. </Value>
  525. <Value type="list" byteSize="1" index="120" label="External Switch S1 Setting" min="0" max="4" value="0" setting_type="zwave" fw="">
  526. <Help>
  527. Configure the external switch mode for S1 via Configuration Set.
  528. 0 = Unidentified mode.
  529. 1 = 2-state switch mode.
  530. 2 = 3-way switch mode.
  531. 3 = momentary switch button mode.
  532. 4 = Enter automatic identification mode. //can enter this mode by tapping internal button 4x times within 2 seconds.
  533. Note: When the mode is determined, this mode value will not be reset after exclusion.
  534. Range: 0~4
  535. Default: 0 (Previous State)
  536. </Help>
  537. <Item label="Unidentified" value="0" />
  538. <Item label="2-State Switch Mode" value="1" />
  539. <Item label="3-way Switch Mode" value="2" />
  540. <Item label="Momentary Push Button Mode" value="3" />
  541. <Item label="Automatic Identification" value="4" />
  542. </Value>
  543. <Value type="list" byteSize="1" index="121" label="External Switch S2 Setting" min="0" max="4" value="0" setting_type="zwave" fw="">
  544. <Help>
  545. Configure the external switch mode for S2 via Configuration Set.
  546. 0 = Unidentified mode.
  547. 1 = 2-state switch mode.
  548. 2 = 3-way switch mode.
  549. 3 = momentary switch button mode.
  550. 4 = Enter automatic identification mode. //can enter this mode by tapping internal button 6x times within 2 seconds.
  551. Note: When the mode is determined, this mode value will not be reset after exclusion.
  552. Range: 0~4
  553. Default: 0 (Previous State)
  554. </Help>
  555. <Item label="Unidentified" value="0" />
  556. <Item label="2-State Switch Mode" value="1" />
  557. <Item label="3-way Switch Mode" value="2" />
  558. <Item label="Momentary Push Button Mode" value="3" />
  559. <Item label="Automatic Identification" value="4" />
  560. </Value>
  561. </configuration>
  562. '''
  563. }
  564.  
  565. //For Later: 83-87, 123
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement