-
-
Save b16b/de4b3ade4e234abd3aa74550c4318d73 to your computer and use it in GitHub Desktop.
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
/* | |
* Integrated ZigBee Switch | |
* | |
* Copyright 2020 SmartThings | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
* use this file except in compliance with the License. You may obtain a copy | |
* of the License at: | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
* License for the specific language governing permissions and limitations | |
* under the License. | |
* | |
* author : woobooung@gmail.com | |
*/ | |
public static String version() { return "v0.0.36.20210720" } | |
/* | |
* 2021/07/20 >>> v0.0.36 - Add Moeshouse 3gang switch by jaengie | |
* 2021/07/01 >>> v0.0.35 - Add Tuya 1gang switch by adenburd@gmail.com, Add Zemi No neutral switchs by JayN | |
* 2021/06/16 >>> v0.0.34 - Add Zemismart 2gang switch | |
* 2021/04/21 >>> v0.0.33 - Add UIOT 3gang swtich | |
* 2021/02/15 >>> v0.0.32 - Add Zemismart no neutral switch | |
* 2021/02/13 >>> v0.0.31 - Add useelink model: "TS011F" | |
* 2021/01/15 >>> v0.0.30 - Add Zemismart 2gang manufacturer: "_TZ3000_7hp93xpr", model: "TS0002" | |
* 2021/01/07 >>> v0.0.29 - Add Zemismart Black 3gang(ceborita@gmail.com), Tuya 4 gang switch(naver cafe: incident) | |
* 2021/01/01 >>> v0.0.28 - Modfied for ZemiSmart Switchs & eZex Switchs | |
* 2020/12/13 >>> v0.0.27 - Add Tuya 4Gang switch(by bubibuhome@gmail.com) | |
* 2020/12/11 >>> v0.0.26 - Add Tuya moes inner 2Gang switch(Zigbee+rf) | |
* 2020/12/09 >>> v0.0.25 - Add Lonsonho Tuya Zigbee Smart Switch No Neutral 3Gang switch | |
* 2020/10/24 >>> v0.0.24 - Add Zemi ZigBee 3Gang v2.5, eZex 4Gang switch, Tuya 2Gang switch | |
* 2020/09/02 >>> v0.0.23 - Add Zemi ZigBee inline Switch | |
* 2020/06/19 >>> v0.0.22 - Add Terncy Switch | |
* 2020/06/16 >>> v0.0.21 - When changed parent's dni, replace child's dni(select settings's "Auto detecting and create device" : ON) | |
* 2020/06/14 >>> v0.0.20 - Added ZigBee 3.0 USB Socket Plug | |
* 2020/06/14 >>> v0.0.19 - Auto detecting and create option | |
* 2020/06/14 >>> v0.0.18 - Child device type change | |
* 2020/06/14 >>> v0.0.17 - Fixed health check issue | |
* 2020/06/14 >>> v0.0.16 - Support All Controller switch and fixed for Tuya usb switch offline issue | |
* 2020/06/13 >>> v0.0.15 - Tuya multitab support USB | |
* 2020/06/01 >>> v0.0.14 - Tuya multitab without USB | |
* 2020/05/29 >>> v0.0.13 - Tuya multitab with USB | |
* 2020/05/27 >>> v0.0.12 - Aqara 1gang switch mapping to ZigBee Switch Power | |
* 2020/05/22 >>> v0.0.11 - Added Aqara switch 1gang | |
* 2020/05/14 >>> v0.0.10 - Added Zemi1gang switch | |
* 2020/05/08 >>> v0.0.9 - Modified for Zemi 2gang switch | |
* 2020/04/27 >>> v0.0.8 - Added Usage | |
* 2020/04/26 >>> v0.0.7 - Support to old Zemi swtich version | |
* 2020/04/26 >>> v0.0.6 - Added Zemi swtich, and modified child device type name | |
* 2020/04/25 >>> v0.0.5 - Fixed minor issue - child device lebel | |
* 2020/04/25 >>> v0.0.4 - Fixed minor issue | |
* 2020/04/25 >>> v0.0.4 - Modified Child Device Lebel | |
* 2020/04/25 >>> v0.0.4 - Fixed minor bugs | |
* 2020/04/25 >>> v0.0.3 - Added Goqual Multi Switch & Modified refresh() function | |
* 2020/04/25 >>> v0.0.2 - Added : DAWON DNS ZigBee Multi Switch 1 2 3 gang, eZex ZigBee Multi Switch 6 gang, old Zigbee OnOff Swtich | |
* 2020/04/25 >>> v0.0.1 - Initialize : Bandi ZigBee Switch, Zemi ZigBee Switch | |
*/ | |
import java.lang.Math | |
import groovy.json.JsonOutput | |
/* | |
> Usage < | |
Example) Bandi 3gang switch model | |
IDE Device Data | |
manufacturer: _TYZB01_pdevogdj | |
model: TS0003 | |
Raw Description 01 0104 0100 00 05 0000 000A 0004 0005 0006 01 0019 | |
Analysis -> '01'(endpointId) '0104'(profileId) '0100'(deviceId) 00(skip) 05(skip) '0000 000A 0004 0005 0006'(inClusters) 01(skil) '0019'(outClusters) | |
> Step1 - Add fingerprint | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_pdevogdj", model: "TS0003", deviceJoinName: "Bandi Zigbee Switch 1" | |
> Step 2 - Add MODEL_MAP | |
private getMODEL_MAP() { | |
[ | |
'TS0003' : 3, | |
.... | |
... | |
.. | |
] | |
} | |
> Step 3 - paring device and test | |
> Step 4 - request add device infos to woobooung@gmail.com | |
*/ | |
private getMODEL_MAP() { | |
[ | |
'TS0601' : 4, | |
'TS0004' : 4, | |
'TS0003' : 3, | |
'TS0002' : 2, | |
'TS0001' : 1, | |
'TS0115' : 4, | |
'TS0112' : 2, | |
'TS0012' : 2, | |
'TS0013' : 3, | |
'TS011F' : 2, | |
'TS0601' : 1, | |
'PM-S340-ZB' : 3, | |
'PM-S240-ZB' : 2, | |
'PM-S140-ZB' : 1, | |
'FNB56-ZSW03LX2.0' : 3, | |
'FNB56-ZSW02LX2.0' : 2, | |
'FNB56-ZSW01LX2.0' :1, | |
'FB56+ZSW1GKJ2.7' : 1, | |
'FB56+ZSW1HKJ2.5' : 2, | |
'FB56+ZSW1IKJ2.7' : 3, | |
'FB56+ZSW1IKJ2.5' : 3, | |
'E220-KR4N0Z1-HA' : 4, | |
'E220-KR6N0Z1-HA' : 6, | |
'Lamp_01' : 1, | |
'lumi.switch.b1naus01': 1, | |
'lumi.switch.b2naus01': 2, | |
'lumi.switch.b3naus01': 3, | |
'lumi.ctrl_neutral1' : 1, | |
'lumi.switch.b2laus01' : 2, | |
'TERNCY-WS01-S2' : 2, | |
'TERNCY-WS01-S3' : 3, | |
'LXN59-2S7LX1.0' : 2, | |
'LXN-3S27LX1.0' : 3, | |
'3AFE330100068603' : 3 | |
] | |
} | |
metadata { | |
definition(name: "Integrated ZigBee Switch", namespace: "WooBooung", author: "Booung", ocfDeviceType: "oic.d.switch", vid: "generic-switch") { | |
capability "Actuator" | |
capability "Configuration" | |
capability "Refresh" | |
capability "Health Check" | |
capability "Switch" | |
command "childOn", ["string"] | |
command "childOff", ["string"] | |
// HejHome & Bandi ZigBee Multi Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_pdevogdj", model: "TS0003", deviceJoinName: "HejHome ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_tas0zemd", model: "TS0002", deviceJoinName: "HejHome ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_ddg0cycp", model: "TS0001", deviceJoinName: "HejHome ZigBee Switch" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_pdevogdj", model: "TS0003", deviceJoinName: "HejHome ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_tas0zemd", model: "TS0002", deviceJoinName: "HejHome ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_ddg0cycp", model: "TS0001", deviceJoinName: "HejHome ZigBee Switch" | |
// DAWON DNS ZigBee Multi Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0103", inClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", outClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", manufacturer: "DAWON_DNS", model: "PM-S140-ZB", deviceJoinName: "DAWON ZigBee Switch" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0103", inClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", outClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", manufacturer: "DAWON_DNS", model: "PM-S240-ZB", deviceJoinName: "DAWON ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0103", inClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", outClusters: "0000, 0004, 0003, 0006, 0019, 0002, 0009", manufacturer: "DAWON_DNS", model: "PM-S340-ZB", deviceJoinName: "DAWON ZigBee Switch 1" | |
// Zemi ZigBee Multi Switch | |
fingerprint endpointId: "10", profileId: "0104", inClusters: "0000, 0003, 0004, 0005, 0006", manufacturer: "Feibit Inc co.", model: "FB56+ZSW1GKJ2.7", deviceJoinName: "Zemi ZigBee Switch" | |
fingerprint endpointId: "10", profileId: "0104", deviceId: "0002", inClusters: "0000, 0005, 0004, 0006", outClusters: "0000", manufacturer: "Feibit Inc co.", model: "FB56+ZSW1HKJ2.5", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "10", profileId: "0104", deviceId: "0002", inClusters: "0000, 0003, 0004, 0005, 0006", manufacturer: "Feibit Inc co.", model: "FB56+ZSW1IKJ2.7", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "12", profileId: "0104", deviceId: "0002", inClusters: "0000, 0005, 0004, 0006", manufacturer: "Feibit Inc co.", model: "FB56+ZSW1IKJ2.5", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "0B", profileId: "C05E", inClusters: "0000, 0004, 0003, 0006, 0005, 1000, 0008", outClusters: "0019", manufacturer: "FeiBit", model: "FNB56-ZSW01LX2.0", deviceJoinName: "Zemi ZigBee Switch" | |
fingerprint endpointId: "0B", profileId: "C05E", inClusters: "0000, 0004, 0003, 0006, 0005, 1000, 0008", outClusters: "0019", manufacturer: "FeiBit", model: "FNB56-ZSW02LX2.0", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "C05E", inClusters: "0000, 0004, 0003, 0006, 0005, 1000, 0008", outClusters: "0019", manufacturer: "FeiBit", model: "FNB56-ZSW03LX2.0", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0003, 0004, 0005, 0006", outClusters: "0019", manufacturer: "3A Smart Home DE", model: "LXN59-2S7LX1.0", deviceJoinName: "Zemi ZigBee inline Switch 1" | |
fingerprint endpointId: "01", profileId: "C05E", deviceId: "0000", inClusters: "0000, 0004, 0003, 0006, 0005", outClusters: "0019", manufacturer: "3A Smart Home DE", model: "LXN-3S27LX1.0", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_7hp93xpr", model: "TS0002", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_vjhyd6ar", model: "TS0002", deviceJoinName: "Zemi ZigBee Switch 1" | |
// Zemi no neutral switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_oysiif07", model: "TS0001", deviceJoinName: "Zemi ZigBee Switch" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_7hp93xpr", model: "TS0002", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_c0wbnbbf", model: "TS0003", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_vjhyd6ar", model: "TS0002", deviceJoinName: "Zemi ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_c0wbnbbf", model: "TS0003", deviceJoinName: "Zemi ZigBee Switch 1" | |
// eZex ZigBee Multi Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000 0003 0004 0006", outClusters: "0006, 000A, 0019", manufacturer: "", model: "E220-KR6N0Z1-HA", deviceJoinName: "eZex ZigBee Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000 0003 0004 0006", outClusters: "0006, 000A, 0019", manufacturer: "", model: "E220-KR4N0Z1-HA", deviceJoinName: "eZex ZigBee Switch 1" | |
// Aqara Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0002, 0003, 0004, 0005, 0006, 0009, 0702, 0B04", outClusters: "000A, 0019", manufacturer: "LUMI", model: "lumi.switch.b1naus01", deviceJoinName: "Aqara Switch" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0002, 0003, 0004, 0005, 0006, 0009, 0702, 0B04", outClusters: "000A, 0019", manufacturer: "LUMI", model: "lumi.switch.b2naus01", deviceJoinName: "Aqara Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0002, 0003, 0004, 0005, 0006, 0009, 0702, 0B04", outClusters: "000A, 0019", manufacturer: "LUMI", model: "lumi.switch.b3naus01", deviceJoinName: "Aqara Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0002, 0003, 0004, 0005, 0006, 0009", outClusters: "000A, 0019", manufacturer: "LUMI", model: "lumi.switch.b2laus01", deviceJoinName: "Aqara Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0006", inClusters: "0000, 0003, 0001, 0002, 0019, 000A", outClusters: "0000, 000A, 0019", manufacturer: "LUMI", model: "lumi.ctrl_neutral1", deviceJoinName: "Aqara Switch" | |
// Zigbee OnOff Swtich | |
fingerprint endpointId: "0B", profileId: "0104", deviceId: "0100", inClusters: "0000, 0003, 0004, 0005, 0006", outClusters: "0000", manufacturer: "SZ", model: "Lamp_01", deviceJoinName: "Zigbee OnOff Switch" | |
// Tuya 1 gang switch | |
//fingerprint endpointId: "01", profileId: "0104", deviceId: "0051", inClusters: "0000, 0004, 0005, EF00", outClusters: "0019, 000A", manufacturer: "_TZE200_amp6tsvy", model: "TS0601", deviceJoinName: "Tuya ZigBee Switch" // <- not working | |
// Tuya multi switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_fvh3pjaz", model: "TS0012", deviceJoinName: "Tuya Multi Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_pmz6mjyu", model: "TS011F", deviceJoinName: "Tuya Multi Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TZ3000_go9rahj5", model: "TS0004", deviceJoinName: "Tuya Multi Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0051", inClusters: "0000, 0004, 0005, EF00", outClusters: "0019, 000A", manufacturer: "_TZE200_aqnazj70", model: "TS0601", deviceJoinName: "Tuya Multi Switch 1" | |
// not working | |
//fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019, 000A", manufacturer: "_TZ3000_wyhuocal", model: "TS0013", deviceJoinName: "Tuya Multi Switch 1" //< - not working | |
// Tuya multitab with USB | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0009", inClusters: "0000, 000A, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_vkwryfdr", model: "TS0115", deviceJoinName: "Tuya Multi Tab Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0051", inClusters: "0000, 0003, 0004, 0005, 0006, 0702, 0B04", outClusters: "0019", manufacturer: "_TYZB01_b1ngbmlm", model: "TS0112", deviceJoinName: "Tuya USB Socket Plug 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "010A", inClusters: "0000, 0003, 0004, 0005, 0006, E000, E001", outClusters: "0019, 000A", manufacturer: "_TZ3000_o005nuxx", model: "TS011F", deviceJoinName: "Tuya Multi Tab Switch 1" | |
// Terncy Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0003, 0006, 0020, FCCC", outClusters: "0019", manufacturer: "Terncy", model: "TERNCY-WS01-S3", deviceJoinName: "Terncy Switch 1" | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0003, 0006, 0020, FCCC", outClusters: "0019", manufacturer: "Terncy", model: "TERNCY-WS01-S2", deviceJoinName: "Terncy Switch 1" | |
// UIOT Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0103", inClusters: "0000, 0003, 0004, 0005, 0006, 0B05, FCC0", outClusters: "0003, 0019, FCC0", manufacturer: "Konke", model: "3AFE330100068603", deviceJoinName: "UIOT Switch 1" | |
//Moeshouse Switch | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0000, 0004, 0005, 0006", outClusters: "0019", manufacturer: "_TYZB01_mqel1whf", model: "TS0013", deviceJoinName: "Moes Multi Switch 1" //by jaengie | |
// Unclear devices without model, meanufacturer | |
fingerprint endpointId: "01", profileId: "0104", deviceId: "0100", inClusters: "0006, 0000, 0003", outClusters: "0019", manufacturer: "", model: "", deviceJoinName: "ZigBee Switch 1" | |
fingerprint endpointId: "01", | |
profileId: "0104", | |
deviceId: "0100", | |
inClusters: "0000 0004 0005 0006 EF00", | |
outClusters: "0019 000A", | |
application: "40", | |
manufacturer: "_TZ3000_hlwm8e96", model: "TS0013", deviceJoinName: "Yag switch 1" | |
} | |
preferences { | |
input name: "isAutoCreateChildDevice", type: "bool", title: "Auto detecting and create device", description: "default: true", defaultValue: true, required: true | |
input name: "isCreateAllControllerSwitch", type: "bool", title: "Create All switch", description: "default: false", defaultValue: false, required: true | |
input type: "paragraph", element: "paragraph", title: "Version", description: version(), displayDuringSetup: false | |
} | |
// simulator metadata | |
simulator { | |
// status messages | |
status "on": "on/off: 1" | |
status "off": "on/off: 0" | |
// reply messages | |
reply "zcl on-off on": "on/off: 1" | |
reply "zcl on-off off": "on/off: 0" | |
} | |
tiles(scale: 2) { | |
multiAttributeTile(name: "switch", type: "lighting", width: 6, height: 4, canChangeIcon: true) { | |
tileAttribute("device.switch", key: "PRIMARY_CONTROL") { | |
attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.light.on", backgroundColor: "#00A0DC", nextState: "turningOff" | |
attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.light.off", backgroundColor: "#ffffff", nextState: "turningOn" | |
attributeState "turningOn", label: '${name}', action: "switch.off", icon: "st.switches.light.on", backgroundColor: "#00A0DC", nextState: "turningOff" | |
attributeState "turningOff", label: '${name}', action: "switch.on", icon: "st.switches.light.off", backgroundColor: "#ffffff", nextState: "turningOn" | |
} | |
} | |
standardTile("refresh", "device.refresh", inactiveLabel: false, decoration: "flat", width: 2, height: 2) { | |
state "default", label: "", action: "refresh.refresh", icon: "st.secondary.refresh" | |
} | |
main "switch" | |
details(["switch", "refresh"]) | |
} | |
} | |
def installed() { | |
log.debug "installed()" | |
def endpointCount = getEndpointCount() | |
def model = device.getDataValue("model") | |
if (endpointCount == 1) { | |
// for 1 gang switch - ST Official local dth | |
if (model == 'lumi.switch.b1naus01') { | |
setDeviceType("ZigBee Switch Power") | |
} else { | |
setDeviceType("ZigBee Switch") | |
} | |
} else if (endpointCount > 1){ | |
if (model == 'FB56+ZSW1HKJ2.5' || model == 'FB56+ZSW1IKJ2.7') { | |
device.updateDataValue("endpointId", "10") | |
} | |
// for multi switch, cloud device | |
createChildDevices() | |
} | |
updateDataValue("onOff", "catchall") | |
state.hasConfiguredHealthCheck = false | |
refresh() | |
} | |
def updated() { | |
log.debug "updated()" | |
updateDataValue("onOff", "catchall") | |
state.hasConfiguredHealthCheck = false | |
refresh() | |
} | |
def parse(String description) { | |
Map eventMap = zigbee.getEvent(description) | |
Map eventDescMap = zigbee.parseDescriptionAsMap(description) | |
if (!eventMap && eventDescMap) { | |
eventMap = [:] | |
if (eventDescMap?.clusterId == zigbee.ONOFF_CLUSTER) { | |
eventMap[name] = "switch" | |
eventMap[value] = eventDescMap?.value | |
} | |
} | |
if (eventMap && eventDescMap) { | |
if (eventDescMap?.attrId == "0000" || eventDescMap?.attId == null) { | |
def endpointId = device.getDataValue("endpointId") | |
log.debug "eventMap $eventMap | eventDescMap $eventDescMap" | |
eventMap[displayed] = true | |
if (eventDescMap?.sourceEndpoint == endpointId) { | |
log.debug "parse - sendEvent parent $eventDescMap.sourceEndpoint" | |
sendEvent(eventMap) | |
} else { | |
def childDevice = childDevices.find { | |
it.deviceNetworkId == "$device.deviceNetworkId:${eventDescMap.sourceEndpoint}" | |
} | |
if (childDevice) { | |
log.debug "parse - sendEvent child $eventDescMap.sourceEndpoint" | |
childDevice.sendEvent(eventMap) | |
} else if (isAutoCreateChildDevice != false || getEndpointCount() == 0){ | |
def model = device.getDataValue("model") | |
log.debug "Child device: $device.deviceNetworkId:${eventDescMap?.sourceEndpoint} was not found" | |
def parentEndpointInt = zigbee.convertHexToInt(endpointId) | |
if (eventDescMap?.sourceEndpoint != null) { | |
def childEndpointInt = zigbee.convertHexToInt(eventDescMap?.sourceEndpoint) | |
def childEndpointHexString = zigbee.convertToHexString(childEndpointInt, 2).toUpperCase() | |
def deviceLabel = "${device.displayName[0..-2]}" | |
def deviceIndex = Math.abs(childEndpointInt - parentEndpointInt) + 1 | |
def childByEndpointId = childDevices.find { | |
it.deviceNetworkId.endsWith(":${eventDescMap.sourceEndpoint}") | |
} | |
if (childByEndpointId) { | |
log.debug "FOUND CHILD!!!!! Change dni to $device.deviceNetworkId:$childEndpointHexString" | |
childByEndpointId.setDeviceNetworkId("$device.deviceNetworkId:$childEndpointHexString") | |
} else { | |
log.debug "NOT FOUND CHILD!!!!! Create to $deviceLabel$deviceIndex" | |
createChildDevice("$deviceLabel$deviceIndex", childEndpointHexString) | |
} | |
} | |
} | |
if (isCreateAllControllerSwitch) { | |
def allControlChildDevice = childDevices.find { | |
it.deviceNetworkId == "$device.deviceNetworkId:ALL" | |
} | |
if (!allControlChildDevice) { | |
def deviceLabel = "${device.displayName[0..-2]}" | |
createChildDevice("${deviceLabel}ALL", "ALL") | |
} | |
} | |
} | |
checkAllSwtichValue() | |
} | |
} | |
} | |
private checkAllSwtichValue() { | |
def parentSwitchValue = device.currentState("switch").value | |
log.debug("checkAllSwtichValue ${device.label} : ${parentSwitchValue}") | |
def allChildDeviceValue = parentSwitchValue | |
def allChildDevice = null | |
childDevices?.each { | |
if (it.deviceNetworkId == "$device.deviceNetworkId:ALL") { | |
allChildDevice = it | |
} else { | |
if (it.currentState("switch")?.value == "on") { | |
allChildDeviceValue = "on" | |
} | |
} | |
} | |
if (allChildDevice?.currentState("switch") != allChildDeviceValue) { | |
allChildDevice?.sendEvent(name: "switch", value : allChildDeviceValue) | |
} | |
} | |
private getEndpointCount() { | |
def model = device.getDataValue("model") | |
def count = MODEL_MAP[model] ?: 0 | |
def manufacturer = device.getDataValue("manufacturer") | |
if ( model == 'TS0013' && manufacturer == '_TZ3000_hlwm8e96') { | |
count = 3 | |
} | |
log.debug("getEndpointCount[$model] : $count") | |
return count | |
} | |
private void createChildDevices() { | |
log.debug("=============createChildDevices of $device.deviceNetworkId") | |
if (!state.isCreateChildDone || isAutoCreateChildDevice != false) { | |
def endpointCount = getEndpointCount() | |
def endpointId = device.getDataValue("endpointId") | |
def endpointInt = zigbee.convertHexToInt(endpointId) | |
def deviceLabel = "${device.displayName[0..-2]}" | |
for (i in 1..endpointCount - 1) { | |
def endpointHexString = zigbee.convertToHexString(endpointInt + i, 2).toUpperCase() | |
createChildDevice("$deviceLabel${i + 1}", endpointHexString) | |
} | |
def model = device.getDataValue("model") | |
def manufacturer = device.getDataValue("manufacturer") | |
if ( model == 'TS0115' ) { | |
createChildDevice("${deviceLabel}USB", "07") | |
} | |
if ( model == 'TS011F' && manufacturer == '_TZ3000_o005nuxx' ) { | |
createChildDevice("${deviceLabel}USB", "05") | |
} | |
state.isCreateChildDone = true | |
} | |
} | |
private void createChildDevice(String deviceLabel, String endpointHexString) { | |
def childDevice = childDevices.find { | |
it.deviceNetworkId == "$device.deviceNetworkId:$endpointHexString" | |
} | |
if (!childDevice) { | |
log.debug("===========Need to createChildDevice: $device.deviceNetworkId:$endpointHexString") | |
addChildDevice("smartthings", "Child Switch", "$device.deviceNetworkId:$endpointHexString", device.hubId, | |
[completedSetup: true, label: deviceLabel, isComponent: false]) | |
} else { | |
log.debug("createChildDevice: SKIP - $device.deviceNetworkId:${endpointHexString}") | |
} | |
} | |
private getChildEndpoint(String dni) { | |
dni.split(":")[-1] as String | |
} | |
private allChildOn() { | |
log.debug "Executing 'on all' for 0x${device.deviceNetworkId}" | |
childDevices.each { | |
if (it.deviceNetworkId == "$device.deviceNetworkId:ALL") { | |
it.sendEvent(name: "switch", value: "on") | |
} else { | |
if (it.currentState("switch").value != "on") { | |
it.on() | |
} | |
} | |
} | |
} | |
private allChildOff() { | |
log.debug "Executing 'off all' for 0x${device.deviceNetworkId}" | |
childDevices.each { | |
if (it.deviceNetworkId == "$device.deviceNetworkId:ALL") { | |
it.sendEvent(name: "switch", value: "off") | |
} else { | |
if (it.currentState("switch").value != "off") { | |
it.off() | |
} | |
} | |
} | |
} | |
def on() { | |
log.debug("on") | |
zigbee.on() | |
} | |
def off() { | |
log.debug("off") | |
zigbee.off() | |
} | |
def childOn(String dni) { | |
log.debug("child on ${dni}") | |
def childEndpoint = getChildEndpoint(dni) | |
if(childEndpoint == "ALL") { | |
allChildOn() | |
if (device.currentState("switch") != "on") { | |
zigbee.on() | |
} | |
} else { | |
def endpointInt = zigbee.convertHexToInt(childEndpoint) | |
zigbee.command(zigbee.ONOFF_CLUSTER, 0x01, "", [destEndpoint: endpointInt]) | |
} | |
} | |
def childOff(String dni) { | |
log.debug("child off ${dni}") | |
def childEndpoint = getChildEndpoint(dni) | |
if(childEndpoint == "ALL") { | |
allChildOff() | |
if (device.currentState("switch") != "off") { | |
zigbee.off() | |
} | |
}else { | |
def endpointInt = zigbee.convertHexToInt(childEndpoint) | |
zigbee.command(zigbee.ONOFF_CLUSTER, 0x00, "", [destEndpoint: endpointInt]) | |
} | |
} | |
/** | |
* PING is used by Device-Watch in attempt to reach the Device | |
* */ | |
def ping() { | |
return refresh() | |
} | |
def refresh() { | |
def cmds = zigbee.onOffRefresh() | |
def endpointCount = getEndpointCount() | |
if (endpointCount > 1) { | |
childDevices.each { | |
log.debug "$it" | |
def childEndpoint = getChildEndpoint(it.deviceNetworkId) | |
if (childEndpoint.isNumber()) { | |
log.debug "refresh $childEndpoint" | |
def endpointInt = zigbee.convertHexToInt(childEndpoint) | |
cmds += zigbee.readAttribute(zigbee.ONOFF_CLUSTER, 0x0000, [destEndpoint: endpointInt]) | |
} | |
} | |
} else { | |
cmds += zigbee.readAttribute(zigbee.ONOFF_CLUSTER, 0x0000, [destEndpoint: 0xFF]) | |
} | |
return cmds | |
} | |
def poll() { | |
refresh() | |
} | |
def healthPoll() { | |
log.debug "healthPoll()" | |
def cmds = refresh() | |
cmds.each { sendHubCommand(new physicalgraph.device.HubAction(it)) } | |
} | |
def configureHealthCheck() { | |
Integer hcIntervalMinutes = 12 | |
if (!state.hasConfiguredHealthCheck) { | |
log.debug "Configuring Health Check, Reporting" | |
unschedule("healthPoll") | |
runEvery5Minutes("healthPoll") | |
def healthEvent = [name: "checkInterval", value: hcIntervalMinutes * 60, displayed: false, data: [protocol: "zigbee", hubHardwareId: device.hub.hardwareID]] | |
// Device-Watch allows 2 check-in misses from device | |
sendEvent(healthEvent) | |
childDevices.each { | |
def childEndpoint = getChildEndpoint(it.deviceNetworkId) | |
if (childEndpoint.isNumber()) { | |
it.sendEvent(healthEvent) | |
} else if (childEndpoint == "ALL") { | |
it.sendEvent(name: "DeviceWatch-Enroll", value: JsonOutput.toJson([protocol: "zigbee", scheme:"untracked"]), displayed: false) | |
} | |
} | |
state.hasConfiguredHealthCheck = true | |
} | |
} | |
def configure() { | |
log.debug "configure()" | |
configureHealthCheck() | |
//other devices supported by this DTH in the future | |
def cmds = zigbee.onOffConfig(0, 120) | |
def endpointCount = getEndpointCount() | |
if (endpointCount > 1) { | |
childDevices.each { | |
def childEndpoint = getChildEndpoint(it.deviceNetworkId) | |
if (childEndpoint.isNumber()) { | |
log.debug "configure(): $childEndpoint" | |
def endpointInt = zigbee.convertHexToInt(childEndpoint) | |
cmds += zigbee.configureReporting(zigbee.ONOFF_CLUSTER, 0x0000, 0x10, 0, 120, null, [destEndpoint: endpointInt]) | |
} | |
} | |
} else { | |
cmds += zigbee.configureReporting(zigbee.ONOFF_CLUSTER, 0x0000, 0x10, 0, 120, null, [destEndpoint: 0xFF]) | |
} | |
cmds += refresh() | |
return cmds | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment