iobroker.zigbee 1.10.2 → 1.10.3

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/README.md CHANGED
@@ -128,12 +128,15 @@ or
128
128
  ## Donate
129
129
 
130
130
  You can thank the authors by these links:
131
- * to Kirov Ilya https://www.paypal.me/goofyk
132
131
  * to Arthur Rupp https://paypal.me/ArthurRupp
133
132
 
134
133
  -----------------------------------------------------------------------------------------------------
135
134
 
136
135
  ## Changelog
136
+ ### 1.10.3 (2024-04-06)
137
+ * (arteck) dependency update
138
+ *
139
+
137
140
  ### 1.10.2 (2024-01-25)
138
141
  * (arteck) dependency update
139
142
 
@@ -332,220 +335,7 @@ You can thank the authors by these links:
332
335
  ### 1.6.1 (2021-08)
333
336
  * (kirovilya) herdsman compatibility
334
337
 
335
- ### 1.6.0 (2021-08-09)
336
-
337
- ### 1.5.6 (2021-05-26)
338
- * (kirovilya) new UI add
339
-
340
- ### 1.5.5 (2021-05-05)
341
- * Fixes for new zigbee-herdsman-converters
342
- * UI fixes
343
-
344
- ### 1.5.3 (2021-04-30)
345
- * (arteck) Fix for js-controller 3.3.*
346
-
347
- ### 1.5.2 (2021-04-29)
348
- * (asgothian) Groups on dashboard
349
-
350
- ### 1.5.1 (2021-04-14)
351
- * (kirovilya) Dashboard
352
- * (asgothian) Groups (reworked)
353
- * [Experimental support EZSP protocol for EFR32 chips](https://github.com/Koenkk/zigbee-herdsman/issues/319) (zigbee-herdsman)
354
-
355
- ### 1.4.4 (2021-02-14)
356
- * (kirovilya) External converters https://www.zigbee2mqtt.io/information/configuration.html#external-converters-configuration
357
- * (asgothian) Enhancement ping process
358
- * (asgothian) Devive query state-button
359
- * (asgothian) State Cleanup button
360
- * (arteck) Setting to use exposes instead of internal device description
361
-
362
- ### 1.4.1 (2020-12)
363
- * (o0shojo0o) added a kelvin possibility into colortemp
364
- * (asgothian) Hue_calibration for exposed devices (Use requires PR on zigbee-herdsman-converters, PR is being worked on)
365
- * (asgothian) fix Tuya Thermostat: restore lost property "preset"
366
- * (asgothian) Change for Device Availability: Stagger initial ping by 200 ms to prevent network congestion due to a large number of ping requests
367
- * (asgothian) Change for Device Availability: Ping request triggered on reconnect. Before the herdsman Ping function is used, the adapter attempts to read the "state" dp. If this is successful, no ping is sent and the state is set
368
- * (asgothian) Change for Device Availability: Set link Quality to 0 when a device is not connected, 10 when it is reconnecting.
369
- * (asgothian) fix for message "illegal properties x,y" - remove color and color_temp from readable states on device available again (Issue #607)
370
- * (asgothian) RGB Color can now be entered as "named" color. Implemented names are taken from the list of extended web colors on wikipedia (https://en.wikipedia.org/wiki/Web_colors)
371
- * (asgothian) change in how RGB color is parsed. Incomplete colors will now be parsed successfully. #FFF will result in R 0, G 15, B 255
372
- * (asgothian) change in OTA: Message that a device does not respond for OTA query downgraded to "info" from "error"
373
- * (asgothian) new coordinator card
374
-
375
- ### 1.4.0 (2020-12)
376
- * Many new devices available
377
-
378
- Starting from version 1.4.0, new devices in iobroker.zigbee will be added automatically, based on the *exposes* described in zigbee-herdsman-converters.
379
- The *exposes* section describes the device's capabilities, events and control commands. In iobroker.zigbee these descriptions are converted to iobroker states.
380
- This means that the new device is described correctly enough in zigbee-herdsman-converters to start working with iobroker.zigbee (do not need to add it to our /lib/devices files.js and /lib/states.js).
381
-
382
- The only thing that is not described (yet, it may change in the future) in zigbee-herdsman-converters is the device image. This is why the device icon on network map uses external links to the resource https://www.zigbee2mqtt.io/images/devices/*.
383
- If you want to use local images, then you need to put the image file in /admin/img and briefly describe the device in the /lib/devices.js file without the *states*:
384
- ```
385
- {
386
- models: [‘01MINIZB’],
387
- icon: 'img/ITEAD01ZBMINI. png',
388
- }
389
- ```
390
- in this case, the *states* attribute will be formed based on the *exposes* description and the image will be local.
391
-
392
- ### 1.3.1 (2020-10-30)
393
- * [Experimental Zigate support](https://github.com/Koenkk/zigbee-herdsman/issues/242) (zigbee-herdsman)
394
- * New devices by:
395
- asgothian, arteck, kirovilya, PaulchenPlump
396
-
397
- ### 1.3.0 (2020-10-07)
398
- * More stable (zigbee-herdsman)
399
- * Backup prior database and nv-data (for z-stack 3) before start adapter
400
- * Allow to select bind cluster
401
- * Admin Tab support (experimental)
402
- * (UncleSamSwiss, DutchmanNL) Translation
403
- * New devices by:
404
- arteck, kirovilya, Shade, krumbholz, fre, Alex18081, ae, asgothian,
405
- Strunzdesign, kairauer, VLGorskij, Hesse-Bub, PaulchenPlump, blackrozes
406
-
407
- ### 1.2.1 (2020-08-16)
408
- * Fixes after changing device identify method
409
- * (Garfonso) Allow to unbind from coordinator
410
-
411
- ### 1.2.0 (2020-08-09)
412
- * Serialport 9.0.0. (zigbee-herdsman)
413
- * Drop support Node < 10 (zigbee-herdsman)
414
- * Device now identify (for zigbee-herdsman-converters) by model not zigbeeModel
415
-
416
- Improvements and fixes:
417
- * (Strunzdesign) Fixed the mapping between bulb levels and adapter levels
418
- * (kirovilya) Fix ota for unavailable devices
419
- * (kirovilya) Lazy states - created only when an event arrives
420
- * (kirovilya) States generator - states are created depending on the device and its endpoints
421
- * (Shade) Fixed WXKG11LM clicks
422
- * (allofmex) Improved DeveloperTab logs
423
- * (allofmex) Add humidity and temperature calibration state to Tuya RH3052
424
- * (kirovilya) Fixed a typo due to which extPanID was not set
425
- * (allofmex) Retry reconnect gateway all the time for tcp connected gateway
426
- * (kirovilya) Allow to collect zigbee-herdsman logs to iobroker logs
427
- * (kirovilya) Additional states for QBKG12LM
428
-
429
- New devices:
430
- * (kirovilya) BlitzWolf BW-IS3, Paulmann 500.67, Paulmann 798.09
431
- * (kirovilya) DiY Geiger counter https://modkam.ru/?p=1591
432
- * (kirovilya) DiY 8 Relays + 8 switches https://modkam.ru/?p=1638
433
- * (kirovilya) DiY Freepad https://github.com/diyruz/freepad
434
- * (kirovilya) Neo Zigbee Siren Alarm https://szneo.com/en/products/show.php?id=241
435
- * (Shade) RB 278 T
436
- * (arteck) TS0601_thermostat
437
- * (arteck) TS0121
438
- * (arteck) GL-D-004Z
439
- * (Shade) WXKG07LM
440
- * (drohne200) 1746430P7
441
- * (sebastian) 4058075816459
442
- * (itProfi) SGMHM-I1
443
- * (arteck) owvfni3
444
- * (arteck) TS0001, TS0111
445
- * (Daniel Dreier) Paulmann 500.45
446
- * (arteck) ZK-EU-2U
447
- * (Newan) Busch-Jaeger 6735/6736/6737
448
- * (andrico21) ZM-L03E-Z
449
- * (arteck) 915005106701, 9290018187B
450
- * (frankjoke) HGZB-20-UK, GL-W-001Z
451
- * (arteck) 4034031P7, 3435011P7
452
- * (arteck) TS0041
453
- * (agross) 5062231P7, 5062431P7
454
- * (kirovilya) TI0001-switch, TI0001-socket
455
- * (arteck) RB 178 T
456
- * (arteck) HGZB-07A, AV2010/22, AV2010/22A, TS0041, TS0043
457
- * (nbars) E1744
458
- * (Florian Look) GS361A-H04
459
- * (arteck) ICZB-IW11SW
460
- * (kirovilya) HS2WD-E
461
- * (Sacred-Shadow) FL 130 C
462
- * (arteck) HS3SA, 9290022169, 4096730U7, AC10787, SP 220, SP 222, SP 224, 07004D, BW-IS2, InstaRemote
463
- * (kirovilya) MCLH-08, MCLH-05
464
- * (Sacred-Shadow) 1746130P7
465
- * (mar565) GUNNARP panel round
466
- * (Erdnuss3003) 4090531P7
467
-
468
- ### 1.1.1 (2020-04-17)
469
- * (kirovilya) Critical. Fixed error starting adapter if cc-chip was only flashed
470
- * (kirovilya) Nue/3A FNB56-ZSW02LX2.0
471
- * (Strunzdesign) Added missing raw button events for Philips Hue Smart Button ROM001
472
- * (Sacred-Shadow) Fix Color for Outdoor Lantern W RGBW OSRAM
473
-
474
- ### 1.1.0 (2020-04-12)
475
- new Zigbee-herdsman features:
476
- * ConBee/RaspBee (experimental support) https://github.com/Koenkk/zigbee-herdsman/issues/72
477
- * OTA update for some devices (IKEA, OSRAM and other) https://github.com/Koenkk/zigbee2mqtt/issues/2921
478
- * Touchlink reset and join https://github.com/Koenkk/zigbee2mqtt/issues/2396
479
- * Green Power devices support https://github.com/Koenkk/zigbee2mqtt/issues/3322
480
- * (peterfido) iCasa KPD14S und KPD18S hinzu
481
- * (kirovilya) Moes Zigbee Thermostatic Radiator
482
- * (kirovilya) LifeControl power plug MCLH-03, bulb MCLH-02, water leak MCLH-07, door sensor MCLH-04
483
- * (kirovilya) Philips LCT002, LCT011, LTW015, LWG004
484
- * (kirovilya) Gledopto GL-C-007 with with channel
485
- * (MultivitaminJuice) Iluminize 511.040
486
- * (Sacred-Shadow) Bitron 902010/24
487
- * (kirovilya) Color indication of LQI and Battery icon
488
- * (kirovilya) Device info modal dialog
489
- * (arteck) Philips LCT026
490
- * (obakuhl) Improvements Osram switch mini
491
- * (arteck) Nue / 3A FB56+ZSW1GKJ2.5, LXN-1S27LX1.0
492
- * (agross) Philips Signe Floor and Table
493
- * (arteck) TRADFRI bulb E14 WS 470lm, OSRAM PAR16 TW Z3
494
- * (kirovilya) Smart remote controller (4 buttons)
495
- * (allofmex) OTA updates
496
- * (kirovilya) Aqara opple change mode keys (for binding)
497
- * (palsch) Heiman HS2WD-E siren
498
-
499
- ### 1.0.4 (2020-03-14)
500
- * (kirovilya) Philips Hue Adore Bathroom Mirror Light
501
- * (kirovilya) Oujiabao Gas and carbon monoxide alarm
502
- * (kirovilya) Tuya SOS button
503
- * (Erdnuss3003) Schwaiger ZBT-DIMLight-GLS0800
504
- * (arteck) Smart Home Pty FB56-ZCW11HG1.4, LXT56-LS27LX1.7
505
- * (arteck) Xiaomi plug lumi.plug.mmeu01
506
- * (arteck) Innr RS 228 T, RS 230 C
507
- * (arteck) Gledopto GL-MC-001, GL-D-003ZS
508
- * (allmyjoes) Bitron AV2010/21A
509
- * (arteck) Osram Panel TW 595 UGR22
510
- * (kirovilya) IKEA SURTE door WS 38x64
511
- * (andigandi) Philips Hue LCG002, Hue LTG002
512
- * (arteck) iCasa ICZB-FC
513
- * (arteck) Osram A60 DIM Z3
514
- * (arteck) Paulmann 371000001
515
- * (DaCHRIS) Osram PAR16 DIM Z3
516
- * (DaCHRIS) Philips LWG001
517
- * (DaCHRIS) Illuminize 511.202
518
- * (SchumyHao) TERNCY-SD01 knob dimmer
519
- * (SchumyHao) Xiaomi lumi.lock.aq1
520
- * (kirovilya) New eWeLink devices: button, TH sensor, contact sensor, motion sensor
521
- * (kirovilya) Allow pairing to routers (again)
522
- * (Erdnuss3003) Philips Hue LCT021
523
- * (root) Trust ZWLD-100 water leak sensor
524
- * (smartpran) Bitron AV2010/32
525
-
526
- ### 1.0.3 (2020-02-09)
527
- * (Tw1nh34d) Hornbach FLAIR LED
528
- * (asgothian) Hue smart button, Heiman smoke sensor
529
- * (kirovilya) Philips LTC014, LTC015
530
- * (kirovilya) Power states for QBKG11LM
531
- * (Garfonso) Change role for occupancy state to 'sensor.motion'
532
- * (kirovilya) Change illuminance state to illuminance_lux (for lux value)
533
- * (arteck) Philips LCF002
534
- * (arteck) TRADFRI open/close remote
535
- * (kirovilya) Tuya sensor TS0201
536
-
537
- ### 1.0.2 (2020-01-29)
538
- * (kirovilya) All button events for Aqara Opple switch
539
- * (ma-john) OSRAM PAR16 RGBW Z3
540
- * (arteck) Phillips LWA004
541
- * (MiniMe6666) Heiman SmokeSendor-N-3.0
542
- * (kirovilya) Force remove device
543
- * (kirovilya) Fix some networkmap bugs
544
- * (kirovilya) Extended info button
545
- * (kirovilya) Long press for WXKG01LM
546
-
547
- ### 1.0.1 (2020-01-23)
548
- * fix for old z-stack firmware
338
+ ----
549
339
 
550
340
  ### 1.0.0 (2020-01-22)
551
341
  * Powered by new [zigbee-herdsman](https://github.com/Koenkk/zigbee-herdsman) library and new [converters database](https://github.com/Koenkk/zigbee-herdsman-converters)
Binary file
Binary file
Binary file
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee",
4
- "version": "1.10.2",
4
+ "version": "1.10.3",
5
5
  "news": {
6
+ "1.10.3": {
7
+ "en": "dependency update\n",
8
+ "de": "aktualisierung der abhängigkeit\n",
9
+ "ru": "обновление\n",
10
+ "pt": "atualização de dependência\n",
11
+ "nl": "afhankelijkheidsupdate\n",
12
+ "fr": "mise à jour de la dépendance\n",
13
+ "it": "aggiornamento della dipendenza\n",
14
+ "es": "actualización de la dependencia\n",
15
+ "pl": "aktualizacja zależności\n",
16
+ "uk": "оновлення залежності\n",
17
+ "zh-cn": "依赖性更新\n"
18
+ },
6
19
  "1.10.2": {
7
20
  "en": "dependency update",
8
21
  "de": "aktualisierung der abhängigkeit",
@@ -80,19 +93,6 @@
80
93
  "pl": "zależności\nwęzeł 18.x.",
81
94
  "uk": "оновлення залежності\nхв вузол 18.x.",
82
95
  "zh-cn": "更新\n第18.x条."
83
- },
84
- "1.9.4": {
85
- "en": "typo",
86
- "de": "typo",
87
- "ru": "тип",
88
- "pt": "tipo",
89
- "nl": "type",
90
- "fr": "type",
91
- "it": "tipo",
92
- "es": "tipo",
93
- "pl": "typ",
94
- "uk": "тип",
95
- "zh-cn": "类型"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -121,6 +121,10 @@
121
121
  "pl": "Adapter Zigbee do urządzeń Xiaomi (i innych) za pośrednictwem Chip cc26xx/cc25xx",
122
122
  "zh-cn": "适用于小米(和其他)设备的Zigbee适配器,通过Chip cc26xx/cc25xx"
123
123
  },
124
+ "docs": {
125
+ "en": "docs/en/readme.md",
126
+ "de": "docs/en/readme.md"
127
+ },
124
128
  "authors": [
125
129
  "Kirov Ilya<kirovilya@gmail.com>"
126
130
  ],
@@ -144,15 +148,17 @@
144
148
  "readme": "https://github.com/ioBroker/ioBroker.zigbee/blob/master/README.md",
145
149
  "loglevel": "info",
146
150
  "type": "hardware",
147
- "materialize": true,
148
151
  "supportedMessages": {
149
152
  "deviceManager": true
150
153
  },
154
+ "adminUI": {
155
+ "config": "materialize",
156
+ "tab": "materialize"
157
+ },
151
158
  "messagebox": true,
152
159
  "stopBeforeUpdate": true,
153
160
  "dataFolder": "zigbee_%INSTANCE%",
154
161
  "compact": true,
155
- "materializeTab": true,
156
162
  "connectionType": "local",
157
163
  "dataSource": "push",
158
164
  "tier": 2,
package/lib/binding.js CHANGED
@@ -43,32 +43,34 @@ class Binding {
43
43
  * @param {ioBroker.Message} obj
44
44
  */
45
45
  onMessage(obj) {
46
- if (typeof obj === 'object' && obj.command) {
47
- switch (obj.command) {
48
- case 'addBinding':
49
- if (obj && obj.message && typeof obj.message === 'object') {
50
- this.addBinding(obj.from, obj.command, obj.message, err =>
51
- this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
52
- }
53
- break;
54
- case 'editBinding':
55
- if (obj && obj.message && typeof obj.message === 'object') {
56
- this.editBinding(obj.from, obj.command, obj.message, err =>
57
- this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
58
- }
59
- break;
60
- case 'getBinding':
61
- if (obj && obj.message && typeof obj.message === 'object') {
62
- this.getBinding(binding =>
63
- this.adapter.sendTo(obj.from, obj.command, binding, obj.callback));
64
- }
65
- break;
66
- case 'delBinding':
67
- if (obj && obj.message) {
68
- this.delBinding(obj.from, obj.command, obj.message, err =>
69
- this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
70
- }
71
- break;
46
+ if (obj) {
47
+ if (typeof obj === 'object' && obj.command) {
48
+ switch (obj.command) {
49
+ case 'addBinding':
50
+ if (obj.message && typeof obj.message === 'object') {
51
+ this.addBinding(obj.from, obj.command, obj.message, err =>
52
+ this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
53
+ }
54
+ break;
55
+ case 'editBinding':
56
+ if (obj.message && typeof obj.message === 'object') {
57
+ this.editBinding(obj.from, obj.command, obj.message, err =>
58
+ this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
59
+ }
60
+ break;
61
+ case 'getBinding':
62
+ if (obj.message && typeof obj.message === 'object') {
63
+ this.getBinding(binding =>
64
+ this.adapter.sendTo(obj.from, obj.command, binding, obj.callback));
65
+ }
66
+ break;
67
+ case 'delBinding':
68
+ if (obj.message) {
69
+ this.delBinding(obj.from, obj.command, obj.message, err =>
70
+ this.adapter.sendTo(obj.from, obj.command, err, obj.callback));
71
+ }
72
+ break;
73
+ }
72
74
  }
73
75
  }
74
76
  }
package/lib/commands.js CHANGED
@@ -46,73 +46,75 @@ class Commands {
46
46
  * @param {ioBroker.Message} obj
47
47
  */
48
48
  onMessage(obj) {
49
- if (typeof obj === 'object' && obj.command) {
50
- switch (obj.command) {
51
- case 'reset':
52
- if (obj && obj.message && obj.message.mode == 'delNvbackup') {
53
- this.delNvBackup(obj.from, obj.command, obj.message, obj.callback);
54
- }
55
- break;
56
- case 'letsPairing':
57
- if (obj && obj.message && typeof obj.message === 'object') {
58
- this.letsPairing(obj.from, obj.command, obj.message, obj.callback);
59
- }
60
- break;
61
- case 'touchlinkReset':
62
- if (obj && obj.message && typeof obj.message === 'object') {
63
- this.touchlinkReset(obj.from, obj.command, obj.message, obj.callback);
64
- }
65
- break;
66
- case 'getDevices':
67
- if (obj && obj.message && typeof obj.message === 'object') {
68
- this.getDevices(obj.from, obj.command, null, obj.callback);
69
- }
70
- break;
71
- case 'renameDevice':
72
- if (obj && obj.message && typeof obj.message === 'object') {
73
- this.renameDevice(obj.from, obj.command, obj.message, obj.callback);
74
- }
75
- break;
76
- case 'deleteDevice':
77
- if (obj && obj.message && typeof obj.message === 'object') {
78
- this.deleteDevice(obj.from, obj.command, obj.message, obj.callback);
79
- }
80
- break;
81
- case 'getChannels':
82
- if (obj && obj.message && typeof obj.message === 'object') {
83
- this.getChannels(obj.from, obj.command, obj.message, obj.callback);
84
- }
85
- break;
86
- case 'getCoordinatorInfo':
87
- if (obj && obj.message && typeof obj.message === 'object') {
88
- this.getCoordinatorInfo(obj.from, obj.command, obj.callback);
89
- }
90
- break;
91
- case 'cleanDeviceStates':
92
- if (obj && obj.message && typeof obj.message === 'object') {
93
- this.cleanDeviceStates(obj.from, obj.command, obj.message, obj.callback);
94
- }
95
- break;
96
- case 'setState':
97
- if (obj && obj.message && typeof obj.message === 'object' && obj.message.id) {
98
- this.stController.setState_typed(obj.message.id, obj.message.val, false, undefined, obj.callback);
99
- }
100
- break;
101
- case 'getDevice':
102
- if (obj && obj.message && typeof obj.message === 'object' && obj.message.id) {
103
- this.getDevices(obj.from, obj.command, obj.message.id, obj.callback);
104
- }
105
- break;
106
- case 'reconfigure':
107
- if (obj && obj.message && typeof obj.message === 'object') {
108
- this.reconfigure(obj.from, obj.command, obj.message, obj.callback);
109
- }
110
- break;
111
- case 'setDeviceActivated':
112
- if (obj && obj.message && typeof obj.message === 'object') {
113
- this.setDeviceActivated(obj.from, obj.command, obj.message, obj.callback);
114
- }
115
- break;
49
+ if (obj) {
50
+ if (typeof obj === 'object' && obj.command) {
51
+ switch (obj.command) {
52
+ case 'reset':
53
+ if (obj.message && obj.message.mode == 'delNvbackup') {
54
+ this.delNvBackup(obj.from, obj.command, obj.message, obj.callback);
55
+ }
56
+ break;
57
+ case 'letsPairing':
58
+ if (obj.message && typeof obj.message === 'object') {
59
+ this.letsPairing(obj.from, obj.command, obj.message, obj.callback);
60
+ }
61
+ break;
62
+ case 'touchlinkReset':
63
+ if (obj.message && typeof obj.message === 'object') {
64
+ this.touchlinkReset(obj.from, obj.command, obj.message, obj.callback);
65
+ }
66
+ break;
67
+ case 'getDevices':
68
+ if (obj.message && typeof obj.message === 'object') {
69
+ this.getDevices(obj.from, obj.command, null, obj.callback);
70
+ }
71
+ break;
72
+ case 'renameDevice':
73
+ if (obj.message && typeof obj.message === 'object') {
74
+ this.renameDevice(obj.from, obj.command, obj.message, obj.callback);
75
+ }
76
+ break;
77
+ case 'deleteDevice':
78
+ if (obj.message && typeof obj.message === 'object') {
79
+ this.deleteDevice(obj.from, obj.command, obj.message, obj.callback);
80
+ }
81
+ break;
82
+ case 'getChannels':
83
+ if (obj.message && typeof obj.message === 'object') {
84
+ this.getChannels(obj.from, obj.command, obj.message, obj.callback);
85
+ }
86
+ break;
87
+ case 'getCoordinatorInfo':
88
+ if (obj && obj.message && typeof obj.message === 'object') {
89
+ this.getCoordinatorInfo(obj.from, obj.command, obj.callback);
90
+ }
91
+ break;
92
+ case 'cleanDeviceStates':
93
+ if (obj.message && typeof obj.message === 'object') {
94
+ this.cleanDeviceStates(obj.from, obj.command, obj.message, obj.callback);
95
+ }
96
+ break;
97
+ case 'setState':
98
+ if (obj.message && typeof obj.message === 'object' && obj.message.id) {
99
+ this.stController.setState_typed(obj.message.id, obj.message.val, false, undefined, obj.callback);
100
+ }
101
+ break;
102
+ case 'getDevice':
103
+ if (obj.message && typeof obj.message === 'object' && obj.message.id) {
104
+ this.getDevices(obj.from, obj.command, obj.message.id, obj.callback);
105
+ }
106
+ break;
107
+ case 'reconfigure':
108
+ if (obj.message && typeof obj.message === 'object') {
109
+ this.reconfigure(obj.from, obj.command, obj.message, obj.callback);
110
+ }
111
+ break;
112
+ case 'setDeviceActivated':
113
+ if (obj.message && typeof obj.message === 'object') {
114
+ this.setDeviceActivated(obj.from, obj.command, obj.message, obj.callback);
115
+ }
116
+ break;
117
+ }
116
118
  }
117
119
  }
118
120
  }
@@ -132,8 +134,10 @@ class Commands {
132
134
  if (this.zbController) {
133
135
  let devId = '';
134
136
  if (message) {
135
- if (message.id) devId = getZbId(message.id);
136
- if (message.code) {
137
+ if (message.id && message.id != undefined) {
138
+ devId = getZbId(message.id);
139
+ }
140
+ if (message.code && message.code != undefined) {
137
141
  try {
138
142
  this.debug(`letsPairing called with code ${message.code}`);
139
143
  const success = await this.zbController.addPairingCode(message.code);
package/lib/devices.js CHANGED
@@ -1516,6 +1516,14 @@ const devices = [
1516
1516
  states: [states.button_action_skip_back, states.button_action_skip_forward, states.action_play_pause,
1517
1517
  states.rotate_left, states.rotate_right, states.rotate_stop, states.battery],
1518
1518
  },
1519
+ {
1520
+ models: ['E2123'],
1521
+ icon: 'img/ikea_symfonisk_remote_gen2.png',
1522
+ states: [states.battery, states.action_play_pause, states.action_track_previous, states.action_track_next,
1523
+ states.action_volume_up, states.action_volume_down, states.action_volume_up_hold, states.action_volume_down_hold,
1524
+ states.action_dots_1_initial_press, states.action_dots_2_initial_press, states.action_dots_1_long_press, states.action_dots_2_long_press, states.action_dots_1_short_release,
1525
+ states.action_dots_2_short_release, states.action_dots_1_long_release, states.action_dots_2_long_release, states.action_dots_1_double_press, states.action_dots_2_double_press],
1526
+ },
1519
1527
  // Hive
1520
1528
  {
1521
1529
  models: ['HALIGHTDIMWWE27'],
package/lib/states.js CHANGED
@@ -1035,8 +1035,8 @@ const states = {
1035
1035
  action_play_pause: {
1036
1036
  id: 'button_play_pause',
1037
1037
  prop: 'action',
1038
- name: 'Play/Pause Button',
1039
- icon: undefined,
1038
+ name: 'Play/Pause button',
1039
+ icon: 'img/play_pause.png',
1040
1040
  role: 'button',
1041
1041
  write: false,
1042
1042
  read: true,
@@ -1044,6 +1044,198 @@ const states = {
1044
1044
  isEvent: true,
1045
1045
  getter: payload => (payload.action === 'play_pause') ? true : undefined,
1046
1046
  },
1047
+ action_track_previous: {
1048
+ id: 'button_track_previous',
1049
+ prop: 'action',
1050
+ name: 'Previous track button',
1051
+ icon: 'img/previous_track.png',
1052
+ role: 'button',
1053
+ write: false,
1054
+ read: true,
1055
+ type: 'boolean',
1056
+ isEvent: true,
1057
+ getter: payload => (payload.action === 'track_previous') ? true : undefined,
1058
+ },
1059
+ action_track_next: {
1060
+ id: 'button_track_next',
1061
+ prop: 'action',
1062
+ name: 'Next track button',
1063
+ icon: 'img/next_track.png',
1064
+ role: 'button',
1065
+ write: false,
1066
+ read: true,
1067
+ type: 'boolean',
1068
+ isEvent: true,
1069
+ getter: payload => (payload.action === 'track_next') ? true : undefined,
1070
+ },
1071
+ action_volume_up: {
1072
+ id: 'button_volume_up',
1073
+ prop: 'action',
1074
+ name: 'Volume up button',
1075
+ icon: undefined,
1076
+ role: 'button',
1077
+ write: false,
1078
+ read: true,
1079
+ type: 'boolean',
1080
+ isEvent: true,
1081
+ getter: payload => (payload.action === 'volume_up') ? true : undefined,
1082
+ },
1083
+ action_volume_down: {
1084
+ id: 'button_volume_down',
1085
+ prop: 'action',
1086
+ name: 'Volume down button',
1087
+ icon: undefined,
1088
+ role: 'button',
1089
+ write: false,
1090
+ read: true,
1091
+ type: 'boolean',
1092
+ isEvent: true,
1093
+ getter: payload => (payload.action === 'volume_down') ? true : undefined,
1094
+ },
1095
+ action_volume_up_hold: {
1096
+ id: 'button_volume_up_hold',
1097
+ prop: 'action',
1098
+ name: 'Volume up button hold',
1099
+ icon: undefined,
1100
+ role: 'button',
1101
+ write: false,
1102
+ read: true,
1103
+ type: 'boolean',
1104
+ isEvent: true,
1105
+ getter: payload => (payload.action === 'volume_up_hold') ? true : undefined,
1106
+ },
1107
+ action_volume_down_hold: {
1108
+ id: 'button_volume_down_hold',
1109
+ prop: 'action',
1110
+ name: 'Volume down button hold',
1111
+ icon: undefined,
1112
+ role: 'button',
1113
+ write: false,
1114
+ read: true,
1115
+ type: 'boolean',
1116
+ isEvent: true,
1117
+ getter: payload => (payload.action === 'volume_down_hold') ? true : undefined,
1118
+ },
1119
+ action_dots_1_initial_press: {
1120
+ id: 'button_dots_1_initial_pressd',
1121
+ prop: 'action',
1122
+ name: 'Dot1 button press init',
1123
+ icon: undefined,
1124
+ role: 'button',
1125
+ write: false,
1126
+ read: true,
1127
+ type: 'boolean',
1128
+ isEvent: true,
1129
+ getter: payload => (payload.action === 'dots_1_initial_press') ? true : undefined,
1130
+ },
1131
+ action_dots_1_long_press: {
1132
+ id: 'button_dots_1_long_press',
1133
+ prop: 'action',
1134
+ name: 'Dot1 button long press',
1135
+ icon: undefined,
1136
+ role: 'button',
1137
+ write: false,
1138
+ read: true,
1139
+ type: 'boolean',
1140
+ isEvent: false,
1141
+ getter: payload => (payload.action === 'dots_1_long_press') ? true : (payload.action === 'dots_1_long_release') ? false : undefined,
1142
+ },
1143
+ action_dots_1_short_release: {
1144
+ id: 'dots_1_short_release',
1145
+ prop: 'action',
1146
+ name: 'Dot1 button short release',
1147
+ icon: undefined,
1148
+ role: 'button',
1149
+ write: false,
1150
+ read: true,
1151
+ type: 'boolean',
1152
+ isEvent: true,
1153
+ getter: payload => (payload.action === 'dots_1_short_release') ? true : undefined,
1154
+ },
1155
+ action_dots_1_long_release: {
1156
+ id: 'dots_1_long_release',
1157
+ prop: 'action',
1158
+ name: 'Dot1 button long release',
1159
+ icon: undefined,
1160
+ role: 'button',
1161
+ write: false,
1162
+ read: true,
1163
+ type: 'boolean',
1164
+ isEvent: true,
1165
+ getter: payload => (payload.action === 'dots_1_long_release') ? true : undefined,
1166
+ },
1167
+ action_dots_1_double_press: {
1168
+ id: 'dots_1_double_press',
1169
+ prop: 'action',
1170
+ name: 'Dot1 button double press',
1171
+ icon: undefined,
1172
+ role: 'button',
1173
+ write: false,
1174
+ read: true,
1175
+ type: 'boolean',
1176
+ isEvent: true,
1177
+ getter: payload => (payload.action === 'dots_1_double_press') ? true : undefined,
1178
+ },
1179
+ action_dots_2_initial_press: {
1180
+ id: 'button_dots_2_initial_press',
1181
+ prop: 'action',
1182
+ name: 'Dot2 button press init',
1183
+ icon: undefined,
1184
+ role: 'button',
1185
+ write: false,
1186
+ read: true,
1187
+ type: 'boolean',
1188
+ isEvent: true,
1189
+ getter: payload => (payload.action === 'dots_2_initial_press') ? true : undefined,
1190
+ },
1191
+ action_dots_2_long_press: {
1192
+ id: 'button_dots_2_long_press',
1193
+ prop: 'action',
1194
+ name: 'Dot2 button long press',
1195
+ icon: undefined,
1196
+ role: 'button',
1197
+ write: false,
1198
+ read: true,
1199
+ type: 'boolean',
1200
+ isEvent: false,
1201
+ getter: payload => (payload.action === 'dots_2_long_press') ? true : (payload.action === 'dots_2_long_release') ? false : undefined,
1202
+ },
1203
+ action_dots_2_short_release: {
1204
+ id: 'dots_2_short_release',
1205
+ prop: 'action',
1206
+ name: 'Dot2 button short release',
1207
+ icon: undefined,
1208
+ role: 'button',
1209
+ write: false,
1210
+ read: true,
1211
+ type: 'boolean',
1212
+ isEvent: true,
1213
+ getter: payload => (payload.action === 'dots_2_short_release') ? true : undefined,
1214
+ },
1215
+ action_dots_2_long_release: {
1216
+ id: 'dots_2_long_release',
1217
+ prop: 'action',
1218
+ name: 'Dot2 button long release',
1219
+ icon: undefined,
1220
+ role: 'button',
1221
+ write: false,
1222
+ read: true,
1223
+ type: 'boolean',
1224
+ isEvent: true,
1225
+ getter: payload => (payload.action === 'dots_2_long_release') ? true : undefined,
1226
+ },
1227
+ action_dots_2_double_press: {
1228
+ id: 'dots_2_double_press',
1229
+ prop: 'action',
1230
+ name: 'Dot2 button double press',
1231
+ icon: undefined,
1232
+ role: 'button',
1233
+ write: false,
1234
+ read: true,
1235
+ type: 'boolean',
1236
+ isEvent: true,
1237
+ getter: payload => (payload.action === 'dots_2_double_press') ? true : undefined,
1238
+ },
1047
1239
  load_power: {
1048
1240
  id: 'load_power',
1049
1241
  prop: 'power',
@@ -505,7 +505,11 @@ class ZigbeeController extends EventEmitter {
505
505
  if (isFunction(devid) && !isFunction(failure)) {
506
506
  failure = devid;
507
507
  } else {
508
- permitDev = this.getDevice(devid);
508
+ if (devid != '') {
509
+ permitDev = this.getDevice(devid);
510
+ } else {
511
+ permitDev = '';
512
+ }
509
513
  }
510
514
 
511
515
  if (permitTime) {
@@ -518,7 +522,7 @@ class ZigbeeController extends EventEmitter {
518
522
  if (permitTime && !this.herdsman.getPermitJoin()) {
519
523
  clearInterval(this._permitJoinInterval);
520
524
  this._permitJoinTime = permitTime;
521
- await this.herdsman.permitJoin(true, permitDev);
525
+ await this.herdsman.permitJoin(true, permitDev, this._permitJoinTime);
522
526
  this._permitJoinInterval = setInterval(async () => {
523
527
  this.emit('pairing', 'Pairing time left', this._permitJoinTime);
524
528
  if (this._permitJoinTime === 0) {
package/main.js CHANGED
@@ -537,12 +537,12 @@ class Zigbee extends utils.Adapter {
537
537
  }
538
538
 
539
539
  let converters = mappedModel.fromZigbee.filter(c => c && c.cluster === cluster && (
540
- (c.type instanceof Array) ? c.type.includes(type) : c.type === type));
540
+ Array.isArray(c.type) ? c.type.includes(type) : c.type === type));
541
541
 
542
542
 
543
543
  if (!converters.length && type === 'readResponse') {
544
544
  converters = mappedModel.fromZigbee.filter(c => c.cluster === cluster && (
545
- (c.type instanceof Array) ? c.type.includes('attributeReport') : c.type === 'attributeReport'));
545
+ Array.isArray(c.type) ? c.type.includes('attributeReport') : c.type === 'attributeReport'));
546
546
  }
547
547
 
548
548
  if (!converters.length) {
@@ -744,8 +744,8 @@ class Zigbee extends utils.Adapter {
744
744
  }
745
745
  }
746
746
 
747
- if (preparedOptions.hasOwnProperty('state')) {
748
- if (preparedOptions !== undefined) {
747
+ if (preparedOptions !== undefined) {
748
+ if (preparedOptions.hasOwnProperty('state')) {
749
749
  meta.state = preparedOptions.state;
750
750
  }
751
751
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zigbee",
3
- "version": "1.10.2",
3
+ "version": "1.10.3",
4
4
  "author": {
5
5
  "name": "Kirov Ilya",
6
6
  "email": "kirovilya@gmail.com"
@@ -21,13 +21,13 @@
21
21
  "serialport": "^12.0.0"
22
22
  },
23
23
  "dependencies": {
24
- "@iobroker/adapter-core": "^3.0.4",
24
+ "@iobroker/adapter-core": "^3.0.6",
25
25
  "@iobroker/dm-utils": "^0.1.9",
26
26
  "humanize-duration": "^3.31.0",
27
27
  "tar": "^6.2.0",
28
28
  "typescript": "^5.3.3",
29
- "zigbee-herdsman": "0.33.2",
30
- "zigbee-herdsman-converters": "18.20.0"
29
+ "zigbee-herdsman": "0.41.2",
30
+ "zigbee-herdsman-converters": "19.15.0"
31
31
  },
32
32
  "description": "Zigbee devices",
33
33
  "devDependencies": {
@@ -36,17 +36,17 @@
36
36
  "@alcalzone/release-script-plugin-license": "^3.7.0",
37
37
  "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
38
38
  "@iobroker/testing": "^4.1.0",
39
- "axios": "^1.6.3",
40
- "chai": "^4.3.5",
39
+ "axios": "^1.6.8",
40
+ "chai": "^4.4.1",
41
41
  "chai-as-promised": "^7.1.1",
42
- "eslint": "^8.52.0",
42
+ "eslint": "^8.57.0",
43
43
  "eslint-config-prettier": "^9.1.0",
44
44
  "eslint-plugin-prettier": "^5.0.0",
45
45
  "gulp": "^4.0.2",
46
46
  "gulp-jsdoc3": "^3.0.0",
47
47
  "gulp-replace": "^1.1.4",
48
48
  "mixin-deep": "^2.0.1",
49
- "mocha": "^10.2.0"
49
+ "mocha": "^10.4.0"
50
50
  },
51
51
  "homepage": "https://github.com/ioBroker/ioBroker.zigbee",
52
52
  "keywords": [