iobroker.zigbee 3.3.1-alpha.0 → 3.3.1
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 +43 -50
- package/admin/admin.js +39 -7
- package/admin/tab_m.html +19 -0
- package/io-package.json +13 -13
- package/lib/colors.js +182 -421
- package/lib/exposes.js +206 -198
- package/lib/groups.js +2 -5
- package/lib/legacy/devices.js +8 -5
- package/lib/models.js +99 -11
- package/lib/statescontroller.js +125 -133
- package/lib/zigbeecontroller.js +42 -9
- package/main.js +15 -20
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -38,8 +38,8 @@ Current firmware files for these devices can be found [on GitHub](https://github
|
|
|
38
38
|
Conbee/RaspBee Support is no longer considered experimental in the zigbee-herdsman and zigbee-herdsman-converters libraries used by the zigbee Adapter, use of these devices with the adapter may limit functionality. Known issues are:
|
|
39
39
|
- link quality display may be incorrect
|
|
40
40
|
- device map metrics may be incorrect
|
|
41
|
-
- NVRam Backup is not supported.
|
|
42
|
-
- channel change is not supported.
|
|
41
|
+
- NVRam Backup is not currently supported.
|
|
42
|
+
- channel change is not currently supported.
|
|
43
43
|
|
|
44
44
|
### Silicon Labs SoC
|
|
45
45
|
|
|
@@ -55,19 +55,8 @@ Support for [ZiGate](https://zigate.fr) based adapters is experimental. The init
|
|
|
55
55
|
|
|
56
56
|
The adapter should **always** be installed from within the ioBroker Admin. Direct npm and GitHub installations are **not recommended**.
|
|
57
57
|
|
|
58
|
-
At first start, it is vital to set up the adapter settings.
|
|
59
|
-
|
|
60
|
-
- the required firmware-Type
|
|
61
|
-
- the network parameters PanID (a number between 0 and 65565), extended PanID (a 16 digit HEX number) and the zigbee Channel **important: Do not run the adapter without changing the values for PanID (6754) and Extended PanID (DDDDDDDDDDDDDDDD) to unique values for your Zigbee Installation. From v3.0 onwards, the adapter will suggest a unique ExtPanID on any new install**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-

|
|
65
|
-
|
|
66
|
-
The *Test Port* and *Star/Stop* buttons are provided to test the settings.
|
|
67
|
-
|
|
68
|
-
**Once the settings are verified the adapter can be prepared for automatic start by setting the CheckBox *start the zigbee network automatically* and saving the parameters.**
|
|
69
|
-
|
|
70
|
-
Please refer to the [in depth documentation](docs/en/readme.md) ([german version](docs/de/readme.md), [russian version](docs/ru/readme.md)) for a detailed explanation on how to configure the adapter.
|
|
58
|
+
At first start, it is vital to set up the adapter settings.
|
|
59
|
+
Please refer to the [in depth documentation](docs/en/readme.md) ([german version](docs/de/readme.md), [russian version](docs/ru/readme.md)) and/or the [wiki](https://github.com/ioBroker/ioBroker.zigbee/wiki) for more information and a step-by-step guide on how to configure the adapter.
|
|
71
60
|
|
|
72
61
|
Once the adapter is up and running, the desired devices need to be integrated into the network. This requires for both the adapter and the device to be in pairing mode. Most new devices will be in pairing-mode when they are powered up for the first time, but some will require a special procedure for this. Please refer to the device manual for information on this.
|
|
73
62
|
|
|
@@ -76,63 +65,61 @@ The adapter is placed in pairing mode by pressing the pairing button:
|
|
|
76
65
|
|
|
77
66
|
A dialog showing a pairing countdown appears. When a new device is discovered, interviewed and paired with the network, messages will be shown in this dialog, and the device will show up in the grid of active devices. Any known device should show up with an image and the correct device name, as well as a number of changable settings. Any unknown device will show up with a device name and a ? as icon, while devices which failed the pairing will show up as 'unknown' with the same ? icon. These should be removed from the network to be paired again. Please refer to the documentation linked above for more details.
|
|
78
67
|
|
|
68
|
+
## Configuration Tabs
|
|
79
69
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
In depth information can be found here [auf deutsch](https://github.com/ioBroker/ioBroker.zigbee/blob/master/docs/de/readme.md), here [in english](https://github.com/ioBroker/ioBroker.zigbee/blob/master/docs/en/readme.md). There is more information on the [wiki](https://github.com/ioBroker/ioBroker.zigbee/wiki) as well.
|
|
70
|
+
The adapter configuration is done completely and solely through the instance settings. It is split into 4 sections, which are covered in detail below. Within the instance settings, there is only limited access to operational functionalities. There is no controllable list of devices, nor is there access to advanced pairing modes or device-level configurations. Instead, the configuration offers the option to rebuild the states and/or trigger a device image download through the Zigbee adapter buttons.
|
|
83
71
|
|
|
84
|
-
|
|
72
|
+
### SETTINGS
|
|
85
73
|
|
|
86
|
-
|
|
74
|
+
This tab contains the general adapter settings. Most of the adapter behaviour is configured on this tab.
|
|
87
75
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
76
|
+
It also include the setting for external converters, which currently read relative to 2 folders:
|
|
77
|
+
- The adapters Data folder, i.e. the folder where the `sheperd.db`, `nvbackup.json` and `LocalOverrides.json` are located
|
|
78
|
+
- The adapters internal storage of external converters, i.e. `iobroker.zigbee/converters`.
|
|
91
79
|
|
|
92
|
-
|
|
80
|
+
Any user who whishes to share their external converters with the users of the adapter can open an issue or PR to have them added to the `converters` repository. **Note:** The adapter developers will **not** maintain these external converters. Each converter accepted into the repository will need to include some form of author identification.
|
|
93
81
|
|
|
94
|
-
|
|
82
|
+
External converters are only loaded **when configured**, i.e. without the respective entry in the External converters field, they will remain unused.
|
|
95
83
|
|
|
96
|
-
|
|
97
|
-
Note that not all devices may be part of a binding - the devices themselves need to support this feature.
|
|
84
|
+
Changes to this tab trigger an automatic restart of the adapter upon leaving the settings.
|
|
98
85
|
|
|
99
|
-
|
|
86
|
+
### HARDWARE
|
|
100
87
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
The adapter has the ability to generate a map of the mesh network. This usually takes a few minutes and provides a momentary glimpse into how the devices are meshed with each other.
|
|
104
|
-
|
|
105
|
-
The network map is only available the zigbee tab.
|
|
88
|
+
This tab contains the Zigbee-Hardware specific settings. Network and Coordinator parameters are set in this tab. It also offers the option to test hardware related settings **without** saving them, giving the user the ability to see how a change in hardware parameters will affect their network. Local backup/restore options for zigbee-adapter local data (Zigbee database, NVRam backup and Local Overrides) are also provided.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**Note** This tab also contains the option if to start the zigbee network automatically.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
Changes to this tab trigger an automatic restart of the adapter upon leaving the settings.
|
|
110
93
|
|
|
111
|
-
|
|
94
|
+
### LOCAL DATA
|
|
112
95
|
|
|
113
|
-
|
|
96
|
+
This tab offers the option to do model-level configuration for device behaviour. Currently, model Options, the default device name and the default device Icon can be set through this tab. Most of the advanced options from Z2M are made available for configuration here. It also offers the option to delete devices.
|
|
114
97
|
|
|
115
|
-
|
|
98
|
+
Changes to this tab **do not** trigger an automatic restart of the adapter upon leaving the settings.
|
|
116
99
|
|
|
117
|
-
|
|
100
|
+
### DEVELOPER
|
|
118
101
|
|
|
119
|
-
|
|
102
|
+
The developer tab offers the option to communicate directly with the device based on ZCL Clusters and attributes. Proper use of this requires access to the cluster definition as well as additional device specific documentation. The results generated through this help with generating an external converter for a currently unknown device.
|
|
120
103
|
|
|
121
|
-
|
|
122
|
-
Changing anything here **may** require a restart of the adapter before it becomes active.
|
|
104
|
+
Changes to this tab **do not** trigger an automatic restart of the adapter upon leaving the settings.
|
|
123
105
|
|
|
124
|
-
|
|
106
|
+
## Sidebar Tabs
|
|
125
107
|
|
|
126
|
-
|
|
108
|
+
Most of the 'normal' operation of the adapter should be performed using the sidebar tabs. Through the Zigbee adapter buttons, the tab offers the ability to
|
|
109
|
+
- trigger a firmware update check for all devices
|
|
110
|
+
- create a new group
|
|
111
|
+
- perform a touchlink reset
|
|
112
|
+
- pair devices which require a pairing code
|
|
127
113
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
The developer tab is only available from the instance configuration
|
|
114
|
+
### Devices
|
|
131
115
|
|
|
116
|
+
The devices tab shows the device tiles, which offer access to a subset of states to display / control for each device, as well as general information on the device. Device tiles can be flipped over to reveal additional information and a row of buttons which allow the operator to rename the devivc, assign device-level options, change the device icon, enable/disable the device or per-device debug and reconfigure the device and manage group membership of devices which can join groups.
|
|
132
117
|
|
|
118
|
+
### Network Map
|
|
133
119
|
|
|
134
|
-
|
|
120
|
+
The network map shows **a Snapshot** of the mesh network. The accuracy of the snapshot relies heavily on the stability of the network and the willingness of the included devices to respond to LQI and Routing requests. After the adapter is started, the map is inactive and incomplete. It must first be generated using the button on the map background or from the map settings. Once a map was generated, it is available in any openend browser window or tab without regeneration. Generating the map can take several minutes to complete, during which time an additional button will appear in the title bar to show the progress.
|
|
135
121
|
|
|
122
|
+
## Additional info
|
|
136
123
|
|
|
137
124
|
There is a [friendly project](https://github.com/koenkk/zigbee2mqtt) with similar functionality which is based on the same technology. It uses the same base libraries for hardware communication and device integration. Any device listed as compatible in this project is likely to be compatible with the ioBroker.zigbee Adapter. Note that there is a delay between device integration into zigbee2mqtt.io and the Zigbee-Adapter, as compatibility with the hardware libraries requires verification before the adapter can move to the latest version.
|
|
138
125
|
|
|
@@ -154,8 +141,14 @@ You can thank the authors by these links:
|
|
|
154
141
|
|
|
155
142
|
-----------------------------------------------------------------------------------------------------
|
|
156
143
|
## Changelog
|
|
157
|
-
### 3.3.1
|
|
158
|
-
*
|
|
144
|
+
### 3.3.1 (2025-12-31)
|
|
145
|
+
* Update documentation
|
|
146
|
+
* Color Hue/Saturation in Groups
|
|
147
|
+
* ZH8
|
|
148
|
+
* Sort by model in Admin
|
|
149
|
+
* Object for complex exposes
|
|
150
|
+
* POSSIBLY BREAKING: Complex exposes changed to 'channel / state' structure
|
|
151
|
+
* Bugfixes
|
|
159
152
|
*
|
|
160
153
|
|
|
161
154
|
### 3.3.0 (2025-12-08)
|
package/admin/admin.js
CHANGED
|
@@ -525,7 +525,7 @@ function getCard(dev) {
|
|
|
525
525
|
<ul>
|
|
526
526
|
<li><span class="labelinfo">ieee:</span><span>0x${ieee}</span></li>
|
|
527
527
|
<li><span class="labelinfo">nwk:</span><span>${(nwk) ? nwk.toString() + ' (0x' + nwk.toString(16) + ')' : ''}</span></li>
|
|
528
|
-
<li><span class="labelinfo">model:</span><span>${modelUrl}</span></li>
|
|
528
|
+
<li><span class="labelinfo">model:</span><span id="model_name">${modelUrl}</span></li>
|
|
529
529
|
${groupInfo}
|
|
530
530
|
${roomInfo}
|
|
531
531
|
</ul>
|
|
@@ -736,6 +736,14 @@ function getDeviceCard(devId) {
|
|
|
736
736
|
return $('#devices').find(`div[id='${namespace}.${devId}']`);
|
|
737
737
|
}
|
|
738
738
|
|
|
739
|
+
function sortStateDefs(a, b) {
|
|
740
|
+
if (a.isInternalState != b.isInternalState)
|
|
741
|
+
return a.isInternalState ? -1 : 1;
|
|
742
|
+
if (a.write != b.write)
|
|
743
|
+
return a.write ? -1 : 1;
|
|
744
|
+
return a.id.localeCompare(b.id);
|
|
745
|
+
}
|
|
746
|
+
|
|
739
747
|
function getDashCard(dev, groupImage, groupstatus) {
|
|
740
748
|
const title = dev.common.name,
|
|
741
749
|
id = dev._id,
|
|
@@ -760,20 +768,21 @@ function getDashCard(dev, groupImage, groupstatus) {
|
|
|
760
768
|
//status = (dev.link_quality > 0 && isActive) ? `<div class="col tool"><i class="material-icons icon-green">check_circle</i></div>` : (groupImage || !isActive ? '' : `<div class="col tool"><i class="material-icons icon-black">leak_remove</i></div>`),
|
|
761
769
|
//infoBtn = (nwk) ? `<button name="info" class="left btn-flat btn-small"><i class="material-icons icon-blue">info</i></button>` : '',
|
|
762
770
|
idleTime = (dev.link_quality_lc > 0 && isActive) ? `<div class="col tool"><i id="${rid}_link_quality_lc_icon" class="material-icons idletime">access_time</i><div id="${rid}_link_quality_lc" class="center" style="font-size:0.7em">${getIdleTime(dev.link_quality_lc)}</div></div>` : '';
|
|
763
|
-
const info = (dev.statesDef) ? dev.statesDef.map((stateDef) => {
|
|
771
|
+
const info = (dev.statesDef) ? dev.statesDef.sort(sortStateDefs).map((stateDef) => {
|
|
764
772
|
const id = stateDef.id;
|
|
765
773
|
const sid = id.split('.').join('_');
|
|
766
|
-
let val = stateDef.val
|
|
774
|
+
let val = stateDef.val === undefined ? '' : stateDef.val;
|
|
767
775
|
if (stateDef.role === 'switch' && stateDef.write) {
|
|
768
776
|
val = `<span class="switch"><label><input type="checkbox" ${(val) ? 'checked' : ''}><span class="lever"></span></label></span>`;
|
|
769
777
|
} else if (stateDef.role === 'level.dimmer' && stateDef.write) {
|
|
770
|
-
val = `<span class="range-field dash"><input type="range" min="0" max="100" ${(val !=
|
|
778
|
+
val = `<span class="range-field dash"><input type="range" min="0" max="100" value="${(val != '') ? val : 0}" /></span>`;
|
|
771
779
|
} else if (stateDef.role === 'level.color.temperature' && stateDef.write) {
|
|
772
780
|
val = `<span class="range-field dash"><input type="range" min="150" max="500" ${(val != undefined) ? `value="${val}"` : ''} /></span>`;
|
|
773
781
|
} else if (stateDef.type === 'boolean') {
|
|
774
782
|
const disabled = (stateDef.write) ? '' : 'disabled="disabled"';
|
|
775
|
-
val = `<label class="dash"><input type="checkbox" ${(val == true) ? 'checked=\'checked\'' : ''} ${disabled}/><span></span></label>`;
|
|
776
|
-
|
|
783
|
+
if (stateDef.write) val = `<label class="dash"><input type="checkbox" ${(val == true) ? 'checked=\'checked\'' : ''} ${disabled}/><span></span></label>`;
|
|
784
|
+
else val = `<label class="dash"><input type="radio" ${(val == true) ? 'checked=\'checked\'' : ''} ${disabled}/><span></span></label>`;
|
|
785
|
+
} else if (stateDef.role === 'level.color') {
|
|
777
786
|
const options = []
|
|
778
787
|
for (const key of namedColors) {
|
|
779
788
|
options.push(`<option value="${key}" ${val===key ? 'selected' : ''}>${key}</option>`);
|
|
@@ -800,6 +809,9 @@ function getDashCard(dev, groupImage, groupstatus) {
|
|
|
800
809
|
return;
|
|
801
810
|
// val = `<span class="input-field dash value"><input class="dash value" id="${stateDef.name}" value="${val}"></input></span>`;
|
|
802
811
|
}
|
|
812
|
+
else if (stateDef.type === 'number') {
|
|
813
|
+
val = `<span class="dash value">${val ? val : 0} ${(stateDef.unit) ? stateDef.unit : ''}</span>`;
|
|
814
|
+
}
|
|
803
815
|
else {
|
|
804
816
|
val = `<span class="dash value">${val ? val : '(null)'} ${(stateDef.unit) ? stateDef.unit : ''}</span>`;
|
|
805
817
|
}
|
|
@@ -850,7 +862,8 @@ function setDashStates(id, state) {
|
|
|
850
862
|
} else if (stateDef.states && stateDef.write) {
|
|
851
863
|
$(`#${sid}`).find(`select option[value=${state.val}]`).prop('selected', true);
|
|
852
864
|
} else if (stateDef.type === 'boolean') {
|
|
853
|
-
|
|
865
|
+
// $(`#${sid}`).find('input[type=\'checkbox\']').prop('checked', state.val);
|
|
866
|
+
$(`#${sid}`).find('input[type=\'radio\']').prop('checked', state.val);
|
|
854
867
|
} else {
|
|
855
868
|
$(`#${sid}`).find('.value').text(`${state.val} ${(stateDef.unit) ? stateDef.unit : ''}`);
|
|
856
869
|
}
|
|
@@ -860,6 +873,13 @@ function setDashStates(id, state) {
|
|
|
860
873
|
|
|
861
874
|
function hookControls() {
|
|
862
875
|
$('input[type=\'checkbox\']').change(function (event) {
|
|
876
|
+
console.warn('write triggered')
|
|
877
|
+
const val = $(this).is(':checked');
|
|
878
|
+
const id = $(this).parents('.state').attr('oid');
|
|
879
|
+
sendToWrapper(namespace, 'setState', {id: id, val: val}, function (data) {
|
|
880
|
+
});
|
|
881
|
+
});
|
|
882
|
+
$('input[type=\'radio\']').change(function (event) {
|
|
863
883
|
const val = $(this).is(':checked');
|
|
864
884
|
const id = $(this).parents('.state').attr('oid');
|
|
865
885
|
sendToWrapper(namespace, 'setState', {id: id, val: val}, function (data) {
|
|
@@ -4545,6 +4565,10 @@ function doSort() {
|
|
|
4545
4565
|
shuffleInstance.sort({
|
|
4546
4566
|
by: sortByLoad
|
|
4547
4567
|
});
|
|
4568
|
+
} else if (sortOrder === 'model') {
|
|
4569
|
+
shuffleInstance.sort({
|
|
4570
|
+
by: sortByModel
|
|
4571
|
+
});
|
|
4548
4572
|
}
|
|
4549
4573
|
}
|
|
4550
4574
|
}
|
|
@@ -4577,6 +4601,14 @@ function sortByLoad(element) {
|
|
|
4577
4601
|
}
|
|
4578
4602
|
}
|
|
4579
4603
|
|
|
4604
|
+
function sortByModel(element) {
|
|
4605
|
+
try {
|
|
4606
|
+
const modelNode = element.querySelector('[id$="model_name"]');
|
|
4607
|
+
return modelNode?.textContent || modelNode?.innerText || '';
|
|
4608
|
+
} catch (e) {
|
|
4609
|
+
return '';
|
|
4610
|
+
}
|
|
4611
|
+
}
|
|
4580
4612
|
|
|
4581
4613
|
function updateDevice(id) {
|
|
4582
4614
|
if (devices.length > 0)
|
package/admin/tab_m.html
CHANGED
|
@@ -401,6 +401,24 @@
|
|
|
401
401
|
margin-left: 25px;
|
|
402
402
|
margin-top: -1px;
|
|
403
403
|
}
|
|
404
|
+
.m .dash input[type=radio]:checked+span:not(.lever):before {
|
|
405
|
+
width: 12px;
|
|
406
|
+
height: 12px;
|
|
407
|
+
}
|
|
408
|
+
.m .dash input[type=radio]:checked+span:not(.lever):after {
|
|
409
|
+
width: 12px;
|
|
410
|
+
height: 12px;
|
|
411
|
+
}
|
|
412
|
+
.m .dash input[type=radio]+span:not(.lever):before {
|
|
413
|
+
width: 12px;
|
|
414
|
+
height: 12px;
|
|
415
|
+
}
|
|
416
|
+
.m .dash input[type="radio"]+span:not(.lever) {
|
|
417
|
+
width: 12px;
|
|
418
|
+
height: 12px;
|
|
419
|
+
margin-left: 25px;
|
|
420
|
+
margin-top: -1px;
|
|
421
|
+
}
|
|
404
422
|
.m .dash input[type=checkbox]:not(:checked):disabled+span:not(.lever):before {
|
|
405
423
|
background-color: rgba(0,0,0,.1);
|
|
406
424
|
}
|
|
@@ -773,6 +791,7 @@
|
|
|
773
791
|
<li class="device-order-item" data-type="default" tabindex="0"><a class="translate" data-lang="Default">Default</a></li>
|
|
774
792
|
<li class="device-order-item" data-type="range" tabindex="0"><a class="translate" data-lang="Range">Range</a></li>
|
|
775
793
|
<li class="device-order-item" data-type="load" tabindex="0"><a class="translate" data-lang="Load">Load</a></li>
|
|
794
|
+
<li class="device-order-item" data-type="model" tabindex="0"><a class="translate" data-lang="Model">Model</a></li>
|
|
776
795
|
</ul>
|
|
777
796
|
</div>
|
|
778
797
|
</li>
|
package/io-package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zigbee",
|
|
4
|
-
"version": "3.3.1
|
|
4
|
+
"version": "3.3.1",
|
|
5
5
|
"news": {
|
|
6
|
-
"3.3.1
|
|
7
|
-
"en": "\n",
|
|
8
|
-
"de": "\n",
|
|
9
|
-
"ru": "\n",
|
|
10
|
-
"pt": "\n",
|
|
11
|
-
"nl": "\n",
|
|
12
|
-
"fr": "\n",
|
|
13
|
-
"it": "\n",
|
|
14
|
-
"es": "\n",
|
|
15
|
-
"pl": "\n",
|
|
16
|
-
"uk": "\n",
|
|
17
|
-
"zh-cn": "
|
|
6
|
+
"3.3.1": {
|
|
7
|
+
"en": "Update documentation\nColor Hue/Saturation in Groups\nZH8\nSort by model in Admin\nObject for complex exposes\nPOSSIBLY BREAKING: Complex exposes changed to 'channel / state' structure\nBugfixes\n",
|
|
8
|
+
"de": "Dokumentation zur Aktualisierung\nFarbe Hue/Sättigung in Gruppen\nZH8\nSortieren nach Modell in Admin\nObjekt für komplexe Exponate\nPOSSIBLY BREAKING: Komplex enthüllt geändert in 'Kanal / Zustand' Struktur\nBugfixes\n",
|
|
9
|
+
"ru": "Обновленная документация\nЦветовой оттенок / насыщение в группах\nZH8\nСортировка по модели в Admin\nОбъект для сложных разоблачений\nВозможное расширение: комплекс подвергается изменениям в структуре «канал / состояние»\nБагфиксы\n",
|
|
10
|
+
"pt": "Atualizar documentação\nTom de cor/saturação em grupos\nZH8\nOrdenar por modelo no administrador\nObjeto para exposições complexas\nPOSSIBly BREAKING: Complexo expõe alterado para estrutura 'canal / estado'\nCorrecções de Erros\n",
|
|
11
|
+
"nl": "Documentatie bijwerken\nKleurtoon/verzadiging in groepen\nZH8\nSorteer op model in Admin\nObject voor complexe blootstellingen\nPOSSILY BREAKING: Complex stelt 'channel / state' structuur bloot\nBugfixes\n",
|
|
12
|
+
"fr": "Mettre à jour la documentation\nCouleur Hue/Saturation en groupes\nZH8\nTrier par modèle dans Admin\nObjet pour des expositions complexes\nPOSSIBILITÉ : Les expositions complexes ont changé à la structure « canal / état »\nFixes de bogue\n",
|
|
13
|
+
"it": "Documentazione di aggiornamento\nColor Hue/Saturazione in gruppi\nZH8\nOrdina per modello in Admin\nOggetto per esposizioni complesse\nPOSSIBILE BREAKING: Complesso espone cambiato in struttura 'canale / stato'\nBugfix\n",
|
|
14
|
+
"es": "Documentación actualizada\nColor Hue/Saturación en Grupos\nZH8\nOrdenar por modelo en Admin\nObjeto para exposiciones complejas\nPOSSIBLY BREAKING: Complejo expone cambiado a la estructura 'canal / estado'\nBugfixes\n",
|
|
15
|
+
"pl": "Aktualizacja dokumentacji\nKolor barwy / nasycenie w grupach\nZH8\nSortuj według modelu w Admin\nObiekt dla złożonych ekspozycji\nPOSIADANIE POŁOWÓW: Złożona ekspozycja zmieniona na strukturę \"kanał / stan\"\nKorekty błędów\n",
|
|
16
|
+
"uk": "Документи\nКолір Hue / насичення груп\nЗХ8\nСортувати за моделлю в Admin\nОб'єкт для комплексних просторів\nPOSSIBLY BREAKING: Комплекс передбачає зміни до структури каналу / держави\nПомилки\n",
|
|
17
|
+
"zh-cn": "更新文件\n组中的颜色色调/ 饱和度\nZH8型电力机车\n按管理模式排序\n复杂曝光对象\nPOSSIBLY BREEAKING:复杂曝光改为\"通道/状态\"结构\n错误修正\n"
|
|
18
18
|
},
|
|
19
19
|
"3.3.0": {
|
|
20
20
|
"en": "Fix: dynamic model assignment when exposes is function (PTVO, BuschJaeger)\nFix: Roles\nRefactor: Legacy code moved\nRefactor: Expose creation changed.\nRefactor: Exposes no longer use states from legacy code\nFeature: Offer state rebuild function in Settings\n: Additional filters for device display\nFix: Orphaned group states detected, marked and deletable\nUpdate: ZH 7.x\nUpdate: ZHC 25.84.0",
|