Skip to content

Commit 3ae6b98

Browse files
authored
Merge pull request #562 from zigbee-alliance/bugfix/522-comissioning-model-initial-step-hints
Set CommissioningModeInitialStepsHint to 1 by default for standard flow
2 parents 4eece29 + 597cd18 commit 3ae6b98

File tree

10 files changed

+223
-95
lines changed

10 files changed

+223
-95
lines changed

docs/transactions.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ Not all fields can be edited (see `EDIT_MODEL`).
203203
- partNumber: `optional(string)` - stock keeping unit
204204
- commissioningCustomFlow: `optional(uint8)` - A value of 1 indicates that user interaction with the device (pressing a button, for example) is required before commissioning can take place. When CommissioningCustomflow is set to a value of 2, the commissioner SHOULD attempt to obtain a URL which MAY be used to provide an end user with the necessary details for how to configure the product for initial commissioning
205205
- commissioningCustomFlowURL: `optional(string)` - commissioningCustomFlowURL SHALL identify a vendor specific commissioning URL for the device model when the commissioningCustomFlow field is set to '2'
206-
- commissioningModeInitialStepsHint: `optional(uint32)` - commissioningModeInitialStepsHint SHALL identify a hint for the steps that can be used to put into commissioning mode a device that has not yet been commissioned. This field is a bitmap with values defined in the Pairing Hint Table. For example, a value of 1 (bit 0 is set) indicates that a device that has not yet been commissioned will enter Commissioning Mode upon a power cycle.
206+
- commissioningModeInitialStepsHint: `optional(uint32)` - commissioningModeInitialStepsHint SHALL identify a hint for the steps that can be used to put into commissioning mode a device that has not yet been commissioned. This field is a bitmap with values defined in the Pairing Hint Table. For example, a value of 1 (bit 0 is set) indicates that a device that has not yet been commissioned will enter Commissioning Mode upon a power cycle (default 1).
207207
- commissioningModeInitialStepsInstruction: `optional(string)` - commissioningModeInitialStepsInstruction SHALL contain text which relates to specific values of CommissioningModeInitialStepsHint. Certain values of CommissioningModeInitialStepsHint, as defined in the Pairing Hint Table, indicate a Pairing Instruction (PI) dependency, and for these values the commissioningModeInitialStepsInstruction SHALL be set
208208
- commissioningModeSecondaryStepsHint: `optional(uint32)` - commissioningModeSecondaryStepsHint SHALL identify a hint for steps that can be used to put into commissioning mode a device that has already been commissioned. This field is a bitmap with values defined in the Pairing Hint Table. For example, a value of 4 (bit 2 is set) indicates that a device that has already been commissioned will require the user to visit a current CHIP Administrator to put the device into commissioning mode.
209209
- commissioningModeSecondaryStepInstruction: `optional(string)` - commissioningModeSecondaryStepInstruction SHALL contain text which relates to specific values of commissioningModeSecondaryStepsHint. Certain values of commissioningModeSecondaryStepsHint, as defined in the Pairing Hint Table, indicate a Pairing Instruction (PI) dependency, and for these values the commissioningModeSecondaryStepInstruction SHALL be set
@@ -260,7 +260,8 @@ All non-edited fields remain the same.
260260
- productURL: `optional(string)` - URL that contains product specific web page that contains details for the device model.
261261
- lsfURL: `optional(string)` - URL to the Localized String File of this product.
262262
- schemaVersion: `optional(uint16)` - Schema version to support backward/forward compatability(default 0)
263-
- lsfRevision: `optional(uint32)` - LsfRevision is a monotonically increasing positive integer indicating the latest available version of Localized String File.
263+
- lsfRevision: `optional(uint32)` - LsfRevision is a monotonically increasing positive integer indicating the latest available version of Localized String File.
264+
- commissioningModeInitialStepsHint: `optional(uint32)` - commissioningModeInitialStepsHint SHALL identify a hint for the steps that can be used to put into commissioning mode a device that has not yet been commissioned. This field is a bitmap with values defined in the Pairing Hint Table. For example, a value of 1 (bit 0 is set) indicates that a device that has not yet been commissioned will enter Commissioning Mode upon a power cycle. Note that this value cannot be updated to 0.
264265
- In State: `model/Model/value/<vid>/<pid>`
265266
- Who can send:
266267
- Vendor account associated with the same vid who has created the model

integration_tests/cli/model-demo.sh

+5-2
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,12 @@ echo "$result"
126126

127127
test_divider
128128

129-
echo "Update Model with VID: ${vid} PID: ${pid} with new description and commissionerRemoteUiFlowURL"
129+
echo "Update Model with VID: ${vid} PID: ${pid} with new description, commissionerRemoteUiFlowURL and commissioningModeInitialStepsHint"
130130
description="New Device Description"
131131
schema_version_3=3
132132
newCommissionerRemoteUiFlowURL="https://commissionerRemoteUiFlowURL.dclmodel.updated"
133-
result=$(echo "test1234" | dcld tx model update-model --vid=$vid --pid=$pid --from $vendor_account --yes --productLabel "$description" --schemaVersion=$schema_version_3 --commissionerRemoteUiFlowURL="$newCommissionerRemoteUiFlowURL")
133+
newCommissioningModeInitialStepsHint=8
134+
result=$(echo "test1234" | dcld tx model update-model --vid=$vid --pid=$pid --from $vendor_account --yes --productLabel "$description" --schemaVersion=$schema_version_3 --commissionerRemoteUiFlowURL="$newCommissionerRemoteUiFlowURL" --commissioningModeInitialStepsHint="$newCommissioningModeInitialStepsHint")
134135
check_response "$result" "\"code\": 0"
135136
echo "$result"
136137

@@ -150,6 +151,7 @@ check_response "$result" "\"pid\": $pid"
150151
check_response "$result" "\"productLabel\": \"$description\""
151152
check_response "$result" "\"schemaVersion\": $schema_version_3"
152153
check_response "$result" "\"commissionerRemoteUiFlowUrl\": \"$newCommissionerRemoteUiFlowURL\""
154+
check_response "$result" "\"commissioningModeInitialStepsHint\": $newCommissioningModeInitialStepsHint"
153155
echo "$result"
154156

155157
test_divider
@@ -167,6 +169,7 @@ result=$(dcld query model get-model --vid=$vid --pid=$pid)
167169
check_response "$result" "\"vid\": $vid"
168170
check_response "$result" "\"pid\": $pid"
169171
check_response "$result" "\"supportUrl\": \"$supportURL\""
172+
check_response "$result" "\"commissioningModeInitialStepsHint\": $newCommissioningModeInitialStepsHint"
170173
echo "$result"
171174

172175
test_divider

integration_tests/grpc_rest/model/helpers.go

+3
Original file line numberDiff line numberDiff line change
@@ -985,14 +985,17 @@ func Demo(suite *utils.TestSuite) {
985985
require.Equal(suite.T, createSecondModelMsg.Pid, vendorModels.Products[1].Pid)
986986

987987
// Update second model
988+
newCommissioningModeInitialStepsHint := uint32(8)
988989
updateSecondModelMsg := NewMsgUpdateModel(createSecondModelMsg.Vid, createSecondModelMsg.Pid, vendorAccount.Address)
990+
updateSecondModelMsg.CommissioningModeInitialStepsHint = newCommissioningModeInitialStepsHint
989991
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{updateSecondModelMsg}, vendorName, vendorAccount)
990992
require.NoError(suite.T, err)
991993

992994
// Check second model is updated
993995
receivedModel, err = GetModel(suite, createSecondModelMsg.Vid, createSecondModelMsg.Pid)
994996
require.NoError(suite.T, err)
995997
require.Equal(suite.T, updateSecondModelMsg.ProductLabel, receivedModel.ProductLabel)
998+
require.Equal(suite.T, newCommissioningModeInitialStepsHint, receivedModel.CommissioningModeInitialStepsHint)
996999

9971000
// add new model version
9981001
createModelVersionMsg := NewMsgCreateModelVersion(createFirstModelMsg.Vid, createFirstModelMsg.Pid, 1, "1", vendorAccount.Address)

proto/model/tx.proto

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ message MsgUpdateModel {
6363
int32 lsfRevision = 14 [(gogoproto.moretags) = "validate:\"gte=0,lte=65535\""];
6464
uint32 schemaVersion = 15 [(gogoproto.moretags) = "validate:\"gte=0,lte=65535\""];
6565
string commissionerRemoteUiFlowUrl = 16 [(gogoproto.moretags) = "validate:\"omitempty,url,startsnotwith=http:,max=256\""];
66+
uint32 commissioningModeInitialStepsHint = 17;
6667
}
6768
message MsgUpdateModelResponse {}
6869

vue/src/store/generated/zigbee-alliance/distributed-compliance-ledger/zigbeealliance.distributedcomplianceledger.model/module/types/model/tx.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export interface MsgUpdateModel {
4545
lsfRevision: number
4646
schemaVersion: number
4747
commissionerRemoteUiFlowUrl: string
48+
commissioningModeInitialStepsHint: number
4849
}
4950

5051
export interface MsgUpdateModelResponse {}
@@ -541,7 +542,8 @@ const baseMsgUpdateModel: object = {
541542
lsfUrl: '',
542543
lsfRevision: 0,
543544
schemaVersion: 0,
544-
commissionerRemoteUiFlowUrl: ''
545+
commissionerRemoteUiFlowUrl: '',
546+
commissioningModeInitialStepsHint: 0
545547
}
546548

547549
export const MsgUpdateModel = {
@@ -594,6 +596,9 @@ export const MsgUpdateModel = {
594596
if (message.commissionerRemoteUiFlowUrl !== '') {
595597
writer.uint32(130).string(message.commissionerRemoteUiFlowUrl)
596598
}
599+
if (message.commissioningModeInitialStepsHint !== 0) {
600+
writer.uint32(136).uint32(message.commissioningModeInitialStepsHint)
601+
}
597602
return writer
598603
},
599604

@@ -652,6 +657,9 @@ export const MsgUpdateModel = {
652657
case 16:
653658
message.commissionerRemoteUiFlowUrl = reader.string()
654659
break
660+
case 17:
661+
message.commissioningModeInitialStepsHint = reader.uint32()
662+
break
655663
default:
656664
reader.skipType(tag & 7)
657665
break
@@ -742,6 +750,11 @@ export const MsgUpdateModel = {
742750
} else {
743751
message.commissionerRemoteUiFlowUrl = ''
744752
}
753+
if (object.commissioningModeInitialStepsHint !== undefined && object.commissioningModeInitialStepsHint !== null) {
754+
message.commissioningModeInitialStepsHint = Number(object.commissioningModeInitialStepsHint)
755+
} else {
756+
message.commissioningModeInitialStepsHint = 0
757+
}
745758
return message
746759
},
747760

@@ -765,6 +778,7 @@ export const MsgUpdateModel = {
765778
message.lsfRevision !== undefined && (obj.lsfRevision = message.lsfRevision)
766779
message.schemaVersion !== undefined && (obj.schemaVersion = message.schemaVersion)
767780
message.commissionerRemoteUiFlowUrl !== undefined && (obj.commissionerRemoteUiFlowUrl = message.commissionerRemoteUiFlowUrl)
781+
message.commissioningModeInitialStepsHint !== undefined && (obj.commissioningModeInitialStepsHint = message.commissioningModeInitialStepsHint)
768782
return obj
769783
},
770784

@@ -850,6 +864,11 @@ export const MsgUpdateModel = {
850864
} else {
851865
message.commissionerRemoteUiFlowUrl = ''
852866
}
867+
if (object.commissioningModeInitialStepsHint !== undefined && object.commissioningModeInitialStepsHint !== null) {
868+
message.commissioningModeInitialStepsHint = object.commissioningModeInitialStepsHint
869+
} else {
870+
message.commissioningModeInitialStepsHint = 0
871+
}
853872
return message
854873
}
855874
}

x/model/client/cli/tx_model.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,12 @@ the necessary details for how to configure the product for initial commissioning
100100
cmd.Flags().StringVar(&commissioningCustomFlowURL, FlagCommissioningCustomFlowURL, "",
101101
`commissioningCustomFlowURL SHALL identify a vendor specific commissioning URL for the
102102
device model when the commissioningCustomFlow field is set to '2'`)
103-
cmd.Flags().Uint32Var(&commissioningModeInitialStepsHint, FlagCommissioningModeInitialStepsHint, 0,
103+
cmd.Flags().Uint32Var(&commissioningModeInitialStepsHint, FlagCommissioningModeInitialStepsHint, 1,
104104
`commissioningModeInitialStepsHint SHALL
105105
identify a hint for the steps that can be used to put into commissioning mode a device that
106106
has not yet been commissioned. This field is a bitmap with values defined in the Pairing Hint Table.
107107
For example, a value of 1 (bit 0 is set) indicates
108-
that a device that has not yet been commissioned will enter Commissioning Mode upon a power cycle.`)
108+
that a device that has not yet been commissioned will enter Commissioning Mode upon a power cycle (default 1).`)
109109
cmd.Flags().StringVar(&commissioningModeInitialStepsInstruction, FlagCommissioningModeInitialStepsInstruction, "",
110110
`commissioningModeInitialStepsInstruction SHALL contain text which relates to specific
111111
values of commissioningModeSecondaryStepsHint. Certain values of CommissioningModeInitialStepsHint,
@@ -160,6 +160,7 @@ func CmdUpdateModel() *cobra.Command {
160160
lsfURL string
161161
lsfRevision int32
162162
schemaVersion uint32
163+
commissioningModeInitialStepsHint uint32
163164
)
164165

165166
cmd := &cobra.Command{
@@ -194,6 +195,7 @@ func CmdUpdateModel() *cobra.Command {
194195
lsfURL,
195196
lsfRevision,
196197
schemaVersion,
198+
commissioningModeInitialStepsHint,
197199
)
198200

199201
// validate basic will be called in GenerateOrBroadcastTxCLI
@@ -241,6 +243,12 @@ and for these values the commissioningModeSecondaryStepInstruction SHALL be set`
241243
cmd.Flags().Int32Var(&lsfRevision, FlagLsfRevision, 0,
242244
"LsfRevision is a monotonically increasing positive integer indicating the latest available version of Localized String File")
243245
cmd.Flags().Uint32Var(&schemaVersion, common.FlagSchemaVersion, 0, "Schema version")
246+
cmd.Flags().Uint32Var(&commissioningModeInitialStepsHint, FlagCommissioningModeInitialStepsHint, 0,
247+
`commissioningModeInitialStepsHint SHALL
248+
identify a hint for the steps that can be used to put into commissioning mode a device that
249+
has not yet been commissioned. This field is a bitmap with values defined in the Pairing Hint Table.
250+
For example, a value of 1 (bit 0 is set) indicates that a device that has not yet been commissioned
251+
will enter Commissioning Mode upon a power cycle. Note that this value cannot be updated to 0. (default 1).`)
244252

245253
cli.AddTxFlagsToCmd(cmd)
246254

x/model/handler_test.go

+44-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,47 @@ func TestHandler_AddModel(t *testing.T) {
170170
require.Equal(t, msgCreateModel.Vid, receivedModel.Vid)
171171
require.Equal(t, msgCreateModel.Pid, receivedModel.Pid)
172172
require.Equal(t, msgCreateModel.DeviceTypeId, receivedModel.DeviceTypeId)
173-
require.Equal(t, testconstants.SchemaVersion, receivedModel.SchemaVersion)
173+
}
174+
175+
func TestHandler_AddModel_CheckCommissioningModeInitialStepsHintHandling(t *testing.T) {
176+
cases := []struct {
177+
name string
178+
commissioningModeInitialStepsHint uint32
179+
expectedCommissioningModeInitialStepsHint uint32
180+
}{
181+
{
182+
name: "CommissioningModeInitialStepsHint=0 Sets Default 1",
183+
commissioningModeInitialStepsHint: 0,
184+
expectedCommissioningModeInitialStepsHint: 1,
185+
},
186+
{
187+
name: "CommissioningModeInitialStepsHint=2 Remains 2",
188+
commissioningModeInitialStepsHint: 2,
189+
expectedCommissioningModeInitialStepsHint: 2,
190+
},
191+
}
192+
193+
for _, tc := range cases {
194+
t.Run(tc.name, func(t *testing.T) {
195+
setup := Setup(t)
196+
197+
// add new model
198+
msgCreateModel := NewMsgCreateModel(setup.Vendor)
199+
msgCreateModel.CommissioningModeInitialStepsHint = tc.commissioningModeInitialStepsHint
200+
_, err := setup.Handler(setup.Ctx, msgCreateModel)
201+
require.NoError(t, err)
202+
203+
// query model
204+
receivedModel, err := queryModel(setup, msgCreateModel.Vid, msgCreateModel.Pid)
205+
require.NoError(t, err)
206+
207+
// check
208+
require.Equal(t, msgCreateModel.Vid, receivedModel.Vid)
209+
require.Equal(t, msgCreateModel.Pid, receivedModel.Pid)
210+
require.Equal(t, msgCreateModel.DeviceTypeId, receivedModel.DeviceTypeId)
211+
require.Equal(t, tc.expectedCommissioningModeInitialStepsHint, receivedModel.CommissioningModeInitialStepsHint)
212+
})
213+
}
174214
}
175215

176216
func TestHandler_UpdateModel(t *testing.T) {
@@ -194,7 +234,9 @@ func TestHandler_UpdateModel(t *testing.T) {
194234

195235
// update existing model
196236
var newSchemaVersion uint32 = 2
237+
var newCommissioningModeInitialStepsHint uint32 = 8
197238
msgUpdateModel.SchemaVersion = newSchemaVersion
239+
msgUpdateModel.CommissioningModeInitialStepsHint = newCommissioningModeInitialStepsHint
198240
_, err = setup.Handler(setup.Ctx, msgUpdateModel)
199241
require.NoError(t, err)
200242

@@ -208,6 +250,7 @@ func TestHandler_UpdateModel(t *testing.T) {
208250
require.Equal(t, msgUpdateModel.Vid, receivedModel.Vid)
209251
require.Equal(t, msgUpdateModel.Pid, receivedModel.Pid)
210252
require.Equal(t, msgUpdateModel.ProductLabel, receivedModel.ProductLabel)
253+
require.Equal(t, newCommissioningModeInitialStepsHint, receivedModel.CommissioningModeInitialStepsHint)
211254
require.Equal(t, newSchemaVersion, receivedModel.SchemaVersion)
212255
}
213256

x/model/keeper/msg_server_model.go

+10
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ func (k msgServer) CreateModel(goCtx context.Context, msg *types.MsgCreateModel)
5757
model.LsfRevision = 1
5858
}
5959

60+
// If CommissioningModeInitialStepsHint is 0, then set it to the default value of 1
61+
// Relevant issue: https://github.com/zigbee-alliance/distributed-compliance-ledger/issues/522
62+
if model.CommissioningModeInitialStepsHint == 0 {
63+
model.CommissioningModeInitialStepsHint = 1
64+
}
65+
6066
// store new model
6167
k.SetModel(
6268
ctx,
@@ -158,6 +164,10 @@ func (k msgServer) UpdateModel(goCtx context.Context, msg *types.MsgUpdateModel)
158164
}
159165
}
160166

167+
if msg.CommissioningModeInitialStepsHint != 0 {
168+
model.CommissioningModeInitialStepsHint = msg.CommissioningModeInitialStepsHint
169+
}
170+
161171
// store updated model
162172
k.SetModel(ctx, model)
163173

x/model/types/messages_model.go

+2
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func NewMsgUpdateModel(
114114
lsfURL string,
115115
lsfRevision int32,
116116
schemaVersion uint32,
117+
commissioningModeInitialStepsHint uint32,
117118
) *MsgUpdateModel {
118119
return &MsgUpdateModel{
119120
Creator: creator,
@@ -132,6 +133,7 @@ func NewMsgUpdateModel(
132133
LsfUrl: lsfURL,
133134
LsfRevision: lsfRevision,
134135
SchemaVersion: schemaVersion,
136+
CommissioningModeInitialStepsHint: commissioningModeInitialStepsHint,
135137
}
136138
}
137139

0 commit comments

Comments
 (0)