iobroker.zigbee 1.10.13 → 1.10.14
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 +1 -1
- package/README.md +7 -423
- package/admin/img/TS0502B.png +0 -0
- package/io-package.json +14 -14
- package/lib/commands.js +2 -2
- package/lib/devices.js +20 -3
- package/lib/groups.js +20 -22
- package/lib/statescontroller.js +25 -34
- package/main.js +30 -26
- package/package.json +4 -4
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2018-
|
|
3
|
+
Copyright (c) 2018-2025 Kirov Ilya <kirovilya@gmail.com>
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -137,6 +137,11 @@ You can thank the authors by these links:
|
|
|
137
137
|
|
|
138
138
|
-----------------------------------------------------------------------------------------------------
|
|
139
139
|
## Changelog
|
|
140
|
+
### 1.10.14 (2025-01-01)
|
|
141
|
+
* (arteck) Herdsman 2.1.9, Converters 20.58.0
|
|
142
|
+
* (asgothian) Fix: Aqara T1M (CL-L02D)
|
|
143
|
+
* (arteck) deleteDeviceStates change to deleteObj
|
|
144
|
+
|
|
140
145
|
### 1.10.13 (2024-11-10)
|
|
141
146
|
* (arteck) corr icon download bug (axios)
|
|
142
147
|
|
|
@@ -193,407 +198,7 @@ You can thank the authors by these links:
|
|
|
193
198
|
* (arteck) new zigbee-herdsman-converters 18.x
|
|
194
199
|
* (arteck) configure message is now a warning
|
|
195
200
|
|
|
196
|
-
|
|
197
|
-
* (arteck) corr configure for some devices
|
|
198
|
-
|
|
199
|
-
### 1.9.6 (2024-01-01)
|
|
200
|
-
* (arteck) corr ikea bug
|
|
201
|
-
* (crckmc) trv child lock works
|
|
202
|
-
|
|
203
|
-
### 1.9.5 (2023-12-29)
|
|
204
|
-
* (arteck) update dependency
|
|
205
|
-
* (arteck) min node 18.x.
|
|
206
|
-
|
|
207
|
-
### 1.9.4 (2023-12-29)
|
|
208
|
-
* (arteck) typo
|
|
209
|
-
|
|
210
|
-
### 1.9.3 (2023-12-26)
|
|
211
|
-
* (arteck) last zhc Version 16.x
|
|
212
|
-
* (arteck) corr reboot in statecontroller
|
|
213
|
-
|
|
214
|
-
### 1.9.2 (2023-12-25)
|
|
215
|
-
* (arteck) gen states from exposes as function
|
|
216
|
-
* (arteck) rebuild dev_names.json with state cleanup button
|
|
217
|
-
|
|
218
|
-
### 1.9.1 (2023-12-23)
|
|
219
|
-
* (arteck) corr TypeError: Cannot read properties of undefined (reading 'state')
|
|
220
|
-
|
|
221
|
-
### 1.9.0 (2023-12-22)
|
|
222
|
-
* (arteck) up to new zhc
|
|
223
|
-
* (arteck) update dependency
|
|
224
|
-
|
|
225
|
-
### 1.8.27 (2023-12-22)
|
|
226
|
-
* (arteck) update dependency
|
|
227
|
-
|
|
228
|
-
### 1.8.26 (2023-12-22)
|
|
229
|
-
* (arteck) corr toZigbee message
|
|
230
|
-
* (arteck) add deviceManager
|
|
231
|
-
|
|
232
|
-
### 1.8.25 (2023-12-17)
|
|
233
|
-
* zhc 16.x
|
|
234
|
-
* (arteck) corr group from exclude dialog
|
|
235
|
-
|
|
236
|
-
### 1.8.24 (2023-09-05)
|
|
237
|
-
* (arteck) switch to exposes tab for some Aqara Devices [more infos](https://github.com/ioBroker/ioBroker.zigbee/wiki/Exposes-for-device-integration)
|
|
238
|
-
|
|
239
|
-
### 1.8.23 (2023-08-10)
|
|
240
|
-
* (arteck) query from xiaomi is now better
|
|
241
|
-
|
|
242
|
-
### 1.8.22 (2023-08-05)
|
|
243
|
-
* (arteck) crash when meta is empty
|
|
244
|
-
|
|
245
|
-
### 1.8.21 (2023-07-31)
|
|
246
|
-
* (arteck) no converter found
|
|
247
|
-
|
|
248
|
-
### 1.8.20 (2023-07-31)
|
|
249
|
-
* (arteck) add log
|
|
250
|
-
|
|
251
|
-
### 1.8.19 (2023-07-31)
|
|
252
|
-
* (arteck) fix occupancy_timeout
|
|
253
|
-
* (arteck) fix battery percentage and voltage
|
|
254
|
-
|
|
255
|
-
### 1.8.18 (2023-07-16)
|
|
256
|
-
* (arteck) little fix sentry and error log
|
|
257
|
-
|
|
258
|
-
### 1.8.17 (2023-07-15)
|
|
259
|
-
* (arteck) sentry corr
|
|
260
|
-
|
|
261
|
-
### 1.8.16 (2023-07-11)
|
|
262
|
-
* (arteck) battery corr
|
|
263
|
-
|
|
264
|
-
### 1.8.15 (2023-07-11)
|
|
265
|
-
* (arteck) corr battery status
|
|
266
|
-
|
|
267
|
-
### 1.8.13 (2023-07-09)
|
|
268
|
-
* (arteck) ota corr
|
|
269
|
-
* (arteck) devices are wrong with enum exposes
|
|
270
|
-
* (arteck) select field for groups is larger
|
|
271
|
-
* (kirovilya) tuya.whitelabel corr
|
|
272
|
-
|
|
273
|
-
### 1.8.12 (2023-06-30)
|
|
274
|
-
* (arteck) new Documentation (thx Stefan)
|
|
275
|
-
|
|
276
|
-
### 1.8.11 (2022-12-10)
|
|
277
|
-
* (arteck) fix compsite exposes with a list
|
|
278
|
-
|
|
279
|
-
### 1.8.10 (2022-12-12)
|
|
280
|
-
* (asgothian) fix group access
|
|
281
|
-
* (asgothian) add option for pairing code:
|
|
282
|
-
A new icon allows opening the network after first entering a pairing code
|
|
283
|
-
listed on the device
|
|
284
|
-
* (asgothian) easier use of external converters
|
|
285
|
-
- external converters can now be placed in the zigbee adapter data folder
|
|
286
|
-
- no absolite path is required to access them
|
|
287
|
-
- external converters posted on the GitHub for zigbee-herdsman-converters
|
|
288
|
-
should work as they are - folders for libraries are rewritten to match
|
|
289
|
-
the expected location when 'required' from within the zigbee adapter
|
|
290
|
-
- Log entries will identify which files are entered as converters. Errors
|
|
291
|
-
in these files should not cause the adapter to crash - instead, use of
|
|
292
|
-
external converters may be unavailable.
|
|
293
|
-
|
|
294
|
-
### 1.8.9 (2022-12-10)
|
|
295
|
-
* (arteck) fix lidl plug
|
|
296
|
-
|
|
297
|
-
### 1.8.7 (2022-12-01)
|
|
298
|
-
* (arteck) fix exposes
|
|
299
|
-
|
|
300
|
-
### 1.8.5 (2022-11-30)
|
|
301
|
-
* (arteck) fix for new code
|
|
302
|
-
|
|
303
|
-
### 1.8.3 (2022-11-30)
|
|
304
|
-
* (arteck) back to old source
|
|
305
|
-
|
|
306
|
-
### 1.8.1 (2022-11-28)
|
|
307
|
-
* (bluefox) Packages updated
|
|
308
|
-
* (bluefox) Added names of serial ports in configuration dialog
|
|
309
|
-
|
|
310
|
-
### 1.7.7 (2022-11-24)
|
|
311
|
-
* dep update
|
|
312
|
-
|
|
313
|
-
### 1.7.6 (2022-07-23)
|
|
314
|
-
* (kirovilya) fix selecting nodes in admin
|
|
315
|
-
* (arteck) ikea fix
|
|
316
|
-
|
|
317
|
-
### 1.7.5 (2022-06-01)
|
|
318
|
-
* (arteck) error message for undefined devices or icons
|
|
319
|
-
|
|
320
|
-
### 1.7.4 (2022-05-30)
|
|
321
|
-
* (arteck) missing icons with multiple description
|
|
322
|
-
|
|
323
|
-
### 1.7.2 (2022-05-28)
|
|
324
|
-
* (arteck) download missing icons corr
|
|
325
|
-
|
|
326
|
-
### 1.7.1 (2022-05-28)
|
|
327
|
-
* (arteck) available status in admin is colored
|
|
328
|
-
* (arteck) disable Backups checkbox in settings
|
|
329
|
-
* (arteck) we keep last 10 backup files
|
|
330
|
-
* (arteck) download missing icons automatically (manual upload needed)
|
|
331
|
-
|
|
332
|
-
### 1.6.18 (2022-04-21)
|
|
333
|
-
* (arteck) fix pairing modus
|
|
334
|
-
|
|
335
|
-
### 1.6.17 (2022-04)
|
|
336
|
-
rollback
|
|
337
|
-
|
|
338
|
-
### 1.6.16 (2022-02-16)
|
|
339
|
-
* (arteck) admin dep fix
|
|
340
|
-
* (arteck) colored objects for online/offline state
|
|
341
|
-
|
|
342
|
-
### 1.6.15 (2022-02-08)
|
|
343
|
-
* (arteck) Battery status % calculation was changed for xiaomi devices
|
|
344
|
-
|
|
345
|
-
### 1.6.14 (2022-01)
|
|
346
|
-
* (asgothian) OTA limitation
|
|
347
|
-
- devices with the available state set to false are excluded from OTA updates (and the update check)
|
|
348
|
-
- devices with link_quality 0 are excluded from OTA updates (and the update check)
|
|
349
|
-
* (asgothian) Device deactivation:
|
|
350
|
-
- Devices can be marked inactive from the device card.
|
|
351
|
-
- inactive devices are not pinged
|
|
352
|
-
- state changes by the user are not sent to inactive devices.
|
|
353
|
-
- when a pingable device is marked active (from being inactive) it will be pinged again.
|
|
354
|
-
- inactive devices are excluded from OTA updates.
|
|
355
|
-
* (asgothian) Group rework part 2:
|
|
356
|
-
- state device.groups will now be deleted with state Cleanup
|
|
357
|
-
- state info.groups is now obsolete and will be deleted at adapter start (after transferring data to
|
|
358
|
-
the new storage)
|
|
359
|
-
* (asgothian) Device name persistance.
|
|
360
|
-
- Changes to device names made within the zigbee adapter are stored in the file dev_names.json. This file
|
|
361
|
-
is not deleted when the adapter is removed, and will be referenced when a device is added to the zigbee adapter. Deleting and reinstalling the adapter will no longer remove custom device names, nor will deleting and adding the device anew.
|
|
362
|
-
* (asgothian) Readme edit to reflect the current information on zigbee coordinator hardware.
|
|
363
|
-
* (arteck) Zigbee-Herdsman 0.14.4, Zigbee-Herdsman-Converters 14.0.394
|
|
364
|
-
|
|
365
|
-
### 1.6.13 (2022-01)
|
|
366
|
-
|
|
367
|
-
* (kirovilya) update to Zigbee-Herdsman 0.14
|
|
368
|
-
|
|
369
|
-
### 1.6.12 (2022-01)
|
|
370
|
-
* (asgothian) Groups were newly revised (read [here](https://github.com/ioBroker/ioBroker.zigbee/pull/1327) )
|
|
371
|
-
- object device.groups is obsolet..the old one is no longer up to date
|
|
372
|
-
|
|
373
|
-
### 1.6.9 (2021-12)
|
|
374
|
-
* (simatec) fix admin Dark-Mode
|
|
375
|
-
* (asgothian) Expose Access Handling
|
|
376
|
-
* (arteck) translations
|
|
377
|
-
* (asgothian) fix groups
|
|
378
|
-
* (agross) use different normalization rules
|
|
379
|
-
|
|
380
|
-
### 1.6.1 (2021-08)
|
|
381
|
-
* (kirovilya) herdsman compatibility
|
|
382
|
-
|
|
383
|
-
### 1.6.0 (2021-08-09)
|
|
384
|
-
|
|
385
|
-
### 1.5.6 (2021-05-26)
|
|
386
|
-
* (kirovilya) new UI add
|
|
387
|
-
|
|
388
|
-
### 1.5.5 (2021-05-05)
|
|
389
|
-
* Fixes for new zigbee-herdsman-converters
|
|
390
|
-
* UI fixes
|
|
391
|
-
|
|
392
|
-
### 1.5.3 (2021-04-30)
|
|
393
|
-
* (arteck) Fix for js-controller 3.3.*
|
|
394
|
-
|
|
395
|
-
### 1.5.2 (2021-04-29)
|
|
396
|
-
* (asgothian) Groups on dashboard
|
|
397
|
-
|
|
398
|
-
### 1.5.1 (2021-04-14)
|
|
399
|
-
* (kirovilya) Dashboard
|
|
400
|
-
* (asgothian) Groups (reworked)
|
|
401
|
-
* [Experimental support EZSP protocol for EFR32 chips](https://github.com/Koenkk/zigbee-herdsman/issues/319) (zigbee-herdsman)
|
|
402
|
-
|
|
403
|
-
### 1.4.4 (2021-02-14)
|
|
404
|
-
* (kirovilya) External converters https://www.zigbee2mqtt.io/information/configuration.html#external-converters-configuration
|
|
405
|
-
* (asgothian) Enhancement ping process
|
|
406
|
-
* (asgothian) Devive query state-button
|
|
407
|
-
* (asgothian) State Cleanup button
|
|
408
|
-
* (arteck) Setting to use exposes instead of internal device description
|
|
409
|
-
|
|
410
|
-
### 1.4.1 (2020-12)
|
|
411
|
-
* (o0shojo0o) added a kelvin possibility into colortemp
|
|
412
|
-
* (asgothian) Hue_calibration for exposed devices (Use requires PR on zigbee-herdsman-converters, PR is being worked on)
|
|
413
|
-
* (asgothian) fix Tuya Thermostat: restore lost property "preset"
|
|
414
|
-
* (asgothian) Change for Device Availability: Stagger initial ping by 200 ms to prevent network congestion due to a large number of ping requests
|
|
415
|
-
* (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
|
|
416
|
-
* (asgothian) Change for Device Availability: Set link Quality to 0 when a device is not connected, 10 when it is reconnecting.
|
|
417
|
-
* (asgothian) fix for message "illegal properties x,y" - remove color and color_temp from readable states on device available again (Issue #607)
|
|
418
|
-
* (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)
|
|
419
|
-
* (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
|
|
420
|
-
* (asgothian) change in OTA: Message that a device does not respond for OTA query downgraded to "info" from "error"
|
|
421
|
-
* (asgothian) new coordinator card
|
|
422
|
-
|
|
423
|
-
### 1.4.0 (2020-12)
|
|
424
|
-
* Many new devices available
|
|
425
|
-
|
|
426
|
-
Starting from version 1.4.0, new devices in iobroker.zigbee will be added automatically, based on the *exposes* described in zigbee-herdsman-converters.
|
|
427
|
-
The *exposes* section describes the device's capabilities, events and control commands. In iobroker.zigbee these descriptions are converted to iobroker states.
|
|
428
|
-
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).
|
|
429
|
-
|
|
430
|
-
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/*.
|
|
431
|
-
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*:
|
|
432
|
-
```
|
|
433
|
-
{
|
|
434
|
-
models: [‘01MINIZB’],
|
|
435
|
-
icon: 'img/ITEAD01ZBMINI. png',
|
|
436
|
-
}
|
|
437
|
-
```
|
|
438
|
-
in this case, the *states* attribute will be formed based on the *exposes* description and the image will be local.
|
|
439
|
-
|
|
440
|
-
### 1.3.1 (2020-10-30)
|
|
441
|
-
* [Experimental Zigate support](https://github.com/Koenkk/zigbee-herdsman/issues/242) (zigbee-herdsman)
|
|
442
|
-
* New devices by:
|
|
443
|
-
asgothian, arteck, kirovilya, PaulchenPlump
|
|
444
|
-
|
|
445
|
-
### 1.3.0 (2020-10-07)
|
|
446
|
-
* More stable (zigbee-herdsman)
|
|
447
|
-
* Backup prior database and nv-data (for z-stack 3) before start adapter
|
|
448
|
-
* Allow to select bind cluster
|
|
449
|
-
* Admin Tab support (experimental)
|
|
450
|
-
* (UncleSamSwiss, DutchmanNL) Translation
|
|
451
|
-
* New devices by:
|
|
452
|
-
arteck, kirovilya, Shade, krumbholz, fre, Alex18081, ae, asgothian,
|
|
453
|
-
Strunzdesign, kairauer, VLGorskij, Hesse-Bub, PaulchenPlump, blackrozes
|
|
454
|
-
|
|
455
|
-
### 1.2.1 (2020-08-16)
|
|
456
|
-
* Fixes after changing device identify method
|
|
457
|
-
* (Garfonso) Allow unbinding from coordinator
|
|
458
|
-
|
|
459
|
-
### 1.2.0 (2020-08-09)
|
|
460
|
-
* Serialport 9.0.0. (zigbee-herdsman)
|
|
461
|
-
* Drop support Node < 10 (zigbee-herdsman)
|
|
462
|
-
* Device now identify (for zigbee-herdsman-converters) by model not zigbeeModel
|
|
463
|
-
|
|
464
|
-
Improvements and fixes:
|
|
465
|
-
* (Strunzdesign) Fixed the mapping between bulb levels and adapter levels
|
|
466
|
-
* (kirovilya) Fix ota for unavailable devices
|
|
467
|
-
* (kirovilya) Lazy states - created only when an event arrives
|
|
468
|
-
* (kirovilya) States generator - states are created depending on the device and its endpoints
|
|
469
|
-
* (Shade) Fixed WXKG11LM clicks
|
|
470
|
-
* (allofmex) Improved DeveloperTab logs
|
|
471
|
-
* (allofmex) Add humidity and temperature calibration state to Tuya RH3052
|
|
472
|
-
* (kirovilya) Fixed a typo due to which extPanID was not set
|
|
473
|
-
* (allofmex) Retry reconnect gateway all the time for TCP-connected gateway
|
|
474
|
-
* (kirovilya) Allow collecting zigbee-herdsman logs to iobroker logs
|
|
475
|
-
* (kirovilya) Additional states for QBKG12LM
|
|
476
|
-
|
|
477
|
-
New devices:
|
|
478
|
-
* (kirovilya) BlitzWolf BW-IS3, Paulmann 500.67, Paulmann 798.09
|
|
479
|
-
* (kirovilya) DiY Geiger counter https://modkam.ru/?p=1591
|
|
480
|
-
* (kirovilya) DiY 8 Relays + 8 switches https://modkam.ru/?p=1638
|
|
481
|
-
* (kirovilya) DiY Freepad https://github.com/diyruz/freepad
|
|
482
|
-
* (kirovilya) Neo Zigbee Siren Alarm https://szneo.com/en/products/show.php?id=241
|
|
483
|
-
* (Shade) RB 278 T
|
|
484
|
-
* (arteck) TS0601_thermostat
|
|
485
|
-
* (arteck) TS0121
|
|
486
|
-
* (arteck) GL-D-004Z
|
|
487
|
-
* (Shade) WXKG07LM
|
|
488
|
-
* (drohne200) 1746430P7
|
|
489
|
-
* (sebastian) 4058075816459
|
|
490
|
-
* (itProfi) SGMHM-I1
|
|
491
|
-
* (arteck) owvfni3
|
|
492
|
-
* (arteck) TS0001, TS0111
|
|
493
|
-
* (Daniel Dreier) Paulmann 500.45
|
|
494
|
-
* (arteck) ZK-EU-2U
|
|
495
|
-
* (Newan) Busch-Jaeger 6735/6736/6737
|
|
496
|
-
* (andrico21) ZM-L03E-Z
|
|
497
|
-
* (arteck) 915005106701, 9290018187B
|
|
498
|
-
* (frankjoke) HGZB-20-UK, GL-W-001Z
|
|
499
|
-
* (arteck) 4034031P7, 3435011P7
|
|
500
|
-
* (arteck) TS0041
|
|
501
|
-
* (agross) 5062231P7, 5062431P7
|
|
502
|
-
* (kirovilya) TI0001-switch, TI0001-socket
|
|
503
|
-
* (arteck) RB 178 T
|
|
504
|
-
* (arteck) HGZB-07A, AV2010/22, AV2010/22A, TS0041, TS0043
|
|
505
|
-
* (nbars) E1744
|
|
506
|
-
* (Florian Look) GS361A-H04
|
|
507
|
-
* (arteck) ICZB-IW11SW
|
|
508
|
-
* (kirovilya) HS2WD-E
|
|
509
|
-
* (Sacred-Shadow) FL 130 C
|
|
510
|
-
* (arteck) HS3SA, 9290022169, 4096730U7, AC10787, SP 220, SP 222, SP 224, 07004D, BW-IS2, InstaRemote
|
|
511
|
-
* (kirovilya) MCLH-08, MCLH-05
|
|
512
|
-
* (Sacred-Shadow) 1746130P7
|
|
513
|
-
* (mar565) GUNNARP panel round
|
|
514
|
-
* (Erdnuss3003) 4090531P7
|
|
515
|
-
|
|
516
|
-
### 1.1.1 (2020-04-17)
|
|
517
|
-
* (kirovilya) Critical. Fixed error starting adapter if cc-chip was only flashed
|
|
518
|
-
* (kirovilya) Nue/3A FNB56-ZSW02LX2.0
|
|
519
|
-
* (Strunzdesign) Added missing raw button events for Philips Hue Smart Button ROM001
|
|
520
|
-
* (Sacred-Shadow) Fix Color for Outdoor Lantern W RGBW OSRAM
|
|
521
|
-
|
|
522
|
-
### 1.1.0 (2020-04-12)
|
|
523
|
-
new Zigbee-herdsman features:
|
|
524
|
-
* ConBee/RaspBee (experimental support) https://github.com/Koenkk/zigbee-herdsman/issues/72
|
|
525
|
-
* OTA update for some devices (IKEA, OSRAM and other) https://github.com/Koenkk/zigbee2mqtt/issues/2921
|
|
526
|
-
* Touchlink reset and join https://github.com/Koenkk/zigbee2mqtt/issues/2396
|
|
527
|
-
* Green Power devices support https://github.com/Koenkk/zigbee2mqtt/issues/3322
|
|
528
|
-
* (peterfido) iCasa KPD14S und KPD18S hinzu
|
|
529
|
-
* (kirovilya) Moes Zigbee Thermostatic Radiator
|
|
530
|
-
* (kirovilya) LifeControl power plug MCLH-03, bulb MCLH-02, water leak MCLH-07, door sensor MCLH-04
|
|
531
|
-
* (kirovilya) Philips LCT002, LCT011, LTW015, LWG004
|
|
532
|
-
* (kirovilya) Gledopto GL-C-007 with a channel
|
|
533
|
-
* (MultivitaminJuice) Iluminize 511.040
|
|
534
|
-
* (Sacred-Shadow) Bitron 902010/24
|
|
535
|
-
* (kirovilya) Color indication of LQI and Battery icon
|
|
536
|
-
* (kirovilya) Device info modal dialog
|
|
537
|
-
* (arteck) Philips LCT026
|
|
538
|
-
* (obakuhl) Improvements Osram switch mini
|
|
539
|
-
* (arteck) Nue / 3A FB56+ZSW1GKJ2.5, LXN-1S27LX1.0
|
|
540
|
-
* (agross) Philips Signe Floor and Table
|
|
541
|
-
* (arteck) TRADFRI bulb E14 WS 470lm, OSRAM PAR16 TW Z3
|
|
542
|
-
* (kirovilya) Smart remote controller (4 buttons)
|
|
543
|
-
* (allofmex) OTA updates
|
|
544
|
-
* (kirovilya) Aqara opple change mode keys (for binding)
|
|
545
|
-
* (palsch) Heiman HS2WD-E siren
|
|
546
|
-
|
|
547
|
-
### 1.0.4 (2020-03-14)
|
|
548
|
-
* (kirovilya) Philips Hue Adore Bathroom Mirror Light
|
|
549
|
-
* (kirovilya) Oujiabao Gas and carbon monoxide alarm
|
|
550
|
-
* (kirovilya) Tuya SOS button
|
|
551
|
-
* (Erdnuss3003) Schwaiger ZBT-DIMLight-GLS0800
|
|
552
|
-
* (arteck) Smart Home Pty FB56-ZCW11HG1.4, LXT56-LS27LX1.7
|
|
553
|
-
* (arteck) Xiaomi plug lumi.plug.mmeu01
|
|
554
|
-
* (arteck) Innr RS 228 T, RS 230 C
|
|
555
|
-
* (arteck) Gledopto GL-MC-001, GL-D-003ZS
|
|
556
|
-
* (allmyjoes) Bitron AV2010/21A
|
|
557
|
-
* (arteck) Osram Panel TW 595 UGR22
|
|
558
|
-
* (kirovilya) IKEA SURTE door WS 38x64
|
|
559
|
-
* (andigandi) Philips Hue LCG002, Hue LTG002
|
|
560
|
-
* (arteck) iCasa ICZB-FC
|
|
561
|
-
* (arteck) Osram A60 DIM Z3
|
|
562
|
-
* (arteck) Paulmann 371000001
|
|
563
|
-
* (DaCHRIS) Osram PAR16 DIM Z3
|
|
564
|
-
* (DaCHRIS) Philips LWG001
|
|
565
|
-
* (DaCHRIS) Illuminize 511.202
|
|
566
|
-
* (SchumyHao) TERNCY-SD01 knob dimmer
|
|
567
|
-
* (SchumyHao) Xiaomi lumi.lock.aq1
|
|
568
|
-
* (kirovilya) New eWeLink devices: button, TH sensor, contact sensor, motion sensor
|
|
569
|
-
* (kirovilya) Allow pairing to routers (again)
|
|
570
|
-
* (Erdnuss3003) Philips Hue LCT021
|
|
571
|
-
* (root) Trust ZWLD-100 water leak sensor
|
|
572
|
-
* (smartpran) Bitron AV2010/32
|
|
573
|
-
|
|
574
|
-
### 1.0.3 (2020-02-09)
|
|
575
|
-
* (Tw1nh34d) Hornbach FLAIR LED
|
|
576
|
-
* (asgothian) Hue smart button, Heiman smoke sensor
|
|
577
|
-
* (kirovilya) Philips LTC014, LTC015
|
|
578
|
-
* (kirovilya) Power states for QBKG11LM
|
|
579
|
-
* (Garfonso) Change role for occupancy state to 'sensor.motion'
|
|
580
|
-
* (kirovilya) Change illuminance state to illuminance_lux (for lux value)
|
|
581
|
-
* (arteck) Philips LCF002
|
|
582
|
-
* (arteck) TRADFRI open/close remote
|
|
583
|
-
* (kirovilya) Tuya sensor TS0201
|
|
584
|
-
|
|
585
|
-
### 1.0.2 (2020-01-29)
|
|
586
|
-
* (kirovilya) All button events for Aqara Opple switch
|
|
587
|
-
* (ma-john) OSRAM PAR16 RGBW Z3
|
|
588
|
-
* (arteck) Phillips LWA004
|
|
589
|
-
* (MiniMe6666) Heiman SmokeSendor-N-3.0
|
|
590
|
-
* (kirovilya) Force remove device
|
|
591
|
-
* (kirovilya) Fix some networkmap bugs
|
|
592
|
-
* (kirovilya) Extended info button
|
|
593
|
-
* (kirovilya) Long press for WXKG01LM
|
|
594
|
-
|
|
595
|
-
### 1.0.1 (2020-01-23)
|
|
596
|
-
* fix for old z-stack firmware
|
|
201
|
+
***********************************************
|
|
597
202
|
|
|
598
203
|
### 1.0.0 (2020-01-22)
|
|
599
204
|
* Powered by new [zigbee-herdsman](https://github.com/Koenkk/zigbee-herdsman) library and new [converters database](https://github.com/Koenkk/zigbee-herdsman-converters)
|
|
@@ -603,25 +208,4 @@ new Zigbee-herdsman features:
|
|
|
603
208
|
* Some design update
|
|
604
209
|
* Binding
|
|
605
210
|
|
|
606
|
-
|
|
607
|
-
The MIT License (MIT)
|
|
608
|
-
|
|
609
|
-
Copyright (c) 2018-2024 Kirov Ilya <kirovilya@gmail.com>
|
|
610
|
-
|
|
611
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
612
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
613
|
-
in the Software without restriction, including without limitation the rights
|
|
614
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
615
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
616
|
-
furnished to do so, subject to the following conditions:
|
|
617
|
-
|
|
618
|
-
The above copyright notice and this permission notice shall be included in
|
|
619
|
-
all copies or substantial portions of the Software.
|
|
620
|
-
|
|
621
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
622
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
623
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
624
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
625
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
626
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
627
|
-
THE SOFTWARE.
|
|
211
|
+
------------------------------------------------------------------------------
|
|
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.14",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.10.14": {
|
|
7
|
+
"en": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D) \ndeleteDeviceStates change to deleteObj",
|
|
8
|
+
"de": "Herdsman 2.1.9, Konverter 20.58.0\nFix: Aqara T1M (CL-L02D)\nlöschen DeviceState Änderung zum Löschen Ob",
|
|
9
|
+
"ru": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D)\nудалить Устройства меняются для удаления Obj",
|
|
10
|
+
"pt": "Herdsman 2.1.9, Conversores 20.58.0\nFix: Aqara T1M (CL-L02D)\nexcluir DeviceStates mudam para excluir Objecção",
|
|
11
|
+
"nl": "Herdsman 2.1.9, Converters 20.58.0\nFix: Aqara T1M (CL-L02D)\nverwijderen Apparaatstaten wijzigen om te verwijderen Obj",
|
|
12
|
+
"fr": "Herdsman 2.1.9, Convertisseurs 20.58.0\nCorrection: Aqara T1M (CL-L02D)\nsupprimer Les états de périphérique changent pour supprimer OBJ",
|
|
13
|
+
"it": "Herdsman 2.1.9, Convertitori 20.58.0\nFisso: Aqara T1M (CL-L02D)\ncancella DeviceStates modifica per eliminare Obj",
|
|
14
|
+
"es": "Herdsman 2.1.9, convertidores 20.58.0\nFijación: Aqara T1M (CL-L02D)\nborrar Los Estados de dispositivos cambian para eliminar Obj",
|
|
15
|
+
"pl": "Herdsman 2.1.9, konwertery 20.58.0\nFix: Aqara T1M (CL- L02D)\nusuń DeviceStates zmienić, aby usunąć Obj",
|
|
16
|
+
"uk": "Herdsman 2.1.9, Конвертер 20.58.0\nФіксація: Aqara T1M (CL-L02D)\nвидалити Зміна стану пристроїв для видалення Офіціант",
|
|
17
|
+
"zh-cn": "牧民2.1.9,转换器 20.58.0\n修补:Aqara T1M(CL-L02D)\n删除 设备状态更改以删除 欧比"
|
|
18
|
+
},
|
|
6
19
|
"1.10.13": {
|
|
7
20
|
"en": "corr icon download bug (axios)",
|
|
8
21
|
"de": "corr icon download bug (axios)",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "ustawienia admin corr\ndodaj nową wersję eslint\n",
|
|
81
94
|
"uk": "корр налаштування адміністратора\nдодати нову версію eslint\n",
|
|
82
95
|
"zh-cn": "corr 管理员设置\n添加新的 eslint 版本\n"
|
|
83
|
-
},
|
|
84
|
-
"1.10.7": {
|
|
85
|
-
"en": "add flow control option \nadd new NewHerdsman\nadd new ezsp coordinator Firmware (7.4.1.0)",
|
|
86
|
-
"de": "möglichkeit der durchflussregelung\nneues hinzufügen NewHerdsman\nezsp Koordinator Firmware hinzufügen (7.4.1.0)",
|
|
87
|
-
"ru": "добавить параметр управления потоком\nдобавить новый NewHerdsman\nдобавить новый координатор ezsp Firmware (7.4.1.0)",
|
|
88
|
-
"pt": "adicionar opção de controle de fluxo\nadicionar novo NewHerdsman\nadicionar novo coordenador ezsp Firmware (7.4.1.0)",
|
|
89
|
-
"nl": "flow control optie toevoegen\nnieuwe NewHerdsman toevoegen\nnieuwe ezsp coördinator Firmware (7.4.1.0) toevoegen",
|
|
90
|
-
"fr": "ajouter l'option de contrôle du débit\najouter un nouveau NewHerdsman\najouter un nouveau logiciel ezsp coordinator (7.4.1.0)",
|
|
91
|
-
"it": "aggiungere opzione di controllo del flusso\naggiungere nuovo NewHerdsman\naggiungere nuovo coordinatore ezsp Firmware (7.4.1.0)",
|
|
92
|
-
"es": "añadir opción de control de flujo\nañadir nuevo NewHerdsman\nañadir nuevo coordinador de ezsp Firmware (7.4.1.0)",
|
|
93
|
-
"pl": "dodaj opcję kontroli przepływu\ndodaj nowy NewHerdsman\ndodaj nowego koordynatora ezsp Firmware (7.4.1.0)",
|
|
94
|
-
"uk": "додати варіант контролю потоку\nдодати новийHerdsman\nadd new ezsp manager Прошивка (7.4.1.0)",
|
|
95
|
-
"zh-cn": "添加流量控制选项\n添加新赫兹曼\n添加新的 ezsp 协调员 Firmware (7.4.1.0)"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
package/lib/commands.js
CHANGED
|
@@ -474,13 +474,13 @@ class Commands {
|
|
|
474
474
|
if (!dev) {
|
|
475
475
|
this.debug('Not found!');
|
|
476
476
|
this.debug(`Try delete dev ${devId} from iobroker.`);
|
|
477
|
-
this.stController.
|
|
477
|
+
this.stController.deleteObj(devId, () =>
|
|
478
478
|
this.adapter.sendTo(from, command, {}, callback));
|
|
479
479
|
return;
|
|
480
480
|
}
|
|
481
481
|
this.zbController.remove(sysid, force, err => {
|
|
482
482
|
if (!err) {
|
|
483
|
-
this.stController.
|
|
483
|
+
this.stController.deleteObj(devId, () =>
|
|
484
484
|
this.adapter.sendTo(from, command, {}, callback));
|
|
485
485
|
} else {
|
|
486
486
|
this.debug(`Error on remove! ${err}`);
|
package/lib/devices.js
CHANGED
|
@@ -306,7 +306,8 @@ const generator = {
|
|
|
306
306
|
setattr: 'state',
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
|
-
if (endpoint.supportsOutputCluster('genMultistateInput'))
|
|
309
|
+
if (endpoint.supportsOutputCluster('genMultistateInput') || endpoint.clusters.hasOwnProperty('genMultistateInput'))
|
|
310
|
+
{
|
|
310
311
|
devstates.push({
|
|
311
312
|
id: `channel_${epID}.click`,
|
|
312
313
|
prop: 'action',
|
|
@@ -343,6 +344,18 @@ const generator = {
|
|
|
343
344
|
isEvent: true,
|
|
344
345
|
getter: payload => payload.action === `tripple_${epName}` ? true : undefined,
|
|
345
346
|
});
|
|
347
|
+
devstates.push({
|
|
348
|
+
id: `channel_${epID}.hold`,
|
|
349
|
+
prop: 'action',
|
|
350
|
+
name: `long click event`,
|
|
351
|
+
icon: undefined,
|
|
352
|
+
role: 'button',
|
|
353
|
+
write: false,
|
|
354
|
+
read: true,
|
|
355
|
+
type: 'boolean',
|
|
356
|
+
isEvent: true,
|
|
357
|
+
getter: payload => payload.action === `hold_${epName}` ? true : undefined,
|
|
358
|
+
});
|
|
346
359
|
}
|
|
347
360
|
if (endpoint.supportsOutputCluster('genLevelCtrl')) {
|
|
348
361
|
devstates.push({
|
|
@@ -487,7 +500,7 @@ const generator = {
|
|
|
487
500
|
});
|
|
488
501
|
return icasa_states;
|
|
489
502
|
},
|
|
490
|
-
ptvo_switch: (entity) => {
|
|
503
|
+
/*ptvo_switch: (entity) => {
|
|
491
504
|
const devstates = [];
|
|
492
505
|
for (const endpoint of entity.device.endpoints) {
|
|
493
506
|
const epID = endpoint.ID;
|
|
@@ -566,7 +579,7 @@ const generator = {
|
|
|
566
579
|
}
|
|
567
580
|
}
|
|
568
581
|
return devstates;
|
|
569
|
-
}
|
|
582
|
+
},*/
|
|
570
583
|
};
|
|
571
584
|
|
|
572
585
|
function states_with_epname(entity, states) {
|
|
@@ -3094,6 +3107,10 @@ const devices = [
|
|
|
3094
3107
|
models: ['E2204'],
|
|
3095
3108
|
icon: 'img/E2204.png',
|
|
3096
3109
|
},
|
|
3110
|
+
{
|
|
3111
|
+
models: ['L1(ZW)'],
|
|
3112
|
+
icon: 'img/TS0502B.png',
|
|
3113
|
+
},
|
|
3097
3114
|
];
|
|
3098
3115
|
|
|
3099
3116
|
const commonStates = [
|
package/lib/groups.js
CHANGED
|
@@ -93,28 +93,28 @@ class Groups {
|
|
|
93
93
|
|
|
94
94
|
async getGroups(obj) {
|
|
95
95
|
const response = {groups: {}};
|
|
96
|
-
try {
|
|
97
|
-
// const groupsState = await this.adapter.getStateAsync('info.groups');
|
|
98
|
-
const herdsmanGroups = await this.zbController.getGroups();
|
|
99
|
-
|
|
100
|
-
// const groups = (groupsState && groupsState.val) ? JSON.parse(groupsState.val) : {};
|
|
101
96
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
97
|
+
const isEnable = await this.adapter.getStateAsync('info.connection');
|
|
98
|
+
if (isEnable.val) {
|
|
99
|
+
try {
|
|
100
|
+
const herdsmanGroups = await this.zbController.getGroups();
|
|
101
|
+
const groups = {};
|
|
102
|
+
if (typeof herdsmanGroups === 'object') {
|
|
103
|
+
for (const group of herdsmanGroups) {
|
|
104
|
+
const gid = group.groupID;
|
|
105
|
+
if (gid) {
|
|
106
|
+
groups[gid] = this.stController.verifyDeviceName(`group_${gid}`, `Group ${gid}`);
|
|
107
|
+
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
+
this.debug(`getGroups result: ${JSON.stringify(groups)}`);
|
|
111
|
+
response.groups = groups;
|
|
112
|
+
} catch (error) {
|
|
113
|
+
response.error = `res getGroups: caught error: ${error}`;
|
|
114
|
+
this.error(`getGroups: caught error: ${error}`);
|
|
115
|
+
} finally {
|
|
116
|
+
obj && this.adapter.sendTo(obj.from, obj.command, response, obj.callback);
|
|
110
117
|
}
|
|
111
|
-
this.debug(`getGroups result: ${JSON.stringify(groups)}`);
|
|
112
|
-
response.groups = groups;
|
|
113
|
-
} catch (error) {
|
|
114
|
-
response.error = `getGroups: caught error: ${error}`;
|
|
115
|
-
this.error(`getGroups: caught error: ${error}`);
|
|
116
|
-
} finally {
|
|
117
|
-
obj && this.adapter.sendTo(obj.from, obj.command, response, obj.callback);
|
|
118
118
|
}
|
|
119
119
|
return response.groups;
|
|
120
120
|
}
|
|
@@ -207,7 +207,7 @@ class Groups {
|
|
|
207
207
|
|
|
208
208
|
async deleteGroup(from, command, message) {
|
|
209
209
|
await this.zbController.removeGroupById(message);
|
|
210
|
-
await this.stController.
|
|
210
|
+
await this.stController.deleteObj(`group_${parseInt(message)}`);
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
async renameGroup(from, command, message) {
|
|
@@ -223,8 +223,6 @@ class Groups {
|
|
|
223
223
|
this.warn(`renameGroup caught error ${JSON.stringify(e.code)}`);
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
-
// objGroups[message.id.toString()] = message.name;
|
|
227
|
-
// await this.adapter.setStateAsync('info.groups', JSON.stringify(objGroups), true);
|
|
228
226
|
|
|
229
227
|
const group = await this.adapter.getStateAsync(id);
|
|
230
228
|
if (!group) {
|
|
@@ -306,7 +304,7 @@ class Groups {
|
|
|
306
304
|
if (dev.common.type === 'group') {
|
|
307
305
|
const groupid = parseInt(dev.native.id);
|
|
308
306
|
if (!usedGroupsIds.includes(groupid)) {
|
|
309
|
-
this.stController.
|
|
307
|
+
this.stController.deleteObj(`group_${groupid}`);
|
|
310
308
|
}
|
|
311
309
|
}
|
|
312
310
|
});
|
package/lib/statescontroller.js
CHANGED
|
@@ -8,7 +8,7 @@ const fs = require('fs');
|
|
|
8
8
|
const axios = require('axios');
|
|
9
9
|
|
|
10
10
|
let savedDeviceNamesDB = {};
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
|
|
13
13
|
class StatesController extends EventEmitter {
|
|
14
14
|
constructor(adapter) {
|
|
@@ -75,7 +75,6 @@ class StatesController extends EventEmitter {
|
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
this.adapter.setStateAsync(`info.undefinedDevices`, JSON.stringify(knownUndefinedDevices), true);
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
checkDebugDevice(dev) {
|
|
@@ -95,9 +94,6 @@ class StatesController extends EventEmitter {
|
|
|
95
94
|
if (!this.adapter.zbController || !this.adapter.zbController.connected()) {
|
|
96
95
|
return;
|
|
97
96
|
}
|
|
98
|
-
if (this.debugDevices === undefined) {
|
|
99
|
-
this.getDebugDevices();
|
|
100
|
-
}
|
|
101
97
|
if (state && !state.ack) {
|
|
102
98
|
if (id.endsWith('pairingCountdown') || id.endsWith('pairingMessage') || id.endsWith('connection')) {
|
|
103
99
|
return;
|
|
@@ -112,7 +108,8 @@ class StatesController extends EventEmitter {
|
|
|
112
108
|
return;
|
|
113
109
|
}
|
|
114
110
|
|
|
115
|
-
if (this.checkDebugDevice(id))
|
|
111
|
+
if (this.checkDebugDevice(id))
|
|
112
|
+
this.warn(`ELEVATED O1: User state change of state ${id} with value ${state.val} (ack: ${state.ack}) from ${state.from}`);
|
|
116
113
|
|
|
117
114
|
this.debug(`User stateChange ${id} ${JSON.stringify(state)}`);
|
|
118
115
|
const devId = getAdId(this.adapter, id); // iobroker device id
|
|
@@ -191,13 +188,7 @@ class StatesController extends EventEmitter {
|
|
|
191
188
|
} else {
|
|
192
189
|
stateModel = statesMapping.findModel(model);
|
|
193
190
|
if (!stateModel) {
|
|
194
|
-
|
|
195
|
-
knownUndefinedDevices[deviceId]++;
|
|
196
|
-
} else {
|
|
197
|
-
knownUndefinedDevices[deviceId] = 1;
|
|
198
|
-
this.info(`Device ${deviceId} "${model}" not present in statesMapping - relying on exposes for device definition.`);
|
|
199
|
-
}
|
|
200
|
-
this.adapter.setStateAsync(`info.undefinedDevices`, JSON.stringify(knownUndefinedDevices), true);
|
|
191
|
+
this.info(`Device ${deviceId} "${model}" not present in statesMapping - relying on exposes for device definition.`);
|
|
201
192
|
states = statesMapping.commonStates;
|
|
202
193
|
} else {
|
|
203
194
|
states = stateModel.states;
|
|
@@ -217,15 +208,14 @@ class StatesController extends EventEmitter {
|
|
|
217
208
|
}
|
|
218
209
|
|
|
219
210
|
async publishFromState(deviceId, model, stateKey, state, options) {
|
|
220
|
-
if (this.debugDevices === undefined) this.getDebugDevices();
|
|
221
211
|
this.debug(`Change state '${stateKey}' at device ${deviceId} type '${model}'`);
|
|
222
212
|
const elevated = this.checkDebugDevice(deviceId);
|
|
223
213
|
|
|
224
|
-
if (elevated) this.warn(`ELEVATED Change state '${stateKey}' at device ${deviceId} type '${model}'`);
|
|
214
|
+
if (elevated) this.warn(`ELEVATED O2: Change state '${stateKey}' at device ${deviceId} type '${model}'`);
|
|
225
215
|
|
|
226
216
|
const devStates = await this.getDevStates(deviceId, model);
|
|
227
217
|
if (!devStates) {
|
|
228
|
-
if (elevated) this.error(`ELEVATED no device states for device ${deviceId} type '${model}'`);
|
|
218
|
+
if (elevated) this.error(`ELEVATED OE1: no device states for device ${deviceId} type '${model}'`);
|
|
229
219
|
return;
|
|
230
220
|
}
|
|
231
221
|
const commonStates = statesMapping.commonStates.find(statedesc => stateKey === statedesc.id);
|
|
@@ -238,7 +228,8 @@ class StatesController extends EventEmitter {
|
|
|
238
228
|
|
|
239
229
|
const value = state.val;
|
|
240
230
|
if (value === undefined || value === '') {
|
|
241
|
-
if (elevated)
|
|
231
|
+
if (elevated)
|
|
232
|
+
this.error(`ELEVATED OE2: no value for device ${deviceId} type '${model}'`);
|
|
242
233
|
return;
|
|
243
234
|
}
|
|
244
235
|
let stateList = [{stateDesc: stateDesc, value: value, index: 0, timeout: 0}];
|
|
@@ -308,18 +299,7 @@ class StatesController extends EventEmitter {
|
|
|
308
299
|
return savedDeviceNamesDB[savedId];
|
|
309
300
|
}
|
|
310
301
|
|
|
311
|
-
|
|
312
|
-
this.adapter.getStatesOf(devId, (err, states) => {
|
|
313
|
-
if (!err && states) {
|
|
314
|
-
states.forEach(state =>
|
|
315
|
-
this.adapter.deleteState(devId, null, state._id));
|
|
316
|
-
}
|
|
317
|
-
this.adapter.delObject(devId, () =>
|
|
318
|
-
callback && callback());
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
async deleteGroupById(devId) {
|
|
302
|
+
async deleteObj(devId) {
|
|
323
303
|
const options = { recursive:true };
|
|
324
304
|
try {
|
|
325
305
|
this.adapter.delObject(devId,options), (err) => { }
|
|
@@ -329,7 +309,6 @@ class StatesController extends EventEmitter {
|
|
|
329
309
|
}
|
|
330
310
|
}
|
|
331
311
|
|
|
332
|
-
|
|
333
312
|
async deleteOrphanedDeviceStates(ieeeAddr, model, force, callback) {
|
|
334
313
|
const devStates = await this.getDevStates(ieeeAddr, model);
|
|
335
314
|
const commonStates = statesMapping.commonStates;
|
|
@@ -620,19 +599,20 @@ class StatesController extends EventEmitter {
|
|
|
620
599
|
async publishToState(devId, model, payload) {
|
|
621
600
|
const devStates = await this.getDevStates(`0x${devId}`, model);
|
|
622
601
|
let has_debug = false;
|
|
623
|
-
if (this.debugDevices === undefined) this.getDebugDevices();
|
|
624
602
|
if (this.checkDebugDevice(devId))
|
|
625
603
|
{
|
|
626
604
|
if (!payload.hasOwnProperty('msg_from_zigbee')) {
|
|
627
|
-
this.warn(`ELEVATED
|
|
605
|
+
this.warn(`ELEVATED I1: message received '${JSON.stringify(payload)}' from device ${devId} type '${model}'`);
|
|
628
606
|
has_debug = true;
|
|
629
607
|
}
|
|
630
608
|
}
|
|
631
609
|
if (!devStates) {
|
|
632
|
-
if (has_debug) this.error(`ELEVATED
|
|
610
|
+
if (has_debug) this.error(`ELEVATED IE2: no device states for device ${devId} type '${model}'`)
|
|
633
611
|
return;
|
|
634
612
|
}
|
|
635
613
|
// find states for payload
|
|
614
|
+
let has_published = false;
|
|
615
|
+
|
|
636
616
|
if (devStates.states !== undefined) {
|
|
637
617
|
try {
|
|
638
618
|
const states = statesMapping.commonStates.concat(
|
|
@@ -655,7 +635,7 @@ class StatesController extends EventEmitter {
|
|
|
655
635
|
let stateID = statedesc.id;
|
|
656
636
|
|
|
657
637
|
if (has_debug && statedesc.id !== 'msg_from_zigbee') {
|
|
658
|
-
this.warn(`ELEVATED
|
|
638
|
+
this.warn(`ELEVATED I2: value generated '${JSON.stringify(value)}' from device ${devId} for '${statedesc.name}'`);
|
|
659
639
|
}
|
|
660
640
|
|
|
661
641
|
const common = {
|
|
@@ -693,11 +673,22 @@ class StatesController extends EventEmitter {
|
|
|
693
673
|
this.updateState(devId, stateID, value, common);
|
|
694
674
|
}
|
|
695
675
|
}
|
|
676
|
+
has_published = true;
|
|
696
677
|
}
|
|
697
678
|
} catch (e) {
|
|
698
679
|
this.debug(`No states in device ${devId} : payload ${JSON.stringify(payload)}`);
|
|
680
|
+
if (has_debug)
|
|
681
|
+
this.error(`ELEVATED IE3: error when enumerating states of ${devId} for payload ${JSON.stringify(payload)}, ${(e ? e.name : 'undefined')} (${(e ? e.message : '')}).`);
|
|
682
|
+
}
|
|
683
|
+
if (!has_published && has_debug) {
|
|
684
|
+
this.error(`ELEVATED IE4: No value published for device ${devId}`);
|
|
685
|
+
|
|
699
686
|
}
|
|
700
687
|
}
|
|
688
|
+
else {
|
|
689
|
+
if (has_debug)
|
|
690
|
+
this.error(`ELEVATED IE5: No states matching the payload ${JSON.stringify(payload)} for device ${devId}`);
|
|
691
|
+
}
|
|
701
692
|
}
|
|
702
693
|
}
|
|
703
694
|
|
package/main.js
CHANGED
|
@@ -441,7 +441,7 @@ class Zigbee extends utils.Adapter {
|
|
|
441
441
|
|
|
442
442
|
Promise.all(chain)
|
|
443
443
|
.then(() =>
|
|
444
|
-
this.stController.
|
|
444
|
+
this.stController.deleteObj(devId, () =>
|
|
445
445
|
this.stController.updateDev(devId, model, model, async () => {
|
|
446
446
|
await this.stController.syncDevStates(device, model);
|
|
447
447
|
resolve();
|
|
@@ -467,7 +467,9 @@ class Zigbee extends utils.Adapter {
|
|
|
467
467
|
const devId = device.ieeeAddr.substr(2);
|
|
468
468
|
const meta = {device};
|
|
469
469
|
|
|
470
|
-
|
|
470
|
+
const has_elevated_debug = this.stController.checkDebugDevice(devId);
|
|
471
|
+
|
|
472
|
+
if (has_elevated_debug) {
|
|
471
473
|
const shortMessage = {};
|
|
472
474
|
for(const propertyName in message) {
|
|
473
475
|
shortMessage[propertyName] = message[propertyName];
|
|
@@ -475,7 +477,7 @@ class Zigbee extends utils.Adapter {
|
|
|
475
477
|
shortMessage.device = device.ieeeAddr;
|
|
476
478
|
shortMessage.meta = undefined;
|
|
477
479
|
shortMessage.endpoint = (message.endpoint.ID ? message.endpoint.ID: -1);
|
|
478
|
-
this.log.warn(`ELEVATED: Zigbee Event of Type ${type} from device ${safeJsonStringify(device.ieeeAddr)}, incoming event: ${safeJsonStringify(shortMessage)}`);
|
|
480
|
+
this.log.warn(`ELEVATED I0: Zigbee Event of Type ${type} from device ${safeJsonStringify(device.ieeeAddr)}, incoming event: ${safeJsonStringify(shortMessage)}`);
|
|
479
481
|
}
|
|
480
482
|
// this assigment give possibility to use iobroker logger in code of the converters, via meta.logger
|
|
481
483
|
meta.logger = this.log;
|
|
@@ -558,6 +560,8 @@ class Zigbee extends utils.Adapter {
|
|
|
558
560
|
if (!converters.length) {
|
|
559
561
|
if (type !== 'readResponse') {
|
|
560
562
|
this.log.debug(`No converter available for '${mappedModel.model}' '${devId}' with cluster '${cluster}' and type '${type}'`);
|
|
563
|
+
if (has_elevated_debug)
|
|
564
|
+
this.log.warn(`ELEVATED IE0: No converter available for '${mappedModel.model}' '${devId}' with cluster '${cluster}' and type '${type}'`);
|
|
561
565
|
}
|
|
562
566
|
return;
|
|
563
567
|
}
|
|
@@ -639,7 +643,7 @@ class Zigbee extends utils.Adapter {
|
|
|
639
643
|
|
|
640
644
|
if (!mappedModel) {
|
|
641
645
|
this.log.debug(`No mapped model for ${model}`);
|
|
642
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: No mapped model for ${model}`)
|
|
646
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O2: No mapped model for ${model}`)
|
|
643
647
|
return;
|
|
644
648
|
}
|
|
645
649
|
|
|
@@ -715,26 +719,29 @@ class Zigbee extends utils.Adapter {
|
|
|
715
719
|
|
|
716
720
|
if (!c.hasOwnProperty('convertSet')) continue;
|
|
717
721
|
this.log.debug(`Type of toZigbee is '${typeof c}', Contains key ${(c.hasOwnProperty('key')?JSON.stringify(c.key):'false ')}`)
|
|
718
|
-
if (!c.hasOwnProperty('key')
|
|
722
|
+
if (!c.hasOwnProperty('key'))
|
|
719
723
|
{
|
|
720
|
-
converter
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
+
if (c.hasOwnProperty('convertSet') && converter === undefined)
|
|
725
|
+
{
|
|
726
|
+
converter = c;
|
|
727
|
+
if (has_elevated_debug)
|
|
728
|
+
this.log.warn(`ELEVATED O3A: Setting converter to keyless converter for ${deviceId} of type ${model}`)
|
|
729
|
+
this.log.debug('setting converter to keyless converter')
|
|
730
|
+
}
|
|
731
|
+
else
|
|
732
|
+
{
|
|
733
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O3B: ignoring keyless converter for ${deviceId} of type ${model}`)
|
|
734
|
+
this.log.debug('ignoring keyless converter')
|
|
735
|
+
}
|
|
724
736
|
continue;
|
|
725
737
|
}
|
|
726
738
|
if (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id))
|
|
727
739
|
{
|
|
728
740
|
this.log.debug(`${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
729
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: ${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
741
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O3C: ${(converter===undefined?'Setting':'Overriding')}' converter to converter with key(s)'${JSON.stringify(c.key)}}`)
|
|
730
742
|
converter = c;
|
|
731
743
|
}
|
|
732
|
-
|
|
733
744
|
}
|
|
734
|
-
/*
|
|
735
|
-
if (!mappedModel.toZigbee[0].hasOwnProperty('key') && mappedModel.toZigbee[0].hasOwnProperty('convertSet')) converter = mappedModel.toZigbee[0];
|
|
736
|
-
converter = mappedModel.toZigbee.find(c => c && c.hasOwnProperty('key') && (c.key.includes(stateDesc.prop) || c.key.includes(stateDesc.setattr) || c.key.includes(stateDesc.id)));
|
|
737
|
-
*/
|
|
738
745
|
if (converter === undefined) {
|
|
739
746
|
this.log.error(`No converter available for '${model}' with key '${stateDesc.id}' `);
|
|
740
747
|
this.sendError(`No converter available for '${model}' with key '${stateDesc.id}' `);
|
|
@@ -755,9 +762,9 @@ class Zigbee extends utils.Adapter {
|
|
|
755
762
|
}
|
|
756
763
|
|
|
757
764
|
const epName = stateDesc.epname !== undefined ? stateDesc.epname : (stateDesc.prop || stateDesc.id);
|
|
758
|
-
const key = stateDesc.
|
|
765
|
+
const key = stateDesc.setattr || stateDesc.prop || stateDesc.id;
|
|
759
766
|
this.log.debug(`convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)}`);
|
|
760
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)} for device ${deviceId}`);
|
|
767
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O4: convert ${key}, ${safeJsonStringify(preparedValue)}, ${safeJsonStringify(preparedOptions)} for device ${deviceId} with Endpoint ${epName}`);
|
|
761
768
|
|
|
762
769
|
let target;
|
|
763
770
|
if (model === 'group') {
|
|
@@ -797,24 +804,21 @@ class Zigbee extends utils.Adapter {
|
|
|
797
804
|
try {
|
|
798
805
|
const result = await converter.convertSet(target, key, preparedValue, meta);
|
|
799
806
|
this.log.debug(`convert result ${safeJsonStringify(result)}`);
|
|
800
|
-
if (has_elevated_debug) this.log.warn(`ELEVATED: convert result ${safeJsonStringify(result)} for device ${deviceId}`);
|
|
807
|
+
if (has_elevated_debug) this.log.warn(`ELEVATED O5: convert result ${safeJsonStringify(result)} for device ${deviceId}`);
|
|
801
808
|
if (result !== undefined) {
|
|
802
809
|
if (stateModel && !isGroup) {
|
|
803
810
|
this.acknowledgeState(deviceId, model, stateDesc, value);
|
|
804
811
|
}
|
|
805
812
|
// process sync state list
|
|
806
813
|
this.processSyncStatesList(deviceId, model, syncStateList);
|
|
807
|
-
|
|
808
|
-
// if (isGroup) {
|
|
809
|
-
// await this.callPluginMethod('queryGroupMemberState', [deviceId, stateDesc]);
|
|
810
|
-
// this.acknowledgeState(deviceId, model, stateDesc, value);
|
|
811
|
-
// }
|
|
812
814
|
}
|
|
813
815
|
else
|
|
814
|
-
if (has_elevated_debug)
|
|
816
|
+
if (has_elevated_debug)
|
|
817
|
+
this.log.error(`ELEVATED OE2: Error convert result for ${key} with ${safeJsonStringify(preparedValue)} is undefined on device ${deviceId}.`);
|
|
815
818
|
|
|
816
819
|
} catch (error) {
|
|
817
|
-
if (has_elevated_debug)
|
|
820
|
+
if (has_elevated_debug)
|
|
821
|
+
this.log.error(`ELEVATED OE3: caught error ${safeJsonStringify(error)} when setting value for device ${deviceId}.`);
|
|
818
822
|
this.filterError(`Error ${error.code} on send command to ${deviceId}.` +
|
|
819
823
|
` Error: ${error.stack}`, `Send command to ${deviceId} failed with`, error);
|
|
820
824
|
}
|
|
@@ -934,7 +938,7 @@ class Zigbee extends utils.Adapter {
|
|
|
934
938
|
if (ieeeAddr) {
|
|
935
939
|
const devId = ieeeAddr.substr(2);
|
|
936
940
|
this.log.debug(`Delete device ${devId} from iobroker.`);
|
|
937
|
-
this.stController.
|
|
941
|
+
this.stController.deleteObj(devId);
|
|
938
942
|
}
|
|
939
943
|
}
|
|
940
944
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zigbee",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.14",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Kirov Ilya",
|
|
6
6
|
"email": "kirovilya@gmail.com"
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"ajv": "^8.17.1",
|
|
29
29
|
"uri-js": "^4.4.1",
|
|
30
30
|
"typescript": "^5.6.3",
|
|
31
|
-
"zigbee-herdsman": "2.1.
|
|
32
|
-
"zigbee-herdsman-converters": "20.
|
|
31
|
+
"zigbee-herdsman": "2.1.9",
|
|
32
|
+
"zigbee-herdsman-converters": "20.58.0"
|
|
33
33
|
},
|
|
34
34
|
"description": "Zigbee devices",
|
|
35
35
|
"devDependencies": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@iobroker/testing": "^5.0.0",
|
|
41
41
|
"chai": "^5.1.2",
|
|
42
42
|
"chai-as-promised": "^7.1.1",
|
|
43
|
-
"eslint": "^9.
|
|
43
|
+
"eslint": "^9.17.0",
|
|
44
44
|
"eslint-config-prettier": "^9.1.0",
|
|
45
45
|
"eslint-plugin-prettier": "^5.2.1",
|
|
46
46
|
"gulp": "^4.0.2",
|