@willieee802/zigbee-herdsman-converters 15.0.8-4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +7 -0
- package/converters/fromZigbee.js +8439 -0
- package/converters/toZigbee.js +7162 -0
- package/devices/ITCommander.js +37 -0
- package/devices/RMC002.js +20 -0
- package/devices/acova.js +101 -0
- package/devices/acuity_brands_lighting.js +11 -0
- package/devices/adeo.js +256 -0
- package/devices/adurosmart.js +130 -0
- package/devices/aeotec.js +13 -0
- package/devices/airam.js +59 -0
- package/devices/ajax_online.js +49 -0
- package/devices/akuvox.js +28 -0
- package/devices/alchemy.js +18 -0
- package/devices/aldi.js +53 -0
- package/devices/alecto.js +98 -0
- package/devices/anchor.js +17 -0
- package/devices/atlantic.js +110 -0
- package/devices/atsmart.js +28 -0
- package/devices/aubess.js +21 -0
- package/devices/aurora_lighting.js +292 -0
- package/devices/automaton.js +44 -0
- package/devices/awox.js +184 -0
- package/devices/axis.js +22 -0
- package/devices/bankamp.js +11 -0
- package/devices/bega.js +22 -0
- package/devices/belkin.js +11 -0
- package/devices/bitron.js +334 -0
- package/devices/blaupunkt.js +27 -0
- package/devices/blitzwolf.js +47 -0
- package/devices/bosch.js +702 -0
- package/devices/brimate.js +15 -0
- package/devices/bseed.js +17 -0
- package/devices/bticino.js +118 -0
- package/devices/busch-jaeger.js +140 -0
- package/devices/byun.js +24 -0
- package/devices/calex.js +37 -0
- package/devices/candeo.js +49 -0
- package/devices/casaia.js +52 -0
- package/devices/centralite.js +359 -0
- package/devices/cleode.js +20 -0
- package/devices/cleverio.js +36 -0
- package/devices/climax.js +138 -0
- package/devices/commercial_electric.js +16 -0
- package/devices/connecte.js +46 -0
- package/devices/cree.js +11 -0
- package/devices/ctm.js +999 -0
- package/devices/current_products_corp.js +24 -0
- package/devices/custom_devices_diy.js +850 -0
- package/devices/cy-lighting.js +11 -0
- package/devices/danalock.js +26 -0
- package/devices/danfoss.js +340 -0
- package/devices/databyte.ch.js +55 -0
- package/devices/datek.js +246 -0
- package/devices/dawon_dns.js +338 -0
- package/devices/develco.js +868 -0
- package/devices/digi.js +14 -0
- package/devices/diyruz.js +305 -0
- package/devices/dlink.js +37 -0
- package/devices/dnake.js +11 -0
- package/devices/dresden_elektronik.js +47 -0
- package/devices/easyaccess.js +27 -0
- package/devices/eatonhalo_led.js +11 -0
- package/devices/echostar.js +25 -0
- package/devices/ecodim.js +145 -0
- package/devices/ecolink.js +21 -0
- package/devices/ecosmart.js +64 -0
- package/devices/ecozy.js +31 -0
- package/devices/edp.js +39 -0
- package/devices/eglo.js +25 -0
- package/devices/elko.js +176 -0
- package/devices/enbrighten.js +163 -0
- package/devices/enocean.js +52 -0
- package/devices/envilar.js +73 -0
- package/devices/essentialb.js +87 -0
- package/devices/eurotronic.js +48 -0
- package/devices/evanell.js +29 -0
- package/devices/evn.js +31 -0
- package/devices/evology.js +24 -0
- package/devices/evvr.js +17 -0
- package/devices/ewelink.js +184 -0
- package/devices/ezex.js +24 -0
- package/devices/fantem.js +77 -0
- package/devices/feibit.js +172 -0
- package/devices/fireangel.js +15 -0
- package/devices/frankever.js +23 -0
- package/devices/garza.js +11 -0
- package/devices/ge.js +111 -0
- package/devices/gewiss.js +48 -0
- package/devices/gidealed.js +11 -0
- package/devices/giderwel.js +11 -0
- package/devices/giex.js +222 -0
- package/devices/girier.js +19 -0
- package/devices/gledopto.js +756 -0
- package/devices/gmy.js +11 -0
- package/devices/gs.js +29 -0
- package/devices/halemeier.js +18 -0
- package/devices/hampton_bay.js +37 -0
- package/devices/heiman.js +805 -0
- package/devices/hej.js +107 -0
- package/devices/hfh.js +11 -0
- package/devices/hgkg.js +54 -0
- package/devices/hilux.js +11 -0
- package/devices/hive.js +524 -0
- package/devices/home_control_as.js +27 -0
- package/devices/hommyn.js +24 -0
- package/devices/honyar.js +29 -0
- package/devices/hornbach.js +53 -0
- package/devices/hzc.js +21 -0
- package/devices/hzc_electric.js +42 -0
- package/devices/icasa.js +121 -0
- package/devices/idinio.js +19 -0
- package/devices/ihorn.js +61 -0
- package/devices/ikea.js +1168 -0
- package/devices/ilightsin.js +11 -0
- package/devices/iluminize.js +262 -0
- package/devices/ilux.js +11 -0
- package/devices/immax.js +203 -0
- package/devices/innr.js +705 -0
- package/devices/inovelli.js +1315 -0
- package/devices/insta.js +110 -0
- package/devices/iolloi.js +20 -0
- package/devices/iotperfect.js +20 -0
- package/devices/iris.js +180 -0
- package/devices/istar.js +20 -0
- package/devices/jasco.js +55 -0
- package/devices/javis.js +37 -0
- package/devices/jethome.js +48 -0
- package/devices/jiawen.js +18 -0
- package/devices/jumitech.js +18 -0
- package/devices/jxuan.js +49 -0
- package/devices/kami.js +15 -0
- package/devices/keen_home.js +80 -0
- package/devices/klikaanklikuit.js +17 -0
- package/devices/kmpcil.js +148 -0
- package/devices/konke.js +141 -0
- package/devices/ksentry.js +17 -0
- package/devices/kurvia.js +17 -0
- package/devices/kwikset.js +120 -0
- package/devices/lanesto.js +11 -0
- package/devices/lds.js +11 -0
- package/devices/led_trading.js +69 -0
- package/devices/ledvance.js +353 -0
- package/devices/leedarson.js +130 -0
- package/devices/legrand.js +554 -0
- package/devices/lellki.js +146 -0
- package/devices/letsled.js +11 -0
- package/devices/letv.js +18 -0
- package/devices/leviton.js +142 -0
- package/devices/lg.js +18 -0
- package/devices/lidl.js +1000 -0
- package/devices/lifecontrol.js +92 -0
- package/devices/lightsolutions.js +37 -0
- package/devices/linkind.js +205 -0
- package/devices/livingwise.js +59 -0
- package/devices/livolo.js +286 -0
- package/devices/lixee.js +779 -0
- package/devices/lonsonho.js +218 -0
- package/devices/lubeez.js +18 -0
- package/devices/lupus.js +74 -0
- package/devices/lutron.js +32 -0
- package/devices/lux.js +40 -0
- package/devices/m-elec.js +18 -0
- package/devices/makegood.js +51 -0
- package/devices/matcall_bv.js +18 -0
- package/devices/meazon.js +47 -0
- package/devices/mercator.js +225 -0
- package/devices/miboxer.js +72 -0
- package/devices/micromatic.js +29 -0
- package/devices/moes.js +400 -0
- package/devices/mycket.js +11 -0
- package/devices/m/303/274ller_licht.js +220 -0
- package/devices/namron.js +774 -0
- package/devices/nanoleaf.js +11 -0
- package/devices/neo.js +86 -0
- package/devices/net2grid.js +29 -0
- package/devices/netvox.js +35 -0
- package/devices/niko.js +314 -0
- package/devices/ninja_blocks.js +24 -0
- package/devices/niviss.js +11 -0
- package/devices/nodon.js +109 -0
- package/devices/nordtronic.js +30 -0
- package/devices/nous.js +88 -0
- package/devices/novo.js +17 -0
- package/devices/nue_3a.js +417 -0
- package/devices/nyce.js +67 -0
- package/devices/onesti.js +59 -0
- package/devices/openlumi.js +22 -0
- package/devices/orvibo.js +515 -0
- package/devices/osram.js +519 -0
- package/devices/oujiabao.js +15 -0
- package/devices/owon.js +352 -0
- package/devices/ozsmartthings.js +11 -0
- package/devices/paul_neuhaus.js +96 -0
- package/devices/paulmann.js +158 -0
- package/devices/peq.js +24 -0
- package/devices/perenio.js +413 -0
- package/devices/philips.js +3118 -0
- package/devices/plaid.js +25 -0
- package/devices/plugwise.js +173 -0
- package/devices/popp.js +10 -0
- package/devices/profalux.js +47 -0
- package/devices/prolight.js +54 -0
- package/devices/qmotion.js +33 -0
- package/devices/qoto.js +113 -0
- package/devices/quotra.js +18 -0
- package/devices/rademacher.js +18 -0
- package/devices/rgb_genie.js +119 -0
- package/devices/robb.js +335 -0
- package/devices/roome.js +15 -0
- package/devices/rtx.js +90 -0
- package/devices/salus_controls.js +137 -0
- package/devices/samotech.js +93 -0
- package/devices/saswell.js +58 -0
- package/devices/scanproducts.js +32 -0
- package/devices/schlage.js +24 -0
- package/devices/schneider_electric.js +1039 -0
- package/devices/schwaiger.js +62 -0
- package/devices/seastar_intelligence.js +16 -0
- package/devices/securifi.js +39 -0
- package/devices/sengled.js +332 -0
- package/devices/sercomm.js +140 -0
- package/devices/shenzhen_homa.js +53 -0
- package/devices/shinasystem.js +686 -0
- package/devices/siglis.js +440 -0
- package/devices/sinope.js +1257 -0
- package/devices/siterwell.js +46 -0
- package/devices/skydance.js +112 -0
- package/devices/slv.js +27 -0
- package/devices/smart9.js +27 -0
- package/devices/smart_home_pty.js +18 -0
- package/devices/smartenit.js +42 -0
- package/devices/smartthings.js +495 -0
- package/devices/smartwings.js +24 -0
- package/devices/sohan_electric.js +13 -0
- package/devices/solaredge.js +11 -0
- package/devices/somgoms.js +47 -0
- package/devices/sonoff.js +262 -0
- package/devices/spotmau.js +36 -0
- package/devices/sprut.js +317 -0
- package/devices/stelpro.js +216 -0
- package/devices/sunricher.js +625 -0
- package/devices/swann.js +33 -0
- package/devices/sylvania.js +200 -0
- package/devices/tci.js +25 -0
- package/devices/technicolor.js +47 -0
- package/devices/terncy.js +64 -0
- package/devices/the_light_group.js +70 -0
- package/devices/third_reality.js +195 -0
- package/devices/titan_products.js +22 -0
- package/devices/tplink.js +42 -0
- package/devices/trust.js +114 -0
- package/devices/tubeszb.js +20 -0
- package/devices/tuya.js +4215 -0
- package/devices/ubisys.js +938 -0
- package/devices/uhome.js +25 -0
- package/devices/universal_electronics_inc.js +119 -0
- package/devices/urlighting.js +12 -0
- package/devices/useelink.js +52 -0
- package/devices/vbled.js +18 -0
- package/devices/vesternet.js +188 -0
- package/devices/viessmann.js +51 -0
- package/devices/villeroy_boch.js +18 -0
- package/devices/vimar.js +78 -0
- package/devices/visonic.js +80 -0
- package/devices/vrey.js +18 -0
- package/devices/wally.js +25 -0
- package/devices/waxman.js +45 -0
- package/devices/weiser.js +67 -0
- package/devices/weten.js +13 -0
- package/devices/wisdom.js +11 -0
- package/devices/woox.js +177 -0
- package/devices/wyze.js +23 -0
- package/devices/xiaomi.js +3223 -0
- package/devices/xinghuoyuan.js +11 -0
- package/devices/yale.js +227 -0
- package/devices/ynoa.js +68 -0
- package/devices/yookee.js +23 -0
- package/devices/ysrsai.js +26 -0
- package/devices/zemismart.js +254 -0
- package/devices/zen.js +34 -0
- package/devices/zipato.js +11 -0
- package/index.js +242 -0
- package/lib/color.js +784 -0
- package/lib/configureKey.js +944 -0
- package/lib/constants.js +316 -0
- package/lib/exposes.js +677 -0
- package/lib/extend.js +180 -0
- package/lib/kelvinToXy.js +1912 -0
- package/lib/legacy.js +2223 -0
- package/lib/light.js +111 -0
- package/lib/ota/OTA_URLs.md +119 -0
- package/lib/ota/common.js +476 -0
- package/lib/ota/index.js +10 -0
- package/lib/ota/inovelli.js +72 -0
- package/lib/ota/ledvance.js +52 -0
- package/lib/ota/lixee.js +57 -0
- package/lib/ota/salus.js +82 -0
- package/lib/ota/securifi.js +25 -0
- package/lib/ota/tradfri.js +45 -0
- package/lib/ota/ubisys.js +61 -0
- package/lib/ota/zigbeeOTA.js +161 -0
- package/lib/philips.js +667 -0
- package/lib/reporting.js +234 -0
- package/lib/store.js +57 -0
- package/lib/tuya.js +2027 -0
- package/lib/utils.js +527 -0
- package/lib/xiaomi.d.ts +11 -0
- package/lib/xiaomi.js +1288 -0
- package/lib/zosung.js +243 -0
- package/package.json +39 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const e = exposes.presets;
|
|
4
|
+
|
|
5
|
+
module.exports = [
|
|
6
|
+
{
|
|
7
|
+
zigbeeModel: ['FB56-BOT02HM1A5'],
|
|
8
|
+
model: 'FZB8708HD-S1',
|
|
9
|
+
vendor: 'Brimate',
|
|
10
|
+
description: 'Smart motion sensor',
|
|
11
|
+
fromZigbee: [fz.ias_occupancy_alarm_1],
|
|
12
|
+
toZigbee: [],
|
|
13
|
+
exposes: [e.occupancy(), e.battery_low()],
|
|
14
|
+
},
|
|
15
|
+
];
|
package/devices/bseed.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
const ea = exposes.access;
|
|
6
|
+
|
|
7
|
+
module.exports = [
|
|
8
|
+
{
|
|
9
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_yenbr4om'}],
|
|
10
|
+
model: 'BSEED_TS0601_cover',
|
|
11
|
+
vendor: 'BSEED',
|
|
12
|
+
description: 'Zigbee curtain switch',
|
|
13
|
+
fromZigbee: [fz.tuya_cover],
|
|
14
|
+
toZigbee: [tz.tuya_cover_control],
|
|
15
|
+
exposes: [e.cover_position().setAccess('position', ea.STATE_SET)],
|
|
16
|
+
},
|
|
17
|
+
];
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const reporting = require('../lib/reporting');
|
|
5
|
+
const extend = require('../lib/extend');
|
|
6
|
+
const e = exposes.presets;
|
|
7
|
+
const ea = exposes.access;
|
|
8
|
+
|
|
9
|
+
module.exports = [
|
|
10
|
+
{
|
|
11
|
+
zigbeeModel: [' Light switch with neutral\u0000\u0000\u0000\u0000\u0000'],
|
|
12
|
+
model: 'K4003C/L4003C/N4003C/NT4003C',
|
|
13
|
+
vendor: 'BTicino',
|
|
14
|
+
description: 'Light switch with neutral',
|
|
15
|
+
fromZigbee: [fz.identify, fz.on_off, fz.K4003C_binary_input, fz.legrand_cluster_fc01],
|
|
16
|
+
toZigbee: [tz.on_off, tz.legrand_settingEnableLedInDark, tz.legrand_settingEnableLedIfOn, tz.legrand_identify],
|
|
17
|
+
exposes: [
|
|
18
|
+
e.switch(), e.action(['identify', 'on', 'off']),
|
|
19
|
+
exposes.binary('led_in_dark', ea.ALL, 'ON', 'OFF').withDescription(`Enables the LED when the light is turned off, allowing ` +
|
|
20
|
+
`to see the switch in the dark`),
|
|
21
|
+
exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is turned on'),
|
|
22
|
+
exposes.enum('identify', ea.SET, ['blink']).withDescription(`Blinks the built-in LED to make it easier to find the device`),
|
|
23
|
+
],
|
|
24
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
25
|
+
const endpoint = device.getEndpoint(1);
|
|
26
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genBinaryInput']);
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
zigbeeModel: [' Dimmer switch with neutral\u0000\u0000\u0000\u0000'],
|
|
31
|
+
model: 'L4411C/N4411C/NT4411C',
|
|
32
|
+
vendor: 'BTicino',
|
|
33
|
+
description: 'Dimmer switch with neutral',
|
|
34
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
35
|
+
fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration, fz.legrand_cluster_fc01],
|
|
36
|
+
toZigbee: [tz.light_onoff_brightness, tz.legrand_settingEnableLedInDark, tz.legrand_settingEnableLedIfOn,
|
|
37
|
+
tz.legrand_deviceMode, tz.legrand_identify, tz.ballast_config],
|
|
38
|
+
exposes: [
|
|
39
|
+
e.light_brightness(),
|
|
40
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
41
|
+
.withDescription('Specifies the minimum brightness value'),
|
|
42
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
43
|
+
.withDescription('Specifies the maximum brightness value'),
|
|
44
|
+
exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
|
|
45
|
+
exposes.binary('led_in_dark', ea.ALL, 'ON', 'OFF').withDescription(`Enables the LED when the light is turned off, allowing ` +
|
|
46
|
+
`to see the switch in the dark`),
|
|
47
|
+
exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is turned on'),
|
|
48
|
+
exposes.enum('identify', ea.SET, ['blink']).withDescription(`Blinks the built-in LED to make it easier to find the device`),
|
|
49
|
+
],
|
|
50
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
51
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
52
|
+
const endpoint = device.getEndpoint(1);
|
|
53
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
|
|
54
|
+
'genBinaryInput', 'lightingBallastCfg']);
|
|
55
|
+
await reporting.onOff(endpoint);
|
|
56
|
+
await reporting.brightness(endpoint);
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
// Newer firmwares (e.g. 001f) Does support partial position reporting
|
|
61
|
+
// Old firmware of this device provides only three values: 0, 100 and 50, 50 means an idefinite position between 1 and 99.
|
|
62
|
+
// If you have an old Firmware set no_position_support to true
|
|
63
|
+
// https://github.com/Koenkk/zigbee-herdsman-converters/pull/2214 - 1st very basic support
|
|
64
|
+
zigbeeModel: [' Shutter SW with level control\u0000'],
|
|
65
|
+
model: 'K4027C/L4027C/N4027C/NT4027C',
|
|
66
|
+
vendor: 'BTicino',
|
|
67
|
+
description: 'Shutter SW with level control',
|
|
68
|
+
fromZigbee: [fz.identify, fz.ignore_basic_report, fz.ignore_zclversion_read, fz.bticino_4027C_binary_input_moving,
|
|
69
|
+
fz.cover_position_tilt],
|
|
70
|
+
toZigbee: [tz.bticino_4027C_cover_state, tz.bticino_4027C_cover_position, tz.legrand_identify,
|
|
71
|
+
tz.legrand_settingEnableLedInDark],
|
|
72
|
+
exposes: [
|
|
73
|
+
e.cover_position(), e.action(['moving', 'identify', '']),
|
|
74
|
+
exposes.binary('led_in_dark', ea.ALL, 'ON', 'OFF').withDescription(`Enables the LED when the light is turned off, allowing ` +
|
|
75
|
+
`to see the switch in the dark`),
|
|
76
|
+
exposes.enum('identify', ea.SET, ['blink']).withDescription(`Blinks the built-in LED to make it easier to find the device`),
|
|
77
|
+
],
|
|
78
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
79
|
+
const endpoint = device.getEndpoint(1);
|
|
80
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBinaryInput', 'closuresWindowCovering', 'genIdentify']);
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
zigbeeModel: ['Bticino Din power consumption module '],
|
|
85
|
+
model: 'F20T60A',
|
|
86
|
+
description: 'DIN power consumption module (same as Legrand 412015)',
|
|
87
|
+
vendor: 'BTicino',
|
|
88
|
+
extend: extend.switch(),
|
|
89
|
+
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
|
|
90
|
+
toZigbee: [tz.legrand_deviceMode, tz.on_off, tz.legrand_identify, tz.electrical_measurement_power],
|
|
91
|
+
exposes: [exposes.switch().withState('state', true, 'On/off (works only if device is in "switch" mode)'),
|
|
92
|
+
e.power().withAccess(ea.STATE_GET), exposes.enum('device_mode', ea.ALL, ['switch', 'auto'])
|
|
93
|
+
.withDescription('switch: allow on/off, auto will use wired action via C1/C2 on contactor for example with HC/HP')],
|
|
94
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
95
|
+
const endpoint = device.getEndpoint(1);
|
|
96
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'haElectricalMeasurement']);
|
|
97
|
+
await reporting.onOff(endpoint);
|
|
98
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
99
|
+
await reporting.activePower(endpoint);
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
zigbeeModel: ['Power socket Bticino Serie LL '],
|
|
104
|
+
model: 'L4531C',
|
|
105
|
+
vendor: 'BTicino',
|
|
106
|
+
description: 'Power socket with power consumption monitoring',
|
|
107
|
+
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement],
|
|
108
|
+
toZigbee: [tz.on_off, tz.legrand_settingEnableLedInDark, tz.legrand_identify],
|
|
109
|
+
exposes: [e.switch(), e.action(['identify']), e.power(), e.voltage(), e.current()],
|
|
110
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
111
|
+
const endpoint = device.getEndpoint(1);
|
|
112
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'haElectricalMeasurement']);
|
|
113
|
+
await reporting.onOff(endpoint);
|
|
114
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
115
|
+
await reporting.activePower(endpoint);
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
];
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const globalStore = require('../lib/store');
|
|
5
|
+
const reporting = require('../lib/reporting');
|
|
6
|
+
const extend = require('../lib/extend');
|
|
7
|
+
const e = exposes.presets;
|
|
8
|
+
|
|
9
|
+
module.exports = [
|
|
10
|
+
{
|
|
11
|
+
zigbeeModel: ['PU01'],
|
|
12
|
+
model: '6717-84',
|
|
13
|
+
vendor: 'Busch-Jaeger',
|
|
14
|
+
description: 'Adaptor plug',
|
|
15
|
+
extend: extend.switch(),
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
// Busch-Jaeger 6735, 6736 and 6737 have been tested with the 6710 U (Power Adapter),
|
|
19
|
+
// 6711 U (Relay) and 6715 U (dimmer) back-ends. Unfortunately both the relay and the dimmer
|
|
20
|
+
// report as model 'RM01' with genLevelCtrl clusters, so we need to set up both of them
|
|
21
|
+
// as dimmable lights.
|
|
22
|
+
//
|
|
23
|
+
// The battery-powered version of the device ('RB01') is supported as well. These devices are
|
|
24
|
+
// sold as Busch-Jaeger 6735/01, 6736/01 and 6737/01.
|
|
25
|
+
//
|
|
26
|
+
// In order to manually capture scenes as described in the devices manual, the endpoint
|
|
27
|
+
// corresponding to the row needs to be unbound (https://www.zigbee2mqtt.io/information/binding.html)
|
|
28
|
+
// If that operation was successful, the switch will respond to button presses on that
|
|
29
|
+
// by blinking multiple times (vs. just blinking once if it's bound).
|
|
30
|
+
zigbeeModel: ['RM01', 'RB01'],
|
|
31
|
+
model: '6735/6736/6737',
|
|
32
|
+
vendor: 'Busch-Jaeger',
|
|
33
|
+
description: 'Zigbee Light Link power supply/relay/dimmer/wall-switch',
|
|
34
|
+
endpoint: (device) => {
|
|
35
|
+
return {'row_1': 0x0a, 'row_2': 0x0b, 'row_3': 0x0c, 'row_4': 0x0d, 'relay': 0x12};
|
|
36
|
+
},
|
|
37
|
+
exposes: (device, options) => {
|
|
38
|
+
const expose = [];
|
|
39
|
+
|
|
40
|
+
// If endpoint 0x12 (18) is present this means the following two things:
|
|
41
|
+
// 1. The device is connected to a relay or dimmer and needs to be exposed as a dimmable light
|
|
42
|
+
// 2. The top rocker will not be usable (not emit any events) as it's hardwired to the relay/dimmer
|
|
43
|
+
if (!device || device.getEndpoint(0x12) != null) {
|
|
44
|
+
expose.push(e.light_brightness().withEndpoint('relay'));
|
|
45
|
+
// Exposing the device as a switch without endpoint is actually wrong, but this is the historic
|
|
46
|
+
// definition and we are keeping it for compatibility reasons.
|
|
47
|
+
// DEPRECATED and should be removed in the future
|
|
48
|
+
expose.push(e.switch());
|
|
49
|
+
}
|
|
50
|
+
// Not all devices support all actions (depends on number of rocker rows and if relay/dimmer is installed),
|
|
51
|
+
// but defining all possible actions here won't do any harm.
|
|
52
|
+
expose.push(e.action([
|
|
53
|
+
'row_1_on', 'row_1_off', 'row_1_up', 'row_1_down', 'row_1_stop',
|
|
54
|
+
'row_2_on', 'row_2_off', 'row_2_up', 'row_2_down', 'row_2_stop',
|
|
55
|
+
'row_3_on', 'row_3_off', 'row_3_up', 'row_3_down', 'row_3_stop',
|
|
56
|
+
'row_4_on', 'row_4_off', 'row_4_up', 'row_4_down', 'row_4_stop',
|
|
57
|
+
]));
|
|
58
|
+
expose.push(e.linkquality());
|
|
59
|
+
|
|
60
|
+
return expose;
|
|
61
|
+
},
|
|
62
|
+
meta: {multiEndpoint: true},
|
|
63
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
64
|
+
// Depending on the actual devices - 6735, 6736, or 6737 - there are 1, 2, or 4 endpoints for
|
|
65
|
+
// the rockers. If the module is installed on a dimmer or relay, there is an additional endpoint (18).
|
|
66
|
+
const endpoint18 = device.getEndpoint(0x12);
|
|
67
|
+
if (endpoint18 != null) {
|
|
68
|
+
await reporting.bind(endpoint18, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
69
|
+
} else {
|
|
70
|
+
// We only need to bind endpoint 10 (top rocker) if endoint 18 (relay/dimmer) is not present.
|
|
71
|
+
// Otherwise the top rocker is hard-wired to the relay/dimmer and cannot be used anyways.
|
|
72
|
+
const endpoint10 = device.getEndpoint(0x0a);
|
|
73
|
+
if (endpoint10 != null) {
|
|
74
|
+
await reporting.bind(endpoint10, coordinatorEndpoint, ['genLevelCtrl']);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The total number of bindings seems to be severely limited with some of these devices.
|
|
79
|
+
// In order to be able to toggle groups, we need to remove the scenes cluster from RM01.
|
|
80
|
+
const dropScenesCluster = device.modelID == 'RM01';
|
|
81
|
+
|
|
82
|
+
const endpoint11 = device.getEndpoint(0x0b);
|
|
83
|
+
if (endpoint11 != null) {
|
|
84
|
+
if (dropScenesCluster) {
|
|
85
|
+
const index = endpoint11.outputClusters.indexOf(5);
|
|
86
|
+
if (index > -1) {
|
|
87
|
+
endpoint11.outputClusters.splice(index, 1);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
await reporting.bind(endpoint11, coordinatorEndpoint, ['genLevelCtrl']);
|
|
91
|
+
}
|
|
92
|
+
const endpoint12 = device.getEndpoint(0x0c);
|
|
93
|
+
if (endpoint12 != null) {
|
|
94
|
+
if (dropScenesCluster) {
|
|
95
|
+
const index = endpoint12.outputClusters.indexOf(5);
|
|
96
|
+
if (index > -1) {
|
|
97
|
+
endpoint12.outputClusters.splice(index, 1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
await reporting.bind(endpoint12, coordinatorEndpoint, ['genLevelCtrl']);
|
|
101
|
+
}
|
|
102
|
+
const endpoint13 = device.getEndpoint(0x0d);
|
|
103
|
+
if (endpoint13 != null) {
|
|
104
|
+
if (dropScenesCluster) {
|
|
105
|
+
const index = endpoint13.outputClusters.indexOf(5);
|
|
106
|
+
if (index > -1) {
|
|
107
|
+
endpoint13.outputClusters.splice(index, 1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
await reporting.bind(endpoint13, coordinatorEndpoint, ['genLevelCtrl']);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
fromZigbee: [fz.ignore_basic_report, fz.on_off, fz.brightness, fz.legacy.RM01_on_click, fz.legacy.RM01_off_click,
|
|
114
|
+
fz.legacy.RM01_up_hold, fz.legacy.RM01_down_hold, fz.legacy.RM01_stop],
|
|
115
|
+
toZigbee: [tz.RM01_light_onoff_brightness, tz.RM01_light_brightness_step, tz.RM01_light_brightness_move],
|
|
116
|
+
onEvent: async (type, data, device) => {
|
|
117
|
+
const switchEndpoint = device.getEndpoint(0x12);
|
|
118
|
+
if (switchEndpoint == null) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// This device doesn't support reporting.
|
|
122
|
+
// Therefore we read the on/off state every 5 seconds.
|
|
123
|
+
// This is the same way as the Hue bridge does it.
|
|
124
|
+
if (type === 'stop') {
|
|
125
|
+
clearInterval(globalStore.getValue(device, 'interval'));
|
|
126
|
+
globalStore.clearValue(device, 'interval');
|
|
127
|
+
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
128
|
+
const interval = setInterval(async () => {
|
|
129
|
+
try {
|
|
130
|
+
await switchEndpoint.read('genOnOff', ['onOff']);
|
|
131
|
+
await switchEndpoint.read('genLevelCtrl', ['currentLevel']);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// Do nothing
|
|
134
|
+
}
|
|
135
|
+
}, 5000);
|
|
136
|
+
globalStore.putValue(device, 'interval', interval);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
];
|
package/devices/byun.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const e = exposes.presets;
|
|
4
|
+
|
|
5
|
+
module.exports = [
|
|
6
|
+
{
|
|
7
|
+
zigbeeModel: ['Windows switch '],
|
|
8
|
+
model: 'M415-6C',
|
|
9
|
+
vendor: 'BYUN',
|
|
10
|
+
description: 'Smoke sensor',
|
|
11
|
+
fromZigbee: [fz.byun_smoke_true, fz.byun_smoke_false],
|
|
12
|
+
toZigbee: [],
|
|
13
|
+
exposes: [e.smoke()],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
zigbeeModel: ['GAS SENSOR '],
|
|
17
|
+
model: 'M415-5C',
|
|
18
|
+
vendor: 'BYUN',
|
|
19
|
+
description: 'Gas sensor',
|
|
20
|
+
fromZigbee: [fz.byun_gas_true, fz.byun_gas_false],
|
|
21
|
+
toZigbee: [],
|
|
22
|
+
exposes: [e.gas()],
|
|
23
|
+
},
|
|
24
|
+
];
|
package/devices/calex.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const extend = require('../lib/extend');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
|
|
6
|
+
module.exports = [
|
|
7
|
+
{
|
|
8
|
+
zigbeeModel: ['EC-Z3.0-CCT'],
|
|
9
|
+
model: '421786',
|
|
10
|
+
vendor: 'Calex',
|
|
11
|
+
description: 'LED A60 Zigbee GLS-lamp',
|
|
12
|
+
extend: extend.light_onoff_brightness(),
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
zigbeeModel: ['EC-Z3.0-RGBW'],
|
|
16
|
+
model: '421792',
|
|
17
|
+
vendor: 'Calex',
|
|
18
|
+
description: 'LED A60 Zigbee RGB lamp',
|
|
19
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
zigbeeModel: ['Smart Wall Switch '], // Yes, it has a space at the end :(
|
|
23
|
+
model: '421782',
|
|
24
|
+
vendor: 'Calex',
|
|
25
|
+
description: 'Smart Wall Switch, wall mounted RGB controller',
|
|
26
|
+
toZigbee: [],
|
|
27
|
+
fromZigbee: [fz.command_off, fz.command_on, fz.command_step, fz.command_move_to_color_temp,
|
|
28
|
+
fz.command_move, fz.command_stop, fz.command_ehanced_move_to_hue_and_saturation,
|
|
29
|
+
],
|
|
30
|
+
exposes: [e.action([
|
|
31
|
+
'on', 'off', 'color_temperature_move', 'brightness_step_up', 'brightness_step_down',
|
|
32
|
+
'brightness_move_up', 'brightness_move_down', 'brightness_stop',
|
|
33
|
+
'enhanced_move_to_hue_and_saturation',
|
|
34
|
+
])],
|
|
35
|
+
meta: {disableActionGroup: true},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const reporting = require('../lib/reporting');
|
|
4
|
+
const extend = require('../lib/extend');
|
|
5
|
+
const e = exposes.presets;
|
|
6
|
+
|
|
7
|
+
module.exports = [
|
|
8
|
+
{
|
|
9
|
+
zigbeeModel: ['HK-DIM-A', 'Candeo Zigbee Dimmer'],
|
|
10
|
+
model: 'HK-DIM-A',
|
|
11
|
+
vendor: 'Candeo',
|
|
12
|
+
description: 'Zigbee LED dimmer smart switch',
|
|
13
|
+
extend: extend.light_onoff_brightness({noConfigure: true, disableEffect: true}),
|
|
14
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
15
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
16
|
+
const endpoint = device.getEndpoint(1);
|
|
17
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
18
|
+
await reporting.onOff(endpoint);
|
|
19
|
+
|
|
20
|
+
// The default reporting from the Candeo dimmer can result in a lot of Zigbee traffic
|
|
21
|
+
// to the extent that reported brighness values can arrive at the endpoint out of order
|
|
22
|
+
// giving the appearance that the values are jumping around.
|
|
23
|
+
// Limit the reporting to once a second to give a smoother reporting of brightness.
|
|
24
|
+
await reporting.brightness(endpoint, {min: 1});
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
zigbeeModel: ['C204'],
|
|
29
|
+
model: 'C204',
|
|
30
|
+
vendor: 'Candeo',
|
|
31
|
+
description: 'Zigbee micro smart dimmer',
|
|
32
|
+
fromZigbee: extend.light_onoff_brightness().fromZigbee.concat([fz.electrical_measurement, fz.metering, fz.ignore_genOta]),
|
|
33
|
+
toZigbee: extend.light_onoff_brightness().toZigbee,
|
|
34
|
+
exposes: [e.light_brightness(), e.power(), e.voltage(), e.current(), e.energy()],
|
|
35
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
36
|
+
const endpoint = device.getEndpoint(1);
|
|
37
|
+
const binds = ['genOnOff', 'genLevelCtrl', 'haElectricalMeasurement', 'seMetering'];
|
|
38
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
39
|
+
await reporting.onOff(endpoint);
|
|
40
|
+
await reporting.brightness(endpoint);
|
|
41
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
42
|
+
await reporting.activePower(endpoint);
|
|
43
|
+
await reporting.rmsCurrent(endpoint, {min: 10, change: 10});
|
|
44
|
+
await reporting.rmsVoltage(endpoint, {min: 10});
|
|
45
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
46
|
+
await reporting.currentSummDelivered(endpoint);
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const reporting = require('../lib/reporting');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
const tz = require('../converters/toZigbee');
|
|
6
|
+
const extend = require('../lib/extend');
|
|
7
|
+
|
|
8
|
+
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
zigbeeModel: ['CSLC601-D-E'],
|
|
11
|
+
model: 'CSLC601-D-E',
|
|
12
|
+
vendor: 'CASAIA',
|
|
13
|
+
description: 'Dry contact relay switch module in 220v AC for gas boiler',
|
|
14
|
+
extend: extend.switch(),
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
zigbeeModel: ['CTHS317ET'],
|
|
18
|
+
model: 'CTHS-317-ET',
|
|
19
|
+
vendor: 'CASAIA',
|
|
20
|
+
description: 'Remote temperature probe on cable',
|
|
21
|
+
fromZigbee: [fz.temperature, fz.battery],
|
|
22
|
+
toZigbee: [],
|
|
23
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
24
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
25
|
+
const endpoint = device.getEndpoint(3);
|
|
26
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
27
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
28
|
+
await reporting.temperature(endpoint);
|
|
29
|
+
await reporting.batteryVoltage(endpoint);
|
|
30
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
31
|
+
},
|
|
32
|
+
exposes: [e.temperature(), e.battery_low(), e.battery()],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
zigbeeModel: ['CCB432'],
|
|
36
|
+
model: 'CCB432',
|
|
37
|
+
vendor: 'CASAIA',
|
|
38
|
+
description: 'Rail-Din relay and energy meter',
|
|
39
|
+
fromZigbee: [fz.electrical_measurement, fz.metering, fz.on_off],
|
|
40
|
+
toZigbee: [tz.on_off],
|
|
41
|
+
exposes: [e.switch(), e.power(), e.energy()],
|
|
42
|
+
meta: {publishDuplicateTransaction: true},
|
|
43
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
44
|
+
const endpoint = device.getEndpoint(1);
|
|
45
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
46
|
+
await reporting.onOff(endpoint);
|
|
47
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
48
|
+
await reporting.instantaneousDemand(endpoint);
|
|
49
|
+
await reporting.currentSummDelivered(endpoint);
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
];
|