Skip to content

Commit 5052168

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Update ZAP to version that generates min/max information. (#12325)
* Update ZAP to version that generates min/max information. The XML updates are based on examining the all-clusters app codegen and removing spurious min-max constraints that just restate the value range of the type (e.g. setting max to 0xFFFF for an int16u). A few attributes were made nullable in the process to remove an unnecessary constraint like max="0xFFFE" when the spec says range is all but the attribute is nullable. * Make generatedAttributes (and generatedDefaults, minMaxDefaults) constexpr. This should ensure that it does not accidentally end up in .data instead of .rodata. The main fix here is adding the constexpr constructor for EmberAfDefaultOrMinMaxAttributeValue that takes a EmberAfAttributeMinMaxValue*, which lets us remove the non-constexpr reinterpret_cast (coming from the C-style cast) to uint8_t* in ZAP_MIN_MAX_DEFAULTS_INDEX. The other fixes are just fixing long-standing const-correctness issues; this allows us to remove the implicit const_cast from ZAP_LONG_DEFAULTS_INDEX.
1 parent 4c2e6e8 commit 5052168

File tree

52 files changed

+1641
-634
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1641
-634
lines changed

examples/bridge-app/esp32/main/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask)
334334
uint8_t buffer[kFixedLabelAttributeArraySize];
335335
EmberAfAttributeMetadata am = { .attributeId = ZCL_LABEL_LIST_ATTRIBUTE_ID,
336336
.size = kFixedLabelAttributeArraySize,
337-
.defaultValue = nullptr };
337+
.defaultValue = static_cast<uint16_t>(0) };
338338

339339
EncodeFixedLabel("room", dev->GetLocation(), buffer, sizeof(buffer), &am);
340340

examples/bridge-app/linux/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void HandleDeviceStatusChanged(Device * dev, Device::Changed_t itemChangedMask)
280280
uint8_t buffer[kFixedLabelAttributeArraySize];
281281
EmberAfAttributeMetadata am = { .attributeId = ZCL_LABEL_LIST_ATTRIBUTE_ID,
282282
.size = kFixedLabelAttributeArraySize,
283-
.defaultValue = nullptr };
283+
.defaultValue = static_cast<uint16_t>(0) };
284284

285285
EncodeFixedLabel("room", dev->GetLocation(), buffer, sizeof(buffer), &am);
286286

src/app/clusters/level-control/level-control.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -700,22 +700,22 @@ static void moveHandler(CommandId commandId, uint8_t moveMode, uint8_t rate, uin
700700
// Otherwise, move as fast as possible
701701
if (rate == 0xFF)
702702
{
703-
uint8_t defaultMoveRate;
704-
status = Attributes::DefaultMoveRate::Get(endpoint, &defaultMoveRate);
705-
if (status != EMBER_ZCL_STATUS_SUCCESS)
703+
app::DataModel::Nullable<uint8_t> defaultMoveRate;
704+
status = Attributes::DefaultMoveRate::Get(endpoint, defaultMoveRate);
705+
if (status != EMBER_ZCL_STATUS_SUCCESS || defaultMoveRate.IsNull())
706706
{
707707
emberAfLevelControlClusterPrintln("ERR: reading default move rate %x", status);
708708
state->eventDurationMs = FASTEST_TRANSITION_TIME_MS;
709709
}
710710
else
711711
{
712712
// nonsensical case, means "don't move", so we're done
713-
if (defaultMoveRate == 0)
713+
if (defaultMoveRate.Value() == 0)
714714
{
715715
status = EMBER_ZCL_STATUS_SUCCESS;
716716
goto send_default_response;
717717
}
718-
state->eventDurationMs = MILLISECOND_TICKS_PER_SECOND / defaultMoveRate;
718+
state->eventDurationMs = MILLISECOND_TICKS_PER_SECOND / defaultMoveRate.Value();
719719
}
720720
}
721721
else

src/app/util/af-types.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,15 @@ typedef void (*EmberAfGenericClusterFunction)(void);
101101
*/
102102
union EmberAfDefaultAttributeValue
103103
{
104-
constexpr EmberAfDefaultAttributeValue(uint8_t * ptr) : ptrToDefaultValue(ptr) {}
104+
constexpr EmberAfDefaultAttributeValue(const uint8_t * ptr) : ptrToDefaultValue(ptr) {}
105105
constexpr EmberAfDefaultAttributeValue(uint16_t val) : defaultValue(val) {}
106106

107107
/**
108108
* Points to data if size is more than 2 bytes.
109109
* If size is more than 2 bytes, and this value is NULL,
110110
* then the default value is all zeroes.
111111
*/
112-
uint8_t * ptrToDefaultValue;
112+
const uint8_t * ptrToDefaultValue;
113113

114114
/**
115115
* Actual default value if the attribute size is 2 bytes or less.
@@ -144,15 +144,16 @@ typedef struct
144144
*/
145145
union EmberAfDefaultOrMinMaxAttributeValue
146146
{
147-
constexpr EmberAfDefaultOrMinMaxAttributeValue(uint8_t * ptr) : ptrToDefaultValue(ptr) {}
147+
constexpr EmberAfDefaultOrMinMaxAttributeValue(const uint8_t * ptr) : ptrToDefaultValue(ptr) {}
148148
constexpr EmberAfDefaultOrMinMaxAttributeValue(uint16_t val) : defaultValue(val) {}
149+
constexpr EmberAfDefaultOrMinMaxAttributeValue(const EmberAfAttributeMinMaxValue * ptr) : ptrToMinMaxValue(ptr) {}
149150

150151
/**
151152
* Points to data if size is more than 2 bytes.
152153
* If size is more than 2 bytes, and this value is NULL,
153154
* then the default value is all zeroes.
154155
*/
155-
uint8_t * ptrToDefaultValue;
156+
const uint8_t * ptrToDefaultValue;
156157
/**
157158
* Actual default value if the attribute size is 2 bytes or less.
158159
*/
@@ -161,7 +162,7 @@ union EmberAfDefaultOrMinMaxAttributeValue
161162
* Points to the min max attribute value structure, if min/max is
162163
* supported for this attribute.
163164
*/
164-
EmberAfAttributeMinMaxValue * ptrToMinMaxValue;
165+
const EmberAfAttributeMinMaxValue * ptrToMinMaxValue;
165166
};
166167

167168
// Attribute masks modify how attributes are used by the framework

src/app/util/af.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ uint8_t emberAfGetLastSequenceNumber(void);
732732
* greater than 4 is being compared
733733
* 1, if val2 is smaller.
734734
*/
735-
int8_t emberAfCompareValues(uint8_t * val1, uint8_t * val2, uint16_t len, bool signedNumber);
735+
int8_t emberAfCompareValues(const uint8_t * val1, const uint8_t * val2, uint16_t len, bool signedNumber);
736736

737737
/**
738738
* @brief populates the passed EUI64 with the local EUI64 MAC address.

src/app/util/attribute-storage.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ EmberAfDefinedEndpoint emAfEndpoints[MAX_ENDPOINT_COUNT];
6868

6969
uint8_t attributeData[ACTUAL_ATTRIBUTE_SIZE];
7070

71+
namespace {
72+
7173
#if (!defined(ATTRIBUTE_SINGLETONS_SIZE)) || (ATTRIBUTE_SINGLETONS_SIZE == 0)
7274
#define ACTUAL_SINGLETONS_SIZE 1
7375
#else
@@ -80,25 +82,25 @@ uint16_t emberEndpointCount = 0;
8082
// If we have attributes that are more than 2 bytes, then
8183
// we need this data block for the defaults
8284
#if (defined(GENERATED_DEFAULTS) && GENERATED_DEFAULTS_COUNT)
83-
const uint8_t generatedDefaults[] = GENERATED_DEFAULTS;
85+
constexpr const uint8_t generatedDefaults[] = GENERATED_DEFAULTS;
8486
#endif // GENERATED_DEFAULTS
8587

8688
#if (defined(GENERATED_MIN_MAX_DEFAULTS) && GENERATED_MIN_MAX_DEFAULT_COUNT)
87-
const EmberAfAttributeMinMaxValue minMaxDefaults[] = GENERATED_MIN_MAX_DEFAULTS;
89+
constexpr const EmberAfAttributeMinMaxValue minMaxDefaults[] = GENERATED_MIN_MAX_DEFAULTS;
8890
#endif // GENERATED_MIN_MAX_DEFAULTS
8991

9092
#ifdef GENERATED_FUNCTION_ARRAYS
9193
GENERATED_FUNCTION_ARRAYS
9294
#endif
9395

94-
const EmberAfAttributeMetadata generatedAttributes[] = GENERATED_ATTRIBUTES;
95-
const EmberAfCluster generatedClusters[] = GENERATED_CLUSTERS;
96-
const EmberAfEndpointType generatedEmberAfEndpointTypes[] = GENERATED_ENDPOINT_TYPES;
96+
constexpr const EmberAfAttributeMetadata generatedAttributes[] = GENERATED_ATTRIBUTES;
97+
constexpr const EmberAfCluster generatedClusters[] = GENERATED_CLUSTERS;
98+
constexpr const EmberAfEndpointType generatedEmberAfEndpointTypes[] = GENERATED_ENDPOINT_TYPES;
9799

98-
const EmberAfManufacturerCodeEntry clusterManufacturerCodes[] = GENERATED_CLUSTER_MANUFACTURER_CODES;
99-
const uint16_t clusterManufacturerCodeCount = GENERATED_CLUSTER_MANUFACTURER_CODE_COUNT;
100-
const EmberAfManufacturerCodeEntry attributeManufacturerCodes[] = GENERATED_ATTRIBUTE_MANUFACTURER_CODES;
101-
const uint16_t attributeManufacturerCodeCount = GENERATED_ATTRIBUTE_MANUFACTURER_CODE_COUNT;
100+
constexpr const EmberAfManufacturerCodeEntry clusterManufacturerCodes[] = GENERATED_CLUSTER_MANUFACTURER_CODES;
101+
constexpr const uint16_t clusterManufacturerCodeCount = GENERATED_CLUSTER_MANUFACTURER_CODE_COUNT;
102+
constexpr const EmberAfManufacturerCodeEntry attributeManufacturerCodes[] = GENERATED_ATTRIBUTE_MANUFACTURER_CODES;
103+
constexpr const uint16_t attributeManufacturerCodeCount = GENERATED_ATTRIBUTE_MANUFACTURER_CODE_COUNT;
102104

103105
#if !defined(EMBER_SCRIPTED_TEST)
104106
#define endpointNumber(x) fixedEndpoints[x]
@@ -109,7 +111,6 @@ const uint16_t attributeManufacturerCodeCount = GENERATED_ATTR
109111
#define endpointNetworkIndex(x) fixedNetworks[x]
110112
#endif
111113

112-
namespace {
113114
app::AttributeAccessInterface * gAttributeAccessOverrides = nullptr;
114115
} // anonymous namespace
115116

src/app/util/util.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ void emberAfCopyLongString(uint8_t * dest, const uint8_t * src, size_t size)
899899
// You can pass in val1 as NULL, which will assume that it is
900900
// pointing to an array of all zeroes. This is used so that
901901
// default value of NULL is treated as all zeroes.
902-
int8_t emberAfCompareValues(uint8_t * val1, uint8_t * val2, uint16_t len, bool signedNumber)
902+
int8_t emberAfCompareValues(const uint8_t * val1, const uint8_t * val2, uint16_t len, bool signedNumber)
903903
{
904904
uint8_t i, j, k;
905905
if (signedNumber)

src/app/zap-templates/templates/app/endpoint_config.zapt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
#define GENERATED_DEFAULTS_COUNT ({{endpoint_attribute_long_defaults_count}})
2020

2121
#define ZAP_TYPE(type) ZCL_ ## type ## _ATTRIBUTE_TYPE
22-
#define ZAP_LONG_DEFAULTS_INDEX(index) {(uint8_t*)(&generatedDefaults[index])}
23-
#define ZAP_MIN_MAX_DEFAULTS_INDEX(index) {(uint8_t*)(&minMaxDefault[index])}
22+
#define ZAP_LONG_DEFAULTS_INDEX(index) { &generatedDefaults[index] }
23+
#define ZAP_MIN_MAX_DEFAULTS_INDEX(index) { &minMaxDefaults[index] }
2424
#define ZAP_EMPTY_DEFAULT() {(uint16_t) 0}
2525
#define ZAP_SIMPLE_DEFAULT(x) {(uint16_t) x}
2626

src/app/zap-templates/zcl/data-model/chip/general-commissioning-cluster.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ limitations under the License.
3939
<code>0x0030</code>
4040
<define>GENERAL_COMMISSIONING_CLUSTER</define>
4141
<description>This cluster is used to set, remove and update fabric information on a commissionee.</description>
42-
<attribute side="server" code="0x00" define="BREADCRUMB" type="INT64U" min="0x0000000000000000" max="0xFFFFFFFFFFFFFFFF" writable="true" default="0x0000000000000000" optional="false">Breadcrumb</attribute>
42+
<attribute side="server" code="0x00" define="BREADCRUMB" type="INT64U" writable="true" default="0x0000000000000000" optional="false">Breadcrumb</attribute>
4343
<attribute side="server" code="0x01" define="BASICCOMMISSIONINGINFO_LIST" type="ARRAY" entryType="BasicCommissioningInfoType" length="254" writable="false" optional="false">BasicCommissioningInfoList</attribute>
4444
<attribute side="server" code="0x02" define="REGULATORYCONFIG" type="ENUM8" writable="false" optional="true">RegulatoryConfig</attribute>
4545
<attribute side="server" code="0x03" define="LOCATIONCAPABILITY" type="ENUM8" writable="false" optional="true">LocationCapability</attribute>

src/app/zap-templates/zcl/data-model/chip/pump-configuration-and-control-cluster.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ limitations under the License.
4242
<attribute side="server" code="0x0012" define="EFFECTIVE_CONTROL_MODE" type="ENUM8" min="0x00" max="0xFE" writable="false" optional="false">EffectiveControlMode</attribute>
4343
<attribute side="server" code="0x0013" define="CAPACITY" type="INT16S" min="0x0000" max="0x7FFF" writable="false" reportable="true" optional="false">Capacity</attribute>
4444
<attribute side="server" code="0x0014" define="SPEED" type="INT16U" min="0x0000" max="0xFFFE" writable="false" optional="true">Speed</attribute>
45-
<attribute side="server" code="0x0015" define="LIFETIME_RUNNING_HOURS" type="INT24U" min="0x000000" max="0xFFFFFE" writable="true" default="0x000000" optional="true">LifetimeRunningHours</attribute>
46-
<attribute side="server" code="0x0016" define="PUMP_POWER" type="INT24U" min="0x000000" max="0xFFFFFE" writable="true" optional="true">Power</attribute>
47-
<attribute side="server" code="0x0017" define="LIFETIME_ENERGY_CONSUMED" type="INT32U" min="0x00000000" max="0xFFFFFFFE" writable="false" default="0x00000000" optional="true">LifetimeEnergyConsumed</attribute>
45+
<attribute side="server" code="0x0015" define="LIFETIME_RUNNING_HOURS" type="INT24U" isNullable="true" writable="true" default="0x000000" optional="true">LifetimeRunningHours</attribute>
46+
<attribute side="server" code="0x0016" define="PUMP_POWER" type="INT24U" min="0x000000" max="0xFFFFFE" writable="false" optional="true">Power</attribute>
47+
<attribute side="server" code="0x0017" define="LIFETIME_ENERGY_CONSUMED" type="INT32U" isNullable="true" writable="true" default="0x00000000" optional="true">LifetimeEnergyConsumed</attribute>
4848
<attribute side="server" code="0x0020" define="OPERATION_MODE" type="ENUM8" min="0x00" max="0xFE" writable="true" default="0x00" optional="false">OperationMode</attribute>
4949
<attribute side="server" code="0x0021" define="CONTROL_MODE" type="ENUM8" min="0x00" max="0xFE" writable="true" default="0x00" optional="true">ControlMode</attribute>
5050
<attribute side="server" code="0x0022" define="PUMP_ALARM_MASK" type="BITMAP16" writable="false" optional="true">AlarmMask</attribute>

src/app/zap-templates/zcl/data-model/silabs/general.xml

+6-6
Original file line numberDiff line numberDiff line change
@@ -400,13 +400,13 @@ limitations under the License.
400400
<attribute side="server" code="0x0005" define="MIN_FREQUENCY" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">min frequency</attribute>
401401
<attribute side="server" code="0x0006" define="MAX_FREQUENCY" type="INT16U" min="0x0000" max="0xFFFF" writable="false" default="0x0000" optional="true">max frequency</attribute>
402402

403-
<attribute side="server" code="0x0010" define="ON_OFF_TRANSITION_TIME" type="INT16U" min="0x0000" max="0xFFFF" writable="true" default="0x0000" optional="true">on off transition time</attribute>
404-
<attribute side="server" code="0x0011" define="ON_LEVEL" type="INT8U" min="0x00" max="0xFF" writable="true" default="0xFE" optional="true">on level</attribute>
405-
<attribute side="server" code="0x0012" define="ON_TRANSITION_TIME" type="INT16U" min="0x0000" max="0xFFFE" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">on transition time</attribute>
406-
<attribute side="server" code="0x0013" define="OFF_TRANSITION_TIME" type="INT16U" min="0x0000" max="0xFFFE" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">off transition time</attribute>
407-
<attribute side="server" code="0x0014" define="DEFAULT_MOVE_RATE" type="INT8U" min="0x00" max="0xFE" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">default move rate</attribute>
403+
<attribute side="server" code="0x0010" define="ON_OFF_TRANSITION_TIME" type="INT16U" writable="true" default="0x0000" optional="true">on off transition time</attribute>
404+
<attribute side="server" code="0x0011" define="ON_LEVEL" type="INT8U" isNullable="true" writable="true" default="0xFE" optional="true">on level</attribute>
405+
<attribute side="server" code="0x0012" define="ON_TRANSITION_TIME" type="INT16U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">on transition time</attribute>
406+
<attribute side="server" code="0x0013" define="OFF_TRANSITION_TIME" type="INT16U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">off transition time</attribute>
407+
<attribute side="server" code="0x0014" define="DEFAULT_MOVE_RATE" type="INT8U" isNullable="true" writable="true" optional="true" introducedIn="ha-1.2-05-3520-29">default move rate</attribute>
408408
<attribute side="server" code="0x000F" define="OPTIONS" type="BITMAP8" min="0x00" max="0x03" writable="true" default="0x00" optional="true" introducedIn="l&amp;o-1.0-15-0014-04">options</attribute>
409-
<attribute side="server" code="0x4000" define="START_UP_CURRENT_LEVEL" type="INT8U" min="0x01" max="0xFF" writable="true" optional="true" introducedIn="l&amp;o-1.0-15-0014-04">start up current level</attribute>
409+
<attribute side="server" code="0x4000" define="START_UP_CURRENT_LEVEL" type="INT8U" writable="true" optional="true" introducedIn="l&amp;o-1.0-15-0014-04">start up current level</attribute>
410410
<command source="client" code="0x00" name="MoveToLevel" optional="false" cli="zcl level-control mv-to-level">
411411
<description>
412412
Command description for MoveToLevel

src/app/zap-templates/zcl/data-model/silabs/ha.xml

+5-5
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ limitations under the License.
222222
<!-- COLOR_TEMPERATURE -->
223223
<attribute side="server" code="0x0008" define="COLOR_CONTROL_COLOR_MODE" type="ENUM8" min="0x00" max="0x02" writable="false" default="0x01" optional="true">color mode</attribute>
224224
<!-- COLOR_MODE -->
225-
<attribute side="server" code="0x000F" define="COLOR_CONTROL_OPTIONS" type="BITMAP8" min="0x00" max="0xFF" writable="true" default="0x00" optional="false" introducedIn="zcl-6.0-15-02017-001">color control options</attribute>
225+
<attribute side="server" code="0x000F" define="COLOR_CONTROL_OPTIONS" type="BITMAP8" writable="true" default="0x00" optional="false" introducedIn="zcl-6.0-15-02017-001">color control options</attribute>
226226
<!-- COLOR_CONTROL_OPTIONS -->
227227
<attribute side="server" code="0x0010" define="COLOR_CONTROL_NUMBER_OF_PRIMARIES" type="INT8U" min="0x00" max="0x06" writable="false" optional="true">number of primaries</attribute>
228228
<!-- NUMBER_OF_PRIMARIES -->
@@ -270,22 +270,22 @@ limitations under the License.
270270
<!-- COLOR_POINT_R_X -->
271271
<attribute side="server" code="0x0033" define="COLOR_CONTROL_COLOR_POINT_R_Y" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="true">color point r y</attribute>
272272
<!-- COLOR_POINT_R_Y -->
273-
<attribute side="server" code="0x0034" define="COLOR_CONTROL_COLOR_POINT_R_INTENSITY" type="INT8U" min="0x00" max="0xFF" writable="true" optional="true">color point r intensity</attribute>
273+
<attribute side="server" code="0x0034" define="COLOR_CONTROL_COLOR_POINT_R_INTENSITY" type="INT8U" writable="true" optional="true">color point r intensity</attribute>
274274
<!-- COLOR_POINT_R_INTENSITY -->
275275
<attribute side="server" code="0x0036" define="COLOR_CONTROL_COLOR_POINT_G_X" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="true">color point g x</attribute>
276276
<!-- COLOR_POINT_G_X -->
277277
<attribute side="server" code="0x0037" define="COLOR_CONTROL_COLOR_POINT_G_Y" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="true">color point g y</attribute>
278278
<!-- COLOR_POINT_G_Y -->
279-
<attribute side="server" code="0x0038" define="COLOR_CONTROL_COLOR_POINT_G_INTENSITY" type="INT8U" min="0x00" max="0xFF" writable="true" optional="true">color point g intensity</attribute>
279+
<attribute side="server" code="0x0038" define="COLOR_CONTROL_COLOR_POINT_G_INTENSITY" type="INT8U" writable="true" optional="true">color point g intensity</attribute>
280280
<!-- COLOR_POINT_G_INTENSITY -->
281281
<attribute side="server" code="0x003A" define="COLOR_CONTROL_COLOR_POINT_B_X" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="true">color point b x</attribute>
282282
<!-- COLOR_POINT_B_X -->
283283
<attribute side="server" code="0x003B" define="COLOR_CONTROL_COLOR_POINT_B_Y" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="true">color point b y</attribute>
284284
<!-- COLOR_POINT_B_Y -->
285-
<attribute side="server" code="0x003C" define="COLOR_CONTROL_COLOR_POINT_B_INTENSITY" type="INT8U" min="0x00" max="0xFF" writable="true" optional="true">color point b intensity</attribute>
285+
<attribute side="server" code="0x003C" define="COLOR_CONTROL_COLOR_POINT_B_INTENSITY" type="INT8U" writable="true" optional="true">color point b intensity</attribute>
286286
<!-- COLOR_POINT_B_INTENSITY -->
287287
<attribute side="server" code="0x400D" define="COLOR_CONTROL_TEMPERATURE_LEVEL_MIN_MIREDS" type="INT16U" min="0x0000" max="0xFFFF" writable="false" optional="false" introducedIn="l&amp;o-1.0-15-0014-04">couple color temp to level min-mireds</attribute>
288-
<attribute side="server" code="0x4010" define="START_UP_COLOR_TEMPERATURE_MIREDS" type="INT16U" min="0x0000" max="0xFFFF" writable="true" optional="false" introducedIn="l&amp;o-1.0-15-0014-04">start up color temperature mireds</attribute>
288+
<attribute side="server" code="0x4010" define="START_UP_COLOR_TEMPERATURE_MIREDS" type="INT16U" min="0x0000" max="0xFEFF" writable="true" optional="false" introducedIn="l&amp;o-1.0-15-0014-04">start up color temperature mireds</attribute>
289289
<command source="client" code="0x00" name="MoveToHue" optional="true" cli="zcl color-control movetohue">
290290
<description>
291291
Move to specified hue.

0 commit comments

Comments
 (0)