@kusinta/iot-schema 0.2.0-beta.14 → 0.2.0-beta.16

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.14",
3
+ "version": "0.2.0-beta.16",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -26,6 +26,7 @@
26
26
  "./access": "./src/kusinta/iot/access/v1/acl_pb.js",
27
27
  "./access/roles": "./src/kusinta/iot/access/v1/roles_pb.js",
28
28
  "./link": "./src/kusinta/iot/link/v1/link_pb.js",
29
+ "./climate": "./src/kusinta/iot/climate/v1/climate_pb.js",
29
30
  "./connector": "./src/kusinta/iot/connector/v1/connector_pb.js",
30
31
  "./connector/service": "./src/kusinta/iot/connector/v1/connector_service_pb.js",
31
32
  "./webrtc": "./src/kusinta/iot/webrtc/v1/envelope_pb.js",
@@ -0,0 +1,381 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/climate/v1/climate.proto (package kusinta.iot.climate.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
+ import type { Message } from "@bufbuild/protobuf";
7
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
8
+ import type { DeviceId, SpaceId, UserId } from "../../identity/v1/identity_pb.js";
9
+
10
+ /**
11
+ * Describes the file kusinta/iot/climate/v1/climate.proto.
12
+ */
13
+ export declare const file_kusinta_iot_climate_v1_climate: GenFile;
14
+
15
+ /**
16
+ * Who or what last set a room's target, and when.
17
+ *
18
+ * Shown beside the target, because under "last change wins" a target that moved on its
19
+ * own looks like a fault unless the reader can see that somebody turned a radiator by
20
+ * hand ten minutes ago.
21
+ *
22
+ * @generated from message kusinta.iot.climate.v1.TargetChange
23
+ */
24
+ export declare type TargetChange = Message<"kusinta.iot.climate.v1.TargetChange"> & {
25
+ /**
26
+ * @generated from field: google.protobuf.Timestamp at = 1;
27
+ */
28
+ at?: Timestamp | undefined;
29
+
30
+ /**
31
+ * @generated from oneof kusinta.iot.climate.v1.TargetChange.by
32
+ */
33
+ by: {
34
+ /**
35
+ * Set in the app, by this user.
36
+ *
37
+ * @generated from field: kusinta.iot.identity.v1.UserId user = 2;
38
+ */
39
+ value: UserId;
40
+ case: "user";
41
+ } | {
42
+ /**
43
+ * Turned by hand at this device: a valve's knob or a wall thermostat's dial, as the
44
+ * device reported it (Matter Thermostat SetpointChangeSource = Manual). A change the
45
+ * device made on its own — window-open, frost protection, its own schedule — is never
46
+ * adopted and never appears here.
47
+ *
48
+ * @generated from field: kusinta.iot.identity.v1.DeviceId device = 3;
49
+ */
50
+ value: DeviceId;
51
+ case: "device";
52
+ } | { case: undefined; value?: undefined };
53
+ };
54
+
55
+ /**
56
+ * Describes the message kusinta.iot.climate.v1.TargetChange.
57
+ * Use `create(TargetChangeSchema)` to create a new message.
58
+ */
59
+ export declare const TargetChangeSchema: GenMessage<TargetChange>;
60
+
61
+ /**
62
+ * The climate of one room.
63
+ *
64
+ * Apply as an upsert keyed on space_id: the same room is sent again whenever any of this
65
+ * moves.
66
+ *
67
+ * @generated from message kusinta.iot.climate.v1.RoomClimate
68
+ */
69
+ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate"> & {
70
+ /**
71
+ * A Space of SPACE_TYPE_ROOM.
72
+ *
73
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
74
+ */
75
+ spaceId?: SpaceId | undefined;
76
+
77
+ /**
78
+ * The temperature the room is to be held at, in centidegrees. Unset: nobody has set
79
+ * one. Always within [min_centidegrees, max_centidegrees] where those are set.
80
+ *
81
+ * @generated from field: optional sint32 target_centidegrees = 2;
82
+ */
83
+ targetCentidegrees?: number | undefined;
84
+
85
+ /**
86
+ * Who or what set target_centidegrees. Unset while the target is.
87
+ *
88
+ * @generated from field: kusinta.iot.climate.v1.TargetChange target_change = 3;
89
+ */
90
+ targetChange?: TargetChange | undefined;
91
+
92
+ /**
93
+ * What the valves are actually being held at, in centidegrees. Equal to the target
94
+ * unless a ClimateMode on an enclosing space sets the room back — and then the room's
95
+ * own target again if somebody changed this room during the mode (see
96
+ * overrides_mode). Unset while nothing is being held.
97
+ *
98
+ * @generated from field: optional sint32 effective_target_centidegrees = 4;
99
+ */
100
+ effectiveTargetCentidegrees?: number | undefined;
101
+
102
+ /**
103
+ * Set when somebody changed this room while a ClimateMode was on: the room keeps its
104
+ * own target until the mode ends, while the rest of the apartment stays set back.
105
+ *
106
+ * @generated from field: bool overrides_mode = 5;
107
+ */
108
+ overridesMode: boolean;
109
+
110
+ /**
111
+ * The space whose ClimateMode applies to this room, if one does — set back or,
112
+ * with overrides_mode, overridden. Unset when no mode applies.
113
+ *
114
+ * @generated from field: kusinta.iot.identity.v1.SpaceId mode_space_id = 13;
115
+ */
116
+ modeSpaceId?: SpaceId | undefined;
117
+
118
+ /**
119
+ * The owner's limits, in centidegrees. The gateway writes them to every device in the
120
+ * room (Matter Min/MaxHeatSetpointLimit), so a knob stops at them physically, and
121
+ * clamps every target — from the app, a knob or a mode — to them. The minimum is also
122
+ * the floor under a mode's setback.
123
+ *
124
+ * @generated from field: optional sint32 min_centidegrees = 6;
125
+ */
126
+ minCentidegrees?: number | undefined;
127
+
128
+ /**
129
+ * @generated from field: optional sint32 max_centidegrees = 7;
130
+ */
131
+ maxCentidegrees?: number | undefined;
132
+
133
+ /**
134
+ * The sensors the room measures with, in order: the first is used, each later one
135
+ * takes over while those before it are quiet. Only devices filed in this room.
136
+ *
137
+ * By default every temperature sensor filed in the room, in the order it was filed, so
138
+ * a sensor filed later joins at the end without anyone configuring anything. An owner
139
+ * can set the order explicitly (see sensors_configured). Empty: the room has no
140
+ * temperature sensor, and its valves regulate on their own probes (NO_SENSOR).
141
+ *
142
+ * @generated from field: repeated kusinta.iot.identity.v1.DeviceId sensor_ids = 8;
143
+ */
144
+ sensorIds: DeviceId[];
145
+
146
+ /**
147
+ * Whether sensor_ids is an order an owner chose, rather than the default of filing
148
+ * order. A sensor filed into a room with a chosen order is not added to it.
149
+ *
150
+ * @generated from field: bool sensors_configured = 14;
151
+ */
152
+ sensorsConfigured: boolean;
153
+
154
+ /**
155
+ * The reading steering the room now, in centidegrees, and which sensor it came from.
156
+ * measured_by unset while the valves are on their own probes.
157
+ *
158
+ * @generated from field: optional sint32 measured_centidegrees = 9;
159
+ */
160
+ measuredCentidegrees?: number | undefined;
161
+
162
+ /**
163
+ * @generated from field: kusinta.iot.identity.v1.DeviceId measured_by = 10;
164
+ */
165
+ measuredBy?: DeviceId | undefined;
166
+
167
+ /**
168
+ * @generated from field: kusinta.iot.climate.v1.RoomClimateCondition condition = 11;
169
+ */
170
+ condition: RoomClimateCondition;
171
+
172
+ /**
173
+ * Whether the controls on this room's devices are locked. While unlocked, a change made
174
+ * by hand at a device becomes the room's target. Locked, the gateway sets the devices'
175
+ * own lock (Matter Thermostat User Interface Configuration KeypadLockout), so the
176
+ * refusal happens at the device rather than being undone later.
177
+ *
178
+ * Stated as the lock rather than as a permission so that the proto3 default — false,
179
+ * unlocked — is the intended default: a room nobody has configured takes changes at its
180
+ * devices, as a room in an apartment always should. Elsewhere locking is the owner's
181
+ * choice.
182
+ *
183
+ * @generated from field: bool lock_device_controls = 12;
184
+ */
185
+ lockDeviceControls: boolean;
186
+ };
187
+
188
+ /**
189
+ * Describes the message kusinta.iot.climate.v1.RoomClimate.
190
+ * Use `create(RoomClimateSchema)` to create a new message.
191
+ */
192
+ export declare const RoomClimateSchema: GenMessage<RoomClimate>;
193
+
194
+ /**
195
+ * A mode set on an apartment — or, for rooms that are not in one, on their floor or
196
+ * common area. While it is on it sets back every room below that space, except that a
197
+ * room inside an apartment follows only its apartment's mode: a mode on a floor does not
198
+ * reach into the flats on it. Where more than one mode could apply, the nearest enclosing
199
+ * space's wins. A room somebody changes during the mode keeps its own target
200
+ * (RoomClimate.overrides_mode) until the mode ends.
201
+ *
202
+ * @generated from message kusinta.iot.climate.v1.ClimateMode
203
+ */
204
+ export declare type ClimateMode = Message<"kusinta.iot.climate.v1.ClimateMode"> & {
205
+ /**
206
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
207
+ */
208
+ spaceId?: SpaceId | undefined;
209
+
210
+ /**
211
+ * @generated from field: kusinta.iot.climate.v1.ClimateModeKind kind = 2;
212
+ */
213
+ kind: ClimateModeKind;
214
+
215
+ /**
216
+ * The temperature every room is set back to, in centidegrees. Required while a mode is
217
+ * on — a mode with nothing to set back to is refused, not defaulted. Clamped by each
218
+ * room's min_centidegrees, which is the frost floor.
219
+ *
220
+ * @generated from field: optional sint32 setback_centidegrees = 3;
221
+ */
222
+ setbackCentidegrees?: number | undefined;
223
+
224
+ /**
225
+ * HOLIDAY: when the setback begins and when the rooms are to be back at their own
226
+ * targets. AWAY: starts_at is when it was switched on; ends_at is unset.
227
+ *
228
+ * @generated from field: google.protobuf.Timestamp starts_at = 4;
229
+ */
230
+ startsAt?: Timestamp | undefined;
231
+
232
+ /**
233
+ * @generated from field: google.protobuf.Timestamp ends_at = 5;
234
+ */
235
+ endsAt?: Timestamp | undefined;
236
+
237
+ /**
238
+ * Who switched it on.
239
+ *
240
+ * @generated from field: kusinta.iot.identity.v1.UserId set_by = 6;
241
+ */
242
+ setBy?: UserId | undefined;
243
+ };
244
+
245
+ /**
246
+ * Describes the message kusinta.iot.climate.v1.ClimateMode.
247
+ * Use `create(ClimateModeSchema)` to create a new message.
248
+ */
249
+ export declare const ClimateModeSchema: GenMessage<ClimateMode>;
250
+
251
+ /**
252
+ * Every room climate and mode a caller may see, in reply to a listing.
253
+ *
254
+ * @generated from message kusinta.iot.climate.v1.RoomClimateList
255
+ */
256
+ export declare type RoomClimateList = Message<"kusinta.iot.climate.v1.RoomClimateList"> & {
257
+ /**
258
+ * @generated from field: repeated kusinta.iot.climate.v1.RoomClimate rooms = 1;
259
+ */
260
+ rooms: RoomClimate[];
261
+
262
+ /**
263
+ * @generated from field: repeated kusinta.iot.climate.v1.ClimateMode modes = 2;
264
+ */
265
+ modes: ClimateMode[];
266
+ };
267
+
268
+ /**
269
+ * Describes the message kusinta.iot.climate.v1.RoomClimateList.
270
+ * Use `create(RoomClimateListSchema)` to create a new message.
271
+ */
272
+ export declare const RoomClimateListSchema: GenMessage<RoomClimateList>;
273
+
274
+ /**
275
+ * What a room is doing right now, in one word. Details live in the fields of
276
+ * RoomClimate; this is what a list row shows.
277
+ *
278
+ * Where several hold at once the room reports the first that applies, in this order:
279
+ * NO_TARGET, NO_HEATING, WINDOW_OPEN, HEATING_UNREACHABLE, SENSOR_LOST, NO_SENSOR,
280
+ * HOLDING — the one that most changes what a person should expect of the room.
281
+ *
282
+ * @generated from enum kusinta.iot.climate.v1.RoomClimateCondition
283
+ */
284
+ export enum RoomClimateCondition {
285
+ /**
286
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_UNSPECIFIED = 0;
287
+ */
288
+ UNSPECIFIED = 0,
289
+
290
+ /**
291
+ * Being held at its effective target from a sensor's reading.
292
+ *
293
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_HOLDING = 1;
294
+ */
295
+ HOLDING = 1,
296
+
297
+ /**
298
+ * Nobody has set a target yet. Not a fault: a room that was just created.
299
+ *
300
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_NO_TARGET = 2;
301
+ */
302
+ NO_TARGET = 2,
303
+
304
+ /**
305
+ * Every sensor the room uses has gone quiet. The valves regulate on their own probes
306
+ * towards the target meanwhile — worse comfort, never a frozen reading.
307
+ *
308
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_SENSOR_LOST = 3;
309
+ */
310
+ SENSOR_LOST = 3,
311
+
312
+ /**
313
+ * A window in the room is open, so heating is paused.
314
+ *
315
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_WINDOW_OPEN = 4;
316
+ */
317
+ WINDOW_OPEN = 4,
318
+
319
+ /**
320
+ * The room has a target but nothing in it can heat.
321
+ *
322
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_NO_HEATING = 5;
323
+ */
324
+ NO_HEATING = 5,
325
+
326
+ /**
327
+ * Every heating device in the room has gone quiet, so nothing is being held however
328
+ * the target is set.
329
+ *
330
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_HEATING_UNREACHABLE = 6;
331
+ */
332
+ HEATING_UNREACHABLE = 6,
333
+
334
+ /**
335
+ * The room has no temperature sensor, so its valves regulate on their own probes
336
+ * towards the target. Not a fault; a room can be set up that way.
337
+ *
338
+ * @generated from enum value: ROOM_CLIMATE_CONDITION_NO_SENSOR = 7;
339
+ */
340
+ NO_SENSOR = 7,
341
+ }
342
+
343
+ /**
344
+ * Describes the enum kusinta.iot.climate.v1.RoomClimateCondition.
345
+ */
346
+ export declare const RoomClimateConditionSchema: GenEnum<RoomClimateCondition>;
347
+
348
+ /**
349
+ * A setback that applies to every room in a space while it is on.
350
+ *
351
+ * @generated from enum kusinta.iot.climate.v1.ClimateModeKind
352
+ */
353
+ export enum ClimateModeKind {
354
+ /**
355
+ * No mode: every room at its own target.
356
+ *
357
+ * @generated from enum value: CLIMATE_MODE_KIND_UNSPECIFIED = 0;
358
+ */
359
+ UNSPECIFIED = 0,
360
+
361
+ /**
362
+ * Every room to the setback until the mode is switched off.
363
+ *
364
+ * @generated from enum value: CLIMATE_MODE_KIND_AWAY = 1;
365
+ */
366
+ AWAY = 1,
367
+
368
+ /**
369
+ * Every room to the setback between starts_at and ends_at, then back to normal on its
370
+ * own — timed so the rooms are warm again at ends_at, not starting to heat then.
371
+ *
372
+ * @generated from enum value: CLIMATE_MODE_KIND_HOLIDAY = 2;
373
+ */
374
+ HOLIDAY = 2,
375
+ }
376
+
377
+ /**
378
+ * Describes the enum kusinta.iot.climate.v1.ClimateModeKind.
379
+ */
380
+ export declare const ClimateModeKindSchema: GenEnum<ClimateModeKind>;
381
+
@@ -0,0 +1,75 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/climate/v1/climate.proto (package kusinta.iot.climate.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
+ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
+ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
8
+
9
+ /**
10
+ * Describes the file kusinta/iot/climate/v1/climate.proto.
11
+ */
12
+ export const file_kusinta_iot_climate_v1_climate = /*@__PURE__*/
13
+ fileDesc("CiRrdXNpbnRhL2lvdC9jbGltYXRlL3YxL2NsaW1hdGUucHJvdG8SFmt1c2ludGEuaW90LmNsaW1hdGUudjEiogEKDFRhcmdldENoYW5nZRImCgJhdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoEdXNlchgCIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZEgAEjMKBmRldmljZRgDIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkSABCBAoCYnki5wUKC1Jvb21DbGltYXRlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIgChN0YXJnZXRfY2VudGlkZWdyZWVzGAIgASgRSACIAQESOwoNdGFyZ2V0X2NoYW5nZRgDIAEoCzIkLmt1c2ludGEuaW90LmNsaW1hdGUudjEuVGFyZ2V0Q2hhbmdlEioKHWVmZmVjdGl2ZV90YXJnZXRfY2VudGlkZWdyZWVzGAQgASgRSAGIAQESFgoOb3ZlcnJpZGVzX21vZGUYBSABKAgSNwoNbW9kZV9zcGFjZV9pZBgNIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSHQoQbWluX2NlbnRpZGVncmVlcxgGIAEoEUgCiAEBEh0KEG1heF9jZW50aWRlZ3JlZXMYByABKBFIA4gBARI1CgpzZW5zb3JfaWRzGAggAygLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSGgoSc2Vuc29yc19jb25maWd1cmVkGA4gASgIEiIKFW1lYXN1cmVkX2NlbnRpZGVncmVlcxgJIAEoEUgEiAEBEjYKC21lYXN1cmVkX2J5GAogASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSPwoJY29uZGl0aW9uGAsgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZUNvbmRpdGlvbhIcChRsb2NrX2RldmljZV9jb250cm9scxgMIAEoCEIWChRfdGFyZ2V0X2NlbnRpZGVncmVlc0IgCh5fZWZmZWN0aXZlX3RhcmdldF9jZW50aWRlZ3JlZXNCEwoRX21pbl9jZW50aWRlZ3JlZXNCEwoRX21heF9jZW50aWRlZ3JlZXNCGAoWX21lYXN1cmVkX2NlbnRpZGVncmVlcyLBAgoLQ2xpbWF0ZU1vZGUSMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjUKBGtpbmQYAiABKA4yJy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkNsaW1hdGVNb2RlS2luZBIhChRzZXRiYWNrX2NlbnRpZGVncmVlcxgDIAEoEUgAiAEBEi0KCXN0YXJ0c19hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKwoHZW5kc19hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoGc2V0X2J5GAYgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkQhcKFV9zZXRiYWNrX2NlbnRpZGVncmVlcyJ5Cg9Sb29tQ2xpbWF0ZUxpc3QSMgoFcm9vbXMYASADKAsyIy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLlJvb21DbGltYXRlEjIKBW1vZGVzGAIgAygLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZSrVAgoUUm9vbUNsaW1hdGVDb25kaXRpb24SJgoiUk9PTV9DTElNQVRFX0NPTkRJVElPTl9VTlNQRUNJRklFRBAAEiIKHlJPT01fQ0xJTUFURV9DT05ESVRJT05fSE9MRElORxABEiQKIFJPT01fQ0xJTUFURV9DT05ESVRJT05fTk9fVEFSR0VUEAISJgoiUk9PTV9DTElNQVRFX0NPTkRJVElPTl9TRU5TT1JfTE9TVBADEiYKIlJPT01fQ0xJTUFURV9DT05ESVRJT05fV0lORE9XX09QRU4QBBIlCiFST09NX0NMSU1BVEVfQ09ORElUSU9OX05PX0hFQVRJTkcQBRIuCipST09NX0NMSU1BVEVfQ09ORElUSU9OX0hFQVRJTkdfVU5SRUFDSEFCTEUQBhIkCiBST09NX0NMSU1BVEVfQ09ORElUSU9OX05PX1NFTlNPUhAHKm8KD0NsaW1hdGVNb2RlS2luZBIhCh1DTElNQVRFX01PREVfS0lORF9VTlNQRUNJRklFRBAAEhoKFkNMSU1BVEVfTU9ERV9LSU5EX0FXQVkQARIdChlDTElNQVRFX01PREVfS0lORF9IT0xJREFZEAJCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_identity_v1_identity]);
14
+
15
+ /**
16
+ * Describes the message kusinta.iot.climate.v1.TargetChange.
17
+ * Use `create(TargetChangeSchema)` to create a new message.
18
+ */
19
+ export const TargetChangeSchema = /*@__PURE__*/
20
+ messageDesc(file_kusinta_iot_climate_v1_climate, 0);
21
+
22
+ /**
23
+ * Describes the message kusinta.iot.climate.v1.RoomClimate.
24
+ * Use `create(RoomClimateSchema)` to create a new message.
25
+ */
26
+ export const RoomClimateSchema = /*@__PURE__*/
27
+ messageDesc(file_kusinta_iot_climate_v1_climate, 1);
28
+
29
+ /**
30
+ * Describes the message kusinta.iot.climate.v1.ClimateMode.
31
+ * Use `create(ClimateModeSchema)` to create a new message.
32
+ */
33
+ export const ClimateModeSchema = /*@__PURE__*/
34
+ messageDesc(file_kusinta_iot_climate_v1_climate, 2);
35
+
36
+ /**
37
+ * Describes the message kusinta.iot.climate.v1.RoomClimateList.
38
+ * Use `create(RoomClimateListSchema)` to create a new message.
39
+ */
40
+ export const RoomClimateListSchema = /*@__PURE__*/
41
+ messageDesc(file_kusinta_iot_climate_v1_climate, 3);
42
+
43
+ /**
44
+ * Describes the enum kusinta.iot.climate.v1.RoomClimateCondition.
45
+ */
46
+ export const RoomClimateConditionSchema = /*@__PURE__*/
47
+ enumDesc(file_kusinta_iot_climate_v1_climate, 0);
48
+
49
+ /**
50
+ * What a room is doing right now, in one word. Details live in the fields of
51
+ * RoomClimate; this is what a list row shows.
52
+ *
53
+ * Where several hold at once the room reports the first that applies, in this order:
54
+ * NO_TARGET, NO_HEATING, WINDOW_OPEN, HEATING_UNREACHABLE, SENSOR_LOST, NO_SENSOR,
55
+ * HOLDING — the one that most changes what a person should expect of the room.
56
+ *
57
+ * @generated from enum kusinta.iot.climate.v1.RoomClimateCondition
58
+ */
59
+ export const RoomClimateCondition = /*@__PURE__*/
60
+ tsEnum(RoomClimateConditionSchema);
61
+
62
+ /**
63
+ * Describes the enum kusinta.iot.climate.v1.ClimateModeKind.
64
+ */
65
+ export const ClimateModeKindSchema = /*@__PURE__*/
66
+ enumDesc(file_kusinta_iot_climate_v1_climate, 1);
67
+
68
+ /**
69
+ * A setback that applies to every room in a space while it is on.
70
+ *
71
+ * @generated from enum kusinta.iot.climate.v1.ClimateModeKind
72
+ */
73
+ export const ClimateModeKind = /*@__PURE__*/
74
+ tsEnum(ClimateModeKindSchema);
75
+
@@ -253,6 +253,25 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
253
253
  * @generated from field: repeated uint32 attribute_ids = 6;
254
254
  */
255
255
  attributeIds: number[];
256
+
257
+ /**
258
+ * The step each writable attribute is set in, keyed by attribute id, in the attribute's
259
+ * own wire unit: 50 on OccupiedHeatingSetpoint is a half degree, since the setpoint is
260
+ * carried in centidegrees.
261
+ *
262
+ * Matter defines no granularity for a setpoint, and devices differ by a factor of ten —
263
+ * one valve holds tenths, another half degrees, another whole degrees. A consumer that
264
+ * guesses offers steps the device silently rounds away, and one that compares a written
265
+ * value with the device's report on the wrong grid never sees the two agree. A value
266
+ * written on this step is one the device holds as written.
267
+ *
268
+ * Stated by the producer at announcement, like attribute_ids, and the same rule
269
+ * applies: an absent key is "not stated", never a step of zero, and a consumer falls
270
+ * back to its own default. A value of 0 means nothing and is treated as absent.
271
+ *
272
+ * @generated from field: map<uint32, uint32> attribute_steps = 7;
273
+ */
274
+ attributeSteps: { [key: number]: number };
256
275
  };
257
276
 
258
277
  /**
@@ -8,7 +8,7 @@ import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
8
8
  * Describes the file kusinta/iot/device/v1/cluster_state.proto.
9
9
  */
10
10
  export const file_kusinta_iot_device_v1_cluster_state = /*@__PURE__*/
11
- fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi8AEKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDUITChFfY2x1c3Rlcl9yZXZpc2lvbkIOCgxfZmVhdHVyZV9tYXBCAkgBYgZwcm90bzM");
11
+ fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi+QIKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDRJQCg9hdHRyaWJ1dGVfc3RlcHMYByADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZVN0ZXBzRW50cnkaNQoTQXR0cmlidXRlU3RlcHNFbnRyeRILCgNrZXkYASABKA0SDQoFdmFsdWUYAiABKA06AjgBQhMKEV9jbHVzdGVyX3JldmlzaW9uQg4KDF9mZWF0dXJlX21hcEICSAFiBnByb3RvMw");
12
12
 
13
13
  /**
14
14
  * Describes the message kusinta.iot.device.v1.NullValue.
@@ -70,8 +70,10 @@ export declare type ClimateLeadSettings = Message<"kusinta.iot.link.v1.ClimateLe
70
70
  * one radiator is the ordinary case, and each of its links carries this
71
71
  * number separately. An interface offering "the temperature in here" is
72
72
  * therefore setting several links at once and is responsible for keeping them
73
- * equal; nothing on this wire enforces it. A single target per room needs a
74
- * room to hang it on, which is a larger idea than a link.
73
+ * equal; nothing on this wire enforces it. A single target per room is
74
+ * climate.v1.RoomClimate: a person sets the room's target there, and the
75
+ * gateway keeps the links it uses underneath in step. New interfaces set
76
+ * rooms, not this.
75
77
  *
76
78
  * One target, not one per heating and cooling mode: this addresses a valve
77
79
  * that only heats. A device that can do both would need the setpoint's mode
@@ -9,6 +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 { DeviceLink, DeviceLinkList } from "../../link/v1/link_pb.js";
12
+ import type { ClimateMode, RoomClimate, RoomClimateList } from "../../climate/v1/climate_pb.js";
12
13
  import type { PairingErrorDetail, PairingWindow } from "../../common/v1/pairing_pb.js";
13
14
  import type { ConnectorKind, DeviceOwnershipType } from "../../common/v1/types_pb.js";
14
15
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
@@ -327,6 +328,14 @@ export declare type ManagementResult = Message<"kusinta.iot.webrtc.v1.Management
327
328
  */
328
329
  value: DeviceLinkList;
329
330
  case: "links";
331
+ } | {
332
+ /**
333
+ * list_room_climates
334
+ *
335
+ * @generated from field: kusinta.iot.climate.v1.RoomClimateList room_climates = 7;
336
+ */
337
+ value: RoomClimateList;
338
+ case: "roomClimates";
330
339
  } | { case: undefined; value?: undefined };
331
340
  };
332
341
 
@@ -632,6 +641,51 @@ export declare type ConnectorsAnnounced = Message<"kusinta.iot.webrtc.v1.Connect
632
641
  */
633
642
  export declare const ConnectorsAnnouncedSchema: GenMessage<ConnectorsAnnounced>;
634
643
 
644
+ /**
645
+ * A room's climate changed, gateway → app: its target, what set it, what it is being
646
+ * held at, its condition. Apply as an upsert keyed on room.space_id. Sent only for rooms
647
+ * the recipient may see, and whenever any field moves — a knob turned by hand shows up
648
+ * here without the app asking.
649
+ *
650
+ * @generated from message kusinta.iot.webrtc.v1.RoomClimateChanged
651
+ */
652
+ export declare type RoomClimateChanged = Message<"kusinta.iot.webrtc.v1.RoomClimateChanged"> & {
653
+ /**
654
+ * @generated from field: kusinta.iot.climate.v1.RoomClimate room = 1;
655
+ */
656
+ room?: RoomClimate | undefined;
657
+ };
658
+
659
+ /**
660
+ * Describes the message kusinta.iot.webrtc.v1.RoomClimateChanged.
661
+ * Use `create(RoomClimateChangedSchema)` to create a new message.
662
+ */
663
+ export declare const RoomClimateChangedSchema: GenMessage<RoomClimateChanged>;
664
+
665
+ /**
666
+ * A mode on a space was switched on, changed or ended, gateway → app. `ended` rather than
667
+ * kind UNSPECIFIED, so an app can still name the mode that finished.
668
+ *
669
+ * @generated from message kusinta.iot.webrtc.v1.ClimateModeChanged
670
+ */
671
+ export declare type ClimateModeChanged = Message<"kusinta.iot.webrtc.v1.ClimateModeChanged"> & {
672
+ /**
673
+ * @generated from field: kusinta.iot.climate.v1.ClimateMode mode = 1;
674
+ */
675
+ mode?: ClimateMode | undefined;
676
+
677
+ /**
678
+ * @generated from field: bool ended = 2;
679
+ */
680
+ ended: boolean;
681
+ };
682
+
683
+ /**
684
+ * Describes the message kusinta.iot.webrtc.v1.ClimateModeChanged.
685
+ * Use `create(ClimateModeChangedSchema)` to create a new message.
686
+ */
687
+ export declare const ClimateModeChangedSchema: GenMessage<ClimateModeChanged>;
688
+
635
689
  /**
636
690
  * @generated from message kusinta.iot.webrtc.v1.GatewayMessage
637
691
  */
@@ -750,6 +804,18 @@ export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessa
750
804
  */
751
805
  value: ConnectorsAnnounced;
752
806
  case: "connectorsAnnounced";
807
+ } | {
808
+ /**
809
+ * @generated from field: kusinta.iot.webrtc.v1.RoomClimateChanged room_climate_changed = 21;
810
+ */
811
+ value: RoomClimateChanged;
812
+ case: "roomClimateChanged";
813
+ } | {
814
+ /**
815
+ * @generated from field: kusinta.iot.webrtc.v1.ClimateModeChanged climate_mode_changed = 22;
816
+ */
817
+ value: ClimateModeChanged;
818
+ case: "climateModeChanged";
753
819
  } | { case: undefined; value?: undefined };
754
820
  };
755
821
 
@@ -5,6 +5,7 @@
5
5
  import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
7
  import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
8
+ import { file_kusinta_iot_climate_v1_climate } from "../../climate/v1/climate_pb.js";
8
9
  import { file_kusinta_iot_common_v1_pairing } from "../../common/v1/pairing_pb.js";
9
10
  import { file_kusinta_iot_common_v1_types } from "../../common/v1/types_pb.js";
10
11
  import { file_kusinta_iot_device_v1_device_event } from "../../device/v1/device_event_pb.js";
@@ -20,7 +21,7 @@ import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb
20
21
  * Describes the file kusinta/iot/webrtc/v1/envelope.proto.
21
22
  */
22
23
  export const file_kusinta_iot_webrtc_v1_envelope = /*@__PURE__*/
23
- fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIrgCChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SABCCAoGcmVzdWx0IvsBCgxTdGFydFBhaXJpbmcSOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSNAoGd2luZG93GAIgASgLMiQua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdXaW5kb3cSOgoQaW5pdGlhbF9zcGFjZV9pZBgDIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPQoJb3duZXJzaGlwGAQgASgOMioua3VzaW50YS5pb3QuY29tbW9uLnYxLkRldmljZU93bmVyc2hpcFR5cGUijwEKDlBhaXJpbmdTdGFydGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEi4KCmV4cGlyZXNfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKBWVycm9yGAMgASgLMikua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdFcnJvckRldGFpbCKXAQoPUGFpcmluZ0ZpbmlzaGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEjUKCmRldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwiTQoLTGlua0NoYW5nZWQSLQoEbGluaxgBIAEoCzIfLmt1c2ludGEuaW90LmxpbmsudjEuRGV2aWNlTGluaxIPCgdyZW1vdmVkGAIgASgIIqMCChNDb25uZWN0b3JEZXNjcmlwdG9yEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAMgAygNEhgKEHN1cHBvcnRzX3BhaXJpbmcYBCABKAgSHQoVc3VwcG9ydHNfcHJvdmlzaW9uaW5nGAUgASgIEhUKDWJyb2tlcnNfbGlua3MYBiABKAgSMgoEa2luZBgHIAEoDjIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5Db25uZWN0b3JLaW5kEhMKC2Rlc2NyaXB0aW9uGAggASgJIlUKE0Nvbm5lY3RvcnNBbm5vdW5jZWQSPgoKY29ubmVjdG9ycxgBIAMoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JEZXNjcmlwdG9yIqMJCg5HYXRld2F5TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEkQKDnN0YXRlX3NuYXBzaG90GAMgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVN0YXRlU25hcHNob3RIABJACg9wcm9wZXJ0eV9yZXBvcnQYBCABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZXBvcnRIABJIChFwZXJtaXNzaW9uX3VwZGF0ZRgFIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaXZlUGVybWlzc2lvblVwZGF0ZUgAEj4KDmNvbW1hbmRfcmVzdWx0GAYgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbW1hbmRSZXN1bHRIABIrCgRwb25nGAggASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBvbmdIABJGChJoYW5kc2hha2VfcmVqZWN0ZWQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuSGFuZHNoYWtlUmVqZWN0ZWRIABI0CgVlcnJvchgKIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JIABJCChBzdWJzY3JpcHRpb25fYWNrGAsgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlN1YnNjcmlwdGlvbkFja0gAEjoKDGRldmljZV9hZGRlZBgMIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VBZGRlZEgAEj4KDmRldmljZV9yZW1vdmVkGA0gASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZVJlbW92ZWRIABJEChFtYW5hZ2VtZW50X3Jlc3VsdBgOIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVzdWx0SAASQAoNZGV2aWNlX2V2ZW50cxgQIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VFdmVudEJhdGNoSAASQAoPcGFpcmluZ19zdGFydGVkGBEgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLlBhaXJpbmdTdGFydGVkSAASQgoQcGFpcmluZ19maW5pc2hlZBgSIAEoCzImLmt1c2ludGEuaW90LndlYnJ0Yy52MS5QYWlyaW5nRmluaXNoZWRIABI6CgxsaW5rX2NoYW5nZWQYEyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlua0NoYW5nZWRIABJKChRjb25uZWN0b3JzX2Fubm91bmNlZBgUIAEoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JzQW5ub3VuY2VkSABCCQoHcGF5bG9hZEoECA8QEEoECAcQCFIWYXR0cmlidXRlX3dyaXRlX3Jlc3VsdFIOcHJvcGVydHlfZXZlbnQigwUKCkFwcE1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgloYW5kc2hha2UYAyABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXBwSGFuZHNoYWtlSAASNwoHY29tbWFuZBgEIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VDb21tYW5kSAASQgoMcmVhZF9yZXF1ZXN0GAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3BlcnR5UmVhZFJlcXVlc3RIABIrCgRwaW5nGAYgASgLMhsua3VzaW50YS5pb3Qud2VicnRjLnYxLlBpbmdIABI8CglzdWJzY3JpYmUYByABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaWJlRGV2aWNlc0gAEkAKC3Vuc3Vic2NyaWJlGAggASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlVuc3Vic2NyaWJlRGV2aWNlc0gAEj4KCm1hbmFnZW1lbnQYCSABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuTWFuYWdlbWVudFJlcXVlc3RIABJHCg9hdHRyaWJ1dGVfd3JpdGUYCiABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXR0cmlidXRlV3JpdGVSZXF1ZXN0SAASPAoNc3RhcnRfcGFpcmluZxgLIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdGFydFBhaXJpbmdIAEIJCgdwYXlsb2FkKvYBChBHYXRld2F5RXJyb3JDb2RlEiIKHkdBVEVXQVlfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEiMKH0dBVEVXQVlfRVJST1JfQ09ERV9OT1RfRU5USVRMRUQQARImCiJHQVRFV0FZX0VSUk9SX0NPREVfSU5WQUxJRF9SRVFVRVNUEAISIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOQVZBSUxBQkxFEAMSHwobR0FURVdBWV9FUlJPUl9DT0RFX0lOVEVSTkFMEAQSLAooR0FURVdBWV9FUlJPUl9DT0RFX1NFU1NJT05fTElNSVRfUkVBQ0hFRBAFQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, 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]);
24
+ fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIvoCChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SAASQAoNcm9vbV9jbGltYXRlcxgHIAEoCzInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGVMaXN0SABCCAoGcmVzdWx0IvsBCgxTdGFydFBhaXJpbmcSOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSNAoGd2luZG93GAIgASgLMiQua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdXaW5kb3cSOgoQaW5pdGlhbF9zcGFjZV9pZBgDIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPQoJb3duZXJzaGlwGAQgASgOMioua3VzaW50YS5pb3QuY29tbW9uLnYxLkRldmljZU93bmVyc2hpcFR5cGUijwEKDlBhaXJpbmdTdGFydGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEi4KCmV4cGlyZXNfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKBWVycm9yGAMgASgLMikua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdFcnJvckRldGFpbCKXAQoPUGFpcmluZ0ZpbmlzaGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEjUKCmRldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwiTQoLTGlua0NoYW5nZWQSLQoEbGluaxgBIAEoCzIfLmt1c2ludGEuaW90LmxpbmsudjEuRGV2aWNlTGluaxIPCgdyZW1vdmVkGAIgASgIIqMCChNDb25uZWN0b3JEZXNjcmlwdG9yEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAMgAygNEhgKEHN1cHBvcnRzX3BhaXJpbmcYBCABKAgSHQoVc3VwcG9ydHNfcHJvdmlzaW9uaW5nGAUgASgIEhUKDWJyb2tlcnNfbGlua3MYBiABKAgSMgoEa2luZBgHIAEoDjIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5Db25uZWN0b3JLaW5kEhMKC2Rlc2NyaXB0aW9uGAggASgJIlUKE0Nvbm5lY3RvcnNBbm5vdW5jZWQSPgoKY29ubmVjdG9ycxgBIAMoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JEZXNjcmlwdG9yIkcKElJvb21DbGltYXRlQ2hhbmdlZBIxCgRyb29tGAEgASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZSJWChJDbGltYXRlTW9kZUNoYW5nZWQSMQoEbW9kZRgBIAEoCzIjLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZU1vZGUSDQoFZW5kZWQYAiABKAgiuQoKDkdhdGV3YXlNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSKwoHc2VudF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASRAoOc3RhdGVfc25hcHNob3QYAyABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlU3RhdGVTbmFwc2hvdEgAEkAKD3Byb3BlcnR5X3JlcG9ydBgEIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcm9wZXJ0eVJlcG9ydEgAEkgKEXBlcm1pc3Npb25fdXBkYXRlGAUgASgLMisua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpdmVQZXJtaXNzaW9uVXBkYXRlSAASPgoOY29tbWFuZF9yZXN1bHQYBiABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZFJlc3VsdEgAEisKBHBvbmcYCCABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUG9uZ0gAEkYKEmhhbmRzaGFrZV9yZWplY3RlZBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5IYW5kc2hha2VSZWplY3RlZEgAEjQKBWVycm9yGAogASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEkIKEHN1YnNjcmlwdGlvbl9hY2sYCyABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaXB0aW9uQWNrSAASOgoMZGV2aWNlX2FkZGVkGAwgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUFkZGVkSAASPgoOZGV2aWNlX3JlbW92ZWQYDSABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlUmVtb3ZlZEgAEkQKEW1hbmFnZW1lbnRfcmVzdWx0GA4gASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLk1hbmFnZW1lbnRSZXN1bHRIABJACg1kZXZpY2VfZXZlbnRzGBAgASgLMicua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUV2ZW50QmF0Y2hIABJACg9wYWlyaW5nX3N0YXJ0ZWQYESABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGFpcmluZ1N0YXJ0ZWRIABJCChBwYWlyaW5nX2ZpbmlzaGVkGBIgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlBhaXJpbmdGaW5pc2hlZEgAEjoKDGxpbmtfY2hhbmdlZBgTIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaW5rQ2hhbmdlZEgAEkoKFGNvbm5lY3RvcnNfYW5ub3VuY2VkGBQgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbm5lY3RvcnNBbm5vdW5jZWRIABJJChRyb29tX2NsaW1hdGVfY2hhbmdlZBgVIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tQ2xpbWF0ZUNoYW5nZWRIABJJChRjbGltYXRlX21vZGVfY2hhbmdlZBgWIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5DbGltYXRlTW9kZUNoYW5nZWRIAEIJCgdwYXlsb2FkSgQIDxAQSgQIBxAIUhZhdHRyaWJ1dGVfd3JpdGVfcmVzdWx0Ug5wcm9wZXJ0eV9ldmVudCKDBQoKQXBwTWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKCWhhbmRzaGFrZRgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BcHBIYW5kc2hha2VIABI3Cgdjb21tYW5kGAQgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUNvbW1hbmRIABJCCgxyZWFkX3JlcXVlc3QYBSABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZWFkUmVxdWVzdEgAEisKBHBpbmcYBiABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGluZ0gAEjwKCXN1YnNjcmliZRgHIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdWJzY3JpYmVEZXZpY2VzSAASQAoLdW5zdWJzY3JpYmUYCCABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuVW5zdWJzY3JpYmVEZXZpY2VzSAASPgoKbWFuYWdlbWVudBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVxdWVzdEgAEkcKD2F0dHJpYnV0ZV93cml0ZRgKIAEoCzIsLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BdHRyaWJ1dGVXcml0ZVJlcXVlc3RIABI8Cg1zdGFydF9wYWlyaW5nGAsgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlN0YXJ0UGFpcmluZ0gAQgkKB3BheWxvYWQq9gEKEEdhdGV3YXlFcnJvckNvZGUSIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASIwofR0FURVdBWV9FUlJPUl9DT0RFX05PVF9FTlRJVExFRBABEiYKIkdBVEVXQVlfRVJST1JfQ09ERV9JTlZBTElEX1JFUVVFU1QQAhIiCh5HQVRFV0FZX0VSUk9SX0NPREVfVU5BVkFJTEFCTEUQAxIfChtHQVRFV0FZX0VSUk9SX0NPREVfSU5URVJOQUwQBBIsCihHQVRFV0FZX0VSUk9SX0NPREVfU0VTU0lPTl9MSU1JVF9SRUFDSEVEEAVCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, 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]);
24
25
 
25
26
  /**
26
27
  * Describes the message kusinta.iot.webrtc.v1.Ping.
@@ -141,19 +142,33 @@ export const ConnectorDescriptorSchema = /*@__PURE__*/
141
142
  export const ConnectorsAnnouncedSchema = /*@__PURE__*/
142
143
  messageDesc(file_kusinta_iot_webrtc_v1_envelope, 16);
143
144
 
145
+ /**
146
+ * Describes the message kusinta.iot.webrtc.v1.RoomClimateChanged.
147
+ * Use `create(RoomClimateChangedSchema)` to create a new message.
148
+ */
149
+ export const RoomClimateChangedSchema = /*@__PURE__*/
150
+ messageDesc(file_kusinta_iot_webrtc_v1_envelope, 17);
151
+
152
+ /**
153
+ * Describes the message kusinta.iot.webrtc.v1.ClimateModeChanged.
154
+ * Use `create(ClimateModeChangedSchema)` to create a new message.
155
+ */
156
+ export const ClimateModeChangedSchema = /*@__PURE__*/
157
+ messageDesc(file_kusinta_iot_webrtc_v1_envelope, 18);
158
+
144
159
  /**
145
160
  * Describes the message kusinta.iot.webrtc.v1.GatewayMessage.
146
161
  * Use `create(GatewayMessageSchema)` to create a new message.
147
162
  */
148
163
  export const GatewayMessageSchema = /*@__PURE__*/
149
- messageDesc(file_kusinta_iot_webrtc_v1_envelope, 17);
164
+ messageDesc(file_kusinta_iot_webrtc_v1_envelope, 19);
150
165
 
151
166
  /**
152
167
  * Describes the message kusinta.iot.webrtc.v1.AppMessage.
153
168
  * Use `create(AppMessageSchema)` to create a new message.
154
169
  */
155
170
  export const AppMessageSchema = /*@__PURE__*/
156
- messageDesc(file_kusinta_iot_webrtc_v1_envelope, 18);
171
+ messageDesc(file_kusinta_iot_webrtc_v1_envelope, 20);
157
172
 
158
173
  /**
159
174
  * Describes the enum kusinta.iot.webrtc.v1.GatewayErrorCode.
@@ -9,6 +9,8 @@ import type { ConnectorId, DeviceId, SpaceId, UserId } from "../../identity/v1/i
9
9
  import type { LorawanProvisioning } from "../../vendor/lorawan/v1/lorawan_pb.js";
10
10
  import type { Space } from "../../space/v1/space_pb.js";
11
11
  import type { LinkFunction, LinkMode, LinkSettings } from "../../link/v1/link_pb.js";
12
+ import type { ClimateModeKind } from "../../climate/v1/climate_pb.js";
13
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
12
14
 
13
15
  /**
14
16
  * Describes the file kusinta/iot/webrtc/v1/management.proto.
@@ -586,6 +588,188 @@ export declare type ListDeviceLinks = Message<"kusinta.iot.webrtc.v1.ListDeviceL
586
588
  */
587
589
  export declare const ListDeviceLinksSchema: GenMessage<ListDeviceLinks>;
588
590
 
591
+ /**
592
+ * Sets the temperature a room is to be held at.
593
+ *
594
+ * Authorized as adjusting, not directing: WRITE on the room is enough — a resident in
595
+ * their own apartment, as well as owners and filing roles. It is the same act as turning
596
+ * a radiator's knob, which a resident can already do; setting up what the room obeys is
597
+ * ConfigureRoomClimate, and stays with owners.
598
+ *
599
+ * Clamped to the room's limits rather than refused outside them, and the clamped value is
600
+ * what the room's RoomClimate then reports.
601
+ *
602
+ * @generated from message kusinta.iot.webrtc.v1.SetRoomTarget
603
+ */
604
+ export declare type SetRoomTarget = Message<"kusinta.iot.webrtc.v1.SetRoomTarget"> & {
605
+ /**
606
+ * @generated from field: kusinta.iot.identity.v1.SpaceId room_id = 1;
607
+ */
608
+ roomId?: SpaceId | undefined;
609
+
610
+ /**
611
+ * Unset clears the target: the room goes back to having none (NO_TARGET) and its
612
+ * devices to their own behaviour. With presence, so that a request that forgot the
613
+ * field is not read as 0 °C and clamped to the room's minimum.
614
+ *
615
+ * @generated from field: optional sint32 target_centidegrees = 2;
616
+ */
617
+ targetCentidegrees?: number | undefined;
618
+ };
619
+
620
+ /**
621
+ * Describes the message kusinta.iot.webrtc.v1.SetRoomTarget.
622
+ * Use `create(SetRoomTargetSchema)` to create a new message.
623
+ */
624
+ export declare const SetRoomTargetSchema: GenMessage<SetRoomTarget>;
625
+
626
+ /**
627
+ * The sensors a room measures with, in order of preference. A message of its own so that
628
+ * "leave the sensors alone" (unset) differs from "set" on the wire. Set but empty returns
629
+ * the room to the default order, every temperature sensor filed in it in filing order.
630
+ *
631
+ * @generated from message kusinta.iot.webrtc.v1.RoomSensors
632
+ */
633
+ export declare type RoomSensors = Message<"kusinta.iot.webrtc.v1.RoomSensors"> & {
634
+ /**
635
+ * @generated from field: repeated kusinta.iot.identity.v1.DeviceId sensor_ids = 1;
636
+ */
637
+ sensorIds: DeviceId[];
638
+ };
639
+
640
+ /**
641
+ * Describes the message kusinta.iot.webrtc.v1.RoomSensors.
642
+ * Use `create(RoomSensorsSchema)` to create a new message.
643
+ */
644
+ export declare const RoomSensorsSchema: GenMessage<RoomSensors>;
645
+
646
+ /**
647
+ * A room's limits. A message of its own so that "leave the limits alone" (unset) differs
648
+ * from "set" — and, set, an unset bound inside it removes that bound, which a bare
649
+ * optional on the request could not say.
650
+ *
651
+ * @generated from message kusinta.iot.webrtc.v1.RoomLimits
652
+ */
653
+ export declare type RoomLimits = Message<"kusinta.iot.webrtc.v1.RoomLimits"> & {
654
+ /**
655
+ * @generated from field: optional sint32 min_centidegrees = 1;
656
+ */
657
+ minCentidegrees?: number | undefined;
658
+
659
+ /**
660
+ * @generated from field: optional sint32 max_centidegrees = 2;
661
+ */
662
+ maxCentidegrees?: number | undefined;
663
+ };
664
+
665
+ /**
666
+ * Describes the message kusinta.iot.webrtc.v1.RoomLimits.
667
+ * Use `create(RoomLimitsSchema)` to create a new message.
668
+ */
669
+ export declare const RoomLimitsSchema: GenMessage<RoomLimits>;
670
+
671
+ /**
672
+ * Configures what a room obeys: its limits, its sensors, and whether a change made by
673
+ * hand at one of its devices counts. Authorized as directing — owners and filing roles —
674
+ * because this decides what everybody in the room can do.
675
+ *
676
+ * Each field moves alone, as on UpdateSpace: unset leaves it as it is.
677
+ *
678
+ * @generated from message kusinta.iot.webrtc.v1.ConfigureRoomClimate
679
+ */
680
+ export declare type ConfigureRoomClimate = Message<"kusinta.iot.webrtc.v1.ConfigureRoomClimate"> & {
681
+ /**
682
+ * @generated from field: kusinta.iot.identity.v1.SpaceId room_id = 1;
683
+ */
684
+ roomId?: SpaceId | undefined;
685
+
686
+ /**
687
+ * Replaces both bounds; see RoomLimits.
688
+ *
689
+ * @generated from field: kusinta.iot.webrtc.v1.RoomLimits limits = 2;
690
+ */
691
+ limits?: RoomLimits | undefined;
692
+
693
+ /**
694
+ * Only devices filed in this room; any other is refused.
695
+ *
696
+ * @generated from field: kusinta.iot.webrtc.v1.RoomSensors sensors = 3;
697
+ */
698
+ sensors?: RoomSensors | undefined;
699
+
700
+ /**
701
+ * @generated from field: optional bool lock_device_controls = 4;
702
+ */
703
+ lockDeviceControls?: boolean | undefined;
704
+ };
705
+
706
+ /**
707
+ * Describes the message kusinta.iot.webrtc.v1.ConfigureRoomClimate.
708
+ * Use `create(ConfigureRoomClimateSchema)` to create a new message.
709
+ */
710
+ export declare const ConfigureRoomClimateSchema: GenMessage<ConfigureRoomClimate>;
711
+
712
+ /**
713
+ * Switches a mode on a space on, or off with kind UNSPECIFIED. WRITE on the space.
714
+ * Switching one on needs setback_centidegrees; a mode with nothing to set back to is
715
+ * refused.
716
+ *
717
+ * @generated from message kusinta.iot.webrtc.v1.SetClimateMode
718
+ */
719
+ export declare type SetClimateMode = Message<"kusinta.iot.webrtc.v1.SetClimateMode"> & {
720
+ /**
721
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
722
+ */
723
+ spaceId?: SpaceId | undefined;
724
+
725
+ /**
726
+ * @generated from field: kusinta.iot.climate.v1.ClimateModeKind kind = 2;
727
+ */
728
+ kind: ClimateModeKind;
729
+
730
+ /**
731
+ * @generated from field: optional sint32 setback_centidegrees = 3;
732
+ */
733
+ setbackCentidegrees?: number | undefined;
734
+
735
+ /**
736
+ * HOLIDAY only; both required there. Refused on AWAY.
737
+ *
738
+ * @generated from field: google.protobuf.Timestamp starts_at = 4;
739
+ */
740
+ startsAt?: Timestamp | undefined;
741
+
742
+ /**
743
+ * @generated from field: google.protobuf.Timestamp ends_at = 5;
744
+ */
745
+ endsAt?: Timestamp | undefined;
746
+ };
747
+
748
+ /**
749
+ * Describes the message kusinta.iot.webrtc.v1.SetClimateMode.
750
+ * Use `create(SetClimateModeSchema)` to create a new message.
751
+ */
752
+ export declare const SetClimateModeSchema: GenMessage<SetClimateMode>;
753
+
754
+ /**
755
+ * Lists the room climates and modes a caller may see. Unset root_space_id lists every
756
+ * one the caller can reach; naming a space narrows it to that space and those below.
757
+ *
758
+ * @generated from message kusinta.iot.webrtc.v1.ListRoomClimates
759
+ */
760
+ export declare type ListRoomClimates = Message<"kusinta.iot.webrtc.v1.ListRoomClimates"> & {
761
+ /**
762
+ * @generated from field: kusinta.iot.identity.v1.SpaceId root_space_id = 1;
763
+ */
764
+ rootSpaceId?: SpaceId | undefined;
765
+ };
766
+
767
+ /**
768
+ * Describes the message kusinta.iot.webrtc.v1.ListRoomClimates.
769
+ * Use `create(ListRoomClimatesSchema)` to create a new message.
770
+ */
771
+ export declare const ListRoomClimatesSchema: GenMessage<ListRoomClimates>;
772
+
589
773
  /**
590
774
  * @generated from message kusinta.iot.webrtc.v1.ManagementRequest
591
775
  */
@@ -683,6 +867,30 @@ export declare type ManagementRequest = Message<"kusinta.iot.webrtc.v1.Managemen
683
867
  */
684
868
  value: ProvisionDevice;
685
869
  case: "provisionDevice";
870
+ } | {
871
+ /**
872
+ * @generated from field: kusinta.iot.webrtc.v1.SetRoomTarget set_room_target = 16;
873
+ */
874
+ value: SetRoomTarget;
875
+ case: "setRoomTarget";
876
+ } | {
877
+ /**
878
+ * @generated from field: kusinta.iot.webrtc.v1.ConfigureRoomClimate configure_room_climate = 17;
879
+ */
880
+ value: ConfigureRoomClimate;
881
+ case: "configureRoomClimate";
882
+ } | {
883
+ /**
884
+ * @generated from field: kusinta.iot.webrtc.v1.SetClimateMode set_climate_mode = 18;
885
+ */
886
+ value: SetClimateMode;
887
+ case: "setClimateMode";
888
+ } | {
889
+ /**
890
+ * @generated from field: kusinta.iot.webrtc.v1.ListRoomClimates list_room_climates = 19;
891
+ */
892
+ value: ListRoomClimates;
893
+ case: "listRoomClimates";
686
894
  } | { case: undefined; value?: undefined };
687
895
  };
688
896
 
@@ -3,6 +3,8 @@
3
3
  /* eslint-disable */
4
4
 
5
5
  import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
6
+ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
+ import { file_kusinta_iot_climate_v1_climate } from "../../climate/v1/climate_pb.js";
6
8
  import { file_kusinta_iot_common_v1_types } from "../../common/v1/types_pb.js";
7
9
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
8
10
  import { file_kusinta_iot_link_v1_link } from "../../link/v1/link_pb.js";
@@ -13,7 +15,7 @@ import { file_kusinta_iot_vendor_lorawan_v1_lorawan } from "../../vendor/lorawan
13
15
  * Describes the file kusinta/iot/webrtc/v1/management.proto.
14
16
  */
15
17
  export const file_kusinta_iot_webrtc_v1_management = /*@__PURE__*/
16
- fileDesc("CiZrdXNpbnRhL2lvdC93ZWJydGMvdjEvbWFuYWdlbWVudC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxIrABCgtDcmVhdGVTcGFjZRI0CgpzcGFjZV90eXBlGAEgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg0KBWZsb29yGAQgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgFIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQizwIKC1VwZGF0ZVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI5CgpzcGFjZV90eXBlGAIgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZUgBiAEBEhEKBG5hbWUYAyABKAlIAogBARIYCgtkZXNjcmlwdGlvbhgEIAEoCUgDiAEBEhIKBWZsb29yGAUgASgFSASIAQESOwoPcGFyZW50X3NwYWNlX2lkGAYgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZEgAEhAKBmRldGFjaBgHIAEoCEgAQg8KDXBhcmVudF9jaGFuZ2VCDQoLX3NwYWNlX3R5cGVCBwoFX25hbWVCDgoMX2Rlc2NyaXB0aW9uQggKBl9mbG9vciJSCgtEZWxldGVTcGFjZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSDwoHY2FzY2FkZRgCIAEoCCJ/ChFBc3NpZ25Vc2VyVG9TcGFjZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSMAoHdXNlcl9pZBgCIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZEoECAMQBCJ7ChNSZW1vdmVVc2VyRnJvbVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkIn4KElBsYWNlRGV2aWNlSW5TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQigQEKFVJlbW92ZURldmljZUZyb21TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi2AEKC0NsYWltRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEj0KCW93bmVyc2hpcBgCIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlEjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhgKEHBvc3Nlc3Npb25fcHJvb2YYBCABKAkiRQoNUmVsZWFzZURldmljZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCKjAQoPUHJvdmlzaW9uRGV2aWNlEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEkUKB2xvcmF3YW4YAiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IubG9yYXdhbi52MS5Mb3Jhd2FuUHJvdmlzaW9uaW5nSABCDQoLY3JlZGVudGlhbHMiRQoKTGlzdFNwYWNlcxI3Cg1yb290X3NwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZCI4CglTcGFjZVRyZWUSKwoGc3BhY2VzGAEgAygLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2UiDwoNTWFuYWdlbWVudEFjayKRAgoQQ3JlYXRlRGV2aWNlTGluaxIxCgZzZW5kZXIYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCghyZWNlaXZlchgCIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjMKCGZ1bmN0aW9uGAMgASgOMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rRnVuY3Rpb24SKwoEbW9kZRgEIAEoDjIdLmt1c2ludGEuaW90LmxpbmsudjEuTGlua01vZGUSMwoIc2V0dGluZ3MYBSABKAsyIS5rdXNpbnRhLmlvdC5saW5rLnYxLkxpbmtTZXR0aW5ncyIjChBSZW1vdmVEZXZpY2VMaW5rEg8KB2xpbmtfaWQYASABKAkiWAoQVXBkYXRlRGV2aWNlTGluaxIPCgdsaW5rX2lkGAEgASgJEjMKCHNldHRpbmdzGAIgASgLMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rU2V0dGluZ3MiRwoPTGlzdERldmljZUxpbmtzEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpwIChFNYW5hZ2VtZW50UmVxdWVzdBI6CgxjcmVhdGVfc3BhY2UYASABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ3JlYXRlU3BhY2VIABI6Cgx1cGRhdGVfc3BhY2UYAiABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuVXBkYXRlU3BhY2VIABI6CgxkZWxldGVfc3BhY2UYAyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGVsZXRlU3BhY2VIABJIChRhc3NpZ25fdXNlcl90b19zcGFjZRgEIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Bc3NpZ25Vc2VyVG9TcGFjZUgAEkwKFnJlbW92ZV91c2VyX2Zyb21fc3BhY2UYBSABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlVXNlckZyb21TcGFjZUgAEkoKFXBsYWNlX2RldmljZV9pbl9zcGFjZRgGIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5QbGFjZURldmljZUluU3BhY2VIABJQChhyZW1vdmVfZGV2aWNlX2Zyb21fc3BhY2UYByABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlRGV2aWNlRnJvbVNwYWNlSAASOgoMY2xhaW1fZGV2aWNlGAggASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkNsYWltRGV2aWNlSAASPgoOcmVsZWFzZV9kZXZpY2UYCSABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVsZWFzZURldmljZUgAEjgKC2xpc3Rfc3BhY2VzGAogASgLMiEua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3RTcGFjZXNIABJFChJjcmVhdGVfZGV2aWNlX2xpbmsYCyABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ3JlYXRlRGV2aWNlTGlua0gAEkUKEnJlbW92ZV9kZXZpY2VfbGluaxgMIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5SZW1vdmVEZXZpY2VMaW5rSAASQwoRbGlzdF9kZXZpY2VfbGlua3MYDSABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlzdERldmljZUxpbmtzSAASRQoSdXBkYXRlX2RldmljZV9saW5rGA4gASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLlVwZGF0ZURldmljZUxpbmtIABJCChBwcm92aXNpb25fZGV2aWNlGA8gASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3Zpc2lvbkRldmljZUgAQgkKB3JlcXVlc3RCAkgBYgZwcm90bzM", [file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_vendor_lorawan_v1_lorawan]);
18
+ fileDesc("CiZrdXNpbnRhL2lvdC93ZWJydGMvdjEvbWFuYWdlbWVudC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxIrABCgtDcmVhdGVTcGFjZRI0CgpzcGFjZV90eXBlGAEgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg0KBWZsb29yGAQgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgFIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQizwIKC1VwZGF0ZVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI5CgpzcGFjZV90eXBlGAIgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZUgBiAEBEhEKBG5hbWUYAyABKAlIAogBARIYCgtkZXNjcmlwdGlvbhgEIAEoCUgDiAEBEhIKBWZsb29yGAUgASgFSASIAQESOwoPcGFyZW50X3NwYWNlX2lkGAYgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZEgAEhAKBmRldGFjaBgHIAEoCEgAQg8KDXBhcmVudF9jaGFuZ2VCDQoLX3NwYWNlX3R5cGVCBwoFX25hbWVCDgoMX2Rlc2NyaXB0aW9uQggKBl9mbG9vciJSCgtEZWxldGVTcGFjZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSDwoHY2FzY2FkZRgCIAEoCCJ/ChFBc3NpZ25Vc2VyVG9TcGFjZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSMAoHdXNlcl9pZBgCIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZEoECAMQBCJ7ChNSZW1vdmVVc2VyRnJvbVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkIn4KElBsYWNlRGV2aWNlSW5TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQigQEKFVJlbW92ZURldmljZUZyb21TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi2AEKC0NsYWltRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEj0KCW93bmVyc2hpcBgCIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlEjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhgKEHBvc3Nlc3Npb25fcHJvb2YYBCABKAkiRQoNUmVsZWFzZURldmljZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCKjAQoPUHJvdmlzaW9uRGV2aWNlEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEkUKB2xvcmF3YW4YAiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IubG9yYXdhbi52MS5Mb3Jhd2FuUHJvdmlzaW9uaW5nSABCDQoLY3JlZGVudGlhbHMiRQoKTGlzdFNwYWNlcxI3Cg1yb290X3NwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZCI4CglTcGFjZVRyZWUSKwoGc3BhY2VzGAEgAygLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2UiDwoNTWFuYWdlbWVudEFjayKRAgoQQ3JlYXRlRGV2aWNlTGluaxIxCgZzZW5kZXIYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCghyZWNlaXZlchgCIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjMKCGZ1bmN0aW9uGAMgASgOMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rRnVuY3Rpb24SKwoEbW9kZRgEIAEoDjIdLmt1c2ludGEuaW90LmxpbmsudjEuTGlua01vZGUSMwoIc2V0dGluZ3MYBSABKAsyIS5rdXNpbnRhLmlvdC5saW5rLnYxLkxpbmtTZXR0aW5ncyIjChBSZW1vdmVEZXZpY2VMaW5rEg8KB2xpbmtfaWQYASABKAkiWAoQVXBkYXRlRGV2aWNlTGluaxIPCgdsaW5rX2lkGAEgASgJEjMKCHNldHRpbmdzGAIgASgLMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rU2V0dGluZ3MiRwoPTGlzdERldmljZUxpbmtzEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkInwKDVNldFJvb21UYXJnZXQSMQoHcm9vbV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSIAoTdGFyZ2V0X2NlbnRpZGVncmVlcxgCIAEoEUgAiAEBQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzIkQKC1Jvb21TZW5zb3JzEjUKCnNlbnNvcl9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJ0CgpSb29tTGltaXRzEh0KEG1pbl9jZW50aWRlZ3JlZXMYASABKBFIAIgBARIdChBtYXhfY2VudGlkZWdyZWVzGAIgASgRSAGIAQFCEwoRX21pbl9jZW50aWRlZ3JlZXNCEwoRX21heF9jZW50aWRlZ3JlZXMi7QEKFENvbmZpZ3VyZVJvb21DbGltYXRlEjEKB3Jvb21faWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjEKBmxpbWl0cxgCIAEoCzIhLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tTGltaXRzEjMKB3NlbnNvcnMYAyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUm9vbVNlbnNvcnMSIQoUbG9ja19kZXZpY2VfY29udHJvbHMYBCABKAhIAIgBAUIXChVfbG9ja19kZXZpY2VfY29udHJvbHMikwIKDlNldENsaW1hdGVNb2RlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI1CgRraW5kGAIgASgOMicua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZUtpbmQSIQoUc2V0YmFja19jZW50aWRlZ3JlZXMYAyABKBFIAIgBARItCglzdGFydHNfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhcKFV9zZXRiYWNrX2NlbnRpZGVncmVlcyJLChBMaXN0Um9vbUNsaW1hdGVzEjcKDXJvb3Rfc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkIrYKChFNYW5hZ2VtZW50UmVxdWVzdBI6CgxjcmVhdGVfc3BhY2UYASABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ3JlYXRlU3BhY2VIABI6Cgx1cGRhdGVfc3BhY2UYAiABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuVXBkYXRlU3BhY2VIABI6CgxkZWxldGVfc3BhY2UYAyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGVsZXRlU3BhY2VIABJIChRhc3NpZ25fdXNlcl90b19zcGFjZRgEIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Bc3NpZ25Vc2VyVG9TcGFjZUgAEkwKFnJlbW92ZV91c2VyX2Zyb21fc3BhY2UYBSABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlVXNlckZyb21TcGFjZUgAEkoKFXBsYWNlX2RldmljZV9pbl9zcGFjZRgGIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5QbGFjZURldmljZUluU3BhY2VIABJQChhyZW1vdmVfZGV2aWNlX2Zyb21fc3BhY2UYByABKAsyLC5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlRGV2aWNlRnJvbVNwYWNlSAASOgoMY2xhaW1fZGV2aWNlGAggASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkNsYWltRGV2aWNlSAASPgoOcmVsZWFzZV9kZXZpY2UYCSABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVsZWFzZURldmljZUgAEjgKC2xpc3Rfc3BhY2VzGAogASgLMiEua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3RTcGFjZXNIABJFChJjcmVhdGVfZGV2aWNlX2xpbmsYCyABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ3JlYXRlRGV2aWNlTGlua0gAEkUKEnJlbW92ZV9kZXZpY2VfbGluaxgMIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5SZW1vdmVEZXZpY2VMaW5rSAASQwoRbGlzdF9kZXZpY2VfbGlua3MYDSABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlzdERldmljZUxpbmtzSAASRQoSdXBkYXRlX2RldmljZV9saW5rGA4gASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLlVwZGF0ZURldmljZUxpbmtIABJCChBwcm92aXNpb25fZGV2aWNlGA8gASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3Zpc2lvbkRldmljZUgAEj8KD3NldF9yb29tX3RhcmdldBgQIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TZXRSb29tVGFyZ2V0SAASTQoWY29uZmlndXJlX3Jvb21fY2xpbWF0ZRgRIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25maWd1cmVSb29tQ2xpbWF0ZUgAEkEKEHNldF9jbGltYXRlX21vZGUYEiABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2V0Q2xpbWF0ZU1vZGVIABJFChJsaXN0X3Jvb21fY2xpbWF0ZXMYEyABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlzdFJvb21DbGltYXRlc0gAQgkKB3JlcXVlc3RCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_vendor_lorawan_v1_lorawan]);
17
19
 
18
20
  /**
19
21
  * Describes the message kusinta.iot.webrtc.v1.CreateSpace.
@@ -134,10 +136,52 @@ export const UpdateDeviceLinkSchema = /*@__PURE__*/
134
136
  export const ListDeviceLinksSchema = /*@__PURE__*/
135
137
  messageDesc(file_kusinta_iot_webrtc_v1_management, 16);
136
138
 
139
+ /**
140
+ * Describes the message kusinta.iot.webrtc.v1.SetRoomTarget.
141
+ * Use `create(SetRoomTargetSchema)` to create a new message.
142
+ */
143
+ export const SetRoomTargetSchema = /*@__PURE__*/
144
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 17);
145
+
146
+ /**
147
+ * Describes the message kusinta.iot.webrtc.v1.RoomSensors.
148
+ * Use `create(RoomSensorsSchema)` to create a new message.
149
+ */
150
+ export const RoomSensorsSchema = /*@__PURE__*/
151
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 18);
152
+
153
+ /**
154
+ * Describes the message kusinta.iot.webrtc.v1.RoomLimits.
155
+ * Use `create(RoomLimitsSchema)` to create a new message.
156
+ */
157
+ export const RoomLimitsSchema = /*@__PURE__*/
158
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 19);
159
+
160
+ /**
161
+ * Describes the message kusinta.iot.webrtc.v1.ConfigureRoomClimate.
162
+ * Use `create(ConfigureRoomClimateSchema)` to create a new message.
163
+ */
164
+ export const ConfigureRoomClimateSchema = /*@__PURE__*/
165
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 20);
166
+
167
+ /**
168
+ * Describes the message kusinta.iot.webrtc.v1.SetClimateMode.
169
+ * Use `create(SetClimateModeSchema)` to create a new message.
170
+ */
171
+ export const SetClimateModeSchema = /*@__PURE__*/
172
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 21);
173
+
174
+ /**
175
+ * Describes the message kusinta.iot.webrtc.v1.ListRoomClimates.
176
+ * Use `create(ListRoomClimatesSchema)` to create a new message.
177
+ */
178
+ export const ListRoomClimatesSchema = /*@__PURE__*/
179
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 22);
180
+
137
181
  /**
138
182
  * Describes the message kusinta.iot.webrtc.v1.ManagementRequest.
139
183
  * Use `create(ManagementRequestSchema)` to create a new message.
140
184
  */
141
185
  export const ManagementRequestSchema = /*@__PURE__*/
142
- messageDesc(file_kusinta_iot_webrtc_v1_management, 17);
186
+ messageDesc(file_kusinta_iot_webrtc_v1_management, 23);
143
187