iobroker.zigbee 1.8.1 → 1.8.5
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 +34 -8
- package/admin/admin.js +31 -28
- package/admin/i18n/de/translations.json +2 -2
- package/admin/index_m.html +1171 -1001
- package/admin/words.js +2 -2
- package/io-package.json +34 -49
- package/lib/commands.js +1 -1
- package/lib/devices.js +3 -3
- package/lib/zigbeecontroller.js +25 -26
- package/main.js +9 -10
- package/package.json +7 -7
package/admin/words.js
CHANGED
|
@@ -96,8 +96,8 @@ systemDictionary = {
|
|
|
96
96
|
"zigbee-shepherd": { "uk": "Ви можете редагувати сирі дані для надсилання сюди. Не використовуйте це, якщо ви не впевнені в тому, що робите! Використовуйте формат JSON (імена атрибутів у подвійних лапках!). Також можуть бути додані додаткові атрибути. Дивіться приклади вище. (Формат, який використовує zigbee-shepherd)", "en": "You may edit the raw data to send here. Do not use this if you are not sure of what you are doing! Use JSON format (attribute names in double quotes!). Additional properties may be added too. See examples above. (Format as used by zigbee-shepherd)", "de": "Sie können die zu sendenden Rohdaten hier bearbeiten. Verwenden Sie diese nicht, wenn Sie sich nicht sicher sind, was Sie tun! Verwenden Sie das JSON-Format (Attributnamen in doppelten Anführungszeichen!). Es können auch zusätzliche Eigenschaften hinzugefügt werden. Siehe Beispiele oben. (Format wie von zigbee-shepherd verwendet)", "ru": "Вы можете редактировать необработанные данные для отправки сюда. Не используйте это, если не уверены в том, что делаете! Используйте формат JSON (имена атрибутов в двойных кавычках!). Также могут быть добавлены дополнительные свойства. См. Примеры выше. (Формат, используемый zigbee-shepherd)", "pt": "Você pode editar os dados brutos para enviar aqui. Não use isso se não tiver certeza do que está fazendo! Use o formato JSON (nomes de atributos entre aspas duplas!). Propriedades adicionais também podem ser adicionadas. Veja os exemplos acima. (Formato usado pelo pastor zigbee)", "nl": "U kunt de onbewerkte gegevens bewerken om hier naartoe te sturen. Gebruik dit niet als u niet zeker weet wat u doet! Gebruik het JSON-formaat (attribuutnamen tussen dubbele aanhalingstekens!). Er kunnen ook aanvullende eigenschappen worden toegevoegd. Zie voorbeelden hierboven. (Formaat zoals gebruikt door zigbee-shepherd)", "fr": "Vous pouvez modifier les données brutes à envoyer ici. Ne l'utilisez pas si vous n'êtes pas sûr de ce que vous faites ! Utilisez le format JSON (noms d'attributs entre guillemets !). Des propriétés supplémentaires peuvent également être ajoutées. Voir les exemples ci-dessus. (Format utilisé par zigbee-shepherd)", "it": "Puoi modificare i dati grezzi da inviare qui. Non usarlo se non sei sicuro di quello che stai facendo! Usa il formato JSON (nomi di attributi tra virgolette doppie!). Possono essere aggiunte anche proprietà aggiuntive. Vedi esempi sopra. (Formato usato da zigbee-shepherd)", "es": "Puede editar los datos sin procesar para enviar aquí. ¡No use esto si no está seguro de lo que está haciendo! Utilice el formato JSON (nombres de atributos entre comillas dobles). También se pueden agregar propiedades adicionales. Vea los ejemplos anteriores. (Formato utilizado por zigbee-shepherd)", "pl": "Tutaj możesz edytować nieprzetworzone dane do wysłania. Nie używaj tego, jeśli nie jesteś pewien, co robisz! Użyj formatu JSON (nazwy atrybutów w podwójnych cudzysłowach!). Można również dodać dodatkowe właściwości. Zobacz przykłady powyżej. (Format używany przez zigbee-shepherd)", "zh-cn": "您可以编辑原始数据以发送到此处。如果不确定自己在做什么,请不要使用它!使用JSON格式(属性名称用双引号引起来!)。也可以添加其他属性。请参阅上面的示例。 (格式由zigbee-shepherd使用)"},
|
|
97
97
|
"№": { "uk": "№", "en": "№", "de": "Nr.", "ru": "№", "pt": "№", "nl": "№", "fr": "№", "it": "№", "es": "№", "pl": "Nr", "zh-cn": "№"},
|
|
98
98
|
"Excludes": { "uk": "виключити", "en": "to exclude", "de": "ausschließen", "ru": "Исключить", "nl": "uitsluiten", "fr": "d'exclure", "pl": "wyklucz"},
|
|
99
|
-
"ExcludeTextTranslation": { "uk": "Тут ви можете додати деякі пристрої, які слід виключити з нашого опису. Вони використовують лише \"викриття (exposes)\" від zigbee-herdsman-converter. Після додавання перезапустіть адаптер.", "en": "Here you can add some devices that should be excluded from our description. They only use \"exposes\" from zigbee-herdsman-converter. After adding, please restart the adapter.", "de": "Sie können hier einige Geräte hinzufügen, die von unserer
|
|
100
|
-
"SettingsExclude": { "uk": "Примусовий запуск адаптера з не цілісною конфігурацією (не рекомендується). Оновіть адаптер до сумісної версії мікропрограми та перестворіть свою мережу якомога швидше.", "en": "Force start adapter with inconsistent configuration (not recommended). Please update the adapter to compatible firmware and recreate your network as soon as possible.", "de": "
|
|
99
|
+
"ExcludeTextTranslation": { "uk": "Тут ви можете додати деякі пристрої, які слід виключити з нашого опису. Вони використовують лише \"викриття (exposes)\" від zigbee-herdsman-converter. Після додавання перезапустіть адаптер.", "en": "Here you can add some devices that should be excluded from our description. They only use \"exposes\" from zigbee-herdsman-converter. After adding, please restart the adapter.", "de": "Sie können hier einige Geräte hinzufügen, die von unserer Verarbeitung ausgeschlossen werden sollten. Sie verwenden dann nur exposes vom ZigBee-Herdsman-Converter. Nach dem Hinzufügen starten Sie bitte den Adapter neu.", "ru": "Здесь вы можете добавить устройства, для которых надо исключить представление заданное адаптером (iobroker.zigbee). В этом случае они будут использовать \"exposes\" из zigbee-herdsman-converter. После добавления перезапустите адаптер.", "nl": "Hier kunt u enkele apparaten toevoegen die moeten worden uitgesloten van onze beschrijving. Ze gebruiken alleen \"exposes\" van zigbee-herdsman-converter. Na het toevoegen moet u de adapter opnieuw opstarten.", "fr": "Ici, vous pouvez ajouter certains dispositifs qui doivent être exclus de notre description. Ils utilisent uniquement les \"exposes\" de zigbee-herdsman-converter. Après l'ajout, veuillez redémarrer l'adaptateur.", "pl": "Możesz dodać tutaj kilka urządzeń, które powinny zostać wyłączone z naszego opisu. Używasz tylko ekspozycji z zigbee-herdsman-converter. Po dodaniu zrestartuj adapter"},
|
|
100
|
+
"SettingsExclude": { "uk": "Примусовий запуск адаптера з не цілісною конфігурацією (не рекомендується). Оновіть адаптер до сумісної версії мікропрограми та перестворіть свою мережу якомога швидше.", "en": "Force start adapter with inconsistent configuration (not recommended). Please update the adapter to compatible firmware and recreate your network as soon as possible.", "de": "Den Start des Adapters mit inkonsistenter Konfiguration erzwingen (nicht empfohlen). Bitte aktualisieren Sie den Adapter auf kompatible Firmware und erstellen Sie Ihr Netzwerk so schnell wie möglich neu.", "ru": "Принудительный запуск адаптера с несовместимой конфигурацией (не рекомендуется). Пожалуйста, обновите адаптер до совместимой прошивки и воссоздайте сеть как можно скорее.", "nl": "Forceer de adapter met een inconsistente configuratie (niet aanbevolen). Update de adapter naar compatibele firmware en maak uw netwerk zo snel mogelijk opnieuw aan.", "fr": "Démarrage forcé de l'adaptateur avec une configuration incohérente (non recommandé). Veuillez mettre à jour l'adaptateur avec un micrologiciel compatible et recréer votre réseau dès que possible.", "pl": "Wystaruj Adapter bez zgodnej konfiguracji (uwaga). Zaktualizuj adapter i jak najszybciej odtwórz sieć."},
|
|
101
101
|
"Others": { "uk": "інші налаштування", "en": "other settings", "de": "andere Einstellungen", "ru": "другие настройки", "nl": "andere instellingen", "fr": "autres réglages", "pl": "inne ustawienia"},
|
|
102
102
|
"disable internal Backup": { "uk": "вимкнути внутрішнє резервне копіювання", "en": "disable internal Backup", "de": "Deaktiviere die interne Sicherung", "ru": "отключить внутреннее резервное копирование", "nl": "interne back-up uitschakelen", "fr": "désactiver la sauvegarde interne", "pl": "wyłącz wewnętrzną kopię"},
|
|
103
103
|
"Disable active availability check": { "uk": "Вимкнути активну перевірку доступності", "en": "Disable active availability check", "de": "Aktive Verfügbarkeitsprüfung deaktivieren", "ru": "Отключить активную проверку доступности", "nl": "Actieve beschikbaarheidscontrole uitschakelen", "fr": "Désactiver le contrôle de disponibilité actif", "pl": "Wyłącz aktywne sprawdzanie dostępności"},
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "1.8.
|
|
4
|
+
"version": "1.8.5",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.8.5": {
|
|
7
|
+
"en": "fix for new code",
|
|
8
|
+
"de": "fix für neuen code",
|
|
9
|
+
"ru": "исправить для нового кода",
|
|
10
|
+
"pt": "corrigir para novo código",
|
|
11
|
+
"nl": "vertaling:",
|
|
12
|
+
"fr": "correction du nouveau code",
|
|
13
|
+
"it": "correzione per nuovo codice",
|
|
14
|
+
"es": "fijar para nuevo código",
|
|
15
|
+
"pl": "naprawić nowy kod",
|
|
16
|
+
"uk": "виправити для нового коду",
|
|
17
|
+
"zh-cn": "f 新的守则的ix"
|
|
18
|
+
},
|
|
19
|
+
"1.8.4": {
|
|
20
|
+
"en": "fix for new code"
|
|
21
|
+
},
|
|
22
|
+
"1.8.3": {
|
|
23
|
+
"en": "back to old source",
|
|
24
|
+
"de": "zurück zur alten quelle",
|
|
25
|
+
"ru": "назад к старому источнику",
|
|
26
|
+
"pt": "voltar para a velha fonte",
|
|
27
|
+
"nl": "terug naar de oude bron",
|
|
28
|
+
"fr": "retour à la vieille source",
|
|
29
|
+
"it": "torna alla vecchia fonte",
|
|
30
|
+
"es": "volver a la vieja fuente",
|
|
31
|
+
"pl": "tył",
|
|
32
|
+
"uk": "назад до старого джерела",
|
|
33
|
+
"zh-cn": "背 景"
|
|
34
|
+
},
|
|
35
|
+
"1.8.2": {
|
|
36
|
+
"en": "back to old source",
|
|
37
|
+
"de": "back to old source"
|
|
38
|
+
},
|
|
6
39
|
"1.8.1": {
|
|
7
40
|
"en": "Packages updated\nAdded names of serial ports in configuration dialog",
|
|
8
41
|
"de": "Pakete aktualisiert\nNamen der seriellen Ports im Konfigurationsdialog hinzugefügt",
|
|
@@ -23,54 +56,6 @@
|
|
|
23
56
|
"1.7.6": {
|
|
24
57
|
"en": "ikea fix ",
|
|
25
58
|
"de": "ikea fix "
|
|
26
|
-
},
|
|
27
|
-
"1.7.5": {
|
|
28
|
-
"en": "error message for undefined devices or icons ",
|
|
29
|
-
"de": "Fehlermeldung für undefinierte Geräte oder Symbole",
|
|
30
|
-
"ru": "сообщение об ошибке для неопределенных устройств или значков",
|
|
31
|
-
"pt": "mensagem de erro para dispositivos ou ícones indefinidos",
|
|
32
|
-
"nl": "foutmelding voor ongedefinieerde apparaten of pictogrammen",
|
|
33
|
-
"fr": "message d'erreur pour les périphériques ou les icônes non définis",
|
|
34
|
-
"it": "messaggio di errore per dispositivi o icone non definiti",
|
|
35
|
-
"es": "mensaje de error para dispositivos o iconos no definidos",
|
|
36
|
-
"pl": "komunikat o błędzie dla niezdefiniowanych urządzeń lub ikon",
|
|
37
|
-
"zh-cn": "未定义设备或图标的错误消息"
|
|
38
|
-
},
|
|
39
|
-
"1.7.4": {
|
|
40
|
-
"en": "missing icons with multiple description",
|
|
41
|
-
"de": "fehlende Symbole mit mehrfacher Beschreibung",
|
|
42
|
-
"ru": "отсутствующие значки с несколькими описаниями",
|
|
43
|
-
"pt": "ícones ausentes com descrição múltipla",
|
|
44
|
-
"nl": "ontbrekende pictogrammen met meerdere beschrijvingen",
|
|
45
|
-
"fr": "icônes manquantes avec plusieurs descriptions",
|
|
46
|
-
"it": "icone mancanti con descrizione multipla",
|
|
47
|
-
"es": "faltan iconos con descripción múltiple",
|
|
48
|
-
"pl": "brakujące ikony z wieloma opisami",
|
|
49
|
-
"zh-cn": "缺少具有多个描述的图标"
|
|
50
|
-
},
|
|
51
|
-
"1.7.2": {
|
|
52
|
-
"en": "corr download missing icon",
|
|
53
|
-
"de": "korrektur download fehlendes Icon",
|
|
54
|
-
"ru": "Корр скачать отсутствует значок",
|
|
55
|
-
"pt": "corr baixar ícone ausente",
|
|
56
|
-
"nl": "corr download ontbreekt icoon",
|
|
57
|
-
"fr": "corr télécharger l'icône manquante",
|
|
58
|
-
"it": "corr download icona mancante",
|
|
59
|
-
"es": "falta el icono de descarga corr",
|
|
60
|
-
"pl": "brak ikony pobierania corr",
|
|
61
|
-
"zh-cn": "更正下载丢失的图标"
|
|
62
|
-
},
|
|
63
|
-
"1.7.1": {
|
|
64
|
-
"en": "Device status is displayed in admin interface with color and icon.\nInternal adapter backups can be disabled (for backups with BackItUp Adapter).\nOnly last 10 backups are kept (currently they accumulate and need to be deleted manually).\nNew function for missing icons in Admin Object tree.",
|
|
65
|
-
"de": "Der Gerätestatus wird in der Admin-Oberfläche mit Farbe und Symbol angezeigt.\nInterne Adapter-Backups können deaktiviert werden (für Backups mit BackItUp Adapter).\nNur die letzten 10 Backups werden aufbewahrt (derzeit sammeln sie sich an und müssen manuell gelöscht werden).\nNeue Funktion für fehlende Symbole im Admin-Objektbaum.",
|
|
66
|
-
"ru": "Состояние устройства отображается в административном интерфейсе цветом и значком.\nВнутренние резервные копии адаптера могут быть отключены (для резервных копий с помощью BackItUp Adapter).\nХранятся только последние 10 резервных копий (в настоящее время они накапливаются и должны быть удалены вручную).\nНовая функция для отсутствуют значки в дереве объектов администрирования.",
|
|
67
|
-
"pt": "O status do dispositivo é exibido na interface de administração com cor e ícone.\nOs backups do adaptador interno podem ser desabilitados (para backups com o BackItUp Adapter).\nSomente os últimos 10 backups são mantidos (atualmente eles se acumulam e precisam ser excluídos manualmente).\nNova função para ícones ausentes na árvore de objetos de administração.",
|
|
68
|
-
"nl": "Apparaatstatus wordt weergegeven in de beheerdersinterface met kleur en pictogram.\nInterne adapterback-ups kunnen worden uitgeschakeld (voor back-ups met BackItUp Adapter).\nAlleen de laatste 10 back-ups worden bewaard (momenteel worden deze verzameld en moeten ze handmatig worden verwijderd).\nNieuwe functie voor ontbrekende pictogrammen in Admin Object-structuur.",
|
|
69
|
-
"fr": "L'état de l'appareil est affiché dans l'interface d'administration avec une couleur et une icône.\nLes sauvegardes de l'adaptateur interne peuvent être désactivées (pour les sauvegardes avec l'adaptateur BackItUp).\nSeules les 10 dernières sauvegardes sont conservées (actuellement, elles s'accumulent et doivent être supprimées manuellement).\nNouvelle fonction pour icônes manquantes dans l'arborescence des objets d'administration.",
|
|
70
|
-
"it": "Lo stato del dispositivo viene visualizzato nell'interfaccia di amministrazione con un colore e un'icona.\nI backup interni dell'adattatore possono essere disabilitati (per i backup con l'adattatore BackItUp).\nSono conservati solo gli ultimi 10 backup (attualmente si accumulano e devono essere eliminati manualmente).\nNuova funzione per icone mancanti nell'albero degli oggetti amministratore.",
|
|
71
|
-
"es": "El estado del dispositivo se muestra en la interfaz de administración con color e icono.\nLas copias de seguridad del adaptador interno se pueden desactivar (para copias de seguridad con el adaptador BackItUp).\nSolo se conservan las últimas 10 copias de seguridad (actualmente se acumulan y deben eliminarse manualmente).\nNueva función para Faltan iconos en el árbol de objetos de administración.",
|
|
72
|
-
"pl": "Stan urządzenia jest wyświetlany w interfejsie administratora za pomocą koloru i ikony.\nWewnętrzne kopie adaptera można wyłączyć (dla kopii zapasowych z BackItUp Adapter).\nZachowywanych jest tylko 10 ostatnich kopii (obecnie są one gromadzone i należy je usunąć ręcznie).\nNowa funkcja dla brakujące ikony w drzewie Admin Object.",
|
|
73
|
-
"zh-cn": "设备状态以颜色和图标显示在管理界面中。\n可以禁用内部适配器备份(对于使用 BackItUp 适配器的备份)。\n仅保留最后 10 个备份(当前它们累积并需要手动删除)。\n新功能管理对象树中缺少图标。"
|
|
74
59
|
}
|
|
75
60
|
},
|
|
76
61
|
"title": "Zigbee",
|
package/lib/commands.js
CHANGED
|
@@ -11,7 +11,7 @@ const disallowedDashStates = [
|
|
|
11
11
|
class Commands {
|
|
12
12
|
constructor(adapter) {
|
|
13
13
|
this.adapter = adapter;
|
|
14
|
-
this.adapter.on('message', this.onMessage
|
|
14
|
+
this.adapter.on('message', obj => this.onMessage(obj));
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
start(zbController, stController) {
|
package/lib/devices.js
CHANGED
|
@@ -3092,8 +3092,8 @@ const groupStates = [states.brightness_step].concat(lightStatesWithColor);
|
|
|
3092
3092
|
function getByModel() {
|
|
3093
3093
|
const byModel = new Map();
|
|
3094
3094
|
for (const device of devices) {
|
|
3095
|
-
for (const model of device.models) {
|
|
3096
|
-
const stripModel = model.replace(
|
|
3095
|
+
for (const model of device.models) {
|
|
3096
|
+
const stripModel = model.replace(/\0.*$/g, '').trim();
|
|
3097
3097
|
byModel.set(stripModel, device);
|
|
3098
3098
|
}
|
|
3099
3099
|
}
|
|
@@ -3121,7 +3121,7 @@ function removeEmptyStates(devices) {
|
|
|
3121
3121
|
|
|
3122
3122
|
function findModel(model) {
|
|
3123
3123
|
const byModel = getByModel();
|
|
3124
|
-
const stripModel = model ? model.replace(
|
|
3124
|
+
const stripModel = (model) ? model.replace(/\0.*$/g, '').trim() : '';
|
|
3125
3125
|
return byModel.get(stripModel);
|
|
3126
3126
|
}
|
|
3127
3127
|
|
package/lib/zigbeecontroller.js
CHANGED
|
@@ -41,7 +41,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
41
41
|
super();
|
|
42
42
|
this.adapter = adapter;
|
|
43
43
|
this._permitJoinTime = 0;
|
|
44
|
-
this.
|
|
44
|
+
this.herdsmanStarted = false;
|
|
45
45
|
this.extensions = [
|
|
46
46
|
new DeviceAvailabilityExt(this, {}),
|
|
47
47
|
new DeviceConfigureExt(this, {}),
|
|
@@ -98,8 +98,8 @@ class ZigbeeController extends EventEmitter {
|
|
|
98
98
|
try {
|
|
99
99
|
//this.debug(`Using zigbee-herdsman with settings2: ${JSON.stringify(this)}`);
|
|
100
100
|
this.debug(`Starting zigbee-herdsman...`);
|
|
101
|
-
await this.herdsman.start();
|
|
102
101
|
|
|
102
|
+
// install event handlers before start
|
|
103
103
|
this.herdsman.on('adapterDisconnected', this.handleDisconnected.bind(this));
|
|
104
104
|
this.herdsman.on('deviceAnnounce', this.handleDeviceAnnounce.bind(this));
|
|
105
105
|
this.herdsman.on('deviceInterview', this.handleDeviceInterview.bind(this));
|
|
@@ -107,8 +107,10 @@ class ZigbeeController extends EventEmitter {
|
|
|
107
107
|
this.herdsman.on('deviceLeave', this.handleDeviceLeave.bind(this));
|
|
108
108
|
this.herdsman.on('message', this.handleMessage.bind(this));
|
|
109
109
|
|
|
110
|
+
await this.herdsman.start();
|
|
111
|
+
|
|
110
112
|
this.debug('zigbee-herdsman started');
|
|
111
|
-
this.
|
|
113
|
+
this.herdsmanStarted = true;
|
|
112
114
|
this.info(`Coordinator firmware version: ${JSON.stringify(await this.herdsman.getCoordinatorVersion())}`);
|
|
113
115
|
|
|
114
116
|
// debug info from herdsman getNetworkParameters
|
|
@@ -256,7 +258,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
256
258
|
if (all) {
|
|
257
259
|
return devices;
|
|
258
260
|
} else {
|
|
259
|
-
return devices.filter(
|
|
261
|
+
return devices.filter(device => device.type !== 'Coordinator');
|
|
260
262
|
}
|
|
261
263
|
} else {
|
|
262
264
|
return [];
|
|
@@ -265,7 +267,11 @@ class ZigbeeController extends EventEmitter {
|
|
|
265
267
|
|
|
266
268
|
async getGroups() {
|
|
267
269
|
try {
|
|
268
|
-
|
|
270
|
+
if (this.herdsman) {
|
|
271
|
+
return await this.herdsman.getGroups();
|
|
272
|
+
} else {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
269
275
|
} catch (error) {
|
|
270
276
|
this.sendError(error);
|
|
271
277
|
this.error(JSON.stringify(error));
|
|
@@ -303,7 +309,6 @@ class ZigbeeController extends EventEmitter {
|
|
|
303
309
|
} else {
|
|
304
310
|
this.debug(`verifyGroupExists: group ${nid} exists`);
|
|
305
311
|
}
|
|
306
|
-
|
|
307
312
|
}
|
|
308
313
|
|
|
309
314
|
async getGroupMembersFromController(id) {
|
|
@@ -311,8 +316,8 @@ class ZigbeeController extends EventEmitter {
|
|
|
311
316
|
try {
|
|
312
317
|
const group = await this.getGroupByID(id);
|
|
313
318
|
if (group) {
|
|
314
|
-
const
|
|
315
|
-
for (const member of
|
|
319
|
+
const groupMembers = group.members;
|
|
320
|
+
for (const member of groupMembers) {
|
|
316
321
|
const epid = member.ID ? member.ID : -1;
|
|
317
322
|
const nwk = member.deviceNetworkAddress;
|
|
318
323
|
const device = this.getDeviceByNetworkAddress(nwk);
|
|
@@ -328,7 +333,6 @@ class ZigbeeController extends EventEmitter {
|
|
|
328
333
|
} else {
|
|
329
334
|
return undefined;
|
|
330
335
|
}
|
|
331
|
-
|
|
332
336
|
} catch (error) {
|
|
333
337
|
this.sendError(error);
|
|
334
338
|
if (error) {
|
|
@@ -353,7 +357,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
353
357
|
}
|
|
354
358
|
|
|
355
359
|
async resolveEntity(key, ep) {
|
|
356
|
-
//assert(typeof key === 'string' || key.constructor.name === 'Device', `Wrong type '${typeof key}'`);
|
|
360
|
+
// assert(typeof key === 'string' || key.constructor.name === 'Device', `Wrong type '${typeof key}'`);
|
|
357
361
|
|
|
358
362
|
if (typeof key === 'string') {
|
|
359
363
|
if (key === 'coordinator') {
|
|
@@ -390,8 +394,6 @@ class ZigbeeController extends EventEmitter {
|
|
|
390
394
|
endpoints: device.endpoints,
|
|
391
395
|
name: key,
|
|
392
396
|
};
|
|
393
|
-
} else {
|
|
394
|
-
return;
|
|
395
397
|
}
|
|
396
398
|
}
|
|
397
399
|
} else if (typeof key === 'number') {
|
|
@@ -442,21 +444,21 @@ class ZigbeeController extends EventEmitter {
|
|
|
442
444
|
await this.herdsman.stop();
|
|
443
445
|
} catch (error) {
|
|
444
446
|
this.sendError(error);
|
|
445
|
-
if (this.
|
|
447
|
+
if (this.herdsmanStarted) {
|
|
446
448
|
this.error(`Failed to stop zigbee (${error.stack})`);
|
|
447
|
-
else {
|
|
449
|
+
} else {
|
|
448
450
|
this.warn(`Failed to stop zigbee during startup`);
|
|
449
451
|
}
|
|
450
452
|
}
|
|
451
453
|
}
|
|
452
454
|
|
|
453
455
|
async handleDisconnected() {
|
|
454
|
-
this.
|
|
456
|
+
this.herdsmanStarted = false;
|
|
455
457
|
this.emit('disconnect');
|
|
456
458
|
}
|
|
457
459
|
|
|
458
460
|
connected() {
|
|
459
|
-
return this.
|
|
461
|
+
return this.herdsmanStarted;
|
|
460
462
|
}
|
|
461
463
|
|
|
462
464
|
// Permit join
|
|
@@ -590,7 +592,6 @@ class ZigbeeController extends EventEmitter {
|
|
|
590
592
|
}
|
|
591
593
|
}
|
|
592
594
|
|
|
593
|
-
|
|
594
595
|
async handleDeviceJoined(message) {
|
|
595
596
|
this.debug('handleDeviceJoined', message);
|
|
596
597
|
//const entity = await this.resolveEntity(message.device || message.ieeeAddr);
|
|
@@ -607,7 +608,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
607
608
|
const entity = await this.resolveEntity(message.device || message.ieeeAddr);
|
|
608
609
|
const friendlyName = entity.name;
|
|
609
610
|
if (message.status === 'successful') {
|
|
610
|
-
this.info(`Successfully interviewed '${friendlyName}', device has
|
|
611
|
+
this.info(`Successfully interviewed '${friendlyName}', device has successfully been paired`);
|
|
611
612
|
|
|
612
613
|
if (entity.mapped) {
|
|
613
614
|
const {vendor, description, model} = entity.mapped;
|
|
@@ -634,7 +635,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
634
635
|
this.emit('new', entity);
|
|
635
636
|
}
|
|
636
637
|
} else if (message.status === 'failed') {
|
|
637
|
-
this.error(`Failed to interview '${friendlyName}', device has not
|
|
638
|
+
this.error(`Failed to interview '${friendlyName}', device has not successfully been paired. ${message.error}`);
|
|
638
639
|
this.emit('pairing', 'Interview failed', friendlyName);
|
|
639
640
|
} else {
|
|
640
641
|
if (message.status === 'started') {
|
|
@@ -676,8 +677,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
676
677
|
result = await device.lqi();
|
|
677
678
|
} catch (error) {
|
|
678
679
|
this.sendError(error);
|
|
679
|
-
|
|
680
|
-
this.debug(`Failed to execute LQI for '${resolved.name}'. ${safeJsonStringify(error.stack)}`);
|
|
680
|
+
error && this.debug(`Failed to execute LQI for '${resolved.name}'. ${safeJsonStringify(error.stack)}`);
|
|
681
681
|
|
|
682
682
|
lqis.push({
|
|
683
683
|
parent: 'undefined',
|
|
@@ -806,7 +806,6 @@ class ZigbeeController extends EventEmitter {
|
|
|
806
806
|
await (ep.addToGroup(group.mapped));
|
|
807
807
|
}
|
|
808
808
|
}
|
|
809
|
-
|
|
810
809
|
} else {
|
|
811
810
|
if (entity.endpoint.inputClusters.includes(4)) {
|
|
812
811
|
this.debug(`adding endpoint ${entity.endpoint.ID} to group`);
|
|
@@ -866,7 +865,7 @@ class ZigbeeController extends EventEmitter {
|
|
|
866
865
|
await ep.removefromAllGroups();
|
|
867
866
|
}
|
|
868
867
|
}
|
|
869
|
-
//await entity.endpoint.removeFromAllGroups();
|
|
868
|
+
// await entity.endpoint.removeFromAllGroups();
|
|
870
869
|
} catch (error) {
|
|
871
870
|
this.sendError(error);
|
|
872
871
|
this.error(`Exception when trying remove ${devId} from all groups`, error);
|
|
@@ -939,12 +938,12 @@ class ZigbeeController extends EventEmitter {
|
|
|
939
938
|
nwkmanageraddr: 0x0000
|
|
940
939
|
};
|
|
941
940
|
const energyScan = this.herdsman.adapter.znp.waitFor(
|
|
942
|
-
2, //unpi_1.Constants.Type.AREQ,
|
|
943
|
-
5, //Subsystem.ZDO,
|
|
941
|
+
2, // unpi_1.Constants.Type.AREQ,
|
|
942
|
+
5, // Subsystem.ZDO,
|
|
944
943
|
'mgmtNwkUpdateNotify'
|
|
945
944
|
);
|
|
946
945
|
await this.herdsman.adapter.znp.request(
|
|
947
|
-
0x5, //Subsystem.ZDO
|
|
946
|
+
0x5, // Subsystem.ZDO
|
|
948
947
|
'mgmtNwkUpdateReq',
|
|
949
948
|
payload,
|
|
950
949
|
energyScan.ID
|
package/main.js
CHANGED
|
@@ -64,9 +64,9 @@ class Zigbee extends utils.Adapter {
|
|
|
64
64
|
name: 'zigbee',
|
|
65
65
|
systemConfig: true,
|
|
66
66
|
}));
|
|
67
|
-
this.on('ready', this.onReady
|
|
68
|
-
this.on('unload', this.onUnload
|
|
69
|
-
this.on('message', this.onMessage
|
|
67
|
+
this.on('ready', () => this.onReady());
|
|
68
|
+
this.on('unload', callback => this.onUnload(callback));
|
|
69
|
+
this.on('message', obj => this.onMessage(obj));
|
|
70
70
|
|
|
71
71
|
this.query_device_block = [];
|
|
72
72
|
|
|
@@ -313,12 +313,12 @@ class Zigbee extends utils.Adapter {
|
|
|
313
313
|
}
|
|
314
314
|
|
|
315
315
|
async onZigbeeAdapterReady() {
|
|
316
|
-
|
|
316
|
+
this.reconnectTimer && clearTimeout(this.reconnectTimer);
|
|
317
317
|
this.log.info(`Zigbee started`);
|
|
318
318
|
// https://github.com/ioBroker/ioBroker.zigbee/issues/668
|
|
319
319
|
const extPanIdFix = this.config.extPanIdFix ? this.config.extPanIdFix : false;
|
|
320
320
|
if (!extPanIdFix) {
|
|
321
|
-
const configExtPanId = this.config.extPanID ?
|
|
321
|
+
const configExtPanId = this.config.extPanID ? `0x${this.config.extPanID.toLowerCase()}` : '0xdddddddddddddddd';
|
|
322
322
|
let networkExtPanId = (await this.zbController.herdsman.getNetworkParameters()).extendedPanID;
|
|
323
323
|
let needChange = false;
|
|
324
324
|
this.log.debug(`Config value ${configExtPanId} : Network value ${networkExtPanId}`);
|
|
@@ -340,7 +340,7 @@ class Zigbee extends utils.Adapter {
|
|
|
340
340
|
2, // ZnpCommandStatus.INVALID_PARAM
|
|
341
341
|
]
|
|
342
342
|
);
|
|
343
|
-
const nwExtPanId =
|
|
343
|
+
const nwExtPanId = `0x${result.payload.value.reverse().toString('hex')}`;
|
|
344
344
|
this.log.debug(`Config value ${configExtPanId} : nw value ${nwExtPanId}`);
|
|
345
345
|
if (configExtPanId !== nwExtPanId) {
|
|
346
346
|
networkExtPanId = nwExtPanId;
|
|
@@ -417,7 +417,7 @@ class Zigbee extends utils.Adapter {
|
|
|
417
417
|
this.log.debug(`Type ${type} device ${safeJsonStringify(entity)} incoming event: ${safeJsonStringify(message)}`);
|
|
418
418
|
const device = entity.device;
|
|
419
419
|
const mappedModel = entity.mapped;
|
|
420
|
-
const model =
|
|
420
|
+
const model = entity.mapped ? entity.mapped.model : entity.device.modelID;
|
|
421
421
|
const cluster = message.cluster;
|
|
422
422
|
const devId = device.ieeeAddr.substr(2);
|
|
423
423
|
const meta = {device};
|
|
@@ -735,9 +735,8 @@ class Zigbee extends utils.Adapter {
|
|
|
735
735
|
const model = (entity.mapped) ? entity.mapped.model : entity.device.modelID;
|
|
736
736
|
this.log.debug(`new device ${dev.ieeeAddr} ${dev.networkAddress} ${model} `);
|
|
737
737
|
this.logToPairing(`New device joined '${dev.ieeeAddr}' model ${model}`, true);
|
|
738
|
-
this.stController.updateDev(dev.ieeeAddr.substr(2), model, model, () =>
|
|
739
|
-
this.stController.syncDevStates(dev, model);
|
|
740
|
-
});
|
|
738
|
+
this.stController.updateDev(dev.ieeeAddr.substr(2), model, model, () =>
|
|
739
|
+
this.stController.syncDevStates(dev, model));
|
|
741
740
|
}
|
|
742
741
|
// else this.log.warn(`Device ${safeJsonStringify(entity)} rejoined, no new device`);
|
|
743
742
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zigbee",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.5",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Kirov Ilya",
|
|
6
6
|
"email": "kirovilya@gmail.com"
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"serialport": "^10.5.0"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"zigbee-herdsman": "0.14.76",
|
|
25
|
-
"zigbee-herdsman-converters": "14.0.676",
|
|
26
24
|
"@iobroker/adapter-core": "^2.6.7",
|
|
27
25
|
"tar": "^6.1.12",
|
|
28
|
-
"typescript": "^4.9.3"
|
|
26
|
+
"typescript": "^4.9.3",
|
|
27
|
+
"zigbee-herdsman": "0.14.76",
|
|
28
|
+
"zigbee-herdsman-converters": "14.0.678"
|
|
29
29
|
},
|
|
30
30
|
"description": "Zigbee devices",
|
|
31
31
|
"devDependencies": {
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
35
35
|
"@iobroker/testing": "^4.1.0",
|
|
36
36
|
"axios": "^1.2.0",
|
|
37
|
-
"
|
|
37
|
+
"chai": "^4.3.7",
|
|
38
|
+
"chai-as-promised": "^7.1.1",
|
|
38
39
|
"eslint": "^8.28.0",
|
|
39
40
|
"eslint-config-prettier": "^8.5.0",
|
|
40
41
|
"eslint-plugin-prettier": "^4.2.1",
|
|
41
|
-
"chai": "^4.3.7",
|
|
42
|
-
"chai-as-promised": "^7.1.1",
|
|
43
42
|
"gulp": "^4.0.2",
|
|
44
43
|
"gulp-jsdoc3": "^3.0.0",
|
|
45
44
|
"gulp-replace": "^1.1.3",
|
|
45
|
+
"mixin-deep": "^2.0.1",
|
|
46
46
|
"mocha": "^10.1.0"
|
|
47
47
|
},
|
|
48
48
|
"homepage": "https://github.com/ioBroker/ioBroker.zigbee",
|