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 +5 -215
- package/admin/img/ikea_symfonisk_remote_gen2.png +0 -0
- package/admin/img/next_track.png +0 -0
- package/admin/img/play_pause.png +0 -0
- package/admin/img/previous_track.png +0 -0
- package/io-package.json +22 -16
- package/lib/binding.js +28 -26
- package/lib/commands.js +73 -69
- package/lib/devices.js +8 -0
- package/lib/states.js +194 -2
- package/lib/zigbeecontroller.js +6 -2
- package/main.js +4 -4
- package/package.json +8 -8
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
|
-
|
|
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
|
|
Binary file
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "1.10.
|
|
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 (
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
this.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
this.
|
|
70
|
-
|
|
71
|
-
|
|
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 (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
136
|
-
|
|
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
|
|
1039
|
-
icon:
|
|
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',
|
package/lib/zigbeecontroller.js
CHANGED
|
@@ -505,7 +505,11 @@ class ZigbeeController extends EventEmitter {
|
|
|
505
505
|
if (isFunction(devid) && !isFunction(failure)) {
|
|
506
506
|
failure = devid;
|
|
507
507
|
} else {
|
|
508
|
-
|
|
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
|
|
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
|
|
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
|
|
748
|
-
if (preparedOptions
|
|
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.
|
|
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.
|
|
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.
|
|
30
|
-
"zigbee-herdsman-converters": "
|
|
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.
|
|
40
|
-
"chai": "^4.
|
|
39
|
+
"axios": "^1.6.8",
|
|
40
|
+
"chai": "^4.4.1",
|
|
41
41
|
"chai-as-promised": "^7.1.1",
|
|
42
|
-
"eslint": "^8.
|
|
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.
|
|
49
|
+
"mocha": "^10.4.0"
|
|
50
50
|
},
|
|
51
51
|
"homepage": "https://github.com/ioBroker/ioBroker.zigbee",
|
|
52
52
|
"keywords": [
|