@kusinta/iot-schema 0.2.0-beta.34 → 0.2.0-beta.36

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.
@@ -2,7 +2,7 @@
2
2
  // @generated from file kusinta/iot/device/v1/cluster_state.proto (package kusinta.iot.device.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
 
8
8
  /**
@@ -272,6 +272,21 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
272
272
  * @generated from field: map<uint32, uint32> attribute_steps = 7;
273
273
  */
274
274
  attributeSteps: { [key: number]: number };
275
+
276
+ /**
277
+ * What a write to each attribute leaves behind, and how late its reports arrive, keyed by
278
+ * attribute id. See AttributeBehaviour. Its step stays in attribute_steps.
279
+ *
280
+ * Per endpoint because a ClusterState belongs to one endpoint: a device with several
281
+ * independently switched outputs states each output's behaviour on that output's
282
+ * endpoint. A vendor parameter, which has no cluster, states its behaviour in
283
+ * Endpoint.vendor_attribute_behaviours.
284
+ *
285
+ * Stated by the producer at announcement. An absent key is "not stated".
286
+ *
287
+ * @generated from field: map<uint32, kusinta.iot.device.v1.AttributeBehaviour> attribute_behaviours = 8;
288
+ */
289
+ attributeBehaviours: { [key: number]: AttributeBehaviour };
275
290
  };
276
291
 
277
292
  /**
@@ -280,3 +295,181 @@ export declare type ClusterState = Message<"kusinta.iot.device.v1.ClusterState">
280
295
  */
281
296
  export declare const ClusterStateSchema: GenMessage<ClusterState>;
282
297
 
298
+ /**
299
+ * What a write to one attribute leaves behind, and how late its reports arrive. Stated per
300
+ * attribute, per endpoint, by the producer that knows the device.
301
+ *
302
+ * A consumer that leaves a written value in place while it is gone — a gateway steering
303
+ * heat — needs to know what the device does on its own. Not stated is read as the worst
304
+ * case: a write whose kind is not stated is held as if sticky, and a reading whose latency
305
+ * is not stated is never treated as real-time.
306
+ *
307
+ * A gateway MUST NOT drive a heat source, a heating circuit or a floor zone through an
308
+ * attribute whose write kind is not stated here: it refuses the write. This is the
309
+ * opposite default to attribute_ids or a connector's known_links, where not stated only
310
+ * means not known; for an output that heats a home, not stated means no. Rollout order: a
311
+ * producer that carries such outputs states their behaviour before a gateway that drives
312
+ * them takes the release that enforces this.
313
+ *
314
+ * @generated from message kusinta.iot.device.v1.AttributeBehaviour
315
+ */
316
+ export declare type AttributeBehaviour = Message<"kusinta.iot.device.v1.AttributeBehaviour"> & {
317
+ /**
318
+ * What a write leaves behind when its writer goes quiet. Unset: not stated.
319
+ *
320
+ * @generated from oneof kusinta.iot.device.v1.AttributeBehaviour.write
321
+ */
322
+ write: {
323
+ /**
324
+ * @generated from field: kusinta.iot.device.v1.StickyWrite sticky = 1;
325
+ */
326
+ value: StickyWrite;
327
+ case: "sticky";
328
+ } | {
329
+ /**
330
+ * @generated from field: kusinta.iot.device.v1.LeasedWrite leased = 2;
331
+ */
332
+ value: LeasedWrite;
333
+ case: "leased";
334
+ } | { case: undefined; value?: undefined };
335
+
336
+ /**
337
+ * The value the attribute takes when the device's power returns. Stated only for an
338
+ * attribute whose cluster has no startup attribute of its own: where the cluster has one
339
+ * (OnOff's StartUpOnOff, Level Control's StartUpCurrentLevel), that attribute says it and
340
+ * this stays unset, so the value lives in one place. Unset: not stated.
341
+ *
342
+ * @generated from field: kusinta.iot.device.v1.AttributeValue power_on_value = 3;
343
+ */
344
+ powerOnValue?: AttributeValue | undefined;
345
+
346
+ /**
347
+ * How late a reported value reaches the producer. Unset: not stated, never REAL_TIME.
348
+ *
349
+ * @generated from field: kusinta.iot.device.v1.ReadLatency read_latency = 4;
350
+ */
351
+ readLatency: ReadLatency;
352
+ };
353
+
354
+ /**
355
+ * Describes the message kusinta.iot.device.v1.AttributeBehaviour.
356
+ * Use `create(AttributeBehaviourSchema)` to create a new message.
357
+ */
358
+ export declare const AttributeBehaviourSchema: GenMessage<AttributeBehaviour>;
359
+
360
+ /**
361
+ * The device holds a written value until something writes it again: through the writer's
362
+ * absence and a lost network. A writer that may go quiet writes a value it can live with
363
+ * being left in place.
364
+ *
365
+ * @generated from message kusinta.iot.device.v1.StickyWrite
366
+ */
367
+ export declare type StickyWrite = Message<"kusinta.iot.device.v1.StickyWrite"> & {
368
+ };
369
+
370
+ /**
371
+ * Describes the message kusinta.iot.device.v1.StickyWrite.
372
+ * Use `create(StickyWriteSchema)` to create a new message.
373
+ */
374
+ export declare const StickyWriteSchema: GenMessage<StickyWrite>;
375
+
376
+ /**
377
+ * The device itself returns the attribute to lapse_value when a write's lease runs out,
378
+ * whether or not anything is still talking to it. The lease is kept by the device — a
379
+ * timer, or a watchdog on the device's own link — never by the writer re-sending: a value
380
+ * that lapses only because its writer keeps renewing it is sticky to anyone who has to
381
+ * plan for the writer failing.
382
+ *
383
+ * @generated from message kusinta.iot.device.v1.LeasedWrite
384
+ */
385
+ export declare type LeasedWrite = Message<"kusinta.iot.device.v1.LeasedWrite"> & {
386
+ /**
387
+ * The shortest and longest lease, in seconds, the device accepts. Absent: no bound on
388
+ * that side, never zero. A lease outside them is refused rather than clamped. Where the
389
+ * device fixes the length itself — a boost time set as a device parameter — the producer
390
+ * states that length as both bounds, so it never accepts a lease it cannot keep.
391
+ *
392
+ * @generated from field: optional uint32 min_lease_seconds = 1;
393
+ */
394
+ minLeaseSeconds?: number | undefined;
395
+
396
+ /**
397
+ * @generated from field: optional uint32 max_lease_seconds = 2;
398
+ */
399
+ maxLeaseSeconds?: number | undefined;
400
+
401
+ /**
402
+ * Whether a write that arrives before the lease runs out starts the lease again from
403
+ * that write. False or unset (not stated): a writer MUST NOT assume that writing the
404
+ * same value again extends how long it holds.
405
+ *
406
+ * @generated from field: optional bool renewal_restarts_lease = 3;
407
+ */
408
+ renewalRestartsLease?: boolean | undefined;
409
+
410
+ /**
411
+ * The value the attribute returns to when the lease runs out. It is the state a site
412
+ * falls back to whenever its writer is gone, so it is what an installer checks first and
413
+ * what a consumer shows as "what happens if this stops". A producer always states it; a
414
+ * consumer reads a lease without it as a write kind not stated.
415
+ *
416
+ * A fixed value. A device whose timer returns the output to whatever it held before the
417
+ * write is leased only if its producer guarantees that earlier value is the lapse value
418
+ * — by accepting timed writes only while the output is at its lapse value, or by
419
+ * writing the lapse value untimed before each one — and is otherwise stated sticky.
420
+ *
421
+ * A write of the lapse value itself needs no lease: it ends any lease running, and a
422
+ * lease carried on it is ignored rather than refused. That is how a writer ends a lease
423
+ * early.
424
+ *
425
+ * A report of the lapse value after a lease has run out is the lease ending, not a
426
+ * change from outside: a consumer that adopts values it did not write — a turned dial —
427
+ * MUST NOT adopt that one as a person's.
428
+ *
429
+ * @generated from field: kusinta.iot.device.v1.AttributeValue lapse_value = 4;
430
+ */
431
+ lapseValue?: AttributeValue | undefined;
432
+ };
433
+
434
+ /**
435
+ * Describes the message kusinta.iot.device.v1.LeasedWrite.
436
+ * Use `create(LeasedWriteSchema)` to create a new message.
437
+ */
438
+ export declare const LeasedWriteSchema: GenMessage<LeasedWrite>;
439
+
440
+ /**
441
+ * How late a reported value reaches the producer after it changes at the device.
442
+ *
443
+ * @generated from enum kusinta.iot.device.v1.ReadLatency
444
+ */
445
+ export enum ReadLatency {
446
+ /**
447
+ * Not stated. Never treated as REAL_TIME.
448
+ *
449
+ * @generated from enum value: READ_LATENCY_UNSPECIFIED = 0;
450
+ */
451
+ UNSPECIFIED = 0,
452
+
453
+ /**
454
+ * Within a few minutes of the change, every time. A value relayed through a vendor's
455
+ * service is not stated REAL_TIME unless that has been measured.
456
+ *
457
+ * @generated from enum value: READ_LATENCY_REAL_TIME = 1;
458
+ */
459
+ REAL_TIME = 1,
460
+
461
+ /**
462
+ * Late enough that acting on it as current would be wrong: values collected by a
463
+ * vendor's service and handed on in batches, hourly values made available the next day.
464
+ * Fit for records, models and reports; not for a decision that has to be made now.
465
+ *
466
+ * @generated from enum value: READ_LATENCY_DELAYED = 2;
467
+ */
468
+ DELAYED = 2,
469
+ }
470
+
471
+ /**
472
+ * Describes the enum kusinta.iot.device.v1.ReadLatency.
473
+ */
474
+ export declare const ReadLatencySchema: GenEnum<ReadLatency>;
475
+
@@ -2,13 +2,13 @@
2
2
  // @generated from file kusinta/iot/device/v1/cluster_state.proto (package kusinta.iot.device.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
 
7
7
  /**
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("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUi+QIKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDRJQCg9hdHRyaWJ1dGVfc3RlcHMYByADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZVN0ZXBzRW50cnkaNQoTQXR0cmlidXRlU3RlcHNFbnRyeRILCgNrZXkYASABKA0SDQoFdmFsdWUYAiABKA06AjgBQhMKEV9jbHVzdGVyX3JldmlzaW9uQg4KDF9mZWF0dXJlX21hcEICSAFiBnByb3RvMw");
11
+ fileDesc("CilrdXNpbnRhL2lvdC9kZXZpY2UvdjEvY2x1c3Rlcl9zdGF0ZS5wcm90bxIVa3VzaW50YS5pb3QuZGV2aWNlLnYxIgsKCU51bGxWYWx1ZSLfAgoOQXR0cmlidXRlVmFsdWUSFAoKYm9vbF92YWx1ZRgBIAEoCEgAEhMKCWludF92YWx1ZRgCIAEoEkgAEhQKCnVpbnRfdmFsdWUYAyABKARIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIWCgxzdHJpbmdfdmFsdWUYBSABKAlIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAEj8KCmxpc3RfdmFsdWUYByABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVMaXN0SAASQwoMc3RydWN0X3ZhbHVlGAggASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlU3RydWN0SAASNgoKbnVsbF92YWx1ZRgJIAEoCzIgLmt1c2ludGEuaW90LmRldmljZS52MS5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJLChJBdHRyaWJ1dGVWYWx1ZUxpc3QSNQoGdmFsdWVzGAEgAygLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlIrUBChRBdHRyaWJ1dGVWYWx1ZVN0cnVjdBJHCgZmaWVsZHMYASADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWVTdHJ1Y3QuRmllbGRzRW50cnkaVAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgNEjQKBXZhbHVlGAIgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlOgI4ASJcCg5BdHRyaWJ1dGVTdGF0ZRIUCgxhdHRyaWJ1dGVfaWQYASABKA0SNAoFdmFsdWUYAiABKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlVmFsdWUivAQKDENsdXN0ZXJTdGF0ZRISCgpjbHVzdGVyX2lkGAEgASgNEh0KEGNsdXN0ZXJfcmV2aXNpb24YAiABKA1IAIgBARIYCgtmZWF0dXJlX21hcBgDIAEoDUgBiAEBEjkKCmF0dHJpYnV0ZXMYBCADKAsyJS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlU3RhdGUSHAoUYWNjZXB0ZWRfY29tbWFuZF9pZHMYBSADKA0SFQoNYXR0cmlidXRlX2lkcxgGIAMoDRJQCg9hdHRyaWJ1dGVfc3RlcHMYByADKAsyNy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZVN0ZXBzRW50cnkSWgoUYXR0cmlidXRlX2JlaGF2aW91cnMYCCADKAsyPC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQ2x1c3RlclN0YXRlLkF0dHJpYnV0ZUJlaGF2aW91cnNFbnRyeRo1ChNBdHRyaWJ1dGVTdGVwc0VudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEoDToCOAEaZQoYQXR0cmlidXRlQmVoYXZpb3Vyc0VudHJ5EgsKA2tleRgBIAEoDRI4CgV2YWx1ZRgCIAEoCzIpLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVCZWhhdmlvdXI6AjgBQhMKEV9jbHVzdGVyX3JldmlzaW9uQg4KDF9mZWF0dXJlX21hcCKCAgoSQXR0cmlidXRlQmVoYXZpb3VyEjQKBnN0aWNreRgBIAEoCzIiLmt1c2ludGEuaW90LmRldmljZS52MS5TdGlja3lXcml0ZUgAEjQKBmxlYXNlZBgCIAEoCzIiLmt1c2ludGEuaW90LmRldmljZS52MS5MZWFzZWRXcml0ZUgAEj0KDnBvd2VyX29uX3ZhbHVlGAMgASgLMiUua3VzaW50YS5pb3QuZGV2aWNlLnYxLkF0dHJpYnV0ZVZhbHVlEjgKDHJlYWRfbGF0ZW5jeRgEIAEoDjIiLmt1c2ludGEuaW90LmRldmljZS52MS5SZWFkTGF0ZW5jeUIHCgV3cml0ZSINCgtTdGlja3lXcml0ZSL1AQoLTGVhc2VkV3JpdGUSHgoRbWluX2xlYXNlX3NlY29uZHMYASABKA1IAIgBARIeChFtYXhfbGVhc2Vfc2Vjb25kcxgCIAEoDUgBiAEBEiMKFnJlbmV3YWxfcmVzdGFydHNfbGVhc2UYAyABKAhIAogBARI6CgtsYXBzZV92YWx1ZRgEIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZUIUChJfbWluX2xlYXNlX3NlY29uZHNCFAoSX21heF9sZWFzZV9zZWNvbmRzQhkKF19yZW5ld2FsX3Jlc3RhcnRzX2xlYXNlKmEKC1JlYWRMYXRlbmN5EhwKGFJFQURfTEFURU5DWV9VTlNQRUNJRklFRBAAEhoKFlJFQURfTEFURU5DWV9SRUFMX1RJTUUQARIYChRSRUFEX0xBVEVOQ1lfREVMQVlFRBACQgJIAWIGcHJvdG8z");
12
12
 
13
13
  /**
14
14
  * Describes the message kusinta.iot.device.v1.NullValue.
@@ -52,3 +52,38 @@ export const AttributeStateSchema = /*@__PURE__*/
52
52
  export const ClusterStateSchema = /*@__PURE__*/
53
53
  messageDesc(file_kusinta_iot_device_v1_cluster_state, 5);
54
54
 
55
+ /**
56
+ * Describes the message kusinta.iot.device.v1.AttributeBehaviour.
57
+ * Use `create(AttributeBehaviourSchema)` to create a new message.
58
+ */
59
+ export const AttributeBehaviourSchema = /*@__PURE__*/
60
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 6);
61
+
62
+ /**
63
+ * Describes the message kusinta.iot.device.v1.StickyWrite.
64
+ * Use `create(StickyWriteSchema)` to create a new message.
65
+ */
66
+ export const StickyWriteSchema = /*@__PURE__*/
67
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 7);
68
+
69
+ /**
70
+ * Describes the message kusinta.iot.device.v1.LeasedWrite.
71
+ * Use `create(LeasedWriteSchema)` to create a new message.
72
+ */
73
+ export const LeasedWriteSchema = /*@__PURE__*/
74
+ messageDesc(file_kusinta_iot_device_v1_cluster_state, 8);
75
+
76
+ /**
77
+ * Describes the enum kusinta.iot.device.v1.ReadLatency.
78
+ */
79
+ export const ReadLatencySchema = /*@__PURE__*/
80
+ enumDesc(file_kusinta_iot_device_v1_cluster_state, 0);
81
+
82
+ /**
83
+ * How late a reported value reaches the producer after it changes at the device.
84
+ *
85
+ * @generated from enum kusinta.iot.device.v1.ReadLatency
86
+ */
87
+ export const ReadLatency = /*@__PURE__*/
88
+ tsEnum(ReadLatencySchema);
89
+
@@ -6,7 +6,7 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { ColorTemperatureLightProperties, ContactSensorProperties, DimmableLightProperties, DoorLockProperties, EnergySensorProperties, HumiditySensorProperties, OccupancySensorProperties, OnOffLightProperties, PowerSourceProperties, PressureSensorProperties, TemperatureSensorProperties, ThermostatProperties, WindowCoveringProperties } from "./properties_pb.js";
8
8
  import type { HmMaintenanceProps, HmThermostatProps } from "../../vendor/homematic/v1/homematic_pb.js";
9
- import type { ClusterState } from "./cluster_state_pb.js";
9
+ import type { AttributeBehaviour, ClusterState } from "./cluster_state_pb.js";
10
10
  import type { DeviceDescriptor } from "./descriptor_pb.js";
11
11
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
12
12
 
@@ -230,6 +230,18 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
230
230
  * @generated from field: repeated string vendor_attribute_names = 17;
231
231
  */
232
232
  vendorAttributeNames: string[];
233
+
234
+ /**
235
+ * What a write to each vendor parameter leaves behind, and how late its reports arrive,
236
+ * keyed by the parameter's vendor name as vendor_attribute_names spells it. The vendor
237
+ * mirror of ClusterState.attribute_behaviours, with the same rules: an absent key is
238
+ * "not stated", and not stated is read as the worst case. For a parameter reached through
239
+ * a vendor's service, the name is the vendor's stable parameter id where it has one,
240
+ * never a display name that is translated or renamed between firmware versions.
241
+ *
242
+ * @generated from field: map<string, kusinta.iot.device.v1.AttributeBehaviour> vendor_attribute_behaviours = 18;
243
+ */
244
+ vendorAttributeBehaviours: { [key: string]: AttributeBehaviour };
233
245
  };
234
246
 
235
247
  /**
@@ -261,12 +273,37 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
261
273
  descriptor?: DeviceDescriptor | undefined;
262
274
 
263
275
  /**
264
- * 15-19 are free; 20+ is the timestamp band.
276
+ * 17-19 are free; 20+ is the timestamp band.
265
277
  *
266
278
  * @generated from field: repeated kusinta.iot.device.v1.Endpoint endpoints = 14;
267
279
  */
268
280
  endpoints: Endpoint[];
269
281
 
282
+ /**
283
+ * The fewest seconds this device needs between two writes, to any of its attributes on
284
+ * any endpoint, without dropping one: a radio limited to a share of airtime, a battery
285
+ * device that wakes on a schedule. A device-wide budget rather than a per-attribute one,
286
+ * because two attributes each written at their own pace still share one radio. Stated by
287
+ * the producer at announcement. Absent: not stated, never zero.
288
+ *
289
+ * A lower bound, not the whole budget: devices behind one radio gateway or one hub share
290
+ * its airtime, and a vendor's service limits an account rather than a device, so a writer
291
+ * may have to space writes further apart than this says.
292
+ *
293
+ * @generated from field: optional uint32 min_write_interval_seconds = 15;
294
+ */
295
+ minWriteIntervalSeconds?: number | undefined;
296
+
297
+ /**
298
+ * The longest a write can take to reach the device: a device that listens only after
299
+ * its own report takes a write at its next one. Stated by the producer at announcement.
300
+ * Absent: not stated, never zero. A writer that renews a lease renews it this long, plus
301
+ * a margin, before the lease runs out, or the output lapses between renewals.
302
+ *
303
+ * @generated from field: optional uint32 max_write_delay_seconds = 16;
304
+ */
305
+ maxWriteDelaySeconds?: number | undefined;
306
+
270
307
  /**
271
308
  * When the gateway last had evidence this device itself — the
272
309
  * most recent PropertyUpdate (wheter or not the property changed) or command
@@ -14,7 +14,7 @@ import { file_kusinta_iot_vendor_v1_vendor_options } from "../../vendor/v1/vendo
14
14
  * Describes the file kusinta/iot/device/v1/device.proto.
15
15
  */
16
16
  export const file_kusinta_iot_device_v1_device = /*@__PURE__*/
17
- fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEi0woKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjQKCnJhZGlvX2xpbmsYNCABKAsyIC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUmFkaW9MaW5rEjUKCGNsdXN0ZXJzGBAgAygLMiMua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNsdXN0ZXJTdGF0ZRIeChZ2ZW5kb3JfYXR0cmlidXRlX25hbWVzGBEgAygJQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIrADCgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBItCglsYXN0X3NlZW4YFCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGxhc3RfdXBkYXRlZBgVIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljIrcBCglSYWRpb0xpbmsSJQoHcXVhbGl0eRgBIAEoDUIPorUYB3F1YWxpdHnQtRgFSACIAQESJwoIcnNzaV9kYm0YAiABKBFCEKK1GAhyc3NpX2RibdC1GAVIAYgBARIjCgZzbnJfZGIYAyABKAJCDqK1GAZzbnJfZGLQtRgFSAKIAQE6Eaq1GA1rdXNpbnRhLnJhZGlvQgoKCF9xdWFsaXR5QgsKCV9yc3NpX2RibUIJCgdfc25yX2RiKnUKDFJhZGlvUXVhbGl0eRIdChlSQURJT19RVUFMSVRZX1VOU1BFQ0lGSUVEEAASFgoSUkFESU9fUVVBTElUWV9HT09EEAESFgoSUkFESU9fUVVBTElUWV9GQUlSEAISFgoSUkFESU9fUVVBTElUWV9QT09SEANCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_descriptor, file_kusinta_iot_device_v1_properties, file_kusinta_iot_vendor_homematic_v1_homematic, file_kusinta_iot_vendor_v1_vendor_options]);
17
+ fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEipQwKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjQKCnJhZGlvX2xpbmsYNCABKAsyIC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUmFkaW9MaW5rEjUKCGNsdXN0ZXJzGBAgAygLMiMua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNsdXN0ZXJTdGF0ZRIeChZ2ZW5kb3JfYXR0cmlidXRlX25hbWVzGBEgAygJEmMKG3ZlbmRvcl9hdHRyaWJ1dGVfYmVoYXZpb3VycxgSIAMoCzI+Lmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludC5WZW5kb3JBdHRyaWJ1dGVCZWhhdmlvdXJzRW50cnkaawoeVmVuZG9yQXR0cmlidXRlQmVoYXZpb3Vyc0VudHJ5EgsKA2tleRgBIAEoCRI4CgV2YWx1ZRgCIAEoCzIpLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVCZWhhdmlvdXI6AjgBQhMKEW1hdHRlcl9wcm9wZXJ0aWVzQhMKEXZlbmRvcl9wcm9wZXJ0aWVzIroECgZEZXZpY2USOwoKZGVzY3JpcHRvchgBIAEoCzInLmt1c2ludGEuaW90LmRldmljZS52MS5EZXZpY2VEZXNjcmlwdG9yEjIKCWVuZHBvaW50cxgOIAMoCzIfLmt1c2ludGEuaW90LmRldmljZS52MS5FbmRwb2ludBInChptaW5fd3JpdGVfaW50ZXJ2YWxfc2Vjb25kcxgPIAEoDUgAiAEBEiQKF21heF93cml0ZV9kZWxheV9zZWNvbmRzGBAgASgNSAGIAQESLQoJbGFzdF9zZWVuGBQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxsYXN0X3VwZGF0ZWQYFSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQh0KG19taW5fd3JpdGVfaW50ZXJ2YWxfc2Vjb25kc0IaChhfbWF4X3dyaXRlX2RlbGF5X3NlY29uZHNKBAgCEA5KBAgyEDNSCnRoZXJtb3N0YXRSEnRlbXBlcmF0dXJlX3NlbnNvclIPaHVtaWRpdHlfc2Vuc29yUhBvY2N1cGFuY3lfc2Vuc29yUg5jb250YWN0X3NlbnNvclIPd2luZG93X2NvdmVyaW5nUglkb29yX2xvY2tSDG9uX29mZl9saWdodFIOZGltbWFibGVfbGlnaHRSEGNvbG9yX3RlbXBfbGlnaHRSDWVuZXJneV9zZW5zb3JSD3ByZXNzdXJlX3NlbnNvclIJaG9tZW1hdGljIrcBCglSYWRpb0xpbmsSJQoHcXVhbGl0eRgBIAEoDUIPorUYB3F1YWxpdHnQtRgFSACIAQESJwoIcnNzaV9kYm0YAiABKBFCEKK1GAhyc3NpX2RibdC1GAVIAYgBARIjCgZzbnJfZGIYAyABKAJCDqK1GAZzbnJfZGLQtRgFSAKIAQE6Eaq1GA1rdXNpbnRhLnJhZGlvQgoKCF9xdWFsaXR5QgsKCV9yc3NpX2RibUIJCgdfc25yX2RiKnUKDFJhZGlvUXVhbGl0eRIdChlSQURJT19RVUFMSVRZX1VOU1BFQ0lGSUVEEAASFgoSUkFESU9fUVVBTElUWV9HT09EEAESFgoSUkFESU9fUVVBTElUWV9GQUlSEAISFgoSUkFESU9fUVVBTElUWV9QT09SEANCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_device_v1_descriptor, file_kusinta_iot_device_v1_properties, file_kusinta_iot_vendor_homematic_v1_homematic, file_kusinta_iot_vendor_v1_vendor_options]);
18
18
 
19
19
  /**
20
20
  * Describes the message kusinta.iot.device.v1.Endpoint.
@@ -15,6 +15,11 @@ export declare const file_kusinta_iot_registration_v1_registration: GenFile;
15
15
  */
16
16
  export declare type RegistrationRequest = Message<"kusinta.iot.registration.v1.RegistrationRequest"> & {
17
17
  /**
18
+ * The one-time token an administrator of the owning organisation obtained from the
19
+ * api-server and handed to the gateway. Opaque to the gateway: it is signed with a key only
20
+ * the api-server holds, and the gateway passes it on unread. Nothing the gateway acts on is
21
+ * taken from it; what the registration settles comes back in RegistrationComplete.
22
+ *
18
23
  * @generated from field: string registration_token = 1;
19
24
  */
20
25
  registrationToken: string;
@@ -65,6 +70,19 @@ export declare type RegistrationComplete = Message<"kusinta.iot.registration.v1.
65
70
  * @generated from field: string ca_bundle_pem = 2;
66
71
  */
67
72
  caBundlePem: string;
73
+
74
+ /**
75
+ * The ownership epoch of the gateway's owner record (signaling.v1.GatewayStreamOpened,
76
+ * OWNERSHIP EPOCH), from the api-server's answer to the registration the gateway made over
77
+ * its own connection to it, which is what makes it trusted. Never empty. An epoch other than
78
+ * the one the gateway holds makes it wipe (signaling.v1.GatewayDeleted, WIPE) before it
79
+ * installs the certificate or admits any session. A registration again by the owning
80
+ * organisation, after a revoke included, answers the epoch the gateway holds and wipes
81
+ * nothing.
82
+ *
83
+ * @generated from field: string ownership_epoch = 3;
84
+ */
85
+ ownershipEpoch: string;
68
86
  };
69
87
 
70
88
  /**
@@ -8,7 +8,7 @@ import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
8
8
  * Describes the file kusinta/iot/registration/v1/registration.proto.
9
9
  */
10
10
  export const file_kusinta_iot_registration_v1_registration = /*@__PURE__*/
11
- fileDesc("Ci5rdXNpbnRhL2lvdC9yZWdpc3RyYXRpb24vdjEvcmVnaXN0cmF0aW9uLnByb3RvEhtrdXNpbnRhLmlvdC5yZWdpc3RyYXRpb24udjEiVwoTUmVnaXN0cmF0aW9uUmVxdWVzdBIaChJyZWdpc3RyYXRpb25fdG9rZW4YASABKAkSEwoLZXh0ZXJuYWxfaXAYAiABKAkSDwoHY3NyX3BlbRgDIAEoCSIkChRSZWdpc3RyYXRpb25Qcm9ncmVzcxIMCgRzdGVwGAEgASgJIkYKFFJlZ2lzdHJhdGlvbkNvbXBsZXRlEhcKD2NlcnRpZmljYXRlX3BlbRgBIAEoCRIVCg1jYV9idW5kbGVfcGVtGAIgASgJIjIKEVJlZ2lzdHJhdGlvbkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLuAQoUUmVnaXN0cmF0aW9uUmVzcG9uc2USRQoIcHJvZ3Jlc3MYASABKAsyMS5rdXNpbnRhLmlvdC5yZWdpc3RyYXRpb24udjEuUmVnaXN0cmF0aW9uUHJvZ3Jlc3NIABJFCghjb21wbGV0ZRgCIAEoCzIxLmt1c2ludGEuaW90LnJlZ2lzdHJhdGlvbi52MS5SZWdpc3RyYXRpb25Db21wbGV0ZUgAEj8KBWVycm9yGAMgASgLMi4ua3VzaW50YS5pb3QucmVnaXN0cmF0aW9uLnYxLlJlZ2lzdHJhdGlvbkVycm9ySABCBwoFZXZlbnQiJQoSQ2VydFJlbmV3YWxSZXF1ZXN0Eg8KB2Nzcl9wZW0YASABKAkiRQoTQ2VydFJlbmV3YWxSZXNwb25zZRIXCg9jZXJ0aWZpY2F0ZV9wZW0YASABKAkSFQoNY2FfYnVuZGxlX3BlbRgCIAEoCUICSAFiBnByb3RvMw");
11
+ fileDesc("Ci5rdXNpbnRhL2lvdC9yZWdpc3RyYXRpb24vdjEvcmVnaXN0cmF0aW9uLnByb3RvEhtrdXNpbnRhLmlvdC5yZWdpc3RyYXRpb24udjEiVwoTUmVnaXN0cmF0aW9uUmVxdWVzdBIaChJyZWdpc3RyYXRpb25fdG9rZW4YASABKAkSEwoLZXh0ZXJuYWxfaXAYAiABKAkSDwoHY3NyX3BlbRgDIAEoCSIkChRSZWdpc3RyYXRpb25Qcm9ncmVzcxIMCgRzdGVwGAEgASgJIl8KFFJlZ2lzdHJhdGlvbkNvbXBsZXRlEhcKD2NlcnRpZmljYXRlX3BlbRgBIAEoCRIVCg1jYV9idW5kbGVfcGVtGAIgASgJEhcKD293bmVyc2hpcF9lcG9jaBgDIAEoCSIyChFSZWdpc3RyYXRpb25FcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAki7gEKFFJlZ2lzdHJhdGlvblJlc3BvbnNlEkUKCHByb2dyZXNzGAEgASgLMjEua3VzaW50YS5pb3QucmVnaXN0cmF0aW9uLnYxLlJlZ2lzdHJhdGlvblByb2dyZXNzSAASRQoIY29tcGxldGUYAiABKAsyMS5rdXNpbnRhLmlvdC5yZWdpc3RyYXRpb24udjEuUmVnaXN0cmF0aW9uQ29tcGxldGVIABI/CgVlcnJvchgDIAEoCzIuLmt1c2ludGEuaW90LnJlZ2lzdHJhdGlvbi52MS5SZWdpc3RyYXRpb25FcnJvckgAQgcKBWV2ZW50IiUKEkNlcnRSZW5ld2FsUmVxdWVzdBIPCgdjc3JfcGVtGAEgASgJIkUKE0NlcnRSZW5ld2FsUmVzcG9uc2USFwoPY2VydGlmaWNhdGVfcGVtGAEgASgJEhUKDWNhX2J1bmRsZV9wZW0YAiABKAlCAkgBYgZwcm90bzM");
12
12
 
13
13
  /**
14
14
  * Describes the message kusinta.iot.registration.v1.RegistrationRequest.
@@ -421,8 +421,9 @@ export declare const ReportProblemsResponseSchema: GenMessage<ReportProblemsResp
421
421
  *
422
422
  * The administration of the gateway is not reported here; the administrator's own service
423
423
  * memberships, if any, are, like anyone's. The api-server records who administers a gateway
424
- * itself, and from when, and gives the administrator every space the gateway serves
425
- * from that moment, applying a change of administrator at once. A problem with no space the
424
+ * itself — the administrators of the organisation that owns it — and from when, and gives each
425
+ * administrator every space the gateway serves from that moment, applying a change of
426
+ * administrator, or of owning organisation, at once. A problem with no space the
426
427
  * api-server holds — a device filed nowhere, a space not yet held or since removed — is shown
427
428
  * only to the administrator. A problem about a connector or the gateway itself concerns no
428
429
  * one's home, and is shown to the administrator and every member with any reach.
@@ -717,20 +718,25 @@ export declare const ReportServedSpacesResponseSchema: GenMessage<ReportServedSp
717
718
  * person connect and leaving is what revokes them. Roles do not follow relations
718
719
  * (access.v1.MembershipRelation): a relation changing alone changes nothing reported here.
719
720
  *
720
- * Who registered the gateway is the api-server's own record, not the gateway's. The
721
- * administration that came with registering it is never taken away by this report — not by
722
- * its absence from a snapshot, not by removed_user_ids — and ends only with a change of who
723
- * is registered as the gateway's administrator at the api-server. Any other administrator is
724
- * a member reported with ROLE_GATEWAY_ADMIN, whom the api-server gives what it gives the
725
- * registering one, from administrator_since (see ServiceReach). Where the registering
726
- * administrator is also reported so, the api-server's record governs: their administration
727
- * counts from the earlier of its own start and administrator_since.
721
+ * Which organisation owns the gateway, and who its administrators are, is the api-server's own
722
+ * record, not the gateway's. The administration that comes with them is never taken away by this
723
+ * report — not by absence from a snapshot, not by removed_user_ids — and ends only when the
724
+ * person stops being an administrator of the owning organisation, or the gateway moves to
725
+ * another (signaling.v1.TransferOutcome). Any other administrator is a member reported with
726
+ * ROLE_GATEWAY_ADMIN, whom the api-server gives what it gives the organisation's, from
727
+ * administrator_since (see ServiceReach). Where an administrator of the organisation is also
728
+ * reported so, the api-server's record governs: their administration counts from the earlier of
729
+ * its own start and administrator_since. The api-server's own start for an organisation's
730
+ * administrator is never before the gateway came to that organisation, so a new owner learns
731
+ * nothing from before a transfer.
728
732
  *
729
- * A member here is a user the gateway holds a membership or a role for, and no one else. The
730
- * registering administrator is reported only when the gateway holds one of those for them —
731
- * a membership, or ROLE_PROPERTY_OWNER they were given — and never with the
732
- * ROLE_GATEWAY_ADMIN their token carries. That the gateway recognises them otherwise
733
- * (webrtc.v1.MemberDetail.registering_admin) does not make them a member of this report.
733
+ * A member here is a user the gateway holds a membership or a role for, and no one else. A
734
+ * vouched administrator (signaling.v1.VouchedAdministrators) is reported only when the gateway
735
+ * holds one of those for them — a membership, or ROLE_PROPERTY_OWNER they were given — and
736
+ * never with the ROLE_GATEWAY_ADMIN the vouched set and their token give. That the gateway
737
+ * lists them otherwise (webrtc.v1.MemberDetail.vouched_admin) does not make them a member of
738
+ * this report. After a wipe (signaling.v1.GatewayDeleted, WIPE) the gateway reports a snapshot
739
+ * with no members.
734
740
  *
735
741
  * @generated from message kusinta.iot.reporting.v1.GatewayMember
736
742
  */