@kusinta/iot-schema 0.2.0-beta.1 → 0.2.0-beta.3
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/package.json +5 -1
- package/src/kusinta/iot/access/v1/acl_pb.d.ts +130 -0
- package/src/kusinta/iot/access/v1/acl_pb.js +18 -4
- package/src/kusinta/iot/access/v1/roles_pb.d.ts +80 -14
- package/src/kusinta/iot/access/v1/roles_pb.js +33 -1
- package/src/kusinta/iot/connector/v1/connector_pb.d.ts +54 -6
- package/src/kusinta/iot/connector/v1/connector_pb.js +1 -1
- package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +14 -6
- package/src/kusinta/iot/webrtc/v1/command_pb.js +2 -1
- package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +12 -6
- package/src/kusinta/iot/webrtc/v1/device_state_pb.js +4 -4
- package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +4 -4
- package/src/kusinta/iot/webrtc/v1/envelope_pb.js +1 -1
- package/src/kusinta/iot/webrtc/v1/setpoint_mode_pb.d.ts +63 -0
- package/src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js +45 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kusinta/iot-schema",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": ["src"],
|
|
@@ -27,7 +27,11 @@
|
|
|
27
27
|
"./connector/service": "./src/kusinta/iot/connector/v1/connector_service_pb.js",
|
|
28
28
|
"./webrtc": "./src/kusinta/iot/webrtc/v1/envelope_pb.js",
|
|
29
29
|
"./webrtc/app-token": "./src/kusinta/iot/webrtc/v1/app_token_pb.js",
|
|
30
|
+
"./webrtc/command": "./src/kusinta/iot/webrtc/v1/command_pb.js",
|
|
31
|
+
"./webrtc/device-state": "./src/kusinta/iot/webrtc/v1/device_state_pb.js",
|
|
30
32
|
"./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
|
|
33
|
+
"./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
|
|
34
|
+
"./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
|
|
31
35
|
"./registration": "./src/kusinta/iot/registration/v1/registration_pb.js",
|
|
32
36
|
"./registration/service": "./src/kusinta/iot/registration/v1/registration_service_pb.js",
|
|
33
37
|
"./signaling": "./src/kusinta/iot/signaling/v1/signaling_pb.js",
|
|
@@ -86,6 +86,77 @@ export declare type AttributeRef = Message<"kusinta.iot.access.v1.AttributeRef">
|
|
|
86
86
|
*/
|
|
87
87
|
export declare const AttributeRefSchema: GenMessage<AttributeRef>;
|
|
88
88
|
|
|
89
|
+
/**
|
|
90
|
+
* CommandRef names one command on one endpoint, for DeviceAcl.allowed_command_refs.
|
|
91
|
+
*
|
|
92
|
+
* A separate type from AttributeRef because attributes and commands are numbered
|
|
93
|
+
* independently within a cluster: On/Off (0x0006) has an attribute 0x0000 (OnOff) and a
|
|
94
|
+
* command 0x0000 (Off) that have nothing to do with each other. Putting a command ID in a
|
|
95
|
+
* field named attribute_id would be the same class of ambiguity this schema removed when
|
|
96
|
+
* it made addressing numeric.
|
|
97
|
+
*
|
|
98
|
+
* @generated from message kusinta.iot.access.v1.CommandRef
|
|
99
|
+
*/
|
|
100
|
+
export declare type CommandRef = Message<"kusinta.iot.access.v1.CommandRef"> & {
|
|
101
|
+
/**
|
|
102
|
+
* @generated from field: uint32 cluster_id = 1;
|
|
103
|
+
*/
|
|
104
|
+
clusterId: number;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @generated from field: uint32 matter_command_id = 2;
|
|
108
|
+
*/
|
|
109
|
+
matterCommandId: number;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Which endpoint. Required on a grant, for the same reason as AttributeRef.endpoint_id:
|
|
113
|
+
* all four channels of a 4-channel actuator accept the same command on the same cluster,
|
|
114
|
+
* so a ref without one cannot tell channel 1 from channel 3.
|
|
115
|
+
*
|
|
116
|
+
* @generated from field: optional uint32 endpoint_id = 3;
|
|
117
|
+
*/
|
|
118
|
+
endpointId?: number | undefined;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Describes the message kusinta.iot.access.v1.CommandRef.
|
|
123
|
+
* Use `create(CommandRefSchema)` to create a new message.
|
|
124
|
+
*/
|
|
125
|
+
export declare const CommandRefSchema: GenMessage<CommandRef>;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* EventRef names one event on one endpoint, for DeviceAcl.allowed_event_refs.
|
|
129
|
+
*
|
|
130
|
+
* Events are numbered independently of attributes and commands within a cluster, so this
|
|
131
|
+
* is a third type rather than a reuse. On Door Lock (0x0101), the LockState attribute and
|
|
132
|
+
* the lock-operation event are different elements answering different questions: what the
|
|
133
|
+
* lock's state is, and who changed it.
|
|
134
|
+
*
|
|
135
|
+
* @generated from message kusinta.iot.access.v1.EventRef
|
|
136
|
+
*/
|
|
137
|
+
export declare type EventRef = Message<"kusinta.iot.access.v1.EventRef"> & {
|
|
138
|
+
/**
|
|
139
|
+
* @generated from field: uint32 cluster_id = 1;
|
|
140
|
+
*/
|
|
141
|
+
clusterId: number;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @generated from field: uint32 event_id = 2;
|
|
145
|
+
*/
|
|
146
|
+
eventId: number;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @generated from field: optional uint32 endpoint_id = 3;
|
|
150
|
+
*/
|
|
151
|
+
endpointId?: number | undefined;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Describes the message kusinta.iot.access.v1.EventRef.
|
|
156
|
+
* Use `create(EventRefSchema)` to create a new message.
|
|
157
|
+
*/
|
|
158
|
+
export declare const EventRefSchema: GenMessage<EventRef>;
|
|
159
|
+
|
|
89
160
|
/**
|
|
90
161
|
* PropertyConstraint bounds a single Matter cluster attribute.
|
|
91
162
|
* MaxHeatSetpointLimit and MinHeatSetpointLimit are actual Matter Thermostat cluster
|
|
@@ -155,6 +226,14 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
|
|
|
155
226
|
userId?: UserId | undefined;
|
|
156
227
|
|
|
157
228
|
/**
|
|
229
|
+
* The user's role AS RESOLVED FOR THIS DEVICE. A gateway-wide role is a ceiling on the
|
|
230
|
+
* kinds of action a user may perform; reach — which devices — is decided separately by
|
|
231
|
+
* filing. This field is what the two produced together for this one device, so it may
|
|
232
|
+
* differ from any single role the user's token carries. See roles.proto.
|
|
233
|
+
*
|
|
234
|
+
* Descriptive. allowed_actions and the ref lists below are what a consumer enforces
|
|
235
|
+
* against; this says which relationship produced them.
|
|
236
|
+
*
|
|
158
237
|
* @generated from field: kusinta.iot.access.v1.Role role = 3;
|
|
159
238
|
*/
|
|
160
239
|
role: Role;
|
|
@@ -192,6 +271,39 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
|
|
|
192
271
|
* @generated from field: repeated kusinta.iot.access.v1.PropertyConstraint property_constraints = 6;
|
|
193
272
|
*/
|
|
194
273
|
propertyConstraints: PropertyConstraint[];
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Narrows PERMISSION_ACTION_INVOKE to particular commands. Empty = every command the
|
|
277
|
+
* device accepts, matching allowed_attribute_refs — it is a filter, and an empty filter
|
|
278
|
+
* narrows nothing. It grants nothing on its own: without INVOKE in allowed_actions, no
|
|
279
|
+
* command is permitted however this list reads.
|
|
280
|
+
*
|
|
281
|
+
* Without it INVOKE is all-or-nothing, and that is the operation that moves hardware —
|
|
282
|
+
* a grant covering a thermostat setpoint would equally cover UnlockDoor on a device
|
|
283
|
+
* exposing both.
|
|
284
|
+
*
|
|
285
|
+
* A ref present with no endpoint_id is INVALID and MUST be rejected.
|
|
286
|
+
*
|
|
287
|
+
* @generated from field: repeated kusinta.iot.access.v1.CommandRef allowed_command_refs = 9;
|
|
288
|
+
*/
|
|
289
|
+
allowedCommandRefs: CommandRef[];
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Which events this user may receive. Empty = NONE.
|
|
293
|
+
*
|
|
294
|
+
* The opposite default to the two lists above, deliberately. Attributes and commands are
|
|
295
|
+
* a device's operating surface; events are its journal, and a journal discloses who did
|
|
296
|
+
* what and when. Reaching that must be an explicit grant, never something a user gets by
|
|
297
|
+
* holding SUBSCRIBE for ordinary readings.
|
|
298
|
+
*
|
|
299
|
+
* Requires PERMISSION_ACTION_SUBSCRIBE as well: the action says a standing stream is
|
|
300
|
+
* permitted, this list says which events travel on it.
|
|
301
|
+
*
|
|
302
|
+
* A ref present with no endpoint_id is INVALID and MUST be rejected.
|
|
303
|
+
*
|
|
304
|
+
* @generated from field: repeated kusinta.iot.access.v1.EventRef allowed_event_refs = 10;
|
|
305
|
+
*/
|
|
306
|
+
allowedEventRefs: EventRef[];
|
|
195
307
|
};
|
|
196
308
|
|
|
197
309
|
/**
|
|
@@ -201,6 +313,24 @@ export declare type DeviceAcl = Message<"kusinta.iot.access.v1.DeviceAcl"> & {
|
|
|
201
313
|
export declare const DeviceAclSchema: GenMessage<DeviceAcl>;
|
|
202
314
|
|
|
203
315
|
/**
|
|
316
|
+
* Every DeviceAcl in force for one user on one gateway, at valid_at.
|
|
317
|
+
*
|
|
318
|
+
* ADVISORY WHEN SENT TO AN APP. The gateway is the sole authority and enforces every
|
|
319
|
+
* read, write, invoke and subscription against its own copy, whether or not the app has
|
|
320
|
+
* one. This is disclosed so an app can RENDER honestly — grey out a control the user may
|
|
321
|
+
* not invoke, clamp a setpoint slider to a PropertyConstraint, hide a device — instead of
|
|
322
|
+
* offering an action and discovering the refusal.
|
|
323
|
+
*
|
|
324
|
+
* Two mistakes this exists to prevent. An app MUST still handle refusal: this snapshot can
|
|
325
|
+
* be stale, and it is not a promise. A gateway MUST NOT treat having sent it as having
|
|
326
|
+
* enforced anything.
|
|
327
|
+
*
|
|
328
|
+
* It discloses only the recipient's own permissions. It says nothing about what any other
|
|
329
|
+
* user holds.
|
|
330
|
+
*
|
|
331
|
+
* Sent whole rather than as a delta, in webrtc.v1.DeviceStateSnapshot at connect and in
|
|
332
|
+
* webrtc.v1.LivePermissionUpdate when it changes.
|
|
333
|
+
*
|
|
204
334
|
* @generated from message kusinta.iot.access.v1.EffectivePermissions
|
|
205
335
|
*/
|
|
206
336
|
export declare type EffectivePermissions = Message<"kusinta.iot.access.v1.EffectivePermissions"> & {
|
|
@@ -11,7 +11,7 @@ import { file_kusinta_iot_access_v1_roles } from "./roles_pb.js";
|
|
|
11
11
|
* Describes the file kusinta/iot/access/v1/acl.proto.
|
|
12
12
|
*/
|
|
13
13
|
export const file_kusinta_iot_access_v1_acl = /*@__PURE__*/
|
|
14
|
-
fileDesc("
|
|
14
|
+
fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQihgQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWZKBAgFEAZSEmFsbG93ZWRfYXR0cmlidXRlcyLlAQoURWZmZWN0aXZlUGVybWlzc2lvbnMSMAoHdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI2CgpnYXRld2F5X2lkGAIgASgLMiIua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuR2F0ZXdheUlkEjUKC2RldmljZV9hY2xzGAMgAygLMiAua3VzaW50YS5pb3QuYWNjZXNzLnYxLkRldmljZUFjbBIsCgh2YWxpZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_access_v1_roles]);
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Describes the message kusinta.iot.access.v1.AttributeRef.
|
|
@@ -20,24 +20,38 @@ export const file_kusinta_iot_access_v1_acl = /*@__PURE__*/
|
|
|
20
20
|
export const AttributeRefSchema = /*@__PURE__*/
|
|
21
21
|
messageDesc(file_kusinta_iot_access_v1_acl, 0);
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Describes the message kusinta.iot.access.v1.CommandRef.
|
|
25
|
+
* Use `create(CommandRefSchema)` to create a new message.
|
|
26
|
+
*/
|
|
27
|
+
export const CommandRefSchema = /*@__PURE__*/
|
|
28
|
+
messageDesc(file_kusinta_iot_access_v1_acl, 1);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Describes the message kusinta.iot.access.v1.EventRef.
|
|
32
|
+
* Use `create(EventRefSchema)` to create a new message.
|
|
33
|
+
*/
|
|
34
|
+
export const EventRefSchema = /*@__PURE__*/
|
|
35
|
+
messageDesc(file_kusinta_iot_access_v1_acl, 2);
|
|
36
|
+
|
|
23
37
|
/**
|
|
24
38
|
* Describes the message kusinta.iot.access.v1.PropertyConstraint.
|
|
25
39
|
* Use `create(PropertyConstraintSchema)` to create a new message.
|
|
26
40
|
*/
|
|
27
41
|
export const PropertyConstraintSchema = /*@__PURE__*/
|
|
28
|
-
messageDesc(file_kusinta_iot_access_v1_acl,
|
|
42
|
+
messageDesc(file_kusinta_iot_access_v1_acl, 3);
|
|
29
43
|
|
|
30
44
|
/**
|
|
31
45
|
* Describes the message kusinta.iot.access.v1.DeviceAcl.
|
|
32
46
|
* Use `create(DeviceAclSchema)` to create a new message.
|
|
33
47
|
*/
|
|
34
48
|
export const DeviceAclSchema = /*@__PURE__*/
|
|
35
|
-
messageDesc(file_kusinta_iot_access_v1_acl,
|
|
49
|
+
messageDesc(file_kusinta_iot_access_v1_acl, 4);
|
|
36
50
|
|
|
37
51
|
/**
|
|
38
52
|
* Describes the message kusinta.iot.access.v1.EffectivePermissions.
|
|
39
53
|
* Use `create(EffectivePermissionsSchema)` to create a new message.
|
|
40
54
|
*/
|
|
41
55
|
export const EffectivePermissionsSchema = /*@__PURE__*/
|
|
42
|
-
messageDesc(file_kusinta_iot_access_v1_acl,
|
|
56
|
+
messageDesc(file_kusinta_iot_access_v1_acl, 5);
|
|
43
57
|
|
|
@@ -10,6 +10,32 @@ import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv2";
|
|
|
10
10
|
export declare const file_kusinta_iot_access_v1_roles: GenFile;
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
+
* What kind of party a user is, gateway-wide.
|
|
14
|
+
*
|
|
15
|
+
* A role is a CEILING on the kinds of action a user may perform anywhere on this gateway.
|
|
16
|
+
* It is not reach: it says nothing about WHICH devices the user may act on. Reach is
|
|
17
|
+
* decided by filing — which spaces the user holds, and which devices are in them — and
|
|
18
|
+
* the two are independent. A role must never be read as reach, and reach must never be
|
|
19
|
+
* read as permission to act.
|
|
20
|
+
*
|
|
21
|
+
* The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
|
|
22
|
+
* role narrows what may appear there; it does not put anything there on its own.
|
|
23
|
+
*
|
|
24
|
+
* Carried in the app's token as webrtc.v1.AppTokenClaims.roles, as an array of proto3
|
|
25
|
+
* canonical enum NAME strings (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]) rather than
|
|
26
|
+
* integers, so the claim stays self-describing. A user may hold several at once and the
|
|
27
|
+
* effective ceiling is their union.
|
|
28
|
+
*
|
|
29
|
+
* UNORDERED. These are categories, not levels: a technician is not "more than" a
|
|
30
|
+
* resident, and there is no >= comparison to make between them. Anything needing a graded
|
|
31
|
+
* comparison — Matter's View/Operate/Manage/Administer, say — would be a separate concept
|
|
32
|
+
* and is deliberately not modelled here.
|
|
33
|
+
*
|
|
34
|
+
* A role is a ceiling rather than a floor, so it may be WIDENED per device by facts the
|
|
35
|
+
* role does not know: a user who owns a device may hold actions on it that their
|
|
36
|
+
* gateway-wide role alone would not grant. That widening is the gateway's to apply and is
|
|
37
|
+
* visible to the app only in the resolved DeviceAcl.
|
|
38
|
+
*
|
|
13
39
|
* @generated from enum kusinta.iot.access.v1.Role
|
|
14
40
|
*/
|
|
15
41
|
export enum Role {
|
|
@@ -19,21 +45,31 @@ export enum Role {
|
|
|
19
45
|
UNSPECIFIED = 0,
|
|
20
46
|
|
|
21
47
|
/**
|
|
48
|
+
* Lives with the devices. Operates what is in the spaces they hold.
|
|
49
|
+
*
|
|
22
50
|
* @generated from enum value: ROLE_RESIDENT = 1;
|
|
23
51
|
*/
|
|
24
52
|
RESIDENT = 1,
|
|
25
53
|
|
|
26
54
|
/**
|
|
55
|
+
* Owns the property the devices are installed in. Sets the bounds residents operate
|
|
56
|
+
* within — see PropertyConstraint in acl.proto.
|
|
57
|
+
*
|
|
27
58
|
* @generated from enum value: ROLE_PROPERTY_OWNER = 2;
|
|
28
59
|
*/
|
|
29
60
|
PROPERTY_OWNER = 2,
|
|
30
61
|
|
|
31
62
|
/**
|
|
63
|
+
* Installs and services devices. Present for the work, not for the tenancy.
|
|
64
|
+
*
|
|
32
65
|
* @generated from enum value: ROLE_TECHNICIAN = 3;
|
|
33
66
|
*/
|
|
34
67
|
TECHNICIAN = 3,
|
|
35
68
|
|
|
36
69
|
/**
|
|
70
|
+
* Administers this gateway itself. The one role that also affects reach: some devices
|
|
71
|
+
* are visible only to a session holding it.
|
|
72
|
+
*
|
|
37
73
|
* @generated from enum value: ROLE_GATEWAY_ADMIN = 4;
|
|
38
74
|
*/
|
|
39
75
|
GATEWAY_ADMIN = 4,
|
|
@@ -49,6 +85,12 @@ export declare const RoleSchema: GenEnum<Role>;
|
|
|
49
85
|
* names an operation that exists on the app leg, so a grant can be checked against the
|
|
50
86
|
* message that arrived.
|
|
51
87
|
*
|
|
88
|
+
* The action says HOW data is reached. WHICH elements it reaches is a separate question,
|
|
89
|
+
* answered by the ref lists on DeviceAcl — allowed_attribute_refs, allowed_command_refs
|
|
90
|
+
* and allowed_event_refs. Keeping the two apart is deliberate: attributes, commands and
|
|
91
|
+
* events are addressed by three different ID spaces, and folding "which kind of element"
|
|
92
|
+
* into the action verb would make the action mean two things at once.
|
|
93
|
+
*
|
|
52
94
|
* @generated from enum kusinta.iot.access.v1.PermissionAction
|
|
53
95
|
*/
|
|
54
96
|
export enum PermissionAction {
|
|
@@ -64,37 +106,61 @@ export enum PermissionAction {
|
|
|
64
106
|
UNSPECIFIED = 0,
|
|
65
107
|
|
|
66
108
|
/**
|
|
67
|
-
* Read an
|
|
109
|
+
* Read an element once, on demand: webrtc.v1.PropertyReadRequest.
|
|
68
110
|
*
|
|
69
111
|
* @generated from enum value: PERMISSION_ACTION_READ = 1;
|
|
70
112
|
*/
|
|
71
113
|
READ = 1,
|
|
72
114
|
|
|
73
115
|
/**
|
|
74
|
-
* Write an attribute
|
|
116
|
+
* Write an attribute to a value: webrtc.v1.AttributeWriteRequest, carried on
|
|
117
|
+
* AppMessage.attribute_write and forwarded to a connector as
|
|
118
|
+
* SessionResponse.execute_attribute_write.
|
|
119
|
+
*
|
|
120
|
+
* MUST be enforced separately from INVOKE. Writing an attribute and invoking a command
|
|
121
|
+
* are different operations in Matter carrying different authority: a user who may
|
|
122
|
+
* toggle a light is not thereby a user who may rewrite its attributes. An earlier form
|
|
123
|
+
* of this schema routed an absolute setpoint through DeviceCommand, which made INVOKE
|
|
124
|
+
* imply WRITE and left the distinction unenforceable — that is the mistake
|
|
125
|
+
* AttributeWriteRequest exists to undo, and checking INVOKE for a write would reinstate
|
|
126
|
+
* it.
|
|
75
127
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* attribute, so the only thing that changes a device is a DeviceCommand, which is
|
|
79
|
-
* INVOKE. This value therefore authorizes an operation that does not yet exist. It is
|
|
80
|
-
* kept rather than reserved because a direct attribute write is a plausible addition
|
|
81
|
-
* and burning the number would gain nothing; until then, granting it grants nothing.
|
|
128
|
+
* A relative adjust is NOT a write. Thermostat SetpointRaiseLower is a genuine Matter
|
|
129
|
+
* command and needs INVOKE; setting an absolute value needs WRITE.
|
|
82
130
|
*
|
|
83
131
|
* @generated from enum value: PERMISSION_ACTION_WRITE = 2;
|
|
84
132
|
*/
|
|
85
133
|
WRITE = 2,
|
|
86
134
|
|
|
87
135
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* interest in a device, not a single question about it.
|
|
136
|
+
* Hold a standing stream of a device's reports: webrtc.v1.AppMessage.subscribe, and the
|
|
137
|
+
* PropertyReport and DeviceEventBatch that follow.
|
|
91
138
|
*
|
|
92
|
-
*
|
|
139
|
+
* Covers BOTH attribute reports and events, as a Matter subscription does — one
|
|
140
|
+
* subscription carries attribute paths and event paths together. Which of them actually
|
|
141
|
+
* arrives is decided by allowed_attribute_refs and allowed_event_refs, not by this
|
|
142
|
+
* action. Note their emptiness rules differ: attributes default to all, events to none.
|
|
143
|
+
*
|
|
144
|
+
* NOT a privacy boundary. Anyone who may READ an element can poll it, so withholding
|
|
145
|
+
* SUBSCRIBE while granting READ hides nothing — it only costs the app round trips. Treat
|
|
146
|
+
* it as a RESOURCE control: bandwidth, battery, and how many standing streams a gateway
|
|
147
|
+
* will carry. Do not use it to protect data; use the ref lists for that.
|
|
148
|
+
*
|
|
149
|
+
* Was PERMISSION_ACTION_OBSERVE. Renamed because "observe" reads as a kind of access
|
|
150
|
+
* distinct from reading, which it is not — it is the same access held open.
|
|
151
|
+
*
|
|
152
|
+
* @generated from enum value: PERMISSION_ACTION_SUBSCRIBE = 3;
|
|
93
153
|
*/
|
|
94
|
-
|
|
154
|
+
SUBSCRIBE = 3,
|
|
95
155
|
|
|
96
156
|
/**
|
|
97
|
-
*
|
|
157
|
+
* Invoke a command on a cluster: webrtc.v1.DeviceCommand. This is the action that moves
|
|
158
|
+
* hardware.
|
|
159
|
+
*
|
|
160
|
+
* Commands are named by (cluster_id, matter_command_id), a different ID space from
|
|
161
|
+
* attributes — On/Off cluster 0x0006 has an attribute 0x0000 and a command 0x0000 that
|
|
162
|
+
* are unrelated. So allowed_attribute_refs cannot narrow this; allowed_command_refs is
|
|
163
|
+
* what does.
|
|
98
164
|
*
|
|
99
165
|
* @generated from enum value: PERMISSION_ACTION_INVOKE = 4;
|
|
100
166
|
*/
|
|
@@ -8,7 +8,7 @@ import { enumDesc, fileDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
|
|
|
8
8
|
* Describes the file kusinta/iot/access/v1/roles.proto.
|
|
9
9
|
*/
|
|
10
10
|
export const file_kusinta_iot_access_v1_roles = /*@__PURE__*/
|
|
11
|
-
fileDesc("
|
|
11
|
+
fileDesc("CiFrdXNpbnRhL2lvdC9hY2Nlc3MvdjEvcm9sZXMucHJvdG8SFWt1c2ludGEuaW90LmFjY2Vzcy52MSp1CgRSb2xlEhQKEFJPTEVfVU5TUEVDSUZJRUQQABIRCg1ST0xFX1JFU0lERU5UEAESFwoTUk9MRV9QUk9QRVJUWV9PV05FUhACEhMKD1JPTEVfVEVDSE5JQ0lBThADEhYKElJPTEVfR0FURVdBWV9BRE1JThAEKq0BChBQZXJtaXNzaW9uQWN0aW9uEiEKHVBFUk1JU1NJT05fQUNUSU9OX1VOU1BFQ0lGSUVEEAASGgoWUEVSTUlTU0lPTl9BQ1RJT05fUkVBRBABEhsKF1BFUk1JU1NJT05fQUNUSU9OX1dSSVRFEAISHwobUEVSTUlTU0lPTl9BQ1RJT05fU1VCU0NSSUJFEAMSHAoYUEVSTUlTU0lPTl9BQ1RJT05fSU5WT0tFEARCAkgBYgZwcm90bzM");
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Describes the enum kusinta.iot.access.v1.Role.
|
|
@@ -17,6 +17,32 @@ export const RoleSchema = /*@__PURE__*/
|
|
|
17
17
|
enumDesc(file_kusinta_iot_access_v1_roles, 0);
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
+
* What kind of party a user is, gateway-wide.
|
|
21
|
+
*
|
|
22
|
+
* A role is a CEILING on the kinds of action a user may perform anywhere on this gateway.
|
|
23
|
+
* It is not reach: it says nothing about WHICH devices the user may act on. Reach is
|
|
24
|
+
* decided by filing — which spaces the user holds, and which devices are in them — and
|
|
25
|
+
* the two are independent. A role must never be read as reach, and reach must never be
|
|
26
|
+
* read as permission to act.
|
|
27
|
+
*
|
|
28
|
+
* The gateway resolves the two together into DeviceAcl.allowed_actions, per device. A
|
|
29
|
+
* role narrows what may appear there; it does not put anything there on its own.
|
|
30
|
+
*
|
|
31
|
+
* Carried in the app's token as webrtc.v1.AppTokenClaims.roles, as an array of proto3
|
|
32
|
+
* canonical enum NAME strings (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]) rather than
|
|
33
|
+
* integers, so the claim stays self-describing. A user may hold several at once and the
|
|
34
|
+
* effective ceiling is their union.
|
|
35
|
+
*
|
|
36
|
+
* UNORDERED. These are categories, not levels: a technician is not "more than" a
|
|
37
|
+
* resident, and there is no >= comparison to make between them. Anything needing a graded
|
|
38
|
+
* comparison — Matter's View/Operate/Manage/Administer, say — would be a separate concept
|
|
39
|
+
* and is deliberately not modelled here.
|
|
40
|
+
*
|
|
41
|
+
* A role is a ceiling rather than a floor, so it may be WIDENED per device by facts the
|
|
42
|
+
* role does not know: a user who owns a device may hold actions on it that their
|
|
43
|
+
* gateway-wide role alone would not grant. That widening is the gateway's to apply and is
|
|
44
|
+
* visible to the app only in the resolved DeviceAcl.
|
|
45
|
+
*
|
|
20
46
|
* @generated from enum kusinta.iot.access.v1.Role
|
|
21
47
|
*/
|
|
22
48
|
export const Role = /*@__PURE__*/
|
|
@@ -33,6 +59,12 @@ export const PermissionActionSchema = /*@__PURE__*/
|
|
|
33
59
|
* names an operation that exists on the app leg, so a grant can be checked against the
|
|
34
60
|
* message that arrived.
|
|
35
61
|
*
|
|
62
|
+
* The action says HOW data is reached. WHICH elements it reaches is a separate question,
|
|
63
|
+
* answered by the ref lists on DeviceAcl — allowed_attribute_refs, allowed_command_refs
|
|
64
|
+
* and allowed_event_refs. Keeping the two apart is deliberate: attributes, commands and
|
|
65
|
+
* events are addressed by three different ID spaces, and folding "which kind of element"
|
|
66
|
+
* into the action verb would make the action mean two things at once.
|
|
67
|
+
*
|
|
36
68
|
* @generated from enum kusinta.iot.access.v1.PermissionAction
|
|
37
69
|
*/
|
|
38
70
|
export const PermissionAction = /*@__PURE__*/
|
|
@@ -8,9 +8,9 @@ import type { ConnectorId, DeviceId, GatewayId } from "../../identity/v1/identit
|
|
|
8
8
|
import type { ConnectorTransport } from "../../common/v1/types_pb.js";
|
|
9
9
|
import type { Device } from "../../device/v1/device_pb.js";
|
|
10
10
|
import type { Timestamp } from "@bufbuild/protobuf/wkt";
|
|
11
|
+
import type { AttributeWriteRequest, CommandError, DeviceCommand } from "../../webrtc/v1/command_pb.js";
|
|
11
12
|
import type { PropertyUpdateBatch } from "../../device/v1/property_update_pb.js";
|
|
12
13
|
import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
|
|
13
|
-
import type { AttributeWriteRequest, DeviceCommand } from "../../webrtc/v1/command_pb.js";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Describes the file kusinta/iot/connector/v1/connector.proto.
|
|
@@ -196,6 +196,15 @@ export declare type UnsubscribeDevice = Message<"kusinta.iot.connector.v1.Unsubs
|
|
|
196
196
|
export declare const UnsubscribeDeviceSchema: GenMessage<UnsubscribeDevice>;
|
|
197
197
|
|
|
198
198
|
/**
|
|
199
|
+
* Session-level error, gateway → connector. NOT how a command or a write fails: that is
|
|
200
|
+
* an ordinary ConnectorCommandResult with success = false and a typed CommandError, and
|
|
201
|
+
* one operation failing says nothing about the session, which continues.
|
|
202
|
+
*
|
|
203
|
+
* code stays a free-form string here, unlike webrtc.v1.GatewayError's closed
|
|
204
|
+
* GatewayErrorCode and unlike the CommandError below. A connector is versioned on its own
|
|
205
|
+
* schedule and one may be a third party's, so the set of things that can go wrong between
|
|
206
|
+
* a gateway and a connector is not closed the way the app leg's is.
|
|
207
|
+
*
|
|
199
208
|
* @generated from message kusinta.iot.connector.v1.GatewayError
|
|
200
209
|
*/
|
|
201
210
|
export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayError"> & {
|
|
@@ -210,7 +219,7 @@ export declare type GatewayError = Message<"kusinta.iot.connector.v1.GatewayErro
|
|
|
210
219
|
message: string;
|
|
211
220
|
|
|
212
221
|
/**
|
|
213
|
-
* non-empty if the error
|
|
222
|
+
* non-empty if the error refers to a specific request
|
|
214
223
|
*
|
|
215
224
|
* @generated from field: string request_id = 3;
|
|
216
225
|
*/
|
|
@@ -245,14 +254,53 @@ export declare type ConnectorCommandResult = Message<"kusinta.iot.connector.v1.C
|
|
|
245
254
|
success: boolean;
|
|
246
255
|
|
|
247
256
|
/**
|
|
248
|
-
* @generated from field:
|
|
257
|
+
* @generated from field: google.protobuf.Timestamp completed_at = 4;
|
|
249
258
|
*/
|
|
250
|
-
|
|
259
|
+
completedAt?: Timestamp | undefined;
|
|
251
260
|
|
|
252
261
|
/**
|
|
253
|
-
*
|
|
262
|
+
* Why it failed, in the same closed vocabulary the app is eventually given. The gateway
|
|
263
|
+
* forwards this into webrtc.v1.CommandResult.error unchanged; it does not translate.
|
|
264
|
+
*
|
|
265
|
+
* Shared rather than mirrored on purpose. The free-form string this replaces left every
|
|
266
|
+
* connector to invent its own spellings ("TIMEOUT", "UNSUPPORTED_MODE") and the gateway
|
|
267
|
+
* to keep a mapping table that silently fell behind whenever a connector coined a new
|
|
268
|
+
* one — which is the drift a closed vocabulary exists to prevent.
|
|
269
|
+
*
|
|
270
|
+
* A connector produces the subset it can actually observe: REJECTED_BY_DEVICE,
|
|
271
|
+
* UNREACHABLE, TIMEOUT, INVALID_COMMAND, INTERNAL. NOT_ENTITLED and
|
|
272
|
+
* CONSTRAINT_VIOLATED are the gateway's, decided before a command is forwarded at all;
|
|
273
|
+
* a connector never sees the caller's permissions and must not claim to.
|
|
274
|
+
*
|
|
275
|
+
* Rollout note: a connector whose schema predates this sends nothing on field 5 and the
|
|
276
|
+
* gateway reads UNSPECIFIED. Set success = false with no code and the meaning is "it
|
|
277
|
+
* failed, reason unstated" — which is what the string codes amounted to anyway.
|
|
278
|
+
*
|
|
279
|
+
* @generated from field: kusinta.iot.webrtc.v1.CommandError error = 5;
|
|
254
280
|
*/
|
|
255
|
-
|
|
281
|
+
error?: CommandError | undefined;
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* When this connector's own optimistic window closes: by this time the value has either
|
|
285
|
+
* been confirmed by the device or restored, and either way the connector will have
|
|
286
|
+
* published a PropertyUpdate saying so.
|
|
287
|
+
*
|
|
288
|
+
* Set it when the connector applied the value optimistically and runs a rollback timer
|
|
289
|
+
* of its own — a downstream device with a known, device-specific timeout. The gateway
|
|
290
|
+
* carries it into webrtc.v1.CommandResult.settles_by instead of applying a fixed guess:
|
|
291
|
+
* the connector is the only party that knows the timer, and a gateway-side constant
|
|
292
|
+
* chasing it is the same hardcoded-window problem one level up.
|
|
293
|
+
*
|
|
294
|
+
* Absent means no claim — either the connector confirms synchronously, or it cannot
|
|
295
|
+
* state a bound. Absent is NOT "settles immediately", and the gateway is free to fall
|
|
296
|
+
* back to a deadline of its own when nothing is stated here.
|
|
297
|
+
*
|
|
298
|
+
* This bounds the wait; it does not label the values that arrive. Which update was the
|
|
299
|
+
* optimistic one is device.v1.PropertyUpdate.provenance.
|
|
300
|
+
*
|
|
301
|
+
* @generated from field: optional google.protobuf.Timestamp settles_by = 6;
|
|
302
|
+
*/
|
|
303
|
+
settlesBy?: Timestamp | undefined;
|
|
256
304
|
};
|
|
257
305
|
|
|
258
306
|
/**
|
|
@@ -15,7 +15,7 @@ import { file_kusinta_iot_webrtc_v1_command } from "../../webrtc/v1/command_pb.j
|
|
|
15
15
|
* Describes the file kusinta/iot/connector/v1/connector.proto.
|
|
16
16
|
*/
|
|
17
17
|
export const file_kusinta_iot_connector_v1_connector = /*@__PURE__*/
|
|
18
|
-
fileDesc("
|
|
18
|
+
fileDesc("CihrdXNpbnRhL2lvdC9jb25uZWN0b3IvdjEvY29ubmVjdG9yLnByb3RvEhhrdXNpbnRhLmlvdC5jb25uZWN0b3IudjEi5QEKDUNvbm5lY3RvckluZm8SOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSFAoMZGlzcGxheV9uYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSPAoJdHJhbnNwb3J0GAQgASgOMikua3VzaW50YS5pb3QuY29tbW9uLnYxLkNvbm5lY3RvclRyYW5zcG9ydBIQCghlbmRwb2ludBgFIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAYgAygNIoEBChJDb25uZWN0b3JIYW5kc2hha2USNQoEaW5mbxgBIAEoCzInLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5Db25uZWN0b3JJbmZvEjQKDWtub3duX2RldmljZXMYAiADKAsyHS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlImgKDEhhbmRzaGFrZUFjaxIQCghhY2NlcHRlZBgBIAEoCBIOCgZyZWFzb24YAiABKAkSNgoKZ2F0ZXdheV9pZBgDIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCJVChJEZXZpY2VBbm5vdW5jZW1lbnQSLQoGZGV2aWNlGAIgASgLMh0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUoECAEQAlIKZGVzY3JpcHRvciJVCg1EZXZpY2VSZW1vdmFsEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEg4KBnJlYXNvbhgCIAEoCSILCglIZWFydEJlYXQiRwoPU3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkkKEVVuc3Vic2NyaWJlRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIkEKDEdhdGV3YXlFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKcmVxdWVzdF9pZBgDIAEoCSLtAQoWQ29ubmVjdG9yQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMAoMY29tcGxldGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIyCgVlcnJvchgFIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kRXJyb3ISMwoKc2V0dGxlc19ieRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieUoECAMQBCK7BAoOU2Vzc2lvblJlcXVlc3QSEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBJBCgloYW5kc2hha2UYAyABKAsyLC5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuQ29ubmVjdG9ySGFuZHNoYWtlSAASRQoPcHJvcGVydHlfdXBkYXRlGAQgASgLMioua3VzaW50YS5pb3QuZGV2aWNlLnYxLlByb3BlcnR5VXBkYXRlQmF0Y2hIABJIChBkZXZpY2VfYW5ub3VuY2VkGAUgASgLMiwua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkRldmljZUFubm91bmNlbWVudEgAEkEKDmRldmljZV9yZW1vdmVkGAYgASgLMicua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkRldmljZVJlbW92YWxIABJKCg5jb21tYW5kX3Jlc3VsdBgHIAEoCzIwLmt1c2ludGEuaW90LmNvbm5lY3Rvci52MS5Db25uZWN0b3JDb21tYW5kUmVzdWx0SAASOAoJaGVhcnRiZWF0GAggASgLMiMua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLkhlYXJ0QmVhdEgAEkAKDWRldmljZV9ldmVudHMYCSABKAsyJy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlRXZlbnRCYXRjaEgAQgkKB3BheWxvYWQi8wMKD1Nlc3Npb25SZXNwb25zZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEj8KDWhhbmRzaGFrZV9hY2sYAyABKAsyJi5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuSGFuZHNoYWtlQWNrSAASPgoJc3Vic2NyaWJlGAUgASgLMikua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLlN1YnNjcmliZURldmljZUgAEkIKC3Vuc3Vic2NyaWJlGAYgASgLMisua3VzaW50YS5pb3QuY29ubmVjdG9yLnYxLlVuc3Vic2NyaWJlRGV2aWNlSAASNwoFZXJyb3IYByABKAsyJi5rdXNpbnRhLmlvdC5jb25uZWN0b3IudjEuR2F0ZXdheUVycm9ySAASPwoPZXhlY3V0ZV9jb21tYW5kGAggASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUNvbW1hbmRIABJPChdleGVjdXRlX2F0dHJpYnV0ZV93cml0ZRgJIAEoCzIsLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BdHRyaWJ1dGVXcml0ZVJlcXVlc3RIAEIJCgdwYXlsb2FkSgQIBBAFQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_webrtc_v1_command]);
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Describes the message kusinta.iot.connector.v1.ConnectorInfo.
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
|
|
6
6
|
import type { Message } from "@bufbuild/protobuf";
|
|
7
|
+
import type { SetpointAdjustMode } from "./setpoint_mode_pb.js";
|
|
7
8
|
import type { DeviceId } from "../../identity/v1/identity_pb.js";
|
|
8
9
|
import type { Timestamp } from "@bufbuild/protobuf/wkt";
|
|
9
10
|
import type { AttributeRef } from "../../access/v1/acl_pb.js";
|
|
@@ -28,11 +29,11 @@ export declare const file_kusinta_iot_webrtc_v1_command: GenFile;
|
|
|
28
29
|
*/
|
|
29
30
|
export declare type ThermostatSetpointParams = Message<"kusinta.iot.webrtc.v1.ThermostatSetpointParams"> & {
|
|
30
31
|
/**
|
|
31
|
-
*
|
|
32
|
+
* absent = the producer stated no mode
|
|
32
33
|
*
|
|
33
|
-
* @generated from field: optional
|
|
34
|
+
* @generated from field: optional kusinta.iot.webrtc.v1.SetpointAdjustMode mode = 1;
|
|
34
35
|
*/
|
|
35
|
-
mode?:
|
|
36
|
+
mode?: SetpointAdjustMode | undefined;
|
|
36
37
|
|
|
37
38
|
/**
|
|
38
39
|
* centidegrees delta
|
|
@@ -147,9 +148,16 @@ export declare const DoorLockParamsSchema: GenMessage<DoorLockParams>;
|
|
|
147
148
|
*
|
|
148
149
|
* An app MAY send any command; it does not decide whether it is allowed. The gateway
|
|
149
150
|
* authorizes every DeviceCommand against the caller's access.v1.DeviceAcl for the target
|
|
150
|
-
* device before forwarding it to a connector
|
|
151
|
-
*
|
|
152
|
-
*
|
|
151
|
+
* device before forwarding it to a connector: PERMISSION_ACTION_INVOKE must be granted,
|
|
152
|
+
* and allowed_command_refs must reach this (endpoint, cluster_id, matter_command_id).
|
|
153
|
+
*
|
|
154
|
+
* NOT allowed_attribute_refs, and NOT PropertyConstraint. Both name attributes, and a
|
|
155
|
+
* command is not an attribute — the two are numbered independently within a cluster, so an
|
|
156
|
+
* attribute ref cannot name a command at all. A constraint bounds an attribute's value;
|
|
157
|
+
* this message carries command arguments, and ThermostatSetpointParams.amount is a DELTA,
|
|
158
|
+
* which cannot be compared against a bound without first resolving it to an absolute using
|
|
159
|
+
* a base the gateway may not hold. Where a setpoint must be bounded, bound the write:
|
|
160
|
+
* AttributeWriteRequest carries the absolute value a PropertyConstraint can be applied to.
|
|
153
161
|
*
|
|
154
162
|
* A refusal comes back as an ordinary CommandResult with success = false and an error,
|
|
155
163
|
* NOT as a session-level GatewayError: one command being refused says nothing about the
|
|
@@ -8,12 +8,13 @@ import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
|
|
|
8
8
|
import { file_kusinta_iot_device_v1_cluster_state } from "../../device/v1/cluster_state_pb.js";
|
|
9
9
|
import { file_kusinta_iot_device_v1_matter_options } from "../../device/v1/matter_options_pb.js";
|
|
10
10
|
import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
|
|
11
|
+
import { file_kusinta_iot_webrtc_v1_setpoint_mode } from "./setpoint_mode_pb.js";
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Describes the file kusinta/iot/webrtc/v1/command.proto.
|
|
14
15
|
*/
|
|
15
16
|
export const file_kusinta_iot_webrtc_v1_command = /*@__PURE__*/
|
|
16
|
-
fileDesc("
|
|
17
|
+
fileDesc("CiNrdXNpbnRhL2lvdC93ZWJydGMvdjEvY29tbWFuZC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxInwKGFRoZXJtb3N0YXRTZXRwb2ludFBhcmFtcxI8CgRtb2RlGAEgASgOMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldHBvaW50QWRqdXN0TW9kZUgAiAEBEg4KBmFtb3VudBgCIAEoEToJuLUYgQTAtRgAQgcKBV9tb2RlIkYKEkxldmVsQ29udHJvbFBhcmFtcxINCgVsZXZlbBgBIAEoDRIXCg90cmFuc2l0aW9uX3RpbWUYAiABKA06CLi1GAjAtRgAIisKC09uT2ZmUGFyYW1zOgS4tRgGSgQIARACSgQIAhADUgJvblIGdG9nZ2xlIkEKGFdpbmRvd0NvdmVyaW5nTGlmdFBhcmFtcxIaChJsaWZ0X3BlcmNlbnQxMDB0aHMYASABKA06Cbi1GIICwLUYBSI7Cg5Eb29yTG9ja1BhcmFtcxIQCghwaW5fY29kZRgCIAEoCToFuLUYgQJKBAgBEAJSCmxvY2tfc3RhdGUikgUKDURldmljZUNvbW1hbmQSEgoKcmVxdWVzdF9pZBgBIAEoCRI0CglkZXZpY2VfaWQYAiABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIUCgxjb21tYW5kX25hbWUYBCABKAkSEgoKY2x1c3Rlcl9pZBgMIAEoDRIeChFtYXR0ZXJfY29tbWFuZF9pZBgNIAEoDUgBiAEBEhgKC2VuZHBvaW50X2lkGAsgASgNSAKIAQESTgoTdGhlcm1vc3RhdF9zZXRwb2ludBgFIAEoCzIvLmt1c2ludGEuaW90LndlYnJ0Yy52MS5UaGVybW9zdGF0U2V0cG9pbnRQYXJhbXNIABJCCg1sZXZlbF9jb250cm9sGAYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkxldmVsQ29udHJvbFBhcmFtc0gAEjQKBm9uX29mZhgHIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Pbk9mZlBhcmFtc0gAEk8KFHdpbmRvd19jb3ZlcmluZ19saWZ0GAggASgLMi8ua3VzaW50YS5pb3Qud2VicnRjLnYxLldpbmRvd0NvdmVyaW5nTGlmdFBhcmFtc0gAEjoKCWRvb3JfbG9jaxgJIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Eb29yTG9ja1BhcmFtc0gAEhEKB3Jhd190bHYYYyABKAxIAEIMCgpwYXJhbWV0ZXJzQhQKEl9tYXR0ZXJfY29tbWFuZF9pZEIOCgxfZW5kcG9pbnRfaWRKBAgDEARKBAgKEAtSDmNsdXN0ZXJfaWRfaGV4Uhl0aGVybW9zdGF0X3NldHBvaW50X3dyaXRlIlwKDENvbW1hbmRFcnJvchIPCgdtZXNzYWdlGAIgASgJEjUKBGNvZGUYAyABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yQ29kZUoECAEQAiLeAQoNQ29tbWFuZFJlc3VsdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMgoFZXJyb3IYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZEVycm9yEjAKDGNvbXBsZXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoKc2V0dGxlc19ieRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfc2V0dGxlc19ieSLMAQoVQXR0cmlidXRlV3JpdGVSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSNAoJZGV2aWNlX2lkGAIgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSMwoGdGFyZ2V0GAMgASgLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhI0CgV2YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZSq/AgoQQ29tbWFuZEVycm9yQ29kZRIiCh5DT01NQU5EX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIjCh9DT01NQU5EX0VSUk9SX0NPREVfTk9UX0VOVElUTEVEEAESKgomQ09NTUFORF9FUlJPUl9DT0RFX0NPTlNUUkFJTlRfVklPTEFURUQQAhImCiJDT01NQU5EX0VSUk9SX0NPREVfSU5WQUxJRF9DT01NQU5EEAMSIgoeQ09NTUFORF9FUlJPUl9DT0RFX1VOUkVBQ0hBQkxFEAQSHgoaQ09NTUFORF9FUlJPUl9DT0RFX1RJTUVPVVQQBRIpCiVDT01NQU5EX0VSUk9SX0NPREVfUkVKRUNURURfQllfREVWSUNFEAYSHwobQ09NTUFORF9FUlJPUl9DT0RFX0lOVEVSTkFMEAdCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_matter_options, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_webrtc_v1_setpoint_mode]);
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Describes the message kusinta.iot.webrtc.v1.ThermostatSetpointParams.
|
|
@@ -44,11 +44,17 @@ export declare type DeviceStateSnapshot = Message<"kusinta.iot.webrtc.v1.DeviceS
|
|
|
44
44
|
export declare const DeviceStateSnapshotSchema: GenMessage<DeviceStateSnapshot>;
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* One attribute reading streamed to the app as it happens — Matter's Report Data Action,
|
|
48
|
+
* for a single attribute.
|
|
48
49
|
*
|
|
49
|
-
*
|
|
50
|
+
* Was DevicePropertyEvent. Renamed because it carries a device.v1.PropertyUpdate, which is
|
|
51
|
+
* STATE, while device.v1.DeviceEvent carries a journal entry. Two messages with "Event" in
|
|
52
|
+
* the name meaning opposite things is a trap, and this one was never the event: latest
|
|
53
|
+
* wins, order does not matter, and a missed one is corrected by the next.
|
|
54
|
+
*
|
|
55
|
+
* @generated from message kusinta.iot.webrtc.v1.PropertyReport
|
|
50
56
|
*/
|
|
51
|
-
export declare type
|
|
57
|
+
export declare type PropertyReport = Message<"kusinta.iot.webrtc.v1.PropertyReport"> & {
|
|
52
58
|
/**
|
|
53
59
|
* @generated from field: kusinta.iot.device.v1.PropertyUpdate update = 1;
|
|
54
60
|
*/
|
|
@@ -61,10 +67,10 @@ export declare type DevicePropertyEvent = Message<"kusinta.iot.webrtc.v1.DeviceP
|
|
|
61
67
|
};
|
|
62
68
|
|
|
63
69
|
/**
|
|
64
|
-
* Describes the message kusinta.iot.webrtc.v1.
|
|
65
|
-
* Use `create(
|
|
70
|
+
* Describes the message kusinta.iot.webrtc.v1.PropertyReport.
|
|
71
|
+
* Use `create(PropertyReportSchema)` to create a new message.
|
|
66
72
|
*/
|
|
67
|
-
export declare const
|
|
73
|
+
export declare const PropertyReportSchema: GenMessage<PropertyReport>;
|
|
68
74
|
|
|
69
75
|
/**
|
|
70
76
|
* A device appeared while the app was connected — the app leg's counterpart to
|
|
@@ -13,7 +13,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
|
|
|
13
13
|
* Describes the file kusinta/iot/webrtc/v1/device_state.proto.
|
|
14
14
|
*/
|
|
15
15
|
export const file_kusinta_iot_webrtc_v1_device_state = /*@__PURE__*/
|
|
16
|
-
fileDesc("
|
|
16
|
+
fileDesc("CihrdXNpbnRhL2lvdC93ZWJydGMvdjEvZGV2aWNlX3N0YXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEiuwEKE0RldmljZVN0YXRlU25hcHNob3QSLgoHZGV2aWNlcxgBIAMoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2USQAoLcGVybWlzc2lvbnMYAiABKAsyKy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRWZmZWN0aXZlUGVybWlzc2lvbnMSMgoOc25hcHNob3R0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIoEBCg5Qcm9wZXJ0eVJlcG9ydBI1CgZ1cGRhdGUYASABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJvcGVydHlVcGRhdGUSOAoUZ2F0ZXdheV9wcm9jZXNzZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIjwKC0RldmljZUFkZGVkEi0KBmRldmljZRgBIAEoCzIdLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2UiVQoNRGV2aWNlUmVtb3ZlZBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIOCgZyZWFzb24YAiABKAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_device, file_kusinta_iot_device_v1_property_update, file_kusinta_iot_access_v1_acl, file_kusinta_iot_identity_v1_identity]);
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Describes the message kusinta.iot.webrtc.v1.DeviceStateSnapshot.
|
|
@@ -23,10 +23,10 @@ export const DeviceStateSnapshotSchema = /*@__PURE__*/
|
|
|
23
23
|
messageDesc(file_kusinta_iot_webrtc_v1_device_state, 0);
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Describes the message kusinta.iot.webrtc.v1.
|
|
27
|
-
* Use `create(
|
|
26
|
+
* Describes the message kusinta.iot.webrtc.v1.PropertyReport.
|
|
27
|
+
* Use `create(PropertyReportSchema)` to create a new message.
|
|
28
28
|
*/
|
|
29
|
-
export const
|
|
29
|
+
export const PropertyReportSchema = /*@__PURE__*/
|
|
30
30
|
messageDesc(file_kusinta_iot_webrtc_v1_device_state, 1);
|
|
31
31
|
|
|
32
32
|
/**
|
|
@@ -9,7 +9,7 @@ import type { AttributeRef } from "../../access/v1/acl_pb.js";
|
|
|
9
9
|
import type { Space } from "../../space/v1/space_pb.js";
|
|
10
10
|
import type { ManagementAck, ManagementRequest, SpaceTree } from "./management_pb.js";
|
|
11
11
|
import type { Timestamp } from "@bufbuild/protobuf/wkt";
|
|
12
|
-
import type { DeviceAdded,
|
|
12
|
+
import type { DeviceAdded, DeviceRemoved, DeviceStateSnapshot, PropertyReport } from "./device_state_pb.js";
|
|
13
13
|
import type { LivePermissionUpdate } from "./permission_push_pb.js";
|
|
14
14
|
import type { AttributeWriteRequest, CommandResult, DeviceCommand } from "./command_pb.js";
|
|
15
15
|
import type { DeviceEventBatch } from "../../device/v1/device_event_pb.js";
|
|
@@ -352,10 +352,10 @@ export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessa
|
|
|
352
352
|
case: "stateSnapshot";
|
|
353
353
|
} | {
|
|
354
354
|
/**
|
|
355
|
-
* @generated from field: kusinta.iot.webrtc.v1.
|
|
355
|
+
* @generated from field: kusinta.iot.webrtc.v1.PropertyReport property_report = 4;
|
|
356
356
|
*/
|
|
357
|
-
value:
|
|
358
|
-
case: "
|
|
357
|
+
value: PropertyReport;
|
|
358
|
+
case: "propertyReport";
|
|
359
359
|
} | {
|
|
360
360
|
/**
|
|
361
361
|
* @generated from field: kusinta.iot.webrtc.v1.LivePermissionUpdate permission_update = 5;
|
|
@@ -17,7 +17,7 @@ import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb
|
|
|
17
17
|
* Describes the file kusinta/iot/webrtc/v1/envelope.proto.
|
|
18
18
|
*/
|
|
19
19
|
export const file_kusinta_iot_webrtc_v1_envelope = /*@__PURE__*/
|
|
20
|
-
fileDesc("
|
|
20
|
+
fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIoICChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSABCCAoGcmVzdWx0IpUHCg5HYXRld2F5TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEkQKDnN0YXRlX3NuYXBzaG90GAMgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVN0YXRlU25hcHNob3RIABJACg9wcm9wZXJ0eV9yZXBvcnQYBCABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZXBvcnRIABJIChFwZXJtaXNzaW9uX3VwZGF0ZRgFIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaXZlUGVybWlzc2lvblVwZGF0ZUgAEj4KDmNvbW1hbmRfcmVzdWx0GAYgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRSZXN1bHRIABIrCgRwb25nGAggASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBvbmdIABJGChJoYW5kc2hha2VfcmVqZWN0ZWQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuSGFuZHNoYWtlUmVqZWN0ZWRIABI0CgVlcnJvchgKIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JIABJCChBzdWJzY3JpcHRpb25fYWNrGAsgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlN1YnNjcmlwdGlvbkFja0gAEjoKDGRldmljZV9hZGRlZBgMIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VBZGRlZEgAEj4KDmRldmljZV9yZW1vdmVkGA0gASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVJlbW92ZWRIABJEChFtYW5hZ2VtZW50X3Jlc3VsdBgOIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVzdWx0SAASQAoNZGV2aWNlX2V2ZW50cxgQIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VFdmVudEJhdGNoSABCCQoHcGF5bG9hZEoECA8QEEoECAcQCFIWYXR0cmlidXRlX3dyaXRlX3Jlc3VsdFIOcHJvcGVydHlfZXZlbnQixQQKCkFwcE1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgloYW5kc2hha2UYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXBwSGFuZHNoYWtlSAASNwoHY29tbWFuZBgEIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VDb21tYW5kSAASQgoMcmVhZF9yZXF1ZXN0GAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3BlcnR5UmVhZFJlcXVlc3RIABIrCgRwaW5nGAYgASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBpbmdIABI8CglzdWJzY3JpYmUYByABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaWJlRGV2aWNlc0gAEkAKC3Vuc3Vic2NyaWJlGAggASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlVuc3Vic2NyaWJlRGV2aWNlc0gAEj4KCm1hbmFnZW1lbnQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuTWFuYWdlbWVudFJlcXVlc3RIABJHCg9hdHRyaWJ1dGVfd3JpdGUYCiABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXR0cmlidXRlV3JpdGVSZXF1ZXN0SABCCQoHcGF5bG9hZCr2AQoQR2F0ZXdheUVycm9yQ29kZRIiCh5HQVRFV0FZX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIjCh9HQVRFV0FZX0VSUk9SX0NPREVfTk9UX0VOVElUTEVEEAESJgoiR0FURVdBWV9FUlJPUl9DT0RFX0lOVkFMSURfUkVRVUVTVBACEiIKHkdBVEVXQVlfRVJST1JfQ09ERV9VTkFWQUlMQUJMRRADEh8KG0dBVEVXQVlfRVJST1JfQ09ERV9JTlRFUk5BTBAEEiwKKEdBVEVXQVlfRVJST1JfQ09ERV9TRVNTSU9OX0xJTUlUX1JFQUNIRUQQBUICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_space_v1_space, file_kusinta_iot_webrtc_v1_command, file_kusinta_iot_webrtc_v1_device_state, file_kusinta_iot_webrtc_v1_management, file_kusinta_iot_webrtc_v1_permission_push]);
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Describes the message kusinta.iot.webrtc.v1.Ping.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
|
|
2
|
+
// @generated from file kusinta/iot/webrtc/v1/setpoint_mode.proto (package kusinta.iot.webrtc.v1, syntax proto3)
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
|
|
5
|
+
import type { GenEnum, GenFile } from "@bufbuild/protobuf/codegenv2";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Describes the file kusinta/iot/webrtc/v1/setpoint_mode.proto.
|
|
9
|
+
*/
|
|
10
|
+
export declare const file_kusinta_iot_webrtc_v1_setpoint_mode: GenFile;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* SetpointAdjustMode selects which setpoint a thermostat command targets. It is
|
|
14
|
+
* Matter's SetpointRaiseLowerModeEnum (Thermostat cluster 0x0201) and carries Matter's
|
|
15
|
+
* own numbering.
|
|
16
|
+
*
|
|
17
|
+
* A real type rather than a numbering written down in a comment. The mode field on
|
|
18
|
+
* ThermostatSetpointParams was a bare uint32 with this numbering stated beside it, so a
|
|
19
|
+
* consumer carrying forward an older Heat=1/Cool=2/Both=3 convention compiled cleanly and
|
|
20
|
+
* silently reversed which physical behavior a command produced.
|
|
21
|
+
*
|
|
22
|
+
* Zero is a real mode, not a "not set" sentinel — which is why there is no
|
|
23
|
+
* SETPOINT_ADJUST_MODE_UNSPECIFIED, and why every field carrying this value has explicit
|
|
24
|
+
* presence: absent = the producer stated no mode, present = the mode it named, Heat
|
|
25
|
+
* included. This is the same rule properties.proto applies to readings, for the same
|
|
26
|
+
* reason — a bare proto3 scalar makes "meant Heat" and "never set it" identical on the
|
|
27
|
+
* wire. Renumbering to free zero is not available: the wire value IS Matter's value.
|
|
28
|
+
*
|
|
29
|
+
* SetpointAdjustMode is NOT ThermostatProperties.system_mode. system_mode is Matter's
|
|
30
|
+
* SystemModeEnum (Off=0, Auto=1, Cool=3, Heat=4), a different enum over a different set
|
|
31
|
+
* of concepts. Cool is 1 here and 3 there; the two must never be substituted for each
|
|
32
|
+
* other or read through the same mapping table.
|
|
33
|
+
*
|
|
34
|
+
* @generated from enum kusinta.iot.webrtc.v1.SetpointAdjustMode
|
|
35
|
+
*/
|
|
36
|
+
export enum SetpointAdjustMode {
|
|
37
|
+
/**
|
|
38
|
+
* Targets ThermostatProperties.occupied_heating_setpoint.
|
|
39
|
+
*
|
|
40
|
+
* @generated from enum value: SETPOINT_ADJUST_MODE_HEAT = 0;
|
|
41
|
+
*/
|
|
42
|
+
HEAT = 0,
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Targets ThermostatProperties.occupied_cooling_setpoint.
|
|
46
|
+
*
|
|
47
|
+
* @generated from enum value: SETPOINT_ADJUST_MODE_COOL = 1;
|
|
48
|
+
*/
|
|
49
|
+
COOL = 1,
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Targets both setpoints.
|
|
53
|
+
*
|
|
54
|
+
* @generated from enum value: SETPOINT_ADJUST_MODE_BOTH = 2;
|
|
55
|
+
*/
|
|
56
|
+
BOTH = 2,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Describes the enum kusinta.iot.webrtc.v1.SetpointAdjustMode.
|
|
61
|
+
*/
|
|
62
|
+
export declare const SetpointAdjustModeSchema: GenEnum<SetpointAdjustMode>;
|
|
63
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
|
|
2
|
+
// @generated from file kusinta/iot/webrtc/v1/setpoint_mode.proto (package kusinta.iot.webrtc.v1, syntax proto3)
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
|
|
5
|
+
import { enumDesc, fileDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Describes the file kusinta/iot/webrtc/v1/setpoint_mode.proto.
|
|
9
|
+
*/
|
|
10
|
+
export const file_kusinta_iot_webrtc_v1_setpoint_mode = /*@__PURE__*/
|
|
11
|
+
fileDesc("CilrdXNpbnRhL2lvdC93ZWJydGMvdjEvc2V0cG9pbnRfbW9kZS5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxKnEKElNldHBvaW50QWRqdXN0TW9kZRIdChlTRVRQT0lOVF9BREpVU1RfTU9ERV9IRUFUEAASHQoZU0VUUE9JTlRfQURKVVNUX01PREVfQ09PTBABEh0KGVNFVFBPSU5UX0FESlVTVF9NT0RFX0JPVEgQAkICSAFiBnByb3RvMw");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Describes the enum kusinta.iot.webrtc.v1.SetpointAdjustMode.
|
|
15
|
+
*/
|
|
16
|
+
export const SetpointAdjustModeSchema = /*@__PURE__*/
|
|
17
|
+
enumDesc(file_kusinta_iot_webrtc_v1_setpoint_mode, 0);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* SetpointAdjustMode selects which setpoint a thermostat command targets. It is
|
|
21
|
+
* Matter's SetpointRaiseLowerModeEnum (Thermostat cluster 0x0201) and carries Matter's
|
|
22
|
+
* own numbering.
|
|
23
|
+
*
|
|
24
|
+
* A real type rather than a numbering written down in a comment. The mode field on
|
|
25
|
+
* ThermostatSetpointParams was a bare uint32 with this numbering stated beside it, so a
|
|
26
|
+
* consumer carrying forward an older Heat=1/Cool=2/Both=3 convention compiled cleanly and
|
|
27
|
+
* silently reversed which physical behavior a command produced.
|
|
28
|
+
*
|
|
29
|
+
* Zero is a real mode, not a "not set" sentinel — which is why there is no
|
|
30
|
+
* SETPOINT_ADJUST_MODE_UNSPECIFIED, and why every field carrying this value has explicit
|
|
31
|
+
* presence: absent = the producer stated no mode, present = the mode it named, Heat
|
|
32
|
+
* included. This is the same rule properties.proto applies to readings, for the same
|
|
33
|
+
* reason — a bare proto3 scalar makes "meant Heat" and "never set it" identical on the
|
|
34
|
+
* wire. Renumbering to free zero is not available: the wire value IS Matter's value.
|
|
35
|
+
*
|
|
36
|
+
* SetpointAdjustMode is NOT ThermostatProperties.system_mode. system_mode is Matter's
|
|
37
|
+
* SystemModeEnum (Off=0, Auto=1, Cool=3, Heat=4), a different enum over a different set
|
|
38
|
+
* of concepts. Cool is 1 here and 3 there; the two must never be substituted for each
|
|
39
|
+
* other or read through the same mapping table.
|
|
40
|
+
*
|
|
41
|
+
* @generated from enum kusinta.iot.webrtc.v1.SetpointAdjustMode
|
|
42
|
+
*/
|
|
43
|
+
export const SetpointAdjustMode = /*@__PURE__*/
|
|
44
|
+
tsEnum(SetpointAdjustModeSchema);
|
|
45
|
+
|