iobroker.zigbee 1.10.3 → 1.10.11
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 +268 -17
- package/admin/adapter-settings.js +105 -18
- package/admin/admin.js +77 -45
- package/admin/i18n/de/translations.json +1 -1
- package/admin/i18n/en/translations.json +1 -1
- package/admin/i18n/fr/translations.json +1 -1
- package/admin/i18n/nl/translations.json +1 -1
- package/admin/i18n/pl/translations.json +1 -1
- package/admin/i18n/pt/translations.json +1 -1
- package/admin/img/E2204.png +0 -0
- package/admin/img/group_1.png +0 -0
- package/admin/img/group_2.png +0 -0
- package/admin/img/group_3.png +0 -0
- package/admin/img/group_4.png +0 -0
- package/admin/img/group_5.png +0 -0
- package/admin/img/group_6.png +0 -0
- package/admin/img/group_7.png +0 -0
- package/admin/index_m.html +286 -32
- package/admin/tab_m.html +312 -7
- package/admin/words.js +2 -2
- package/docs/de/readme.md +15 -16
- package/docs/en/readme.md +19 -19
- package/io-package.json +104 -99
- package/lib/backup.js +1 -2
- package/lib/commands.js +6 -5
- package/lib/developer.js +6 -2
- package/lib/devices.js +6 -2
- package/lib/groups.js +1 -25
- package/lib/ota.js +2 -2
- package/lib/statescontroller.js +48 -39
- package/lib/utils.js +4 -1
- package/lib/zigbeecontroller.js +70 -26
- package/main.js +57 -8
- package/package.json +17 -16
- package/support/docgen.js +3 -1
package/io-package.json
CHANGED
|
@@ -1,98 +1,98 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "1.10.
|
|
4
|
+
"version": "1.10.11",
|
|
5
5
|
"news": {
|
|
6
|
-
"1.10.
|
|
7
|
-
"en": "
|
|
8
|
-
"de": "
|
|
9
|
-
"ru": "
|
|
10
|
-
"pt": "
|
|
11
|
-
"nl": "
|
|
12
|
-
"fr": "
|
|
13
|
-
"it": "
|
|
14
|
-
"es": "
|
|
15
|
-
"pl": "
|
|
16
|
-
"uk": "
|
|
17
|
-
"zh-cn": "
|
|
6
|
+
"1.10.11": {
|
|
7
|
+
"en": "BREAKING CHANGE\n\nbugs : ChannelScan is currently not available\n\n\nfix linter errors\ndisable map display for deactivated devices\nnew option on map: disable physics interaction\nnew zigbee-herdsman-converters 20.28.0\nnew zigbee-herdsman 2.1.1\nAllow use of keyless converters (used for TuYa and compatible devices in zigbee-herdsman-converters\nswap from request to axios\ndelete groups works again",
|
|
8
|
+
"de": "VERWENDUNGSBEREICH\n\nbugs : ChannelScan ist derzeit nicht verfügbar\n\n\nlinterfehler beheben\nkartenanzeige für deaktivierte geräte deaktivieren\nneue option auf der karte: physik-interaktion deaktivieren\nneue zickbee-herdsman-konverter 20.28.0\nneuer zickbee-herdsman 2.1.1\nVerwenden von schlüssellosen Wandlern (für TuYa und kompatible Geräte in Zickbee-herdsman-Konverter verwendet)\nswap von anfrage an axios\nlöschen von gruppen funktioniert wieder",
|
|
9
|
+
"ru": "ОБМЕН\n\nжуки: ChannelScan в настоящее время не доступен\n\n\nисправление ошибок\nотключить отображение карты для деактивированных устройств\nновый вариант на карте: отключить взаимодействие физики\n20.28.0\n2.1.1\nПозволить использовать бесключевые конвертеры (используемые для TuYa и совместимые устройства в zigbee-herdsman-конвертерах\nсвопа от запроса к axios\nудалить группы снова",
|
|
10
|
+
"pt": "ALTERAÇÕES DE TRABALHO\n\nbugs : ChannelScan não está disponível\n\n\ncorrigir erros do linter\ndesativar a exibição do mapa para dispositivos desativados\nnova opção no mapa: desativar a interação física\nnovos conversores de zigbee-herdsman 20.28.0\nnovo zigbee-herdsman 2.1.1\nPermitir o uso de conversores sem chave (usado para TuYa e dispositivos compatíveis em conversores de zigbee-herdsman\nswap de pedido para axios\nexcluir grupos funciona novamente",
|
|
11
|
+
"nl": "BREAKING VERANDERING\n\nbugs: ChannelScan is momenteel niet beschikbaar\n\n\nrepareren linter fouten\nkaartweergave voor gedeactiveerde apparaten uitschakelen\nnieuwe optie op de kaart: interactie natuurkunde uitschakelen\nnieuwe zigbee-herdsman-converters 20.28.0\nnieuwe zigbee-herdsman 2.1.1\nGebruik van sleutelloze converters toestaan (gebruikt voor TuYa en compatibele apparaten in zigbee-herdsman-converters\nruil van verzoek naar axios\ngroepen opnieuw verwijderen",
|
|
12
|
+
"fr": "CHANGEMENT DE BREAING\n\nbugs : ChannelScan n'est actuellement pas disponible\n\n\ncorrection des erreurs linter\ndésactiver l'affichage de la carte pour les appareils désactivés\nnouvelle option sur la carte: désactiver l'interaction physique\nnouveaux convertisseurs zigbee-herdsman 20.28.0\nnouveau zigbee-herdsman 2.1.1\nPermettre l'utilisation de convertisseurs sans clé (utilisés pour TuYa et appareils compatibles dans les convertisseurs zigbee-herdsman-converters\néchange de la demande à l'axios\nsupprimer les groupes fonctionne à nouveau",
|
|
13
|
+
"it": "CAPITOLO DI RICERCA\n\nbugs: ChannelScan non è attualmente disponibile\n\n\ncorreggere gli errori di linter\ndisabilitare la visualizzazione della mappa per i dispositivi disattivati\nnuova opzione sulla mappa: disabilitare l'interazione fisica\nnuovo zigbee-herdsman-converters 20.28.0\nnuovo zigbee-herdsman 2.1.1\nConsentire l'uso di convertitori senza chiave (utilizzati per TuYa e dispositivi compatibili in zigbee-herdsman-converter\nswap da richiesta a assios\ncancellare i gruppi funziona di nuovo",
|
|
14
|
+
"es": "BREAKING CHANGE\n\nbugs : ChannelScan actualmente no está disponible\n\n\ncorrige errores de invierno\npantalla de mapa deshabilitado para dispositivos desactivados\nnueva opción en el mapa: la interacción física deshabilitada\nnuevos zigbee-herdsman-converters 20.28.0\nnuevo zigbee-herdsman 2.1.1\nPermitir el uso de convertidores sin llave (utilizados para TuYa y dispositivos compatibles en zigbee-herdsman-converters\nswap from request to axios\neliminar grupos funciona de nuevo",
|
|
15
|
+
"pl": "ZMIANA ZBIORCZA\n\nbłędy: ChannelScan jest obecnie niedostępny\n\n\nnaprawić błędy lintera\nwyłączyć wyświetlacz mapy dla wyłączonych urządzeń\nnowa opcja na mapie: wyłączenie interakcji fizyki\nnowe konwertery zigbee- herdsman- 20.28.0\nnowy zigbee-herdsman 2.1.1\nZezwalaj na stosowanie konwerterów bezklawiszowych (używanych dla TuYa i kompatybilnych urządzeń w konwerterach zigbee- herdsman-\nzamiana z wniosku na aksjos\nusuń grupy działa ponownie",
|
|
16
|
+
"uk": "БРЕАКІНГ ЗМІН\n\nпомилки : CanalScan наразі немає\n\n\nвиправлено помилки linter\nвідключення відображення карти для деактивованих пристроїв\nновий варіант на карті: відключена фізика взаємодія\nнові zigbee-herdsman-converters 20.28.0\nновий zigbee-herdsman 2.1.1\nДозволити використання без ключів конвертерів (використовується для TuYa та сумісних пристроїв в zigbee-herdsman-converters\nковтання від запиту в осях\nвидалити групи знову",
|
|
17
|
+
"zh-cn": "破坏变化\n\n错误 : 频道扫描目前不可用\n\n\n修正线性错误\n禁用已停用设备的地图显示\n地图上的新选项: 禁用物理交互\n新齐格比-牧民-转换器 20.28.0\n新齐格比牧民 2.1.1\n允许使用无密钥转换器( 用于 TuYa 和 Zigbee- herdsman- 转换器中的兼容设备)\n从请求转换为轴\n再次删除组工作"
|
|
18
18
|
},
|
|
19
|
-
"1.10.
|
|
20
|
-
"en": "
|
|
21
|
-
"de": "
|
|
22
|
-
"ru": "обновление",
|
|
23
|
-
"pt": "atualização de dependência",
|
|
24
|
-
"nl": "
|
|
25
|
-
"fr": "mise à jour de la dépendance",
|
|
26
|
-
"it": "aggiornamento della dipendenza",
|
|
27
|
-
"es": "actualización de la dependencia",
|
|
28
|
-
"pl": "aktualizacja zależności",
|
|
29
|
-
"uk": "оновлення залежності",
|
|
30
|
-
"zh-cn": "依赖性更新"
|
|
19
|
+
"1.10.10": {
|
|
20
|
+
"en": "core update\ndependency update",
|
|
21
|
+
"de": "kern-update\naktualisierung der abhängigkeit",
|
|
22
|
+
"ru": "обновление\nобновление",
|
|
23
|
+
"pt": "atualização do núcleo\natualização de dependência",
|
|
24
|
+
"nl": "kernupdate\nafhankelijkheidsupdate",
|
|
25
|
+
"fr": "mise à jour de base\nmise à jour de la dépendance",
|
|
26
|
+
"it": "aggiornamento del core\naggiornamento della dipendenza",
|
|
27
|
+
"es": "actualización básica\nactualización de la dependencia",
|
|
28
|
+
"pl": "podstawowa aktualizacja\naktualizacja zależności",
|
|
29
|
+
"uk": "оновлення ядра\nоновлення залежності",
|
|
30
|
+
"zh-cn": "核心更新\n依赖性更新"
|
|
31
31
|
},
|
|
32
|
-
"1.10.
|
|
33
|
-
"en": "
|
|
34
|
-
"de": "
|
|
35
|
-
"ru": "
|
|
36
|
-
"pt": "
|
|
37
|
-
"nl": "
|
|
38
|
-
"fr": "
|
|
39
|
-
"it": "
|
|
40
|
-
"es": "
|
|
41
|
-
"pl": "
|
|
42
|
-
"uk": "
|
|
43
|
-
"zh-cn": "
|
|
32
|
+
"1.10.9": {
|
|
33
|
+
"en": "typo admin settings\neslint config",
|
|
34
|
+
"de": "typo admin einstellungen\neslint config",
|
|
35
|
+
"ru": "настройки admin\neslint config",
|
|
36
|
+
"pt": "configurações de administração do tipo\neslint config",
|
|
37
|
+
"nl": "typo admin instellingen\neslint config",
|
|
38
|
+
"fr": "paramètres d'administration typo\nconfig eslint",
|
|
39
|
+
"it": "impostazioni dell'amministratore\neslint config",
|
|
40
|
+
"es": "configuración de administración de tipo\neslint config",
|
|
41
|
+
"pl": "ustawienia admin typo\neslint config",
|
|
42
|
+
"uk": "параметри адміністратора\neslint config",
|
|
43
|
+
"zh-cn": "类型管理员设置\n埃斯林特配置"
|
|
44
44
|
},
|
|
45
|
-
"1.10.
|
|
46
|
-
"en": "
|
|
47
|
-
"de": "
|
|
48
|
-
"ru": "
|
|
49
|
-
"pt": "
|
|
50
|
-
"nl": "
|
|
51
|
-
"fr": "
|
|
52
|
-
"it": "
|
|
53
|
-
"es": "
|
|
54
|
-
"pl": "
|
|
55
|
-
"uk": "
|
|
56
|
-
"zh-cn": "
|
|
45
|
+
"1.10.8": {
|
|
46
|
+
"en": "corr admin settings\nadd new eslint version\n",
|
|
47
|
+
"de": "korr admin einstellungen\nneue eslint-version hinzufügen\n",
|
|
48
|
+
"ru": "настройки администрирования\nдобавить новую версию eslint\n",
|
|
49
|
+
"pt": "configurações de administração de corrimento\nadicionar nova versão eslint\n",
|
|
50
|
+
"nl": "corr admin instellingen\nnieuwe eslint versie toevoegen\n",
|
|
51
|
+
"fr": "paramètres d'administration corr\najouter une nouvelle version eslint\n",
|
|
52
|
+
"it": "impostazioni dell'amministratore\naggiungere nuova versione eslint\n",
|
|
53
|
+
"es": "configuración de administración de corr\nañadir nueva versión eslint\n",
|
|
54
|
+
"pl": "ustawienia admin corr\ndodaj nową wersję eslint\n",
|
|
55
|
+
"uk": "корр налаштування адміністратора\nдодати нову версію eslint\n",
|
|
56
|
+
"zh-cn": "corr 管理员设置\n添加新的 eslint 版本\n"
|
|
57
57
|
},
|
|
58
|
-
"1.
|
|
59
|
-
"en": "
|
|
60
|
-
"de": "
|
|
61
|
-
"ru": "
|
|
62
|
-
"pt": "
|
|
63
|
-
"nl": "
|
|
64
|
-
"fr": "
|
|
65
|
-
"it": "
|
|
66
|
-
"es": "
|
|
67
|
-
"pl": "
|
|
68
|
-
"uk": "
|
|
69
|
-
"zh-cn": "
|
|
58
|
+
"1.10.7": {
|
|
59
|
+
"en": "add flow control option \nadd new NewHerdsman\nadd new ezsp coordinator Firmware (7.4.1.0)",
|
|
60
|
+
"de": "möglichkeit der durchflussregelung\nneues hinzufügen NewHerdsman\nezsp Koordinator Firmware hinzufügen (7.4.1.0)",
|
|
61
|
+
"ru": "добавить параметр управления потоком\nдобавить новый NewHerdsman\nдобавить новый координатор ezsp Firmware (7.4.1.0)",
|
|
62
|
+
"pt": "adicionar opção de controle de fluxo\nadicionar novo NewHerdsman\nadicionar novo coordenador ezsp Firmware (7.4.1.0)",
|
|
63
|
+
"nl": "flow control optie toevoegen\nnieuwe NewHerdsman toevoegen\nnieuwe ezsp coördinator Firmware (7.4.1.0) toevoegen",
|
|
64
|
+
"fr": "ajouter l'option de contrôle du débit\najouter un nouveau NewHerdsman\najouter un nouveau logiciel ezsp coordinator (7.4.1.0)",
|
|
65
|
+
"it": "aggiungere opzione di controllo del flusso\naggiungere nuovo NewHerdsman\naggiungere nuovo coordinatore ezsp Firmware (7.4.1.0)",
|
|
66
|
+
"es": "añadir opción de control de flujo\nañadir nuevo NewHerdsman\nañadir nuevo coordinador de ezsp Firmware (7.4.1.0)",
|
|
67
|
+
"pl": "dodaj opcję kontroli przepływu\ndodaj nowy NewHerdsman\ndodaj nowego koordynatora ezsp Firmware (7.4.1.0)",
|
|
68
|
+
"uk": "додати варіант контролю потоку\nдодати новийHerdsman\nadd new ezsp manager Прошивка (7.4.1.0)",
|
|
69
|
+
"zh-cn": "添加流量控制选项\n添加新赫兹曼\n添加新的 ezsp 协调员 Firmware (7.4.1.0)"
|
|
70
70
|
},
|
|
71
|
-
"1.
|
|
72
|
-
"en": "
|
|
73
|
-
"de": "
|
|
74
|
-
"ru": "
|
|
75
|
-
"pt": "
|
|
76
|
-
"nl": "
|
|
77
|
-
"fr": "
|
|
78
|
-
"it": "
|
|
79
|
-
"es": "
|
|
80
|
-
"pl": "
|
|
81
|
-
"uk": "
|
|
82
|
-
"zh-cn": "
|
|
71
|
+
"1.10.6": {
|
|
72
|
+
"en": "core update\ndependency update",
|
|
73
|
+
"de": "kern-update\naktualisierung der abhängigkeit",
|
|
74
|
+
"ru": "обновление\nобновление",
|
|
75
|
+
"pt": "atualização do núcleo\natualização de dependência",
|
|
76
|
+
"nl": "kernupdate\nafhankelijkheidsupdate",
|
|
77
|
+
"fr": "mise à jour de base\nmise à jour de la dépendance",
|
|
78
|
+
"it": "aggiornamento del core\naggiornamento della dipendenza",
|
|
79
|
+
"es": "actualización básica\nactualización de la dependencia",
|
|
80
|
+
"pl": "podstawowa aktualizacja\naktualizacja zależności",
|
|
81
|
+
"uk": "оновлення ядра\nоновлення залежності",
|
|
82
|
+
"zh-cn": "核心更新\n依赖性更新"
|
|
83
83
|
},
|
|
84
|
-
"1.
|
|
85
|
-
"en": "update
|
|
86
|
-
"de": "
|
|
87
|
-
"ru": "обновление
|
|
88
|
-
"pt": "
|
|
89
|
-
"nl": "
|
|
90
|
-
"fr": "
|
|
91
|
-
"it": "
|
|
92
|
-
"es": "actualización
|
|
93
|
-
"pl": "
|
|
94
|
-
"uk": "
|
|
95
|
-
"zh-cn": "
|
|
84
|
+
"1.10.5": {
|
|
85
|
+
"en": "icon ota device update\nicon fix",
|
|
86
|
+
"de": "icon ota device update\nsymbol fix",
|
|
87
|
+
"ru": "обновление значок ota\nзначок",
|
|
88
|
+
"pt": "atualização do dispositivo do ícone ota\ncorreção do ícone",
|
|
89
|
+
"nl": "pictogram ota apparaat update\npictogramfix",
|
|
90
|
+
"fr": "icône ota mise à jour du périphérique\ncorrection de l'icône",
|
|
91
|
+
"it": "icona ota aggiornamento del dispositivo\nicona fix",
|
|
92
|
+
"es": "icono ota actualización del dispositivo\nicono de fijación",
|
|
93
|
+
"pl": "icon ota aktualizacji urządzenia\nikona fix",
|
|
94
|
+
"uk": "ota пристрій оновлення\nфіксатор ікони",
|
|
95
|
+
"zh-cn": "图标 ota 设备更新\n图标修复"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -128,7 +128,10 @@
|
|
|
128
128
|
"authors": [
|
|
129
129
|
"Kirov Ilya<kirovilya@gmail.com>"
|
|
130
130
|
],
|
|
131
|
-
"
|
|
131
|
+
"licenseInformation": {
|
|
132
|
+
"license": "MIT",
|
|
133
|
+
"type": "free"
|
|
134
|
+
},
|
|
132
135
|
"platform": "Javascript/Node.js",
|
|
133
136
|
"mode": "daemon",
|
|
134
137
|
"icon": "zigbee.png",
|
|
@@ -197,8 +200,8 @@
|
|
|
197
200
|
"condition": {
|
|
198
201
|
"operand": "and",
|
|
199
202
|
"rules": [
|
|
200
|
-
"oldVersion<=1.
|
|
201
|
-
"newVersion>=1.
|
|
203
|
+
"oldVersion<=1.10.3",
|
|
204
|
+
"newVersion>=1.10.10"
|
|
202
205
|
]
|
|
203
206
|
},
|
|
204
207
|
"title": {
|
|
@@ -214,16 +217,17 @@
|
|
|
214
217
|
"zh-cn": "重要通知!"
|
|
215
218
|
},
|
|
216
219
|
"text": {
|
|
217
|
-
"en": "
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"
|
|
221
|
-
"
|
|
222
|
-
"
|
|
223
|
-
"
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
220
|
+
"en": "\"BREAKING CHANGE. after update to this Version you can't go back to Version <= 1.10.3. Only option is your Backup",
|
|
221
|
+
"de": "\"BREAKING CHANGE. nach dem Update könnt ihr nicht zurück zu einer Version <= 1.10.3. Es geht nur per ioBroker Backup was hoffentlich gemacht habt",
|
|
222
|
+
"ru": "\"Изменяюсь. После обновления этой версии вы не можете вернуться к версии <= 1.10.3. Единственный вариант - это ваша резервная копия",
|
|
223
|
+
"pt": "\"BREAKING CHANGE. após a atualização para esta versão você não pode voltar para Versão <= 1.10.3. A única opção é o seu Backup",
|
|
224
|
+
"nl": "\"Verandering. Na update naar deze versie kun je niet meer terug naar versie <= 1.10.3. De enige optie is uw back-up",
|
|
225
|
+
"fr": "\"C'est le changement. après la mise à jour de cette version, vous ne pouvez pas retourner à la version <= 1.10.3. Seule option est votre sauvegarde",
|
|
226
|
+
"it": "\"Cambiare il cambiamento. dopo l'aggiornamento a questa versione non si può tornare alla versione <= 1.10.3. Solo l'opzione è il backup",
|
|
227
|
+
"es": "\"Cambiando. después de la actualización a esta versión no puede volver a la versión 0 = 1.10.3. La única opción es tu Backup",
|
|
228
|
+
"pl": "\"ZMIENIONA ZMIANA. po aktualizacji do tej wersji nie można wrócić do wersji < = 1.10.3. Jedyną opcją jest kopia zapasowa",
|
|
229
|
+
"uk": "\"Бреагування ЗМІНИ. після оновлення цієї версії ви не можете повернутися до версії <= 1.10.3. Тільки варіант - Ваш Резервне копіювання",
|
|
230
|
+
"zh-cn": "\"呼吸变化。 更新到此版本后, 您不能返回到 QQ 1. 10. 3. 版本 。 唯一的选项是您的备份"
|
|
227
231
|
},
|
|
228
232
|
"link": "https://github.com/ioBroker/ioBroker.zigbee/blob/master/README.md",
|
|
229
233
|
"level": "warn",
|
|
@@ -261,7 +265,8 @@
|
|
|
261
265
|
"external": "",
|
|
262
266
|
"startWithInconsistent": false,
|
|
263
267
|
"warnOnDeviceAnnouncement": true,
|
|
264
|
-
"baudRate": 115200
|
|
268
|
+
"baudRate": 115200,
|
|
269
|
+
"flowCTRL": false
|
|
265
270
|
},
|
|
266
271
|
"instanceObjects": [
|
|
267
272
|
{
|
package/lib/backup.js
CHANGED
|
@@ -117,7 +117,6 @@ class Backup {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
// eslint-disable-next-line no-unused-vars
|
|
121
120
|
delBackupsFiles(options, files) {
|
|
122
121
|
const arr = files.length;
|
|
123
122
|
if (arr > 10) {
|
|
@@ -134,7 +133,7 @@ class Backup {
|
|
|
134
133
|
}
|
|
135
134
|
}
|
|
136
135
|
|
|
137
|
-
|
|
136
|
+
|
|
138
137
|
async listbackups(obj) {
|
|
139
138
|
|
|
140
139
|
}
|
package/lib/commands.js
CHANGED
|
@@ -277,19 +277,20 @@ class Commands {
|
|
|
277
277
|
// get group members and store them
|
|
278
278
|
const match = /zigbee.\d.group_([0-9]+)/.exec(devInfo._id);
|
|
279
279
|
if (match && match.length > 1) {
|
|
280
|
-
const
|
|
281
|
-
|
|
280
|
+
const groupID = Number(match[1]);
|
|
281
|
+
const groupmembers = await this.zbController.getGroupMembersFromController(groupID);
|
|
282
|
+
this.debug(`group members for group ${groupID}: ${JSON.stringify(groupmembers)}`);
|
|
282
283
|
if (groupmembers && groupmembers.length > 0) {
|
|
283
284
|
const memberinfo = [];
|
|
284
285
|
for (const member of groupmembers) {
|
|
285
286
|
if (groups) {
|
|
286
287
|
const grouparray = groups[member.ieee];
|
|
287
288
|
if (grouparray) {
|
|
288
|
-
if (!grouparray.includes(
|
|
289
|
-
groups[member.ieee].push(
|
|
289
|
+
if (!grouparray.includes(groupID)) {
|
|
290
|
+
groups[member.ieee].push(groupID);
|
|
290
291
|
}
|
|
291
292
|
} else {
|
|
292
|
-
groups[member.ieee] = [
|
|
293
|
+
groups[member.ieee] = [groupID];
|
|
293
294
|
}
|
|
294
295
|
}
|
|
295
296
|
const device = await this.adapter.getObjectAsync(`${this.adapter.namespace}.${member.ieee.substr(2)}`);
|
package/lib/developer.js
CHANGED
|
@@ -31,6 +31,10 @@ class Developer {
|
|
|
31
31
|
this.adapter.log.debug(msg);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
warn(msg) {
|
|
35
|
+
this.adapter.log.warn(msg);
|
|
36
|
+
}
|
|
37
|
+
|
|
34
38
|
/**
|
|
35
39
|
* @param {ioBroker.Message} obj
|
|
36
40
|
*/
|
|
@@ -57,7 +61,7 @@ class Developer {
|
|
|
57
61
|
const zcl = ZigbeeHerdsman.Zcl;
|
|
58
62
|
const result = {};
|
|
59
63
|
if (key === 'cidList') {
|
|
60
|
-
result.list = zcl.
|
|
64
|
+
result.list = zcl.Clusters;
|
|
61
65
|
} else if (key === 'attrIdList') {
|
|
62
66
|
const cid = obj.message.cid;
|
|
63
67
|
result.list = zcl.Utils.getCluster(cid).attributes;
|
|
@@ -133,7 +137,7 @@ class Developer {
|
|
|
133
137
|
// report exceptions
|
|
134
138
|
// happens for example if user tries to send write command but did not provide value/type
|
|
135
139
|
// or unsupported attribute was addressed.
|
|
136
|
-
const ZclStatusError = require('zigbee-herdsman/dist/zcl/zclStatusError').
|
|
140
|
+
const ZclStatusError = require('zigbee-herdsman/dist/zspec/zcl/zclStatusError').ZclStatusError;
|
|
137
141
|
if (exception instanceof ZclStatusError) {
|
|
138
142
|
const result = {};
|
|
139
143
|
result.msg = `Zigbee error ${exception.code} received!`;
|
package/lib/devices.js
CHANGED
|
@@ -37,7 +37,7 @@ const comb = {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
effectJson: (state, value, options, disableQueue) => {
|
|
42
42
|
if (state.id === states.effect_json.id) {
|
|
43
43
|
const effectjson = {};
|
|
@@ -1401,7 +1401,7 @@ const devices = [
|
|
|
1401
1401
|
linkedStates: [comb.brightnessAndState],
|
|
1402
1402
|
},
|
|
1403
1403
|
{
|
|
1404
|
-
models: ['LED1536G5', 'LED1903C5/LED1835C6'],
|
|
1404
|
+
models: ['LED1536G5', 'LED1835C6', 'LED1903C5/LED1835C6'],
|
|
1405
1405
|
icon: 'img/ikea_e14_bulb.png',
|
|
1406
1406
|
states: lightStatesWithColortemp,
|
|
1407
1407
|
linkedStates: [comb.brightnessAndState],
|
|
@@ -3090,6 +3090,10 @@ const devices = [
|
|
|
3090
3090
|
models: ['E1603/E1702/E1708'],
|
|
3091
3091
|
icon: 'img/ikea_control_outlet.png',
|
|
3092
3092
|
},
|
|
3093
|
+
{
|
|
3094
|
+
models: ['E2204'],
|
|
3095
|
+
icon: 'img/E2204.png',
|
|
3096
|
+
},
|
|
3093
3097
|
];
|
|
3094
3098
|
|
|
3095
3099
|
const commonStates = [
|
package/lib/groups.js
CHANGED
|
@@ -206,32 +206,8 @@ class Groups {
|
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
async deleteGroup(from, command, message) {
|
|
209
|
-
/*
|
|
210
|
-
const members = await this.getGroupMembersFromController(parseInt(message));
|
|
211
|
-
if (members && members.length) {
|
|
212
|
-
for (const member of members) {
|
|
213
|
-
const devName = member.device.substring(2);
|
|
214
|
-
const groupEntry = this.adapter.getStateAsync(`${devName}.groups`);
|
|
215
|
-
const memberarray = (groupEntry && groupEntry.val) ? JSON.parse(groupEntry.val) : [];
|
|
216
|
-
const index = memberarray.indexOf(message.toString());
|
|
217
|
-
if (index > -1) {
|
|
218
|
-
memberarray.splice(index, 1);
|
|
219
|
-
}
|
|
220
|
-
if (memberarray.length > 0) {
|
|
221
|
-
await this.adapter.setStateAsync(`${devName}.groups`, JSON.stringify(memberarray), true);
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
await this.adapter.setStateAsync(`${devName}.groups`, '', true);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
const groupsEntry = await this.adapter.getStateAsync('info.groups');
|
|
229
|
-
const objGroups = (groupsEntry && groupsEntry.val ? JSON.parse(groupsEntry.val) : {});
|
|
230
|
-
delete objGroups[message.toString()];
|
|
231
|
-
await this.adapter.setStateAsync('info.groups', JSON.stringify(objGroups), true);
|
|
232
|
-
*/
|
|
233
209
|
await this.zbController.removeGroupById(message);
|
|
234
|
-
await this.stController.
|
|
210
|
+
await this.stController.deleteGroupById(`group_${parseInt(message)}`);
|
|
235
211
|
}
|
|
236
212
|
|
|
237
213
|
async renameGroup(from, command, message) {
|
package/lib/ota.js
CHANGED
|
@@ -94,7 +94,7 @@ class Ota {
|
|
|
94
94
|
this.debug(`Checking if firmware update is available for ${device.name}`);
|
|
95
95
|
|
|
96
96
|
if (device && device.mapped.ota) {
|
|
97
|
-
const available = await device.mapped.ota.isUpdateAvailable(device.device,
|
|
97
|
+
const available = await device.mapped.ota.isUpdateAvailable(device.device, null);
|
|
98
98
|
result.status = available.available ? 'available' : 'not_available';
|
|
99
99
|
if (available.currentFileVersion !== available.otaFileVersion) {
|
|
100
100
|
this.warn(`current Firmware for ${device.name} is ${available.currentFileVersion} new is ${available.otaFileVersion}`);
|
|
@@ -155,7 +155,7 @@ class Ota {
|
|
|
155
155
|
};
|
|
156
156
|
|
|
157
157
|
const from_ = await this.readSoftwareBuildIDAndDateCode(device.device, false);
|
|
158
|
-
await device.mapped.ota.updateToLatest(device.device,
|
|
158
|
+
const fileVersion = await device.mapped.ota.updateToLatest(device.device, onProgress);
|
|
159
159
|
const to = await this.readSoftwareBuildIDAndDateCode(device.device, true);
|
|
160
160
|
const [fromS, toS] = [JSON.stringify(from_), JSON.stringify(to)];
|
|
161
161
|
result.status = 'success';
|
package/lib/statescontroller.js
CHANGED
|
@@ -5,7 +5,7 @@ const statesMapping = require('./devices');
|
|
|
5
5
|
const getAdId = require('./utils').getAdId;
|
|
6
6
|
const getZbId = require('./utils').getZbId;
|
|
7
7
|
const fs = require('fs');
|
|
8
|
-
const
|
|
8
|
+
const axios = require('axios');
|
|
9
9
|
|
|
10
10
|
let savedDeviceNamesDB = {};
|
|
11
11
|
const knownUndefinedDevices = {};
|
|
@@ -78,6 +78,19 @@ class StatesController extends EventEmitter {
|
|
|
78
78
|
this.adapter.setStateAsync(`info.undefinedDevices`, JSON.stringify(knownUndefinedDevices), true);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
checkDebugDevice(dev) {
|
|
82
|
+
if (typeof dev != 'string' || dev == '') return false;
|
|
83
|
+
if (this.debugDevices === undefined) {
|
|
84
|
+
this.getDebugDevices();
|
|
85
|
+
}
|
|
86
|
+
for (const addressPart of this.debugDevices) {
|
|
87
|
+
if (typeof dev === 'string' && dev.includes(addressPart)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
81
94
|
onStateChange(id, state) {
|
|
82
95
|
if (!this.adapter.zbController || !this.adapter.zbController.connected()) {
|
|
83
96
|
return;
|
|
@@ -98,12 +111,9 @@ class StatesController extends EventEmitter {
|
|
|
98
111
|
}
|
|
99
112
|
return;
|
|
100
113
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
114
|
+
|
|
115
|
+
if (this.checkDebugDevice(id)) this.warn(`ELEVATED: User stateChange ${id} ${JSON.stringify(state)}`);
|
|
116
|
+
|
|
107
117
|
this.debug(`User stateChange ${id} ${JSON.stringify(state)}`);
|
|
108
118
|
const devId = getAdId(this.adapter, id); // iobroker device id
|
|
109
119
|
let deviceId = getZbId(id); // zigbee device id
|
|
@@ -185,7 +195,7 @@ class StatesController extends EventEmitter {
|
|
|
185
195
|
knownUndefinedDevices[deviceId]++;
|
|
186
196
|
} else {
|
|
187
197
|
knownUndefinedDevices[deviceId] = 1;
|
|
188
|
-
this.
|
|
198
|
+
this.info(`Device ${deviceId} "${model}" not present in statesMapping - relying on exposes for device definition.`);
|
|
189
199
|
}
|
|
190
200
|
this.adapter.setStateAsync(`info.undefinedDevices`, JSON.stringify(knownUndefinedDevices), true);
|
|
191
201
|
states = statesMapping.commonStates;
|
|
@@ -209,14 +219,13 @@ class StatesController extends EventEmitter {
|
|
|
209
219
|
async publishFromState(deviceId, model, stateKey, state, options) {
|
|
210
220
|
if (this.debugDevices === undefined) this.getDebugDevices();
|
|
211
221
|
this.debug(`Change state '${stateKey}' at device ${deviceId} type '${model}'`);
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
}
|
|
222
|
+
const elevated = this.checkDebugDevice(deviceId);
|
|
223
|
+
|
|
224
|
+
if (elevated) this.warn(`ELEVATED Change state '${stateKey}' at device ${deviceId} type '${model}'`);
|
|
225
|
+
|
|
218
226
|
const devStates = await this.getDevStates(deviceId, model);
|
|
219
227
|
if (!devStates) {
|
|
228
|
+
if (elevated) this.error(`ELEVATED no device states for device ${deviceId} type '${model}'`);
|
|
220
229
|
return;
|
|
221
230
|
}
|
|
222
231
|
const commonStates = statesMapping.commonStates.find(statedesc => stateKey === statedesc.id);
|
|
@@ -229,6 +238,7 @@ class StatesController extends EventEmitter {
|
|
|
229
238
|
|
|
230
239
|
const value = state.val;
|
|
231
240
|
if (value === undefined || value === '') {
|
|
241
|
+
if (elevated) this.error(`ELEVATED no value for device ${deviceId} type '${model}'`);
|
|
232
242
|
return;
|
|
233
243
|
}
|
|
234
244
|
let stateList = [{stateDesc: stateDesc, value: value, index: 0, timeout: 0}];
|
|
@@ -304,22 +314,22 @@ class StatesController extends EventEmitter {
|
|
|
304
314
|
states.forEach(state =>
|
|
305
315
|
this.adapter.deleteState(devId, null, state._id));
|
|
306
316
|
}
|
|
307
|
-
this.adapter.
|
|
317
|
+
this.adapter.delObject(devId, () =>
|
|
308
318
|
callback && callback());
|
|
309
319
|
});
|
|
310
320
|
}
|
|
311
321
|
|
|
312
|
-
async
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
322
|
+
async deleteGroupById(devId) {
|
|
323
|
+
const options = { recursive:true };
|
|
324
|
+
try {
|
|
325
|
+
this.adapter.delObject(devId,options), (err) => { }
|
|
326
|
+
|
|
327
|
+
} catch (err) {
|
|
328
|
+
this.adapter.log.info(`Cannot delete Group ${devId}: ${err}`);
|
|
318
329
|
}
|
|
319
|
-
await this.adapter.deleteDevice(devId);
|
|
320
330
|
}
|
|
321
331
|
|
|
322
|
-
|
|
332
|
+
|
|
323
333
|
async deleteOrphanedDeviceStates(ieeeAddr, model, force, callback) {
|
|
324
334
|
const devStates = await this.getDevStates(ieeeAddr, model);
|
|
325
335
|
const commonStates = statesMapping.commonStates;
|
|
@@ -540,15 +550,17 @@ class StatesController extends EventEmitter {
|
|
|
540
550
|
async downloadIcon(url, image_path) {
|
|
541
551
|
if (!fs.existsSync(image_path)) {
|
|
542
552
|
return new Promise((resolve, reject) => {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
553
|
+
axios({
|
|
554
|
+
method: 'get',
|
|
555
|
+
url: url,
|
|
556
|
+
responseType: 'stream' // Dies ist wichtig, um den Stream direkt zu erhalten
|
|
557
|
+
}).then(response => {
|
|
558
|
+
const writer = fs.createWriteStream(image_path);
|
|
559
|
+
response.data.pipe(writer);
|
|
560
|
+
writer.on('finish', resolve);
|
|
561
|
+
writer.on('error', reject);
|
|
562
|
+
}).catch(err => {
|
|
563
|
+
reject(err);
|
|
552
564
|
});
|
|
553
565
|
});
|
|
554
566
|
}
|
|
@@ -608,18 +620,15 @@ class StatesController extends EventEmitter {
|
|
|
608
620
|
const devStates = await this.getDevStates(`0x${devId}`, model);
|
|
609
621
|
let has_debug = false;
|
|
610
622
|
if (this.debugDevices === undefined) this.getDebugDevices();
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
break;
|
|
615
|
-
}
|
|
616
|
-
|
|
623
|
+
if (this.checkDebugDevice(devId))
|
|
624
|
+
{
|
|
625
|
+
if (!payload.hasOwnProperty('msg_from_zigbee')) {
|
|
617
626
|
this.warn(`ELEVATED publishToState: message received '${JSON.stringify(payload)}' from device ${devId} type '${model}'`);
|
|
618
627
|
has_debug = true;
|
|
619
|
-
break;
|
|
620
628
|
}
|
|
621
629
|
}
|
|
622
630
|
if (!devStates) {
|
|
631
|
+
if (has_debug) this.error(`ELEVATED publishToState: no device states for device ${devId} type '${model}'`)
|
|
623
632
|
return;
|
|
624
633
|
}
|
|
625
634
|
// find states for payload
|
package/lib/utils.js
CHANGED
|
@@ -127,8 +127,11 @@ function getDeviceIcon(definition) {
|
|
|
127
127
|
if (icon) {
|
|
128
128
|
icon = icon.replace('${model}', sanitizeImageParameter(definition.model));
|
|
129
129
|
}
|
|
130
|
+
// if (!icon) {
|
|
131
|
+
// icon = `https://www.zigbee2mqtt.io/images/devices/${sanitizeImageParameter(definition.model)}.jpg`;
|
|
132
|
+
// }
|
|
130
133
|
if (!icon) {
|
|
131
|
-
icon = `https://www.zigbee2mqtt.io/images/devices/${sanitizeImageParameter(definition.model)}.
|
|
134
|
+
icon = `https://www.zigbee2mqtt.io/images/devices/${sanitizeImageParameter(definition.model)}.png`;
|
|
132
135
|
}
|
|
133
136
|
return icon;
|
|
134
137
|
}
|