@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
package/devices/ikea.js
ADDED
|
@@ -0,0 +1,1168 @@
|
|
|
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 ota = require('../lib/ota');
|
|
5
|
+
const constants = require('../lib/constants');
|
|
6
|
+
const reporting = require('../lib/reporting');
|
|
7
|
+
const {repInterval} = require('../lib/constants');
|
|
8
|
+
const utils = require('../lib/utils');
|
|
9
|
+
const extend = require('../lib/extend');
|
|
10
|
+
const globalStore = require('../lib/store');
|
|
11
|
+
const e = exposes.presets;
|
|
12
|
+
const ea = exposes.access;
|
|
13
|
+
const herdsman = require('zigbee-herdsman');
|
|
14
|
+
const {
|
|
15
|
+
calibrateAndPrecisionRoundOptions, postfixWithEndpointName, getMetaValue, precisionRound,
|
|
16
|
+
} = require('../lib/utils');
|
|
17
|
+
|
|
18
|
+
const bulbOnEvent = async (type, data, device, options, state) => {
|
|
19
|
+
/**
|
|
20
|
+
* IKEA bulbs lose their configured reportings when losing power.
|
|
21
|
+
* A deviceAnnounce indicates they are powered on again.
|
|
22
|
+
* Reconfigure the configured reoprting here.
|
|
23
|
+
*
|
|
24
|
+
* Additionally some other information is lost like
|
|
25
|
+
* color_options.execute_if_off. We also restore these.
|
|
26
|
+
*
|
|
27
|
+
* NOTE: binds are not lost so rebinding is not needed!
|
|
28
|
+
*/
|
|
29
|
+
if (type === 'deviceAnnounce') {
|
|
30
|
+
for (const endpoint of device.endpoints) {
|
|
31
|
+
for (const c of endpoint.configuredReportings) {
|
|
32
|
+
await endpoint.configureReporting(c.cluster.name, [{
|
|
33
|
+
attribute: c.attribute.name, minimumReportInterval: c.minimumReportInterval,
|
|
34
|
+
maximumReportInterval: c.maximumReportInterval, reportableChange: c.reportableChange,
|
|
35
|
+
}]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// NOTE: execute_if_off default is false
|
|
40
|
+
// we only restore if true, to save unneeded network writes
|
|
41
|
+
if (state !== undefined && state.color_options !== undefined && state.color_options.execute_if_off === true) {
|
|
42
|
+
device.endpoints[0].write('lightingColorCtrl', {'options': 1});
|
|
43
|
+
}
|
|
44
|
+
if (state !== undefined && state.level_config !== undefined && state.level_config.execute_if_off === true) {
|
|
45
|
+
device.endpoints[0].write('genLevelCtrl', {'options': 1});
|
|
46
|
+
}
|
|
47
|
+
if (state !== undefined && state.level_config !== undefined && state.level_config.on_level !== undefined) {
|
|
48
|
+
let onLevel = state.level_config.on_level;
|
|
49
|
+
if (typeof onLevel === 'string' && onLevel.toLowerCase() == 'previous') {
|
|
50
|
+
onLevel = 255;
|
|
51
|
+
} else {
|
|
52
|
+
onLevel = Number(onLevel);
|
|
53
|
+
}
|
|
54
|
+
if (onLevel > 255) onLevel = 254;
|
|
55
|
+
if (onLevel < 1) onLevel = 1;
|
|
56
|
+
|
|
57
|
+
device.endpoints[0].write('genLevelCtrl', {onLevel});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const configureRemote = async (device, coordinatorEndpoint, logger) => {
|
|
63
|
+
// Firmware 2.3.075 >= only supports binding to endpoint, before only to group
|
|
64
|
+
// - https://github.com/Koenkk/zigbee2mqtt/issues/2772#issuecomment-577389281
|
|
65
|
+
// - https://github.com/Koenkk/zigbee2mqtt/issues/7716
|
|
66
|
+
const endpoint = device.getEndpoint(1);
|
|
67
|
+
const version = device.softwareBuildID.split('.').map((n) => Number(n));
|
|
68
|
+
const bindTarget = version[0] > 2 || (version[0] == 2 && version[1] > 3) || (version[0] == 2 && version[1] == 3 && version[2] >= 75) ?
|
|
69
|
+
coordinatorEndpoint : constants.defaultBindGroup;
|
|
70
|
+
await endpoint.bind('genOnOff', bindTarget);
|
|
71
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
72
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const tradfriExtend = {
|
|
76
|
+
light_onoff_brightness: (options = {}) => ({
|
|
77
|
+
...extend.light_onoff_brightness(options),
|
|
78
|
+
ota: ota.tradfri,
|
|
79
|
+
onEvent: bulbOnEvent,
|
|
80
|
+
}),
|
|
81
|
+
light_onoff_brightness_colortemp: (options = {colorTempRange: [250, 454]}) => ({
|
|
82
|
+
...extend.light_onoff_brightness_colortemp(options),
|
|
83
|
+
ota: ota.tradfri,
|
|
84
|
+
onEvent: bulbOnEvent,
|
|
85
|
+
}),
|
|
86
|
+
light_onoff_brightness_colortemp_color: (options = {disableColorTempStartup: true, colorTempRange: [250, 454]}) => ({
|
|
87
|
+
...extend.light_onoff_brightness_colortemp_color(options),
|
|
88
|
+
ota: ota.tradfri,
|
|
89
|
+
onEvent: bulbOnEvent,
|
|
90
|
+
}),
|
|
91
|
+
light_onoff_brightness_color: (options = {}) => ({
|
|
92
|
+
...extend.light_onoff_brightness_color(options),
|
|
93
|
+
ota: ota.tradfri,
|
|
94
|
+
onEvent: bulbOnEvent,
|
|
95
|
+
}),
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const manufacturerOptions = {manufacturerCode: herdsman.Zcl.ManufacturerCode.IKEA_OF_SWEDEN};
|
|
99
|
+
|
|
100
|
+
const ikea = {
|
|
101
|
+
fz: {
|
|
102
|
+
air_purifier: {
|
|
103
|
+
cluster: 'manuSpecificIkeaAirPurifier',
|
|
104
|
+
type: ['attributeReport', 'readResponse'],
|
|
105
|
+
options: [exposes.options.precision('pm25'), exposes.options.calibration('pm25')],
|
|
106
|
+
convert: (model, msg, publish, options, meta) => {
|
|
107
|
+
const state = {};
|
|
108
|
+
|
|
109
|
+
if (msg.data.hasOwnProperty('particulateMatter25Measurement')) {
|
|
110
|
+
const pm25Property = postfixWithEndpointName('pm25', msg, model, meta);
|
|
111
|
+
let pm25 = parseFloat(msg.data['particulateMatter25Measurement']);
|
|
112
|
+
|
|
113
|
+
// Air Quality
|
|
114
|
+
// Scale based on EU AQI (https://www.eea.europa.eu/themes/air/air-quality-index)
|
|
115
|
+
// Using German IAQ labels to match the Develco Air Quality Sensor
|
|
116
|
+
let airQuality;
|
|
117
|
+
const airQualityProperty = postfixWithEndpointName('air_quality', msg, model, meta);
|
|
118
|
+
if (pm25 <= 10) {
|
|
119
|
+
airQuality = 'excellent';
|
|
120
|
+
} else if (pm25 <= 20) {
|
|
121
|
+
airQuality = 'good';
|
|
122
|
+
} else if (pm25 <= 25) {
|
|
123
|
+
airQuality = 'moderate';
|
|
124
|
+
} else if (pm25 <= 50) {
|
|
125
|
+
airQuality = 'poor';
|
|
126
|
+
} else if (pm25 <= 75) {
|
|
127
|
+
airQuality = 'unhealthy';
|
|
128
|
+
} else if (pm25 <= 800) {
|
|
129
|
+
airQuality = 'hazardous';
|
|
130
|
+
} else if (pm25 < 65535) {
|
|
131
|
+
airQuality = 'out_of_range';
|
|
132
|
+
} else {
|
|
133
|
+
airQuality = 'unknown';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// calibrate and round pm25 unless invalid
|
|
137
|
+
pm25 = (pm25 == 65535) ? -1 : calibrateAndPrecisionRoundOptions(pm25, options, 'pm25');
|
|
138
|
+
|
|
139
|
+
state[pm25Property] = calibrateAndPrecisionRoundOptions(pm25, options, 'pm25');
|
|
140
|
+
state[airQualityProperty] = airQuality;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (msg.data.hasOwnProperty('filterRunTime')) {
|
|
144
|
+
// Filter needs to be replaced after 6 months
|
|
145
|
+
state['replace_filter'] = (parseInt(msg.data['filterRunTime']) >= 259200);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (msg.data.hasOwnProperty('controlPanelLight')) {
|
|
149
|
+
state['led_enable'] = (msg.data['controlPanelLight'] == 0);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (msg.data.hasOwnProperty('childLock')) {
|
|
153
|
+
state['child_lock'] = (msg.data['childLock'] > 0 ? 'LOCK' : 'UNLOCK');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (msg.data.hasOwnProperty('fanSpeed')) {
|
|
157
|
+
let fanSpeed = msg.data['fanSpeed'];
|
|
158
|
+
if (fanSpeed >= 10) {
|
|
159
|
+
fanSpeed = (((fanSpeed - 5) * 2) / 10);
|
|
160
|
+
} else {
|
|
161
|
+
fanSpeed = 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
state['fan_speed'] = fanSpeed;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (msg.data.hasOwnProperty('fanMode')) {
|
|
168
|
+
let fanMode = msg.data['fanMode'];
|
|
169
|
+
if (fanMode >= 10) {
|
|
170
|
+
fanMode = (((fanMode - 5) * 2) / 10).toString();
|
|
171
|
+
} else if (fanMode == 1) {
|
|
172
|
+
fanMode = 'auto';
|
|
173
|
+
} else {
|
|
174
|
+
fanMode = 'off';
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
state['fan_mode'] = fanMode;
|
|
178
|
+
state['fan_state'] = (fanMode === 'off' ? 'OFF' : 'ON');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return state;
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
ikea_voc_index: {
|
|
185
|
+
cluster: 'msIkeaVocIndexMeasurement',
|
|
186
|
+
type: ['attributeReport', 'readResponse'],
|
|
187
|
+
convert: (model, msg, publish, options, meta) => {
|
|
188
|
+
if (msg.data.hasOwnProperty('measuredValue')) {
|
|
189
|
+
return {voc_index: msg.data['measuredValue']};
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
battery: {
|
|
194
|
+
cluster: 'genPowerCfg',
|
|
195
|
+
type: ['attributeReport', 'readResponse'],
|
|
196
|
+
convert: (model, msg, publish, options, meta) => {
|
|
197
|
+
const payload = {};
|
|
198
|
+
if (msg.data.hasOwnProperty('batteryPercentageRemaining') && (msg.data['batteryPercentageRemaining'] < 255)) {
|
|
199
|
+
// Some devices do not comply to the ZCL and report a
|
|
200
|
+
// batteryPercentageRemaining of 100 when the battery is full (should be 200).
|
|
201
|
+
//
|
|
202
|
+
// IKEA corrected this on newer remote fw version, but many people are still
|
|
203
|
+
// 2.2.010 which is the last version supporting group bindings. We try to be
|
|
204
|
+
// smart and pick the correct one for IKEA remotes.
|
|
205
|
+
let dontDividePercentage = false;
|
|
206
|
+
let percentage = msg.data['batteryPercentageRemaining'];
|
|
207
|
+
const fwVer = meta.device.softwareBuildID.split('.');
|
|
208
|
+
if ((fwVer[0] < 2) || (fwVer[0] == 2 && fwVer[1] <= 3)) {
|
|
209
|
+
dontDividePercentage = true;
|
|
210
|
+
}
|
|
211
|
+
percentage = dontDividePercentage ? percentage : percentage / 2;
|
|
212
|
+
payload.battery = precisionRound(percentage, 2);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return payload;
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
// The STYRBAR sends an on +- 500ms after the arrow release. We don't want to send the ON action in this case.
|
|
219
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/13335
|
|
220
|
+
styrbar_on: {
|
|
221
|
+
cluster: 'genOnOff',
|
|
222
|
+
type: 'commandOn',
|
|
223
|
+
convert: (model, msg, publish, options, meta) => {
|
|
224
|
+
if (utils.hasAlreadyProcessedMessage(msg, model)) return;
|
|
225
|
+
const arrowReleaseAgo = Date.now() - globalStore.getValue(msg.endpoint, 'arrow_release', 0);
|
|
226
|
+
if (arrowReleaseAgo > 700) {
|
|
227
|
+
return {action: 'on'};
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
styrbar_arrow_release: {
|
|
232
|
+
cluster: 'genScenes',
|
|
233
|
+
type: 'commandTradfriArrowRelease',
|
|
234
|
+
options: [exposes.options.legacy()],
|
|
235
|
+
convert: (model, msg, publish, options, meta) => {
|
|
236
|
+
if (utils.hasAlreadyProcessedMessage(msg, model)) return;
|
|
237
|
+
globalStore.putValue(msg.endpoint, 'arrow_release', Date.now());
|
|
238
|
+
const direction = globalStore.getValue(msg.endpoint, 'direction');
|
|
239
|
+
if (direction) {
|
|
240
|
+
globalStore.clearValue(msg.endpoint, 'direction');
|
|
241
|
+
const duration = msg.data.value / 1000;
|
|
242
|
+
const result = {action: `arrow_${direction}_release`, duration, action_duration: duration};
|
|
243
|
+
if (!utils.isLegacyEnabled(options)) delete result.duration;
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
ikea_dots_click_v1: {
|
|
249
|
+
// For remotes with firmware 1.0.012 (20211214)
|
|
250
|
+
cluster: 64639,
|
|
251
|
+
type: 'raw',
|
|
252
|
+
convert: (model, msg, publish, options, meta) => {
|
|
253
|
+
if (!Buffer.isBuffer(msg.data)) return;
|
|
254
|
+
let action;
|
|
255
|
+
const button = msg.data[5];
|
|
256
|
+
switch (msg.data[6]) {
|
|
257
|
+
case 1: action = 'initial_press'; break;
|
|
258
|
+
case 2: action = 'double_press'; break;
|
|
259
|
+
case 3: action = 'long_press'; break;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return {action: `dots_${button}_${action}`};
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
ikea_dots_click_v2: {
|
|
266
|
+
// For remotes with firmware 1.0.32 (20221219)
|
|
267
|
+
cluster: 'heimanSpecificScenes',
|
|
268
|
+
type: 'raw',
|
|
269
|
+
convert: (model, msg, publish, options, meta) => {
|
|
270
|
+
if (!Buffer.isBuffer(msg.data)) return;
|
|
271
|
+
let button;
|
|
272
|
+
let action;
|
|
273
|
+
switch (msg.endpoint.ID) {
|
|
274
|
+
case 2: button = '1'; break; // 1 dot
|
|
275
|
+
case 3: button = '2'; break; // 2 dot
|
|
276
|
+
}
|
|
277
|
+
switch (msg.data[4]) {
|
|
278
|
+
case 1: action = 'initial_press'; break;
|
|
279
|
+
case 2: action = 'long_press'; break;
|
|
280
|
+
case 3: action = 'short_release'; break;
|
|
281
|
+
case 4: action = 'long_release'; break;
|
|
282
|
+
case 6: action = 'double_press'; break;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return {action: `dots_${button}_${action}`};
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
ikea_volume_click: {
|
|
289
|
+
cluster: 'genLevelCtrl',
|
|
290
|
+
type: 'commandMoveWithOnOff',
|
|
291
|
+
convert: (model, msg, publish, options, meta) => {
|
|
292
|
+
const direction = msg.data.movemode === 1 ? 'down' : 'up';
|
|
293
|
+
return {action: `volume_${direction}`};
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
ikea_volume_hold: {
|
|
297
|
+
cluster: 'genLevelCtrl',
|
|
298
|
+
type: 'commandMove',
|
|
299
|
+
convert: (model, msg, publish, options, meta) => {
|
|
300
|
+
const direction = msg.data.movemode === 1 ? 'down_hold' : 'up_hold';
|
|
301
|
+
return {action: `volume_${direction}`};
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
ikea_track_click: {
|
|
305
|
+
cluster: 'genLevelCtrl',
|
|
306
|
+
type: 'commandStep',
|
|
307
|
+
convert: (model, msg, publish, options, meta) => {
|
|
308
|
+
if (utils.hasAlreadyProcessedMessage(msg, model)) return;
|
|
309
|
+
const direction = msg.data.stepmode === 1 ? 'previous' : 'next';
|
|
310
|
+
return {action: `track_${direction}`};
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
tz: {
|
|
315
|
+
air_purifier_fan_mode: {
|
|
316
|
+
key: ['fan_mode', 'fan_state'],
|
|
317
|
+
convertSet: async (entity, key, value, meta) => {
|
|
318
|
+
if (key == 'fan_state' && value.toLowerCase() == 'on') {
|
|
319
|
+
value = getMetaValue(entity, meta.mapped, 'fanStateOn', 'allEqual', 'on');
|
|
320
|
+
} else {
|
|
321
|
+
value = value.toString().toLowerCase();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
let fanMode;
|
|
325
|
+
switch (value) {
|
|
326
|
+
case 'off':
|
|
327
|
+
fanMode = 0;
|
|
328
|
+
break;
|
|
329
|
+
case 'auto':
|
|
330
|
+
fanMode = 1;
|
|
331
|
+
break;
|
|
332
|
+
default:
|
|
333
|
+
fanMode = parseInt(((parseInt(value) / 2.0) * 10) + 5);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
await entity.write('manuSpecificIkeaAirPurifier', {'fanMode': fanMode}, manufacturerOptions.ikea);
|
|
337
|
+
return {state: {fan_mode: value, fan_state: value === 'off' ? 'OFF' : 'ON'}};
|
|
338
|
+
},
|
|
339
|
+
convertGet: async (entity, key, meta) => {
|
|
340
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['fanMode']);
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
air_purifier_fan_speed: {
|
|
344
|
+
key: ['fan_speed'],
|
|
345
|
+
convertGet: async (entity, key, meta) => {
|
|
346
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['fanSpeed']);
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
air_purifier_pm25: {
|
|
350
|
+
key: ['pm25', 'air_quality'],
|
|
351
|
+
convertGet: async (entity, key, meta) => {
|
|
352
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['particulateMatter25Measurement']);
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
air_purifier_replace_filter: {
|
|
356
|
+
key: ['replace_filter'],
|
|
357
|
+
convertGet: async (entity, key, meta) => {
|
|
358
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['filterRunTime']);
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
air_purifier_child_lock: {
|
|
362
|
+
key: ['child_lock'],
|
|
363
|
+
convertSet: async (entity, key, value, meta) => {
|
|
364
|
+
await entity.write('manuSpecificIkeaAirPurifier', {'childLock': ((value.toLowerCase() === 'lock') ? 1 : 0)},
|
|
365
|
+
manufacturerOptions);
|
|
366
|
+
return {state: {child_lock: ((value.toLowerCase() === 'lock') ? 'LOCK' : 'UNLOCK')}};
|
|
367
|
+
},
|
|
368
|
+
convertGet: async (entity, key, meta) => {
|
|
369
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['childLock']);
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
|
+
air_purifier_led_enable: {
|
|
373
|
+
key: ['led_enable'],
|
|
374
|
+
convertSet: async (entity, key, value, meta) => {
|
|
375
|
+
await entity.write('manuSpecificIkeaAirPurifier', {'controlPanelLight': ((value) ? 0 : 1)}, manufacturerOptions);
|
|
376
|
+
return {state: {led_enable: ((value) ? true : false)}};
|
|
377
|
+
},
|
|
378
|
+
convertGet: async (entity, key, meta) => {
|
|
379
|
+
await entity.read('manuSpecificIkeaAirPurifier', ['controlPanelLight']);
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
module.exports = [
|
|
386
|
+
{
|
|
387
|
+
zigbeeModel: ['ASKVADER on/off switch'],
|
|
388
|
+
model: 'E1836',
|
|
389
|
+
vendor: 'IKEA',
|
|
390
|
+
description: 'ASKVADER on/off switch',
|
|
391
|
+
extend: extend.switch(),
|
|
392
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
393
|
+
const endpoint = device.getEndpoint(1);
|
|
394
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
395
|
+
await reporting.onOff(endpoint);
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
zigbeeModel: ['TRADFRI bulb E27 WS opal 980lm', 'TRADFRI bulb E26 WS opal 980lm', 'TRADFRI bulb E27 WS\uFFFDopal 980lm'],
|
|
400
|
+
model: 'LED1545G12',
|
|
401
|
+
vendor: 'IKEA',
|
|
402
|
+
description: 'TRADFRI LED bulb E26/E27 980 lumen, dimmable, white spectrum, opal white',
|
|
403
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
zigbeeModel: ['TRADFRI Light Engine'],
|
|
407
|
+
model: 'T2011',
|
|
408
|
+
description: 'Osvalla panel round',
|
|
409
|
+
vendor: 'IKEA',
|
|
410
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
zigbeeModel: ['TRADFRI bulb E27 WS clear 950lm', 'TRADFRI bulb E26 WS clear 950lm', 'TRADFRI bulb E27 WS\uFFFDclear 950lm'],
|
|
414
|
+
model: 'LED1546G12',
|
|
415
|
+
vendor: 'IKEA',
|
|
416
|
+
description: 'TRADFRI LED bulb E26/E27 950 lumen, dimmable, white spectrum, clear',
|
|
417
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
zigbeeModel: ['TRADFRI bulb E27 opal 1000lm', 'TRADFRI bulb E27 W opal 1000lm'],
|
|
421
|
+
model: 'LED1623G12',
|
|
422
|
+
vendor: 'IKEA',
|
|
423
|
+
description: 'TRADFRI LED bulb E27 1000 lumen, dimmable, opal white',
|
|
424
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
zigbeeModel: ['TRADFRIbulbE26WWglobeclear250lm'],
|
|
428
|
+
model: 'LED2008G3',
|
|
429
|
+
vendor: 'IKEA',
|
|
430
|
+
description: 'TRADFRI LED bulb E26 250 lumen, wireless dimmable warm white/globe clear',
|
|
431
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
zigbeeModel: ['TRADFRI bulb E27 WW G95 CL 470lm'],
|
|
435
|
+
model: 'LED2102G3',
|
|
436
|
+
vendor: 'IKEA',
|
|
437
|
+
description: 'TRADFRI bulb E27 WW 470 lumen, wireless dimmable warm white/globe clear',
|
|
438
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
zigbeeModel: ['TRADFRIbulbG125E27WSopal470lm', 'TRADFRIbulbG125E26WSopal450lm'],
|
|
442
|
+
model: 'LED1936G5',
|
|
443
|
+
vendor: 'IKEA',
|
|
444
|
+
description: 'TRADFRI LED globe-bulb E26/E27 450/470 lumen, dimmable, white spectrum, opal white',
|
|
445
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
zigbeeModel: ['TRADFRIbulbE27WSglobeopal1055lm', 'TRADFRIbulbE26WSglobeopal1100lm', 'TRADFRIbulbE26WSglobeopal1160lm',
|
|
449
|
+
'TRADFRIbulbE26WSglobeopal1055lm'],
|
|
450
|
+
model: 'LED2003G10',
|
|
451
|
+
vendor: 'IKEA',
|
|
452
|
+
description: 'TRADFRI LED bulb E26/27 1100/1055/1160 lumen, dimmable, white spectrum, opal white',
|
|
453
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
zigbeeModel: ['TRADFRIbulbE26WSglobeclear800lm', 'TRADFRIbulbE27WSglobeclear806lm', 'TRADFRIbulbE26WSglobeclear806lm'],
|
|
457
|
+
model: 'LED2004G8',
|
|
458
|
+
vendor: 'IKEA',
|
|
459
|
+
description: 'TRADFRI LED bulb E26/E27 800/806 lumen, dimmable, white spectrum, clear',
|
|
460
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
zigbeeModel: ['TRADFRI bulb E27 opal 470lm', 'TRADFRI bulb E27 W opal 470lm', 'TRADFRIbulbT120E27WSopal470lm'],
|
|
464
|
+
model: 'LED1937T5_E27',
|
|
465
|
+
vendor: 'IKEA',
|
|
466
|
+
description: 'TRADFRI LED bulb E27 470 lumen, dimmable, opal white',
|
|
467
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
zigbeeModel: ['TRADFRIbulbT120E26WSopal450lm', 'TRADFRIbulbT120E26WSopal470lm'],
|
|
471
|
+
model: 'LED1937T5_E26',
|
|
472
|
+
vendor: 'IKEA',
|
|
473
|
+
description: 'LED bulb E26 450/470 lumen, wireless dimmable white spectrum/tube-shaped white frosted glass',
|
|
474
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
zigbeeModel: ['TRADFRIbulbB22WSglobeopal1055lm', 'TRADFRIbulbB22WSglobeopal1055lm'],
|
|
478
|
+
model: 'LED2035G10',
|
|
479
|
+
vendor: 'IKEA',
|
|
480
|
+
description: 'TRADFRI LED bulb B22 1055 lumen, dimmable, white spectrum, opal white',
|
|
481
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
zigbeeModel: ['TRADFRI bulb GU10 WS 400lm'],
|
|
485
|
+
model: 'LED1537R6/LED1739R5',
|
|
486
|
+
vendor: 'IKEA',
|
|
487
|
+
description: 'TRADFRI LED bulb GU10 400 lumen, dimmable, white spectrum',
|
|
488
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
zigbeeModel: ['TRADFRI bulb GU10 W 400lm'],
|
|
492
|
+
model: 'LED1650R5',
|
|
493
|
+
vendor: 'IKEA',
|
|
494
|
+
description: 'TRADFRI LED bulb GU10 400 lumen, dimmable',
|
|
495
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
zigbeeModel: ['TRADFRI bulb E14 WS opal 400lm', 'TRADFRI bulb E12 WS opal 400lm'],
|
|
499
|
+
model: 'LED1536G5',
|
|
500
|
+
vendor: 'IKEA',
|
|
501
|
+
description: 'TRADFRI LED bulb E12/E14 400 lumen, dimmable, white spectrum, opal white',
|
|
502
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
zigbeeModel: ['TRADFRI bulb E14 WS 470lm', 'TRADFRI bulb E12 WS 450lm', 'TRADFRI bulb E17 WS 440lm'],
|
|
506
|
+
model: 'LED1903C5/LED1835C6',
|
|
507
|
+
vendor: 'IKEA',
|
|
508
|
+
description: 'TRADFRI bulb E12/E14/E17 WS 450/470/440 lumen, dimmable, white spectrum, opal white',
|
|
509
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
zigbeeModel: ['TRADFRI bulb E14 WS globe 470lm', 'TRADFRI bulb E12 WS globe 450lm'],
|
|
513
|
+
model: 'LED2101G4',
|
|
514
|
+
vendor: 'IKEA',
|
|
515
|
+
description: 'TRADFRI bulb E12/E14 WS globe 450/470 lumen, dimmable, white spectrum, opal white',
|
|
516
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
zigbeeModel: ['TRADFRI bulb GU10 WW 400lm'],
|
|
520
|
+
model: 'LED1837R5',
|
|
521
|
+
vendor: 'IKEA',
|
|
522
|
+
description: 'TRADFRI LED bulb GU10 400 lumen, dimmable',
|
|
523
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
zigbeeModel: ['TRADFRI bulb E27 WW clear 250lm', 'TRADFRI bulb E26 WW clear 250lm'],
|
|
527
|
+
model: 'LED1842G3',
|
|
528
|
+
vendor: 'IKEA',
|
|
529
|
+
description: 'TRADFRI LED bulb E27 WW clear 250 lumen, dimmable',
|
|
530
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
zigbeeModel: ['TRADFRIbulbE27WWclear250lm'],
|
|
534
|
+
model: 'LED1934G3_E27',
|
|
535
|
+
vendor: 'IKEA',
|
|
536
|
+
description: 'TRADFRI LED bulb E27 WW clear 250 lumen, dimmable',
|
|
537
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
538
|
+
meta: {turnsOffAtBrightness1: true},
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
zigbeeModel: ['TRADFRIbulbE26WWclear250lm'],
|
|
542
|
+
model: 'LED1934G3_E26',
|
|
543
|
+
vendor: 'IKEA',
|
|
544
|
+
description: 'LED bulb E26 250 lumen, wireless dimmable warm white/globe clear',
|
|
545
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
zigbeeModel: ['TRADFRI bulb E14 WS opal 600lm'],
|
|
549
|
+
model: 'LED1733G7',
|
|
550
|
+
vendor: 'IKEA',
|
|
551
|
+
description: 'TRADFRI LED bulb E14 600 lumen, dimmable, white spectrum, opal white',
|
|
552
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
zigbeeModel: ['TRADFRI bulb E26 opal 1000lm', 'TRADFRI bulb E26 W opal 1000lm'],
|
|
556
|
+
model: 'LED1622G12',
|
|
557
|
+
vendor: 'IKEA',
|
|
558
|
+
description: 'TRADFRI LED bulb E26 1000 lumen, dimmable, opal white',
|
|
559
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
zigbeeModel: ['TRADFRI bulb E27 CWS opal 600lm', 'TRADFRI bulb E26 CWS opal 600lm', 'TRADFRI bulb E14 CWS opal 600lm',
|
|
563
|
+
'TRADFRI bulb E12 CWS opal 600lm', 'TRADFRI bulb E27 C/WS opal 600'],
|
|
564
|
+
model: 'LED1624G9',
|
|
565
|
+
vendor: 'IKEA',
|
|
566
|
+
description: 'TRADFRI LED bulb E14/E26/E27 600 lumen, dimmable, color, opal white',
|
|
567
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
|
|
568
|
+
toZigbee: utils.replaceInArray(
|
|
569
|
+
tradfriExtend.light_onoff_brightness_colortemp_color().toZigbee,
|
|
570
|
+
[tz.light_color_colortemp],
|
|
571
|
+
[tz.light_color_and_colortemp_via_color],
|
|
572
|
+
),
|
|
573
|
+
meta: {supportsHueAndSaturation: false},
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
zigbeeModel: ['TRADFRI bulb E26 CWS 800lm', 'TRADFRI bulb E27 CWS 806lm', 'TRADFRI bulb E26 CWS 806lm'],
|
|
577
|
+
model: 'LED1924G9',
|
|
578
|
+
vendor: 'IKEA',
|
|
579
|
+
description: 'TRADFRI bulb E26/E27 CWS 800/806 lumen, dimmable, color, opal white',
|
|
580
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
|
|
581
|
+
meta: {turnsOffAtBrightness1: true},
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
zigbeeModel: ['TRADFRI bulb E14 W op/ch 400lm', 'TRADFRI bulb E12 W op/ch 400lm', 'TRADFRI bulb E17 W op/ch 400lm'],
|
|
585
|
+
model: 'LED1649C5',
|
|
586
|
+
vendor: 'IKEA',
|
|
587
|
+
description: 'TRADFRI LED bulb E12/E14/E17 400 lumen, dimmable warm white, chandelier opal',
|
|
588
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
zigbeeModel: ['TRADFRI bulb E27 WS opal 1000lm', 'TRADFRI bulb E26 WS opal 1000lm'],
|
|
592
|
+
model: 'LED1732G11',
|
|
593
|
+
vendor: 'IKEA',
|
|
594
|
+
description: 'TRADFRI LED bulb E27 1000 lumen, dimmable, white spectrum, opal white',
|
|
595
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp({colorTempRange: [250, 454]}),
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
zigbeeModel: ['TRADFRI bulb E27 WW 806lm', 'TRADFRI bulb E26 WW 806lm'],
|
|
599
|
+
model: 'LED1836G9',
|
|
600
|
+
vendor: 'IKEA',
|
|
601
|
+
description: 'TRADFRI LED bulb E26/E27 806 lumen, dimmable, warm white',
|
|
602
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
603
|
+
meta: {turnsOffAtBrightness1: true},
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
zigbeeModel: ['TRADFRI bulb E27 WS clear 806lm', 'TRADFRI bulb E26 WS clear 806lm'],
|
|
607
|
+
model: 'LED1736G9',
|
|
608
|
+
vendor: 'IKEA',
|
|
609
|
+
description: 'TRADFRI LED bulb E26/E27 806 lumen, dimmable, white spectrum, clear',
|
|
610
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
zigbeeModel: ['TRADFRIbulbE14WSglobeopal470lm', 'TRADFRIbulbE12WSglobeopal470lm'],
|
|
614
|
+
model: 'LED2002G5',
|
|
615
|
+
vendor: 'IKEA',
|
|
616
|
+
description: 'TRADFRI LED bulb E14/E12 470 lumen, dimmable, white spectrum, clear',
|
|
617
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
zigbeeModel: ['LEPTITER Recessed spot light'],
|
|
621
|
+
model: 'T1820',
|
|
622
|
+
vendor: 'IKEA',
|
|
623
|
+
description: 'LEPTITER Recessed spot light, dimmable, white spectrum',
|
|
624
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
zigbeeModel: ['TRADFRI wireless dimmer'],
|
|
628
|
+
model: 'ICTC-G-1',
|
|
629
|
+
vendor: 'IKEA',
|
|
630
|
+
description: 'TRADFRI wireless dimmer',
|
|
631
|
+
fromZigbee: [fz.legacy.cmd_move, fz.legacy.cmd_move_with_onoff, fz.legacy.cmd_stop, fz.legacy.cmd_stop_with_onoff,
|
|
632
|
+
fz.legacy.cmd_move_to_level_with_onoff, fz.battery],
|
|
633
|
+
exposes: [e.battery(), e.action(['brightness_move_up', 'brightness_move_down', 'brightness_stop', 'brightness_move_to_level'])],
|
|
634
|
+
toZigbee: [],
|
|
635
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
636
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
637
|
+
const endpoint = device.getEndpoint(1);
|
|
638
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genLevelCtrl', 'genPowerCfg']);
|
|
639
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
640
|
+
},
|
|
641
|
+
ota: ota.tradfri,
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
zigbeeModel: ['TRADFRI transformer 10W', 'TRADFRI Driver 10W'],
|
|
645
|
+
model: 'ICPSHC24-10EU-IL-1',
|
|
646
|
+
vendor: 'IKEA',
|
|
647
|
+
description: 'TRADFRI driver for wireless control (10 watt)',
|
|
648
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
649
|
+
meta: {turnsOffAtBrightness1: true},
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
zigbeeModel: ['TRADFRI transformer 30W', 'TRADFRI Driver 30W'],
|
|
653
|
+
model: 'ICPSHC24-30EU-IL-1',
|
|
654
|
+
vendor: 'IKEA',
|
|
655
|
+
description: 'TRADFRI driver for wireless control (30 watt)',
|
|
656
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
657
|
+
meta: {turnsOffAtBrightness1: true},
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
zigbeeModel: ['SILVERGLANS IP44 LED driver'],
|
|
661
|
+
model: 'ICPSHC24-30-IL44-1',
|
|
662
|
+
vendor: 'IKEA',
|
|
663
|
+
description: 'SILVERGLANS IP44 LED driver for wireless control (30 watt)',
|
|
664
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
665
|
+
meta: {turnsOffAtBrightness1: true},
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
zigbeeModel: ['Pendant lamp WW'],
|
|
669
|
+
model: 'T2030',
|
|
670
|
+
vendor: 'IKEA',
|
|
671
|
+
description: 'PILSKOTT LED pendant lamp',
|
|
672
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
673
|
+
meta: {turnsOffAtBrightness1: true},
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
zigbeeModel: ['FLOALT panel WS 30x30'],
|
|
677
|
+
model: 'L1527',
|
|
678
|
+
vendor: 'IKEA',
|
|
679
|
+
description: 'FLOALT LED light panel, dimmable, white spectrum (30x30 cm)',
|
|
680
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
681
|
+
meta: {turnsOffAtBrightness1: true},
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
zigbeeModel: ['FLOALT panel WS 60x60'],
|
|
685
|
+
model: 'L1529',
|
|
686
|
+
vendor: 'IKEA',
|
|
687
|
+
description: 'FLOALT LED light panel, dimmable, white spectrum (60x60 cm)',
|
|
688
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
689
|
+
meta: {turnsOffAtBrightness1: true},
|
|
690
|
+
},
|
|
691
|
+
{
|
|
692
|
+
zigbeeModel: ['JORMLIEN door WS 40x80'],
|
|
693
|
+
model: 'L1530',
|
|
694
|
+
vendor: 'IKEA',
|
|
695
|
+
description: 'JORMLIEN door light panel, dimmable, white spectrum (40x80 cm)',
|
|
696
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
zigbeeModel: ['FLOALT panel WS 30x90'],
|
|
700
|
+
model: 'L1528',
|
|
701
|
+
vendor: 'IKEA',
|
|
702
|
+
description: 'FLOALT LED light panel, dimmable, white spectrum (30x90 cm)',
|
|
703
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
704
|
+
meta: {turnsOffAtBrightness1: true},
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
zigbeeModel: ['SURTE door WS 38x64'],
|
|
708
|
+
model: 'L1531',
|
|
709
|
+
vendor: 'IKEA',
|
|
710
|
+
description: 'SURTE door light panel, dimmable, white spectrum (38x64 cm)',
|
|
711
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
zigbeeModel: ['TRADFRI control outlet'],
|
|
715
|
+
model: 'E1603/E1702/E1708',
|
|
716
|
+
description: 'TRADFRI control outlet',
|
|
717
|
+
vendor: 'IKEA',
|
|
718
|
+
extend: extend.switch(),
|
|
719
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
720
|
+
const endpoint = device.getEndpoint(1);
|
|
721
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
722
|
+
await reporting.onOff(endpoint);
|
|
723
|
+
},
|
|
724
|
+
ota: ota.tradfri,
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
zigbeeModel: ['TRADFRI remote control'],
|
|
728
|
+
model: 'E1524/E1810',
|
|
729
|
+
description: 'TRADFRI remote control',
|
|
730
|
+
vendor: 'IKEA',
|
|
731
|
+
fromZigbee: [ikea.fz.battery, fz.E1524_E1810_toggle, fz.E1524_E1810_levelctrl, fz.ikea_arrow_click, fz.ikea_arrow_hold,
|
|
732
|
+
fz.ikea_arrow_release],
|
|
733
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['arrow_left_click', 'arrow_left_hold', 'arrow_left_release',
|
|
734
|
+
'arrow_right_click', 'arrow_right_hold', 'arrow_right_release', 'brightness_down_click', 'brightness_down_hold',
|
|
735
|
+
'brightness_down_release', 'brightness_up_click', 'brightness_up_hold', 'brightness_up_release', 'toggle'])],
|
|
736
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
737
|
+
ota: ota.tradfri,
|
|
738
|
+
// dontDividePercentage: true not needed with latest firmware
|
|
739
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/16412
|
|
740
|
+
configure: configureRemote,
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
zigbeeModel: ['Remote Control N2'],
|
|
744
|
+
model: 'E2001/E2002',
|
|
745
|
+
vendor: 'IKEA',
|
|
746
|
+
description: 'STYRBAR remote control',
|
|
747
|
+
fromZigbee: [ikea.fz.battery, ikea.fz.styrbar_on, fz.command_off, fz.command_move, fz.command_stop, fz.ikea_arrow_click,
|
|
748
|
+
fz.ikea_arrow_hold, ikea.fz.styrbar_arrow_release],
|
|
749
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down',
|
|
750
|
+
'brightness_stop', 'arrow_left_click', 'arrow_right_click', 'arrow_left_hold',
|
|
751
|
+
'arrow_right_hold', 'arrow_left_release', 'arrow_right_release'])],
|
|
752
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
753
|
+
ota: ota.tradfri,
|
|
754
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
755
|
+
// Binding genOnOff is not required to make device send events.
|
|
756
|
+
const endpoint = device.getEndpoint(1);
|
|
757
|
+
const version = device.softwareBuildID.split('.').map((n) => Number(n));
|
|
758
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/15725
|
|
759
|
+
const v245OrLater = version[0] > 2 || (version[0] == 2 && version[1] >= 4);
|
|
760
|
+
const binds = v245OrLater ? ['genPowerCfg', 'genOnOff', 'genLevelCtrl', 'genScenes'] : ['genPowerCfg'];
|
|
761
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
762
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
763
|
+
},
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
zigbeeModel: ['TRADFRI on/off switch'],
|
|
767
|
+
model: 'E1743',
|
|
768
|
+
vendor: 'IKEA',
|
|
769
|
+
description: 'TRADFRI ON/OFF switch',
|
|
770
|
+
fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.command_move,
|
|
771
|
+
ikea.fz.battery, fz.legacy.E1743_brightness_up, fz.legacy.E1743_brightness_down, fz.command_stop,
|
|
772
|
+
fz.legacy.E1743_brightness_stop],
|
|
773
|
+
exposes: [
|
|
774
|
+
e.battery().withAccess(ea.STATE_GET),
|
|
775
|
+
e.action(['on', 'off', 'brightness_move_down', 'brightness_move_up', 'brightness_stop']),
|
|
776
|
+
],
|
|
777
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
778
|
+
ota: ota.tradfri,
|
|
779
|
+
meta: {disableActionGroup: true},
|
|
780
|
+
configure: configureRemote,
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
zigbeeModel: ['KNYCKLAN Open/Close remote'],
|
|
784
|
+
model: 'E1841',
|
|
785
|
+
vendor: 'IKEA',
|
|
786
|
+
description: 'KNYCKLAN open/close remote water valve',
|
|
787
|
+
fromZigbee: [fz.command_on, fz.command_off, ikea.fz.battery],
|
|
788
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off'])],
|
|
789
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
790
|
+
ota: ota.tradfri,
|
|
791
|
+
meta: {disableActionGroup: true},
|
|
792
|
+
configure: configureRemote,
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
zigbeeModel: ['KNYCKLAN receiver'],
|
|
796
|
+
model: 'E1842',
|
|
797
|
+
description: 'KNYCKLAN receiver electronic water valve shut-off',
|
|
798
|
+
vendor: 'IKEA',
|
|
799
|
+
fromZigbee: extend.switch().fromZigbee.concat([fz.ias_water_leak_alarm_1]),
|
|
800
|
+
exposes: extend.switch().exposes.concat([e.water_leak()]),
|
|
801
|
+
extend: extend.switch(),
|
|
802
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
803
|
+
const endpoint = device.getEndpoint(1);
|
|
804
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
805
|
+
await reporting.onOff(endpoint);
|
|
806
|
+
},
|
|
807
|
+
ota: ota.tradfri,
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
zigbeeModel: ['TRADFRI SHORTCUT Button'],
|
|
811
|
+
model: 'E1812',
|
|
812
|
+
vendor: 'IKEA',
|
|
813
|
+
description: 'TRADFRI shortcut button',
|
|
814
|
+
fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, ikea.fz.battery],
|
|
815
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_stop'])],
|
|
816
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
817
|
+
ota: ota.tradfri,
|
|
818
|
+
meta: {disableActionGroup: true},
|
|
819
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
820
|
+
// Binding genOnOff is not required to make device send events.
|
|
821
|
+
const endpoint = device.getEndpoint(1);
|
|
822
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
823
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
824
|
+
},
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
zigbeeModel: ['SYMFONISK Sound Controller'],
|
|
828
|
+
model: 'E1744',
|
|
829
|
+
vendor: 'IKEA',
|
|
830
|
+
description: 'SYMFONISK sound controller',
|
|
831
|
+
fromZigbee: [fz.legacy.cmd_move, fz.legacy.cmd_stop, fz.legacy.E1744_play_pause, fz.legacy.E1744_skip, fz.battery],
|
|
832
|
+
toZigbee: [],
|
|
833
|
+
exposes: [e.battery(), e.action([
|
|
834
|
+
'brightness_move_up', 'brightness_move_down', 'brightness_stop', 'toggle', 'brightness_step_up', 'brightness_step_down'])],
|
|
835
|
+
ota: ota.tradfri,
|
|
836
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
837
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
838
|
+
const endpoint = device.getEndpoint(1);
|
|
839
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genLevelCtrl', 'genPowerCfg']);
|
|
840
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
841
|
+
},
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
zigbeeModel: ['TRADFRI motion sensor'],
|
|
845
|
+
model: 'E1525/E1745',
|
|
846
|
+
vendor: 'IKEA',
|
|
847
|
+
description: 'TRADFRI motion sensor',
|
|
848
|
+
fromZigbee: [ikea.fz.battery, fz.tradfri_occupancy, fz.E1745_requested_brightness],
|
|
849
|
+
toZigbee: [],
|
|
850
|
+
exposes: [e.battery(), e.occupancy(),
|
|
851
|
+
exposes.numeric('requested_brightness_level', ea.STATE).withValueMin(76).withValueMax(254),
|
|
852
|
+
exposes.numeric('requested_brightness_percent', ea.STATE).withValueMin(30).withValueMax(100),
|
|
853
|
+
exposes.binary('illuminance_above_threshold', ea.STATE, true, false)
|
|
854
|
+
.withDescription('Indicates whether the device detected bright light (works only in night mode)')],
|
|
855
|
+
ota: ota.tradfri,
|
|
856
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
857
|
+
const endpoint = device.getEndpoint(1);
|
|
858
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
859
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
860
|
+
device.powerSource = 'Battery';
|
|
861
|
+
device.save();
|
|
862
|
+
},
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
zigbeeModel: ['TRADFRI signal repeater'],
|
|
866
|
+
model: 'E1746',
|
|
867
|
+
description: 'TRADFRI signal repeater',
|
|
868
|
+
vendor: 'IKEA',
|
|
869
|
+
fromZigbee: [fz.linkquality_from_basic],
|
|
870
|
+
toZigbee: [],
|
|
871
|
+
ota: ota.tradfri,
|
|
872
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
873
|
+
const endpoint = device.getEndpoint(1);
|
|
874
|
+
const payload = [{attribute: 'modelId', minimumReportInterval: 3600, maximumReportInterval: 14400}];
|
|
875
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
|
|
876
|
+
await endpoint.configureReporting('genBasic', payload);
|
|
877
|
+
},
|
|
878
|
+
exposes: [],
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
zigbeeModel: ['FYRTUR block-out roller blind'],
|
|
882
|
+
model: 'E1757',
|
|
883
|
+
vendor: 'IKEA',
|
|
884
|
+
description: 'FYRTUR roller blind',
|
|
885
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
886
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
887
|
+
ota: ota.tradfri,
|
|
888
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
889
|
+
const endpoint = device.getEndpoint(1);
|
|
890
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
|
|
891
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
892
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
893
|
+
},
|
|
894
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
895
|
+
},
|
|
896
|
+
{
|
|
897
|
+
zigbeeModel: ['KADRILJ roller blind'],
|
|
898
|
+
model: 'E1926',
|
|
899
|
+
vendor: 'IKEA',
|
|
900
|
+
description: 'KADRILJ roller blind',
|
|
901
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
902
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
903
|
+
ota: ota.tradfri,
|
|
904
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
905
|
+
const endpoint = device.getEndpoint(1);
|
|
906
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
|
|
907
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
908
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
909
|
+
},
|
|
910
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
zigbeeModel: ['PRAKTLYSING cellular blind'],
|
|
914
|
+
model: 'E2102',
|
|
915
|
+
vendor: 'IKEA',
|
|
916
|
+
description: 'PRAKTLYSING cellular blind',
|
|
917
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
918
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
919
|
+
ota: ota.tradfri,
|
|
920
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
921
|
+
const endpoint = device.getEndpoint(1);
|
|
922
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
|
|
923
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
924
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
925
|
+
},
|
|
926
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
zigbeeModel: ['TREDANSEN block-out cellul blind'],
|
|
930
|
+
model: 'E2103',
|
|
931
|
+
vendor: 'IKEA',
|
|
932
|
+
description: 'TREDANSEN cellular blind',
|
|
933
|
+
fromZigbee: [fz.cover_position_tilt, fz.battery],
|
|
934
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt],
|
|
935
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
936
|
+
ota: ota.tradfri,
|
|
937
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
938
|
+
const endpoint = device.getEndpoint(1);
|
|
939
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
|
|
940
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
941
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
942
|
+
},
|
|
943
|
+
exposes: [e.cover_position(), e.battery()],
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
zigbeeModel: ['TRADFRI open/close remote'],
|
|
947
|
+
model: 'E1766',
|
|
948
|
+
vendor: 'IKEA',
|
|
949
|
+
description: 'TRADFRI open/close remote',
|
|
950
|
+
fromZigbee: [ikea.fz.battery, fz.command_cover_close, fz.legacy.cover_close, fz.command_cover_open, fz.legacy.cover_open,
|
|
951
|
+
fz.command_cover_stop, fz.legacy.cover_stop],
|
|
952
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['close', 'open', 'stop'])],
|
|
953
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
954
|
+
ota: ota.tradfri,
|
|
955
|
+
configure: configureRemote,
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
zigbeeModel: ['GUNNARP panel round'],
|
|
959
|
+
model: 'T1828',
|
|
960
|
+
description: 'GUNNARP panel round',
|
|
961
|
+
vendor: 'IKEA',
|
|
962
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
zigbeeModel: ['GUNNARP panel 40*40'],
|
|
966
|
+
model: 'T1829',
|
|
967
|
+
description: 'GUNNARP panel 40*40',
|
|
968
|
+
vendor: 'IKEA',
|
|
969
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
zigbeeModel: ['TRADFRI bulb E12 WS opal 600lm'],
|
|
973
|
+
model: 'LED1738G7',
|
|
974
|
+
vendor: 'IKEA',
|
|
975
|
+
description: 'TRADFRI LED bulb E12 600 lumen, dimmable, white spectrum, opal white',
|
|
976
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
zigbeeModel: ['TRADFRI bulb GU10 CWS 345lm', 'TRADFRI bulb GU10 CWS 380lm'],
|
|
980
|
+
model: 'LED1923R5',
|
|
981
|
+
vendor: 'IKEA',
|
|
982
|
+
description: 'TRADFRI LED bulb GU10 345 lumen, dimmable, white spectrum, color spectrum',
|
|
983
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]}),
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
zigbeeModel: ['TRADFRI bulb E14 CWS 470lm', 'TRADFRI bulb E12 CWS 450lm', 'TRADFRI bulb E17 CWS 440lm'],
|
|
987
|
+
model: 'LED1925G6',
|
|
988
|
+
vendor: 'IKEA',
|
|
989
|
+
description: 'TRADFRI LED bulb E14 470 lumen, opal, dimmable, white spectrum, color spectrum',
|
|
990
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp_color(),
|
|
991
|
+
meta: {turnsOffAtBrightness1: true},
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
zigbeeModel: ['TRADFRIbulbE14WWclear250lm', 'TRADFRIbulbE12WWclear250lm'],
|
|
995
|
+
model: 'LED1935C3',
|
|
996
|
+
vendor: 'IKEA',
|
|
997
|
+
description: 'TRADFRI LED bulb E12/E14 WW clear 250 lumen, dimmable',
|
|
998
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
999
|
+
},
|
|
1000
|
+
{
|
|
1001
|
+
zigbeeModel: ['TRADFRIbulbE12WWcandleclear250lm'],
|
|
1002
|
+
model: 'LED2009C3',
|
|
1003
|
+
vendor: 'IKEA',
|
|
1004
|
+
description: 'TRADFRI LED bulb E12 WW candle clear 250 lumen, dimmable',
|
|
1005
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
zigbeeModel: ['TRADFRIbulbGU10WS345lm', 'TRADFRI bulb GU10 WW 345lm', 'TRADFRIbulbGU10WS380lm'],
|
|
1009
|
+
model: 'LED2005R5',
|
|
1010
|
+
vendor: 'IKEA',
|
|
1011
|
+
description: 'TRADFRI LED bulb GU10 345/380 lumen, dimmable, white spectrum',
|
|
1012
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
zigbeeModel: ['STARKVIND Air purifier', 'STARKVIND Air purifier table'],
|
|
1016
|
+
model: 'E2007',
|
|
1017
|
+
vendor: 'IKEA',
|
|
1018
|
+
description: 'STARKVIND air purifier',
|
|
1019
|
+
exposes: [
|
|
1020
|
+
e.fan().withModes(['off', 'auto', '1', '2', '3', '4', '5', '6', '7', '8', '9']),
|
|
1021
|
+
exposes.numeric('fan_speed', exposes.access.STATE_GET).withValueMin(0).withValueMax(9)
|
|
1022
|
+
.withDescription('Current fan speed'),
|
|
1023
|
+
e.pm25().withAccess(ea.STATE_GET),
|
|
1024
|
+
exposes.enum('air_quality', ea.STATE_GET, [
|
|
1025
|
+
'excellent', 'good', 'moderate', 'poor',
|
|
1026
|
+
'unhealthy', 'hazardous', 'out_of_range',
|
|
1027
|
+
'unknown',
|
|
1028
|
+
]).withDescription('Measured air quality'),
|
|
1029
|
+
exposes.binary('led_enable', ea.ALL, true, false).withDescription('Enabled LED'),
|
|
1030
|
+
exposes.binary('child_lock', ea.ALL, 'LOCK', 'UNLOCK').withDescription('Enables/disables physical input on the device'),
|
|
1031
|
+
exposes.binary('replace_filter', ea.STATE_GET, true, false)
|
|
1032
|
+
.withDescription('Filter is older than 6 months and needs replacing'),
|
|
1033
|
+
],
|
|
1034
|
+
meta: {fanStateOn: 'auto'},
|
|
1035
|
+
fromZigbee: [ikea.fz.air_purifier],
|
|
1036
|
+
toZigbee: [
|
|
1037
|
+
ikea.tz.air_purifier_fan_mode, ikea.tz.air_purifier_fan_speed,
|
|
1038
|
+
ikea.tz.air_purifier_pm25, ikea.tz.air_purifier_child_lock, ikea.tz.air_purifier_led_enable,
|
|
1039
|
+
ikea.tz.air_purifier_replace_filter,
|
|
1040
|
+
],
|
|
1041
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1042
|
+
const endpoint = device.getEndpoint(1);
|
|
1043
|
+
|
|
1044
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['manuSpecificIkeaAirPurifier']);
|
|
1045
|
+
await endpoint.configureReporting('manuSpecificIkeaAirPurifier', [{attribute: 'particulateMatter25Measurement',
|
|
1046
|
+
minimumReportInterval: repInterval.MINUTE, maximumReportInterval: repInterval.HOUR, reportableChange: 1}],
|
|
1047
|
+
manufacturerOptions);
|
|
1048
|
+
await endpoint.configureReporting('manuSpecificIkeaAirPurifier', [{attribute: 'filterRunTime',
|
|
1049
|
+
minimumReportInterval: repInterval.HOUR, maximumReportInterval: repInterval.HOUR, reportableChange: 0}],
|
|
1050
|
+
manufacturerOptions);
|
|
1051
|
+
await endpoint.configureReporting('manuSpecificIkeaAirPurifier', [{attribute: 'fanMode',
|
|
1052
|
+
minimumReportInterval: 0, maximumReportInterval: repInterval.HOUR, reportableChange: 1}],
|
|
1053
|
+
manufacturerOptions);
|
|
1054
|
+
await endpoint.configureReporting('manuSpecificIkeaAirPurifier', [{attribute: 'fanSpeed',
|
|
1055
|
+
minimumReportInterval: 0, maximumReportInterval: repInterval.HOUR, reportableChange: 1}],
|
|
1056
|
+
manufacturerOptions);
|
|
1057
|
+
|
|
1058
|
+
await endpoint.read('manuSpecificIkeaAirPurifier', ['controlPanelLight', 'childLock', 'filterRunTime']);
|
|
1059
|
+
},
|
|
1060
|
+
ota: ota.tradfri,
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
zigbeeModel: ['TRADFRIbulbE14WScandleopal470lm', 'TRADFRIbulbE12WScandleopal450lm'],
|
|
1064
|
+
model: 'LED1949C5',
|
|
1065
|
+
vendor: 'IKEA',
|
|
1066
|
+
description: 'TRADFRI LED bulb E12/E14 450/470 lumen, wireless dimmable white spectrum/chandelier opal white',
|
|
1067
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
zigbeeModel: ['NYMANE PENDANT'],
|
|
1071
|
+
model: '90504044',
|
|
1072
|
+
vendor: 'IKEA',
|
|
1073
|
+
description: 'NYMÅNE Pendant lamp',
|
|
1074
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
1075
|
+
},
|
|
1076
|
+
{
|
|
1077
|
+
zigbeeModel: ['STOFTMOLN ceiling/wall lamp WW37'],
|
|
1078
|
+
model: 'T2037',
|
|
1079
|
+
vendor: 'IKEA',
|
|
1080
|
+
description: 'STOFTMOLN ceiling/wall lamp 37 warm light dimmable',
|
|
1081
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
1082
|
+
},
|
|
1083
|
+
{
|
|
1084
|
+
zigbeeModel: ['STOFTMOLN ceiling/wall lamp WW24'],
|
|
1085
|
+
model: 'T2035',
|
|
1086
|
+
vendor: 'IKEA',
|
|
1087
|
+
description: 'STOFTMOLN ceiling/wall lamp 24 warm light dimmable',
|
|
1088
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
zigbeeModel: ['STOFTMOLN ceiling/wall lamp WW10'],
|
|
1092
|
+
model: 'T2105',
|
|
1093
|
+
vendor: 'IKEA',
|
|
1094
|
+
description: 'STOFTMOLN ceiling/wall lamp 10 warm light dimmable',
|
|
1095
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
1096
|
+
},
|
|
1097
|
+
{
|
|
1098
|
+
zigbeeModel: ['TRADFRIbulbPAR38WS900lm'],
|
|
1099
|
+
model: 'LED2006R9',
|
|
1100
|
+
vendor: 'IKEA',
|
|
1101
|
+
description: 'TRADFRI E26 PAR38 LED bulb 900 lumen, dimmable, white spectrum, downlight',
|
|
1102
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
zigbeeModel: ['Floor lamp WW'],
|
|
1106
|
+
model: 'G2015',
|
|
1107
|
+
vendor: 'IKEA',
|
|
1108
|
+
description: 'PILSKOTT LED floor lamp',
|
|
1109
|
+
extend: tradfriExtend.light_onoff_brightness(),
|
|
1110
|
+
},
|
|
1111
|
+
{
|
|
1112
|
+
zigbeeModel: ['VINDSTYRKA'],
|
|
1113
|
+
model: 'E2112',
|
|
1114
|
+
vendor: 'IKEA',
|
|
1115
|
+
description: 'Vindstyrka air quality and humidity sensor',
|
|
1116
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.pm25, ikea.fz.ikea_voc_index],
|
|
1117
|
+
toZigbee: [],
|
|
1118
|
+
exposes: [e.temperature(), e.humidity(), e.pm25(), e.voc_index().withDescription('Sensirion VOC index')],
|
|
1119
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1120
|
+
const ep = device.getEndpoint(1);
|
|
1121
|
+
await reporting.bind(ep, coordinatorEndpoint,
|
|
1122
|
+
['msTemperatureMeasurement', 'msRelativeHumidity', 'pm25Measurement', 'msIkeaVocIndexMeasurement']);
|
|
1123
|
+
await ep.configureReporting('msTemperatureMeasurement', [{
|
|
1124
|
+
attribute: 'measuredValue',
|
|
1125
|
+
minimumReportInterval: 60, maximumReportInterval: 120,
|
|
1126
|
+
}]);
|
|
1127
|
+
await ep.configureReporting('msRelativeHumidity', [{
|
|
1128
|
+
attribute: 'measuredValue',
|
|
1129
|
+
minimumReportInterval: 60, maximumReportInterval: 120,
|
|
1130
|
+
}]);
|
|
1131
|
+
await ep.configureReporting('pm25Measurement', [{
|
|
1132
|
+
attribute: 'measuredValueIkea',
|
|
1133
|
+
minimumReportInterval: 60, maximumReportInterval: 120, reportableChange: 2,
|
|
1134
|
+
}]);
|
|
1135
|
+
await ep.configureReporting('msIkeaVocIndexMeasurement', [{
|
|
1136
|
+
attribute: 'measuredValue',
|
|
1137
|
+
minimumReportInterval: 60, maximumReportInterval: 120,
|
|
1138
|
+
}]);
|
|
1139
|
+
},
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
zigbeeModel: ['SYMFONISK sound remote gen2'],
|
|
1143
|
+
model: 'E2123',
|
|
1144
|
+
vendor: 'IKEA',
|
|
1145
|
+
description: 'SYMFONISK sound remote gen2',
|
|
1146
|
+
fromZigbee: [ikea.fz.battery, fz.legacy.E1744_play_pause, ikea.fz.ikea_track_click, ikea.fz.ikea_volume_click,
|
|
1147
|
+
ikea.fz.ikea_volume_hold, ikea.fz.ikea_dots_click_v1, ikea.fz.ikea_dots_click_v2],
|
|
1148
|
+
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['toggle', 'track_previous', 'track_next', 'volume_up',
|
|
1149
|
+
'volume_down', 'volume_up_hold', 'volume_down_hold', 'dots_1_initial_press', 'dots_2_initial_press',
|
|
1150
|
+
'dots_1_long_press', 'dots_2_long_press', 'dots_1_short_release', 'dots_2_short_release', 'dots_1_long_release',
|
|
1151
|
+
'dots_2_long_release', 'dots_1_double_press', 'dots_2_double_press'])],
|
|
1152
|
+
toZigbee: [tz.battery_percentage_remaining],
|
|
1153
|
+
ota: ota.zigbeeOTA,
|
|
1154
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1155
|
+
const endpoint1 = device.getEndpoint(1);
|
|
1156
|
+
const endpoint2 = device.getEndpoint(2);
|
|
1157
|
+
const endpoint3 = device.getEndpoint(3);
|
|
1158
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'genPollCtrl']);
|
|
1159
|
+
if (endpoint2) {
|
|
1160
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['heimanSpecificScenes']);
|
|
1161
|
+
}
|
|
1162
|
+
if (endpoint3) {
|
|
1163
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['heimanSpecificScenes']);
|
|
1164
|
+
}
|
|
1165
|
+
await reporting.batteryVoltage(endpoint1);
|
|
1166
|
+
},
|
|
1167
|
+
},
|
|
1168
|
+
];
|