iobroker.zigbee 1.6.3 → 1.6.6

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.
@@ -3,8 +3,33 @@ const path = location.pathname;
3
3
  const parts = path.split('/');
4
4
  parts.splice(-3);
5
5
 
6
- const socket = io.connect('/', {path: parts.join('/') + '/socket.io'});
7
- const instance = window.location.search.slice(-1) || 0;
6
+ const socket = io.connect('/', { path: parts.join('/') + '/socket.io' });
7
+ var query = (window.location.search || '').replace(/^\?/, '').replace(/#.*$/, '');
8
+ var args = {};
9
+ let theme = null;
10
+
11
+ // parse parameters
12
+ query.trim().split('&').filter(function (t) { return t.trim(); }).forEach(function (b, i) {
13
+ const parts = b.split('=');
14
+ if (!i && parts.length === 1 && !isNaN(parseInt(b, 10))) {
15
+ args.instance = parseInt(b, 10);
16
+ }
17
+ var name = parts[0];
18
+ args[name] = parts.length === 2 ? parts[1] : true;
19
+
20
+ if (name === 'instance') {
21
+ args.instance = parseInt(args.instance, 10) || 0;
22
+ }
23
+
24
+ if (args[name] === 'true') {
25
+ args[name] = true;
26
+ } else if (args[name] === 'false') {
27
+ args[name] = false;
28
+ }
29
+ });
30
+
31
+ var instance = args.instance;
32
+
8
33
  let common = null; // common information of adapter
9
34
  const host = null; // host object on which the adapter runs
10
35
  const changed = false;
@@ -71,6 +96,17 @@ function loadSettings(callback) {
71
96
  if (typeof load === 'undefined') {
72
97
  alert('Please implement save function in your admin/index.html');
73
98
  } else {
99
+ // detect, that we are now in react container (themeNames = ['dark', 'blue', 'colored', 'light'])
100
+
101
+ const _query = query.split('&');
102
+
103
+ for (var q = 0; q < _query.length; q++) {
104
+ if (_query[q].indexOf('react=') !== -1) {
105
+ $('.adapter-container').addClass('react-' + _query[q].substring(6));
106
+ theme = 'react-' + _query[q].substring(6);
107
+ }
108
+ }
109
+
74
110
  load(res.native, onChange);
75
111
  }
76
112
  if (typeof callback === 'function') {
@@ -205,4 +241,4 @@ function showMessage(message, title, icon) {
205
241
  }
206
242
  $dialogMessage.find('.dialog-text').html(message);
207
243
  $dialogMessage.modal().modal('open');
208
- }
244
+ }
package/admin/admin.js CHANGED
@@ -154,7 +154,7 @@ function getGroupCard(dev) {
154
154
  </div>`);
155
155
  const image = `<img src="img/group_${memberCount}.png" width="80px" onerror="this.onerror=null;this.src='img/unavailable.png';">`;
156
156
  const dashCard = getDashCard(dev,`img/group_${memberCount}.png` );
157
- const card = `<div id="${id}" class="device">
157
+ const card = `<div id="${id}" class="device group">
158
158
  <div class="card hoverable flipable">
159
159
  <div class="front face">${dashCard}</div>
160
160
  <div class="back face">
@@ -187,12 +187,16 @@ function getGroupCard(dev) {
187
187
  return card;
188
188
  }
189
189
 
190
-
190
+ function sanitizeModelParameter(parameter) {
191
+ const replaceByUnderscore = /[\s/]/g;
192
+ return parameter.replace(replaceByUnderscore, '_');
193
+ }
191
194
 
192
195
  function getCard(dev) {
193
196
  const title = dev.common.name,
194
197
  id = dev._id,
195
- type = (dev.common.type ? dev.common.type.replace('/','_'):'unknown'),
198
+ type = (dev.common.type ? dev.common.type : 'unknown'),
199
+ type_url = (dev.common.type ? sanitizeModelParameter(dev.common.type) : 'unknown'),
196
200
  img_src = dev.icon || dev.common.icon,
197
201
  rooms = [],
198
202
  lang = systemLang || 'en';
@@ -206,7 +210,7 @@ function getCard(dev) {
206
210
  const room = rooms.join(',') || '&nbsp';
207
211
  const paired = (dev.paired) ? '' : '<i class="material-icons right">leak_remove</i>';
208
212
  const rid = id.split('.').join('_');
209
- const modelUrl = (!type) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${type}.html" target="_blank" rel="noopener noreferrer">${type}</a>`;
213
+ const modelUrl = (!type) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${type_url}.html" target="_blank" rel="noopener noreferrer">${type}</a>`;
210
214
  const image = `<img src="${img_src}" width="80px" onerror="this.onerror=null;this.src='img/unavailable.png';">`,
211
215
  nwk = (dev.info && dev.info.device) ? dev.info.device._networkAddress : undefined,
212
216
  battery_cls = getBatteryCls(dev.battery),
@@ -656,7 +660,7 @@ function getDevices() {
656
660
  }
657
661
 
658
662
  function getDeviceCards() {
659
- return $('#devices .device');
663
+ return $('#devices .device').not(".group");
660
664
  }
661
665
 
662
666
  function getDeviceCard(devId) {
@@ -2185,7 +2189,7 @@ function genDevInfo(device) {
2185
2189
  }).join('');
2186
2190
  }
2187
2191
  };
2188
- const modelUrl = (!mapped) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${mapped.model}.html" target="_blank" rel="noopener noreferrer">${mapped.model}</a>`;
2192
+ const modelUrl = (!mapped) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${sanitizeModelParameter(mapped.model)}.html" target="_blank" rel="noopener noreferrer">${mapped.model}</a>`;
2189
2193
  const mappedInfo = (!mapped) ? '' :
2190
2194
  `<div style="font-size: 0.9em">
2191
2195
  <ul>
@@ -2427,10 +2431,10 @@ function showExclude() {
2427
2431
  const exclude_dev = devices.find((d) => d.common.type == exclude_id) || {common: {name: exclude_id}};
2428
2432
  // exclude_icon = (exclude_dev.icon) ? `<img src="${exclude_dev.icon}" width="64px">` : '';
2429
2433
 
2430
- const modelUrl = (!exclude_id) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${exclude_id}.html" target="_blank" rel="noopener noreferrer">${exclude_id}</a>`;
2434
+ const modelUrl = (!exclude_id) ? '' : `<a href="https://www.zigbee2mqtt.io/devices/${sanitizeModelParameter(exclude_id)}.html" target="_blank" rel="noopener noreferrer">${exclude_id}</a>`;
2431
2435
 
2432
2436
  const card = `
2433
- <div id="${exclude_id}" class="exclude col s12 m6 l4 xl3">
2437
+ <div id="${exclude_id}" class="exclude col s12 m6 l4 xl3" style="height: 135px;padding-bottom: 10px;">
2434
2438
  <div class="card hoverable">
2435
2439
  <div class="card-content zcard">
2436
2440
  <i class="left"><img src="${exclude_dev.icon}" width="64px" onerror="this.onerror=null;this.src='img/unavailable.png';"></i>
Binary file
@@ -144,7 +144,7 @@
144
144
  border: none;
145
145
  bottom: 0;
146
146
  height: 50px;
147
- background: #fff;
147
+ /*background: #fff;*/
148
148
  right: 0;
149
149
  /*text-align: right;*/
150
150
  padding: 10px;
@@ -247,7 +247,7 @@
247
247
  position:absolute;
248
248
  height: 100%;
249
249
  width: 100%;
250
- background: #fff;
250
+ /*background: #fff;*/
251
251
  z-index: 2;
252
252
  -webkit-transform: rotateY( 0deg );
253
253
  -moz-transform: rotateY( 0deg );
@@ -261,7 +261,7 @@
261
261
  box-sizing: border-box;
262
262
  height: 100%;
263
263
  width: 100%;
264
- background: #fff;
264
+ /*background: #fff;*/
265
265
  -webkit-transform: rotateY( -180deg );
266
266
  -moz-transform: rotateY( -180deg );
267
267
  -o-transform: rotateY( -180deg );
@@ -752,8 +752,8 @@
752
752
  </div>
753
753
  </div>
754
754
  <div id="tab-exclude" class="col s12 page">
755
- <div class="col s4">
756
- <p class="translate">ExcludeTextTranslation</p>&nbsp;
755
+ <div class="row">
756
+ <p class="translate">ExcludeTextTranslation</p>
757
757
  </div>
758
758
  <div class="fixed-action-btn" style="margin-bottom: 100px">
759
759
  <a id="add_exclude" class="btn-floating waves-effect waves-light blue tooltipped center-align hoverable translateT" title="Add exlude"><i class="material-icons large">add</i></a>
package/admin/tab_m.html CHANGED
@@ -144,7 +144,7 @@
144
144
  border: none;
145
145
  bottom: 0;
146
146
  height: 50px;
147
- background: #fff;
147
+ /*background: #fff;*/
148
148
  right: 0;
149
149
  /*text-align: right;*/
150
150
  padding: 10px;
@@ -174,18 +174,30 @@
174
174
  i.icon-green {
175
175
  color: green;
176
176
  }
177
+ .m.react-dark i.icon-green {
178
+ color: green!important;
179
+ }
177
180
  i.icon-black {
178
181
  color: black;
179
182
  }
180
183
  i.icon-blue {
181
184
  color: blue;
182
185
  }
186
+ .m.react-dark i.icon-blue {
187
+ color: rgb(100, 181, 246)!important;
188
+ }
183
189
  i.icon-red {
184
190
  color: red;
185
191
  }
192
+ .m.react-dark i.icon-red {
193
+ color: red!important;
194
+ }
186
195
  i.icon-orange {
187
196
  color: orange;
188
197
  }
198
+ .m.react-dark i.icon-orange {
199
+ color: orange!important;
200
+ }
189
201
  .m .btn-small.btn-flat {
190
202
  padding: 0 4px;
191
203
  }
@@ -243,7 +255,7 @@
243
255
  position:absolute;
244
256
  height: 100%;
245
257
  width: 100%;
246
- background: #fff;
258
+ /*background: #fff;*/
247
259
  z-index: 2;
248
260
  -webkit-transform: rotateY( 0deg );
249
261
  -moz-transform: rotateY( 0deg );
@@ -257,7 +269,7 @@
257
269
  box-sizing: border-box;
258
270
  height: 100%;
259
271
  width: 100%;
260
- background: #fff;
272
+ /*background: #fff;*/
261
273
  -webkit-transform: rotateY( -180deg );
262
274
  -moz-transform: rotateY( -180deg );
263
275
  -o-transform: rotateY( -180deg );
@@ -269,6 +281,9 @@
269
281
  -o-transform: rotateY( 180deg );
270
282
  transform: rotateY( 180deg );
271
283
  }
284
+ .m .card .card-action {
285
+ padding: 22px 24px;
286
+ }
272
287
  .m .switch label .lever {
273
288
  width: 30px;
274
289
  height: 12px;
@@ -714,8 +729,8 @@
714
729
  </div>
715
730
  </div>
716
731
  <div id="tab-exclude" class="col s12 page">
717
- <div class="col s4">
718
- <p class="translate">ExcludeTextTranslation</p>&nbsp;
732
+ <div class="row">
733
+ <p class="translate">ExcludeTextTranslation</p>
719
734
  </div>
720
735
  <div class="fixed-action-btn" style="margin-bottom: 100px">
721
736
  <a id="add_exclude" class="btn-floating waves-effect waves-light blue tooltipped center-align hoverable translateT" title="Add exlude"><i class="material-icons large">add</i></a>
package/admin/words.js CHANGED
@@ -4,13 +4,13 @@
4
4
  systemDictionary = {
5
5
  "Add binding": { "en": "Add binding", "de": "Bindung hinzufügen", "ru": "Добавить привязку", "pt": "Adicionar ligação", "nl": "Voeg binding toe", "fr": "Ajouter une liaison", "it": "Aggiungi associazione", "es": "Agregar enlace", "pl": "Dodaj wiązanie", "zh-cn": "添加绑定"},
6
6
  "Add group": { "en": "Add group", "de": "Füge Gruppe hinzu", "ru": "Добавить группу", "pt": "Adicionar grupo", "nl": "Groep toevoegen", "fr": "Ajouter un groupe", "it": "Aggiungere gruppo", "es": "Añadir grupo", "pl": "Dodaj grupę", "zh-cn": "新增群组"},
7
- "Attribute ID": { "en": "Attribute ID", "de": "Attribut-ID", "ru": "ID атрибута", "pt": "ID de atributo", "nl": "Kenmerk-ID", "fr": "ID d'attribut", "it": "ID attributo", "es": "ID de atributo", "pl": "Identyfikator atrybutu", "zh-cn": "属性ID"},
8
- "Binding": { "en": "Binding", "de": "Bindung", "ru": "Привязка", "pt": "Obrigatório", "nl": "Verbindend", "fr": "Contraignant", "it": "Rilegatura", "es": "Unión", "pl": "Wiążący", "zh-cn": "捆绑"},
7
+ "Attribute ID": { "en": "Attribute ID", "de": "Attribut-ID", "ru": "ID атрибута", "pt": "ID do atributo", "nl": "Kenmerk-ID", "fr": "ID d'attribut", "it": "ID attributo", "es": "ID de atributo", "pl": "Identyfikator atrybutu", "zh-cn": "属性ID"},
8
+ "Binding": { "en": "Binding", "de": "Bindung", "ru": "Привязка", "pt": "Ligação", "nl": "Verbindend", "fr": "Contraignant", "it": "Rilegatura", "es": "Unión", "pl": "Wiążący", "zh-cn": "捆绑"},
9
9
  "Binding configuration": { "en": "Binding configuration", "de": "Bindungskonfiguration", "ru": "Конфигурация привязки", "pt": "Configuração de ligação", "nl": "Bindende configuratie", "fr": "Configuration de la liaison", "it": "Configurazione vincolante", "es": "Configuración de enlace", "pl": "Konfiguracja wiązania", "zh-cn": "绑定配置"},
10
10
  "COM port name": { "en": "COM port name", "de": "COM-Anschlussname", "ru": "Имя или адрес порта", "pt": "Nome da porta COM", "nl": "COM-poortnaam", "fr": "Nom du port COM", "it": "Nome della porta COM", "es": "Nombre del puerto COM", "pl": "Nazwa portu COM", "zh-cn": "设备端口"},
11
11
  "Cancel": { "en": "Cancel", "de": "Abbrechen", "ru": "Отмена", "pt": "Cancelar", "nl": "Annuleren", "fr": "Annuler", "it": "Annulla", "es": "Cancelar", "pl": "Anuluj", "zh-cn": "取消"},
12
12
  "Channel": { "en": "Channel", "de": "Kanal", "ru": "Канал", "pt": "Canal", "nl": "Kanaal", "fr": "Canal", "it": "Canale", "es": "Canal", "pl": "Kanał", "zh-cn": "信道"},
13
- "ChannelChangeText": { "en": "Channel sets the used radio frequency. It may be changed to avoid conflicts with existing wifi networks. <b>All devices must be relearned when changing!</b>", "de": "Kanal stellt die verwendete Funkfrequenz ein. Es kann geändert werden, um Konflikte mit vorhandenen WLAN-Netzwerken zu vermeiden. <b>Alle Geräte müssen beim Wechsel neu gelernt werden!</b>", "ru": "Канал устанавливает используемую радиочастоту. Его можно изменить, чтобы избежать конфликтов с существующими сетями Wi-Fi. <b>При замене все устройства необходимо переучивать!</b>", "pt": "Canal define a freqüência de rádio usada. Pode ser alterado para evitar conflitos com redes wi-fi existentes. <b>Todos os dispositivos devem ser reaprendidos ao mudar!</b>", "nl": "Gewenste radiofrequentie instellen. Deze kan worden aangepast om conflicten met bestaande wifi-netwerken te voorkomen. <b>Bij wijzigingen moeten alle apparaten opnieuw aangeleerd worden!</b>", "fr": "Channel définit la fréquence radio utilisée. Il peut être modifié pour éviter les conflits avec les réseaux wifi existants. <b>Tous les appareils doivent être réappris lors du changement!</b>", "it": "Canale imposta la frequenza radio utilizzata. Può essere modificato per evitare conflitti con le reti Wi-Fi esistenti. <b>Tutti i dispositivi devono essere riappresi quando si cambia!</b>", "es": "Canal establece la frecuencia de radio utilizada. Puede cambiarse para evitar conflictos con las redes wifi existentes. <b>¡Todos los dispositivos se deben volver a aprender al cambiar!</b>", "pl": "Kanał ustawia używaną częstotliwość radiową. Można go zmienić, aby uniknąć konfliktów z istniejącymi sieciami Wi-Fi. <b>Podczas zmiany wszystkie urządzenia muszą zostać ponownie nauczone!</b>", "zh-cn": "频道设置使用的无线电频率。可以更改它以避免与现有的wifi网络冲突。 <b>更改时必须重新学习所有设备!</b>"},
13
+ "ChannelChangeText": { "en": "Channel sets the used radio frequency. It may be changed to avoid conflicts with existing wifi networks. <b>All devices must be relearned when changing!</b>", "de": "Kanal stellt die verwendete Funkfrequenz ein. Es kann geändert werden, um Konflikte mit vorhandenen WLAN-Netzwerken zu vermeiden. <b>Alle Geräte müssen beim Wechsel neu gelernt werden!</b>", "ru": "Канал устанавливает используемую радиочастоту. Его можно изменить, чтобы избежать конфликтов с существующими сетями Wi-Fi. <b>При замене все устройства необходимо переучивать!</b>", "pt": "Canal define a freqüência de rádio usada. Pode ser alterado para evitar conflitos com redes wi-fi existentes. <b>Se mudar o valor, todos os dispositivos tem que ser reaprendidos!</b>", "nl": "Gewenste radiofrequentie instellen. Deze kan worden aangepast om conflicten met bestaande wifi-netwerken te voorkomen. <b>Bij wijzigingen moeten alle apparaten opnieuw aangeleerd worden!</b>", "fr": "Channel définit la fréquence radio utilisée. Il peut être modifié pour éviter les conflits avec les réseaux wifi existants. <b>Tous les appareils doivent être réappris lors du changement!</b>", "it": "Canale imposta la frequenza radio utilizzata. Può essere modificato per evitare conflitti con le reti Wi-Fi esistenti. <b>Tutti i dispositivi devono essere riappresi quando si cambia!</b>", "es": "Canal establece la frecuencia de radio utilizada. Puede cambiarse para evitar conflictos con las redes wifi existentes. <b>¡Todos los dispositivos se deben volver a aprender al cambiar!</b>", "pl": "Kanał ustawia używaną częstotliwość radiową. Można go zmienić, aby uniknąć konfliktów z istniejącymi sieciami Wi-Fi. <b>Podczas zmiany wszystkie urządzenia muszą zostać ponownie nauczone!</b>", "zh-cn": "频道设置使用的无线电频率。可以更改它以避免与现有的wifi网络冲突。 <b>更改时必须重新学习所有设备!</b>"},
14
14
  "Check firmware updates": { "en": "Check firmware updates", "de": "Auf Firmware-Updates überprüfen", "ru": "Проверить обновления прошивки", "pt": "Verifique as atualizações de firmware", "nl": "Controleer firmware-updates", "fr": "Vérifier les mises à jour du firmware", "it": "Controlla gli aggiornamenti del firmware", "es": "Verifique las actualizaciones de firmware", "pl": "Sprawdź aktualizacje oprogramowania układowego", "zh-cn": "检查固件更新"},
15
15
  "Check if your Command needs to submit a value. For example, cmd 'write' needs the value you want to write to your device.": {"en": "Check if your Command needs to submit a value. For example, the command 'write' needs the value you want to write to your device.", "de": "Überprüfen Sie, ob Ihr Befehl einen Wert senden muss. Zum Beispiel benötigt cmd 'write' den Wert, den Sie auf Ihr Gerät schreiben möchten.", "ru": "Проверьте, нужно ли вашей команде передать значение. Например, cmd 'write' требуется значение, которое вы хотите записать на свое устройство.", "pt": "Verifique se o seu comando precisa enviar um valor. Por exemplo, cmd 'write' precisa do valor que você deseja gravar em seu dispositivo.", "nl": "Controleer of uw commando een waarde moet indienen. Cmd 'write' heeft bijvoorbeeld de waarde nodig die u naar uw apparaat wilt schrijven.", "fr": "Vérifiez si votre commande doit soumettre une valeur. Par exemple, cmd 'write' a besoin de la valeur que vous souhaitez écrire sur votre appareil.", "it": "Controlla se il tuo comando deve inviare un valore. Ad esempio, cmd \"write\" ha bisogno del valore che vuoi scrivere sul tuo dispositivo.", "es": "Compruebe si su comando debe enviar un valor. Por ejemplo, cmd 'write' necesita el valor que desea escribir en su dispositivo.", "pl": "Sprawdź, czy Twoje polecenie musi przesłać wartość. Na przykład cmd 'write' wymaga wartości, którą chcesz zapisać na swoim urządzeniu.", "zh-cn": "检查您的Command是否需要提交值。例如,cmd'write'需要您要写入设备的值。"},
16
16
  "Choose channel": { "en": "Choose channel", "de": "Kanal auswählen", "ru": "Выберите канал", "pt": "Escolha o canal", "nl": "Kies een kanaal", "fr": "Choisissez la chaîne", "it": "Scegli il canale", "es": "Elige canal", "pl": "Wybierz kanał", "zh-cn": "选择频道"},
@@ -26,7 +26,7 @@ systemDictionary = {
26
26
  "Device details": { "en": "Device details", "de": "Gerätedetails", "ru": "Детали устройства", "pt": "Device details", "nl": "Apparaat details", "fr": "Détails du dispositif", "it": "Device details", "es": "Device details", "pl": "Device details", "zh-cn": "设备详情"},
27
27
  "Device information": { "en": "Device information", "de": "Geräteinformation", "ru": "Информация об устройстве", "pt": "Informação de dispositivo", "nl": "Apparaat informatie", "fr": "Informations sur le dispositif", "it": "Informazioni sul dispositivo", "es": "Información del dispositivo", "pl": "Informacje o urządzeniu", "zh-cn": "设备信息"},
28
28
  "Device map info": { "en": "<b>Click a device to see more details.</b> Every device can have only one parent. Devices may change their parent by themselves. There is no way to force a device to a specific parent. (If you see more than one parent link, it may be outdated data.)<br>You may also move devices for better visibility.<br>Weak and offline links are shown red. If a device label shows red, no links were found. No problem if a device has only 'Previous Parents' links, it may just not have sent new data for some time.", "de": "<p>Du kannst auf ein Gerät klicken um mehr Details zu sehen.</p> Jedes Gerät kann nur ein Parent haben. Geräte können ihre Parents auch selbstständig wechseln, es gibt keine Möglichkeit einen bestimmten Parent zu erzwingen. (Falls mehrere Parent Links angezeigt werden, kommt das vermutlich von noch nicht aktualisierten Daten.)<br>Geräte lassen sich verschieben für bessere Übersicht.<br>Schwache und Offline Links werden in rot angezeigt. Wenn der Gerätename rot dargestellt wird, hat das Gerät keine Verbindungen. Wenn ein Gerät nur 'Letzte Parents' Verbindungen hat, ist das kein Problem, es hat vermutlich nur seit einer Weile keine Daten geschickt.", "ru": "<b>Кликните на устройстве, чтобы увидеть связи.</b> Каждое устройство имеет только одного родителя. Устройства могут сменить родителя самостоятельно. Нет возможности принудительно сменить родителя устройства (если вы видите больше чем одну родительскую связь, это могут быть устаревшие данные).<br>Слабые и недоступные связи показываются красным. Если название устройства отображается красным, то не найдено ни одной связи. Не проблема, если устройства имеет только связи от 'Предыдущих родителей', это может означать, что просто небыло передач данных какое-то время.", "pt": "<b>Clique em um dispositivo para ver mais detalhes.</b> Cada dispositivo pode ter apenas um pai. Os dispositivos podem mudar seus pais por si próprios. Não há como forçar um dispositivo a um pai específico. (se você vir mais de um link pai, pode ser um dado desatualizado). <br> Você também pode mover dispositivos para melhor visibilidade. <br> Links fracos e off-line são exibidos em vermelho. Se um rótulo de dispositivo mostra vermelho, nenhum link foi encontrado. Não há problema se um dispositivo tiver apenas links de 'Pais anteriores', ele pode simplesmente não enviar novos dados há algum tempo.", "nl": "<b>Klik op een apparaat om meer details te zien.</b> Elk apparaat kan maar één relatie hebben. Apparaten kunnen hun relatie zelf veranderen. Er is geen manier om een apparaat aan een specifieke relatie te forceren. (als u meer dan één relatie ziet, kunnen dit verouderde gegevens zijn). <br> U kunt ook apparaten verplaatsen voor een betere zichtbaarheid. <br> Zwakke apparaten en onbereikbare links worden rood weergegeven. Als een apparaatlabel rood is, zijn er geen links gevonden. Geen probleem als een apparaat alleen 'Vorige relatie'-links heeft, het kan zijn dat het enige tijd geleden is dat gegevens verzonden zijn.", "fr": "<b>Cliquez sur un dispositif pour voir plus de détails.</b> Chaque dispositif ne peut avoir qu'un seul parent. Les appareils peuvent changer les parents par eux-mêmes. Il n'y a aucun moyen de forcer un appareil à un parent spécifique. (Si vous voyez plus d'un lien parent, il peut s'agir de données obsolètes.) <br> Vous pouvez également déplacer des appareils pour une meilleure visibilité. <br> Les liens faibles et hors ligne sont affichés en rouge. Si une étiquette de dispositif est rouge, aucun lien n'a été trouvé. Pas de problème si un appareil n'a que des liens «Parents précédents», il se peut qu'il n'ait tout simplement pas envoyé de nouvelles données depuis un certain temps.", "it": "<b>Fare clic su un dispositivo per visualizzare ulteriori dettagli.</b> Ogni dispositivo può avere un solo genitore. I dispositivi possono cambiare lì i genitori da soli. Non è possibile forzare un dispositivo a un genitore specifico. (se vedi più di un collegamento principale, potrebbero essere dati obsoleti). <br> Puoi anche spostare i dispositivi per una migliore visibilità. <br> I collegamenti deboli e offline vengono visualizzati in rosso. Se l'etichetta di un dispositivo è rossa, non è stato trovato alcun collegamento. Nessun problema se un dispositivo ha solo link 'Genitori precedenti', potrebbe semplicemente non inviare nuovi dati da un po 'di tempo.", "es": "<b>Haga clic en un dispositivo para ver más detalles.</b> Cada dispositivo puede tener un solo padre. Los dispositivos pueden cambiar sus padres por sí mismos. No hay forma de forzar un dispositivo a un padre específico. (si ve más de un enlace principal, es posible que sean datos desactualizados). <br> También puede mover dispositivos para una mejor visibilidad. <br> Los enlaces débiles y fuera de línea se muestran en rojo. Si la etiqueta de un dispositivo se muestra en rojo, no se encontraron enlaces. No hay problema si un dispositivo solo tiene enlaces de 'Padres anteriores', es posible que no haya enviado nuevos datos desde hace algún tiempo.", "pl": "<b>Kliknij urządzenie, aby wyświetlić więcej szczegółów.</b> Każde urządzenie może mieć tylko jednego rodzica. Urządzenia mogą tam samodzielnie zmieniać rodziców. Nie ma sposobu, aby narzucić urządzenie konkretnemu rodzicowi. (jeśli widzisz więcej niż jeden link nadrzędny, mogą to być nieaktualne dane). <br> Możesz także przenosić urządzenia, aby uzyskać lepszą widoczność. <br> Słabe linki i linki offline są wyświetlane na czerwono. Jeśli etykieta urządzenia ma kolor czerwony, nie znaleziono żadnych linków. Nie ma problemu, jeśli urządzenie ma tylko linki „Poprzedni rodzic”, może po prostu nie wysyłać nowych danych od pewnego czasu.", "zh-cn": "<b>单击设备以查看更多详细信息。</b>每个设备只能有一个父级。设备可能会自行更改那里的父母。无法将设备强制为特定的父级。 (如果您看到多个父链接,则可能是过时的数据)。 <br>您也可以移动设备以获得更好的可见性。 <br>弱链接和脱机链接显示为红色。如果设备标签显示红色,则找不到任何链接。如果设备仅具有“以前的上级”链接,则没问题,它可能从一段时间以来就没有发送过新数据。"},
29
- "Devices": { "en": "Devices", "de": "Geräte", "ru": "Устройства", "pt": "Devices", "nl": "Apparaten", "fr": "Dispositifs", "it": "dispositivi", "es": "Dispositivos", "pl": "Pomysłowość", "zh-cn": "已连接设备"},
29
+ "Devices": { "en": "Devices", "de": "Geräte", "ru": "Устройства", "pt": "Dispositivos", "nl": "Apparaten", "fr": "Dispositifs", "it": "dispositivi", "es": "Dispositivos", "pl": "Pomysłowość", "zh-cn": "已连接设备"},
30
30
  "Disable LED for cc2531": { "en": "Disable LED for cc2531", "de": "LED auf CC2531 deaktivieren", "ru": "Выключить индикатор для cc2531", "pt": "Desativar LED para cc2531", "nl": "Schakel LED uit voor cc2531", "fr": "Désactiver DEL pour cc2531", "it": "Disabilita LED per cc2531", "es": "Desactivar LED para cc2531", "pl": "Wyłącz LED dla cc2531", "zh-cn": "关闭CC2531指示灯"},
31
31
  "Disable Queue": { "en": "Disable queue", "de": "Queue deaktivieren", "ru": "Выключить Queue", "pt": "Desativar Queue", "nl": "Wachtrij uitschakelen", "fr": "Désactiver la queue", "it": "Disabilita Queue", "es": "Desactivar Queue", "pl": "Wyłącz Queue", "zh-cn": "关闭队列"},
32
32
  "Do you really want to delete device": { "en": "Do you really want to delete the device?", "de": "Möchtest du das Gerät wirklich löschen?", "ru": "Вы действительно хотите удалить устройство?", "pt": "Você realmente quer deletar o dispositivo", "nl": "Weet je zeker dat je het apparaat wilt verwijderen?", "fr": "Voulez-vous vraiment supprimer le dispositif ?", "it": "Vuoi davvero eliminare il dispositivo", "es": "¿Realmente quieres borrar dispositivo?", "pl": "Czy naprawdę chcesz usunąć urządzenie?", "zh-cn": "确定要删除设备?"},
@@ -104,4 +104,4 @@ systemDictionary = {
104
104
  "№": { "en": "№", "de": "Nr.", "ru": "№", "pt": "№", "nl": "№", "fr": "№", "it": "№", "es": "№", "pl": "Nr", "zh-cn": "№"},
105
105
  "Excludes": { "en": "to exclude", "de": "ausschließen", "ru": "Исключить", "pl": "wykluczyć"},
106
106
  "ExcludeTextTranslation": { "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 Beschreibung ausgeschlossen werden sollten. Sie verwenden nur exposes vom ZigBee-Herdsman-Converter. Nach dem Hinzufügen starten Sie bitte den Adapter neu.", "ru": "Здесь вы можете добавить устройства, для которых надо исключить представление заданное адаптером (iobroker.zigbee). В этом случае они будут использовать \"exposes\" из zigbee-herdsman-converter. После добавления перезапустите адаптер.", "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"},
107
- };
107
+ };
package/io-package.json CHANGED
@@ -1,8 +1,14 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zigbee",
4
- "version": "1.6.3",
4
+ "version": "1.6.6",
5
5
  "news": {
6
+ "1.6.6": {
7
+ "en": "fix admin"
8
+ },
9
+ "1.6.5": {
10
+ "en": "Some fixes and updates"
11
+ },
6
12
  "1.6.3": {
7
13
  "en": "Some fixes and updates"
8
14
  },
package/lib/devices.js CHANGED
@@ -2327,6 +2327,12 @@ const devices = [
2327
2327
  icon: 'img/nue_hgzb-02a.png',
2328
2328
  states: [states.state],
2329
2329
  },
2330
+ {
2331
+ models: ['HGZB-02A'],
2332
+ icon: 'img/nue_hgzb-02a.png',
2333
+ states: lightStates,
2334
+ linkedStates: [comb.brightnessAndState],
2335
+ },
2330
2336
  {
2331
2337
  models: ['HGZB-41', 'HGZB-20-UK'],
2332
2338
  icon: 'img/nue_switch_single.png',
package/lib/utils.js CHANGED
@@ -115,7 +115,7 @@ const xiaomiManufacturerID = [4151, 4447];
115
115
  const ikeaTradfriManufacturerID = [4476];
116
116
 
117
117
  function sanitizeImageParameter(parameter) {
118
- const replaceByDash = [/\?/g, /&/g, /[^a-z\d\- _./:]/gi];
118
+ const replaceByDash = [/\?/g, /&/g, /[^a-z\d\-_./:]/gi, /[/]/gi];
119
119
  let sanitized = parameter;
120
120
  replaceByDash.forEach((r) => sanitized = sanitized.replace(r, '-'));
121
121
  return sanitized;
package/main.js CHANGED
@@ -497,6 +497,10 @@ class Zigbee extends utils.Adapter {
497
497
  const entity = await this.zbController.resolveEntity(deviceId);
498
498
  this.log.debug(`entity: ${safeJsonStringify(entity)}`);
499
499
  const mappedModel = entity.mapped;
500
+ if (!mappedModel) {
501
+ this.log.debug(`No mapped model for ${model}`);
502
+ return;
503
+ }
500
504
  this.log.debug('Mapped Model: ' + JSON.stringify(mappedModel));
501
505
 
502
506
  stateList.forEach(async(changedState) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zigbee",
3
- "version": "1.6.3",
3
+ "version": "1.6.6",
4
4
  "author": {
5
5
  "name": "Kirov Ilya",
6
6
  "email": "kirovilya@gmail.com"
@@ -18,8 +18,8 @@
18
18
  "node": ">=10"
19
19
  },
20
20
  "dependencies": {
21
- "zigbee-herdsman": "0.13.149",
22
- "zigbee-herdsman-converters": "14.0.256",
21
+ "zigbee-herdsman": "0.13.169",
22
+ "zigbee-herdsman-converters": "14.0.316",
23
23
  "@iobroker/adapter-core": "^2.4.0",
24
24
  "tar": "^6.0.5",
25
25
  "typescript": "^4.0.5"