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.
- package/admin/adapter-settings.js +39 -3
- package/admin/admin.js +12 -8
- package/admin/img/tuya_rb280.png +0 -0
- package/admin/index_m.html +5 -5
- package/admin/tab_m.html +20 -5
- package/admin/words.js +5 -5
- package/io-package.json +7 -1
- package/lib/devices.js +6 -0
- package/lib/utils.js +1 -1
- package/main.js +4 -0
- package/package.json +3 -3
|
@@ -3,8 +3,33 @@ const path = location.pathname;
|
|
|
3
3
|
const parts = path.split('/');
|
|
4
4
|
parts.splice(-3);
|
|
5
5
|
|
|
6
|
-
const socket
|
|
7
|
-
|
|
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
|
|
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(',') || ' ';
|
|
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/${
|
|
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>
|
package/admin/img/tuya_rb280.png
CHANGED
|
Binary file
|
package/admin/index_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;
|
|
@@ -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="
|
|
756
|
-
<p class="translate">ExcludeTextTranslation</p
|
|
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="
|
|
718
|
-
<p class="translate">ExcludeTextTranslation</p
|
|
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
|
|
8
|
-
"Binding": { "en": "Binding", "de": "Bindung", "ru": "Привязка", "pt": "
|
|
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>
|
|
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": "
|
|
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
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\-
|
|
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
|
+
"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.
|
|
22
|
-
"zigbee-herdsman-converters": "14.0.
|
|
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"
|