@kusinta/iot-schema 0.2.0-beta.46 → 0.2.0-beta.47

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.46",
3
+ "version": "0.2.0-beta.47",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -447,7 +447,10 @@ export enum ServiceSignal {
447
447
 
448
448
  /**
449
449
  * How the home is set up: the apartment and its rooms, their names and descriptions, the
450
- * rooms' limits, and the building's sensors in them.
450
+ * rooms' outer limits with when each was set, and the role that set each save an installer
451
+ * under a grant — never the household's inner limits — and the building's sensors in them.
452
+ * While the home stood empty, before anyone moved in, its property owner and gateway
453
+ * administrators saw its rooms and modes in full (webrtc.v1 household.proto, EMPTY HOME).
451
454
  *
452
455
  * @generated from enum value: SERVICE_SIGNAL_ROOM_SETUP = 7;
453
456
  */
@@ -223,7 +223,9 @@ export declare const PermissionActionSchema: GenEnum<PermissionAction>;
223
223
  * operate none of them. Of what they reach of the home — from the room they are filed
224
224
  * on, or all of it — they see how its rooms are set up, with
225
225
  * RoomClimate.state_withheld marking what is not shown, and its links with
226
- * DeviceLink.details_withheld; modes on a home are not sent to them at all. Service
226
+ * DeviceLink.details_withheld; modes on a home are not sent to them at all — save that the
227
+ * property owner and the gateway administrators are sent an empty home's rooms and modes
228
+ * in full (webrtc.v1 household.proto, EMPTY HOME). Service
227
229
  * that reaches the apartment itself also gets its climate summary over the disclosed
228
230
  * period. What they newly see of the home reaches them as it happens; what they lose,
229
231
  * at once.
@@ -127,7 +127,9 @@ export const MembershipRelationSchema = /*@__PURE__*/
127
127
  * operate none of them. Of what they reach of the home — from the room they are filed
128
128
  * on, or all of it — they see how its rooms are set up, with
129
129
  * RoomClimate.state_withheld marking what is not shown, and its links with
130
- * DeviceLink.details_withheld; modes on a home are not sent to them at all. Service
130
+ * DeviceLink.details_withheld; modes on a home are not sent to them at all — save that the
131
+ * property owner and the gateway administrators are sent an empty home's rooms and modes
132
+ * in full (webrtc.v1 household.proto, EMPTY HOME). Service
131
133
  * that reaches the apartment itself also gets its climate summary over the disclosed
132
134
  * period. What they newly see of the home reaches them as it happens; what they lose,
133
135
  * at once.
@@ -395,6 +395,13 @@ export declare const TokenRefreshedSchema: GenMessage<TokenRefreshed>;
395
395
  * and it outlives a household handover's wipe and a gateway-wide wipe, which delete the
396
396
  * grant itself: it is the only means left of ending the link at the service.
397
397
  *
398
+ * A service with no means of revoking a grant is answered REJECTED by the api-server without
399
+ * asking the service. The gateway drops the token as for any REJECTED, and the grant stays
400
+ * valid at the service until it expires or the account holder removes the access there. So an
401
+ * app never tells the household that the service revoked the access, only that the home no
402
+ * longer holds it; where the service has no revocation, it may say that the access is removed
403
+ * at the service by the account holder.
404
+ *
398
405
  * @generated from message kusinta.iot.accountlink.v1.RevokeToken
399
406
  */
400
407
  export declare type RevokeToken = Message<"kusinta.iot.accountlink.v1.RevokeToken"> & {
@@ -434,8 +441,9 @@ export declare type TokenRevoked = Message<"kusinta.iot.accountlink.v1.TokenRevo
434
441
  requestId: string;
435
442
 
436
443
  /**
437
- * OK: revoked. REJECTED: the service no longer knew the token, which is as good.
438
- * UNAVAILABLE: ask again after retry_after.
444
+ * OK: revoked. REJECTED: the service no longer knew the token, which is as good — or it has
445
+ * no means of revoking one, which the api-server answers without asking it (RevokeToken);
446
+ * either way the gateway drops the token. UNAVAILABLE: ask again after retry_after.
439
447
  *
440
448
  * @generated from field: kusinta.iot.accountlink.v1.TokenOutcome outcome = 2;
441
449
  */
@@ -6,6 +6,7 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
8
8
  import type { DeviceId, SpaceId, UserId } from "../../identity/v1/identity_pb.js";
9
+ import type { Role } from "../../access/v1/roles_pb.js";
9
10
 
10
11
  /**
11
12
  * Describes the file kusinta/iot/climate/v1/climate.proto.
@@ -49,6 +50,15 @@ export declare type TargetChange = Message<"kusinta.iot.climate.v1.TargetChange"
49
50
  */
50
51
  value: DeviceId;
51
52
  case: "device";
53
+ } | {
54
+ /**
55
+ * Set by the gateway when the home gained a resident, from the room's outer move-in target
56
+ * (OuterRoomLimits.move_in_target; webrtc.v1 household.proto, MOVE-IN). Only true is sent.
57
+ *
58
+ * @generated from field: bool move_in = 4;
59
+ */
60
+ value: boolean;
61
+ case: "moveIn";
52
62
  } | { case: undefined; value?: undefined };
53
63
  };
54
64
 
@@ -76,7 +86,16 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
76
86
 
77
87
  /**
78
88
  * 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.
89
+ * one. Always within the inner limits where those are set (inner_limits), and bounded by
90
+ * nothing of the room where they are not. Never clamped by the outer ones, a change made by
91
+ * hand at a device they bind included: the target keeps the change, and that device's output
92
+ * is held within them (OuterRoomLimits, WHAT THEY BIND and DEVICE LIMITS).
93
+ *
94
+ * Rollout note: an app that predates outer_limits reads min_centidegrees and
95
+ * max_centidegrees as bounds on this field, and may be sent a target outside them; one that
96
+ * holds its control to them may, on any touch, send the outer bound as the target and so
97
+ * rewrite a household's target set beyond it. An app tells a gateway that predates outer
98
+ * limits by outer_limits unset, and offers it only min and max (ConfigureRoomClimate.limits).
80
99
  *
81
100
  * @generated from field: optional sint32 target_centidegrees = 2;
82
101
  */
@@ -84,7 +103,8 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
84
103
 
85
104
  /**
86
105
  * Who or what set target_centidegrees. Unset while the target is, and when it is withheld
87
- * from the recipient: from service in a home, and from anyone when it dates from before
106
+ * from the recipient: from service in a home that is not empty (webrtc.v1 household.proto,
107
+ * EMPTY HOME), and from anyone when it dates from before
88
108
  * their current residency in the home, or from a home they did not live in at the time
89
109
  * (see access.v1.MembershipRelation).
90
110
  *
@@ -96,7 +116,10 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
96
116
  * What the valves are actually being held at, in centidegrees. Equal to the target
97
117
  * unless a ClimateMode on an enclosing space sets the room back — and then the room's
98
118
  * own target again if somebody changed this room during the mode (see
99
- * overrides_mode). Unset while nothing is being held.
119
+ * overrides_mode) — or the vacancy setback holds it (webrtc.v1 household.proto, VACANCY), or
120
+ * an outer bound clamps it (outer_limit_clamp). Where the outer limits bind some of the
121
+ * room's outputs and not others, what those they bind are held at (OuterRoomLimits, HELD).
122
+ * Unset while nothing is being held.
100
123
  *
101
124
  * @generated from field: optional sint32 effective_target_centidegrees = 4;
102
125
  */
@@ -119,17 +142,19 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
119
142
  modeSpaceId?: SpaceId | undefined;
120
143
 
121
144
  /**
122
- * The owner's limits, in centidegrees. The gateway writes them to every device in the
123
- * room (Matter Min/MaxHeatSetpointLimit), so a knob stops at them physically, and
124
- * clamps every target — from the app, a knob or a mode — to them. The minimum is also
125
- * the floor under a mode's setback.
145
+ * A copy of outer_limits.min and .max, in centidegrees, kept for apps that predate
146
+ * outer_limits: each set exactly when its outer bound is, and unset otherwise. Read
147
+ * outer_limits instead. What the gateway writes into a device's own setpoint limits is
148
+ * OuterRoomLimits' (DEVICE LIMITS).
126
149
  *
127
- * @generated from field: optional sint32 min_centidegrees = 6;
150
+ * @generated from field: optional sint32 min_centidegrees = 6 [deprecated = true];
151
+ * @deprecated
128
152
  */
129
153
  minCentidegrees?: number | undefined;
130
154
 
131
155
  /**
132
- * @generated from field: optional sint32 max_centidegrees = 7;
156
+ * @generated from field: optional sint32 max_centidegrees = 7 [deprecated = true];
157
+ * @deprecated
133
158
  */
134
159
  maxCentidegrees?: number | undefined;
135
160
 
@@ -186,8 +211,9 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
186
211
  * Stated as the lock rather than as a permission so that the proto3 default — false,
187
212
  * unlocked — is the intended default: a room nobody has configured takes changes at its
188
213
  * devices, as a room in an apartment should until its residents decide otherwise; when a
189
- * home loses its last resident, its rooms' locks are cleared. Elsewhere locking is the
190
- * owner's choice.
214
+ * home loses its last resident, its rooms' locks are cleared, and so are those set while it
215
+ * stood empty when it gains one (webrtc.v1 household.proto, MOVE-IN). Elsewhere locking is
216
+ * the owner's choice.
191
217
  *
192
218
  * @generated from field: bool lock_device_controls = 12;
193
219
  */
@@ -195,16 +221,19 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
195
221
 
196
222
  /**
197
223
  * Set when the recipient reaches this room only as service (see
198
- * access.v1.MembershipRelation): the room is in someone's home, and what describes the
199
- * people in it is WITHHELD — target_centidegrees, target_change,
200
- * effective_target_centidegrees, overrides_mode, mode_space_id, measured_centidegrees,
201
- * measured_by, condition and lock_device_controls are all left unset, and sensor_ids
202
- * leaves out sensors a resident owns.
224
+ * access.v1.MembershipRelation): the room is in someone's home, and what describes the people
225
+ * in it is WITHHELD. Never set for the property owner or a gateway administrator while the
226
+ * home is empty (webrtc.v1 household.proto, EMPTY HOME): they are sent its rooms as rooms
227
+ * outside homes are, and at MOVE-IN sent them again with it set. When it is set,
228
+ * target_centidegrees, target_change, effective_target_centidegrees, overrides_mode,
229
+ * mode_space_id, measured_centidegrees, measured_by, condition, lock_device_controls,
230
+ * inner_limits, outer_limit_clamp, outer_limits_coverage and outer_bound_device_ids are all
231
+ * left unset, and sensor_ids leaves out sensors a resident owns.
203
232
  *
204
233
  * Unset because withheld, not because unknown: an app must not render them as NO_TARGET or
205
234
  * a lost sensor. A withheld room is sent again only when something that IS sent changes,
206
- * so that the timing of an update does not give away what was withheld. Its limits and
207
- * the sensors service may see are still sent, since setting a room up is service work.
235
+ * so that the timing of an update does not give away what was withheld. Its outer limits
236
+ * and the sensors service may see are still sent, since setting a room up is service work.
208
237
  * Its climate over time is available to service only as an ApartmentClimateSummary.
209
238
  *
210
239
  * explanations, target_held_until, planning and the comfort band are withheld in the
@@ -253,8 +282,9 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
253
282
  /**
254
283
  * The comfort band in force, in centidegrees: the lowest and highest a plan may hold the
255
284
  * room at while it heats ahead, coasts or saves on dear energy. Both set or neither, low
256
- * no higher than high, and within [min_centidegrees, max_centidegrees] where those are
257
- * set. Absent: no band, and a plan holds the room at its target — never 0 °C.
285
+ * no higher than high, and within the inner limits where those are set; at the outputs the
286
+ * outer limits bind, a plan holds within them too (OuterRoomLimits, HELD). Absent: no band,
287
+ * and a plan holds the room at its target — never 0 °C.
258
288
  *
259
289
  * @generated from field: optional sint32 comfort_band_low_centidegrees = 19;
260
290
  */
@@ -264,6 +294,61 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
264
294
  * @generated from field: optional sint32 comfort_band_high_centidegrees = 20;
265
295
  */
266
296
  comfortBandHighCentidegrees?: number | undefined;
297
+
298
+ /**
299
+ * The room's outer limits, each bound with who set it and when (OuterRoomLimits). Sent to
300
+ * whoever is sent the room, service included and with state_withheld too: they are the
301
+ * building's, and setting them is service work.
302
+ *
303
+ * Always set by a gateway that keeps outer limits: an empty OuterRoomLimits where the room
304
+ * has none. Unset only from a gateway that predates them, which keeps min and max alone: an
305
+ * app reads unset so, and offers only min and max, through ConfigureRoomClimate.limits,
306
+ * rather than an editor whose away minimum and move-in target that gateway would drop.
307
+ *
308
+ * @generated from field: kusinta.iot.climate.v1.OuterRoomLimits outer_limits = 21;
309
+ */
310
+ outerLimits?: OuterRoomLimits | undefined;
311
+
312
+ /**
313
+ * The household's limits (InnerRoomLimits). Sent to the home's residents only, and never with
314
+ * state_withheld. Unset: none, or a room outside homes.
315
+ *
316
+ * @generated from field: kusinta.iot.climate.v1.InnerRoomLimits inner_limits = 22;
317
+ */
318
+ innerLimits?: InnerRoomLimits | undefined;
319
+
320
+ /**
321
+ * Set while an outer bound holds the outputs it binds away from where the room would be held
322
+ * without it — the household's target, its inner limits or its mode's setback — so the
323
+ * household is told which bound does it, and from outer_limits the role behind it and since
324
+ * when. Gone once nothing is clamped. Sent as outer_limits_coverage is.
325
+ *
326
+ * @generated from field: kusinta.iot.climate.v1.OuterLimitClamp outer_limit_clamp = 23;
327
+ */
328
+ outerLimitClamp?: OuterLimitClamp | undefined;
329
+
330
+ /**
331
+ * How many of the room's heating outputs the outer limits bind, so that an app shows the
332
+ * building's bounds where they apply and not where they do not. In a home, sent to its
333
+ * residents only: to anyone else it would tell whether the room holds a device a resident
334
+ * owns. Outside homes, sent to whoever is sent the room, judged over the outputs of devices
335
+ * the recipient sees, so that a device hidden from them changes nothing they are sent.
336
+ *
337
+ * @generated from field: kusinta.iot.climate.v1.OuterLimitsCoverage outer_limits_coverage = 24;
338
+ */
339
+ outerLimitsCoverage: OuterLimitsCoverage;
340
+
341
+ /**
342
+ * The devices in the room with a heating output the outer limits bind
343
+ * (OuterRoomLimits, WHAT THEY BIND), so that an app marks a device's own limit settings as
344
+ * governed by them only where they are. Sent as outer_limits_coverage is, and judged over the
345
+ * same devices: outside homes, only devices the recipient sees are listed. Empty under
346
+ * coverage NONE or UNSPECIFIED; under ALL, every heating device in the room the recipient
347
+ * sees is in it; under SOME, some are.
348
+ *
349
+ * @generated from field: repeated kusinta.iot.identity.v1.DeviceId outer_bound_device_ids = 25;
350
+ */
351
+ outerBoundDeviceIds: DeviceId[];
267
352
  };
268
353
 
269
354
  /**
@@ -272,6 +357,198 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
272
357
  */
273
358
  export declare const RoomClimateSchema: GenMessage<RoomClimate>;
274
359
 
360
+ /**
361
+ * One bound of a room's outer limits, with who set it and when. Shown to the household as the
362
+ * role and the time, never a name: "building administrator, since …".
363
+ *
364
+ * @generated from message kusinta.iot.climate.v1.OuterLimit
365
+ */
366
+ export declare type OuterLimit = Message<"kusinta.iot.climate.v1.OuterLimit"> & {
367
+ /**
368
+ * @generated from field: sint32 centidegrees = 1;
369
+ */
370
+ centidegrees: number;
371
+
372
+ /**
373
+ * The role its setter acted in (webrtc.v1.ConfigureRoomClimate): ROLE_PROPERTY_OWNER where
374
+ * they hold it, else ROLE_GATEWAY_ADMIN, else ROLE_TECHNICIAN. In a home, a bound an
375
+ * installer set under a commissioning grant has it unset to anyone but the home's residents:
376
+ * staff are shown its value and set_at alone, so the stamp tells them nothing of when the
377
+ * household let an installer in. An app shows an unset role as not stated.
378
+ *
379
+ * @generated from field: kusinta.iot.access.v1.Role set_by_role = 2;
380
+ */
381
+ setByRole: Role;
382
+
383
+ /**
384
+ * When the bound was last given a new value. Always sent, also when it dates from before the
385
+ * recipient's residency: it records an act of the building's, and nothing of a household.
386
+ *
387
+ * @generated from field: google.protobuf.Timestamp set_at = 3;
388
+ */
389
+ setAt?: Timestamp | undefined;
390
+ };
391
+
392
+ /**
393
+ * Describes the message kusinta.iot.climate.v1.OuterLimit.
394
+ * Use `create(OuterLimitSchema)` to create a new message.
395
+ */
396
+ export declare const OuterLimitSchema: GenMessage<OuterLimit>;
397
+
398
+ /**
399
+ * A room's outer limits: the building's bounds on the heating it owns, set by the parties
400
+ * webrtc.v1.ConfigureRoomClimate names. Every bound is optional: a building where each home
401
+ * pays its own heating may set floors only.
402
+ *
403
+ * WHAT THEY BIND. The asset owner decides whether they can bind a device, and the
404
+ * organisation whether to use them. They bind an output only on one of the building's own
405
+ * devices (common.v1.DeviceOwnershipType COMPANY) whose asset owner is the organisation, or
406
+ * that has none recorded (common.v1.AssetOwner); never a household's asset, nor a device a
407
+ * person owns outright. The clamp is applied per output, by its device's owner: in a room with
408
+ * a valve the organisation owns and a heater a resident owns, the valve is held within the
409
+ * outer limits and the heater at the room's target. So they bind outputs, never the room: the
410
+ * room's target and its inner limits are the household's, are not rewritten when an outer bound
411
+ * moves, and hold again at those outputs once it moves back out.
412
+ *
413
+ * HELD. What an output is held at is worked out in this order, each step clamping the one
414
+ * before:
415
+ * 1. the room's target, or while a mode (ClimateMode) sets the room back its setback;
416
+ * 2. the inner limits (InnerRoomLimits): the maximum always, the minimum — the household's
417
+ * everyday floor — only while no mode sets the room back;
418
+ * 3. at an output the outer limits bind: [min, max] while no mode sets the room back, and
419
+ * [AWAY FLOOR, max] while one does; during the vacancy setback (webrtc.v1 household.proto,
420
+ * VACANCY), the AWAY FLOOR itself;
421
+ * 4. an installer's equipment-safety limits — a floor's surface maximum, a supply cap
422
+ * (commissioning.v1) — which neither tier of comfort limits widens.
423
+ * So where an inner bound and an outer bound disagree the outer one wins, and the household's
424
+ * range at those outputs is always inside the building's; outputs the outer limits do not bind
425
+ * stop at step 2. The AWAY FLOOR is away_min, or min where away_min is unset: kept apart from
426
+ * min so that a household going away may set back below its everyday floor but never below what
427
+ * the building needs — frost, damp, heat drawn from neighbours. With neither set, a room has no
428
+ * away floor, and no vacancy setback.
429
+ *
430
+ * DEVICE LIMITS. Where the gateway writes a room's outer limits into a device's own setpoint
431
+ * limits (Matter Min/MaxHeatSetpointLimit), so that a knob stops at them, it writes them only
432
+ * to devices they bind (WHAT THEY BIND), and writes the AWAY FLOOR as the minimum and max as
433
+ * the maximum, each only where set: a device holding min as its own minimum would refuse the
434
+ * setbacks of step 3. Outside a setback the gateway holds min itself: a change made by hand at
435
+ * such a device below min is adopted as the room's target as it was made, within the inner
436
+ * limits and never clamped by the outer ones, while the device's output is held at min and min
437
+ * is written back to it. Into a device the outer limits do not bind that holds room limits
438
+ * written before, it writes the device's defaults back, queued and retried as the wipe's device
439
+ * writes are (webrtc.v1 household.proto, WIPE).
440
+ *
441
+ * They stay with the home: a household handover wipes the inner limits, never these
442
+ * (webrtc.v1 household.proto, WIPE).
443
+ *
444
+ * @generated from message kusinta.iot.climate.v1.OuterRoomLimits
445
+ */
446
+ export declare type OuterRoomLimits = Message<"kusinta.iot.climate.v1.OuterRoomLimits"> & {
447
+ /**
448
+ * The normal minimum and maximum.
449
+ *
450
+ * @generated from field: kusinta.iot.climate.v1.OuterLimit min = 1;
451
+ */
452
+ min?: OuterLimit | undefined;
453
+
454
+ /**
455
+ * @generated from field: kusinta.iot.climate.v1.OuterLimit max = 2;
456
+ */
457
+ max?: OuterLimit | undefined;
458
+
459
+ /**
460
+ * The floor under a setback; see AWAY FLOOR above.
461
+ *
462
+ * @generated from field: kusinta.iot.climate.v1.OuterLimit away_min = 3;
463
+ */
464
+ awayMin?: OuterLimit | undefined;
465
+
466
+ /**
467
+ * The target the room starts at when an empty home gains a resident (webrtc.v1
468
+ * household.proto, MOVE-IN). A start, never a limit, and a target like any other. Always
469
+ * within [min, max] where those are set (webrtc.v1.ConfigureRoomClimate, "limits_order").
470
+ *
471
+ * @generated from field: kusinta.iot.climate.v1.OuterLimit move_in_target = 4;
472
+ */
473
+ moveInTarget?: OuterLimit | undefined;
474
+
475
+ /**
476
+ * Set while min was set below the gateway's public-health threshold: the threshold in force
477
+ * then, which min's setter explicitly accepted going below (ConfigureRoomClimate
478
+ * .accept_below_threshold). The acceptance is recorded with min's set_by_role and set_at.
479
+ * Unset while min is unset or was set at or above the threshold. A threshold changed later
480
+ * re-judges nothing already set.
481
+ *
482
+ * @generated from field: optional sint32 min_accepted_threshold_centidegrees = 5;
483
+ */
484
+ minAcceptedThresholdCentidegrees?: number | undefined;
485
+ };
486
+
487
+ /**
488
+ * Describes the message kusinta.iot.climate.v1.OuterRoomLimits.
489
+ * Use `create(OuterRoomLimitsSchema)` to create a new message.
490
+ */
491
+ export declare const OuterRoomLimitsSchema: GenMessage<OuterRoomLimits>;
492
+
493
+ /**
494
+ * A room's inner limits: the household's own minimum and maximum, set by the home's household
495
+ * admins (webrtc.v1.SetInnerRoomLimits). They clamp the room's target, from the app or a knob
496
+ * alike, and setting them clamps the target already set. They apply to every output in the
497
+ * room, a household's own devices included, as OuterRoomLimits (HELD) orders them. Household
498
+ * data: never told to anyone but the home's residents, and wiped at a handover (webrtc.v1
499
+ * household.proto, WIPE). They belong to the room while it is in the home: cleared when it
500
+ * leaves the home, or the space stops being an apartment, so an empty home's rooms hold none
501
+ * and a move-in target meets none.
502
+ *
503
+ * @generated from message kusinta.iot.climate.v1.InnerRoomLimits
504
+ */
505
+ export declare type InnerRoomLimits = Message<"kusinta.iot.climate.v1.InnerRoomLimits"> & {
506
+ /**
507
+ * @generated from field: optional sint32 min_centidegrees = 1;
508
+ */
509
+ minCentidegrees?: number | undefined;
510
+
511
+ /**
512
+ * @generated from field: optional sint32 max_centidegrees = 2;
513
+ */
514
+ maxCentidegrees?: number | undefined;
515
+ };
516
+
517
+ /**
518
+ * Describes the message kusinta.iot.climate.v1.InnerRoomLimits.
519
+ * Use `create(InnerRoomLimitsSchema)` to create a new message.
520
+ */
521
+ export declare const InnerRoomLimitsSchema: GenMessage<InnerRoomLimits>;
522
+
523
+ /**
524
+ * An outer bound clamping a room (RoomClimate.outer_limit_clamp).
525
+ *
526
+ * @generated from message kusinta.iot.climate.v1.OuterLimitClamp
527
+ */
528
+ export declare type OuterLimitClamp = Message<"kusinta.iot.climate.v1.OuterLimitClamp"> & {
529
+ /**
530
+ * Which bound. An app that does not know the value shows that the building's limits clamp the
531
+ * room, without naming one.
532
+ *
533
+ * @generated from field: kusinta.iot.climate.v1.OuterLimitKind limit = 1;
534
+ */
535
+ limit: OuterLimitKind;
536
+
537
+ /**
538
+ * Where the room would be held without it, in centidegrees: where outputs the outer limits do
539
+ * not bind are held. effective_target_centidegrees is where those they bind are.
540
+ *
541
+ * @generated from field: optional sint32 unclamped_centidegrees = 2;
542
+ */
543
+ unclampedCentidegrees?: number | undefined;
544
+ };
545
+
546
+ /**
547
+ * Describes the message kusinta.iot.climate.v1.OuterLimitClamp.
548
+ * Use `create(OuterLimitClampSchema)` to create a new message.
549
+ */
550
+ export declare const OuterLimitClampSchema: GenMessage<OuterLimitClamp>;
551
+
275
552
  /**
276
553
  * One reason a room, or a part of its heating, is where it is.
277
554
  *
@@ -345,8 +622,8 @@ export declare type ClimateMode = Message<"kusinta.iot.climate.v1.ClimateMode">
345
622
 
346
623
  /**
347
624
  * The temperature every room is set back to, in centidegrees. Required while a mode is
348
- * on — a mode with nothing to set back to is refused, not defaulted. Clamped by each
349
- * room's min_centidegrees, which is the frost floor.
625
+ * on — a mode with nothing to set back to is refused, not defaulted. Clamped in each room as
626
+ * OuterRoomLimits (HELD) orders, the away floor being what the building needs.
350
627
  *
351
628
  * @generated from field: optional sint32 setback_centidegrees = 3;
352
629
  */
@@ -357,7 +634,8 @@ export declare type ClimateMode = Message<"kusinta.iot.climate.v1.ClimateMode">
357
634
  * targets — warm by then, not starting to heat (see warm_from). AWAY: starts_at is when it
358
635
  * was switched on; ends_at is unset. starts_at is unset when it dates from before the
359
636
  * recipient's current residency in the home, or from a home they did not live in at the
360
- * time; an ends_at ahead is always sent.
637
+ * time, save to the property owner and the gateway administrators for a mode on a home while
638
+ * it is empty (webrtc.v1 household.proto, EMPTY HOME); an ends_at ahead is always sent.
361
639
  *
362
640
  * @generated from field: google.protobuf.Timestamp starts_at = 4;
363
641
  */
@@ -371,7 +649,9 @@ export declare type ClimateMode = Message<"kusinta.iot.climate.v1.ClimateMode">
371
649
  /**
372
650
  * Who switched it on. Unset when it is withheld from the recipient: from service in a
373
651
  * home, and from anyone when it dates from before their current residency in the home, or
374
- * from a home they did not live in at the time (see access.v1.MembershipRelation).
652
+ * from a home they did not live in at the time (see access.v1.MembershipRelation). The
653
+ * property owner and the gateway administrators are given it for a mode on a home while it is
654
+ * empty, which only they can have switched on (webrtc.v1 household.proto, EMPTY HOME).
375
655
  *
376
656
  * @generated from field: kusinta.iot.identity.v1.UserId set_by = 6;
377
657
  */
@@ -775,6 +1055,81 @@ export enum RoomClimateCondition {
775
1055
  */
776
1056
  export declare const RoomClimateConditionSchema: GenEnum<RoomClimateCondition>;
777
1057
 
1058
+ /**
1059
+ * Which bound of a room's outer limits clamps the outputs it binds.
1060
+ *
1061
+ * @generated from enum kusinta.iot.climate.v1.OuterLimitKind
1062
+ */
1063
+ export enum OuterLimitKind {
1064
+ /**
1065
+ * @generated from enum value: OUTER_LIMIT_KIND_UNSPECIFIED = 0;
1066
+ */
1067
+ UNSPECIFIED = 0,
1068
+
1069
+ /**
1070
+ * Also when min stands in as the AWAY FLOOR for an unset away_min.
1071
+ *
1072
+ * @generated from enum value: OUTER_LIMIT_KIND_MIN = 1;
1073
+ */
1074
+ MIN = 1,
1075
+
1076
+ /**
1077
+ * @generated from enum value: OUTER_LIMIT_KIND_MAX = 2;
1078
+ */
1079
+ MAX = 2,
1080
+
1081
+ /**
1082
+ * @generated from enum value: OUTER_LIMIT_KIND_AWAY_MIN = 3;
1083
+ */
1084
+ AWAY_MIN = 3,
1085
+ }
1086
+
1087
+ /**
1088
+ * Describes the enum kusinta.iot.climate.v1.OuterLimitKind.
1089
+ */
1090
+ export declare const OuterLimitKindSchema: GenEnum<OuterLimitKind>;
1091
+
1092
+ /**
1093
+ * How many of a room's heating outputs its outer limits bind (OuterRoomLimits, WHAT THEY BIND).
1094
+ *
1095
+ * @generated from enum kusinta.iot.climate.v1.OuterLimitsCoverage
1096
+ */
1097
+ export enum OuterLimitsCoverage {
1098
+ /**
1099
+ * Not stated: withheld, or the room has no outer limits.
1100
+ *
1101
+ * @generated from enum value: OUTER_LIMITS_COVERAGE_UNSPECIFIED = 0;
1102
+ */
1103
+ UNSPECIFIED = 0,
1104
+
1105
+ /**
1106
+ * The room has outer limits and they bind none of its heating outputs: it heats only with a
1107
+ * household's own devices, or with nothing.
1108
+ *
1109
+ * @generated from enum value: OUTER_LIMITS_COVERAGE_NONE = 1;
1110
+ */
1111
+ NONE = 1,
1112
+
1113
+ /**
1114
+ * Some of its heating outputs and not others.
1115
+ *
1116
+ * @generated from enum value: OUTER_LIMITS_COVERAGE_SOME = 2;
1117
+ */
1118
+ SOME = 2,
1119
+
1120
+ /**
1121
+ * Every heating output in it.
1122
+ *
1123
+ * @generated from enum value: OUTER_LIMITS_COVERAGE_ALL = 3;
1124
+ */
1125
+ ALL = 3,
1126
+ }
1127
+
1128
+ /**
1129
+ * Describes the enum kusinta.iot.climate.v1.OuterLimitsCoverage.
1130
+ */
1131
+ export declare const OuterLimitsCoverageSchema: GenEnum<OuterLimitsCoverage>;
1132
+
778
1133
  /**
779
1134
  * Whether a plan steers a room: one that looks ahead at prices, weather and the heat
780
1135
  * source and moves the room within its comfort band. A standing state of the room, not a