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

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.47",
3
+ "version": "0.2.0-beta.49",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -384,8 +384,8 @@ export declare const EffectivePermissionsSchema: GenMessage<EffectivePermissions
384
384
  /**
385
385
  * What service sees of a home, as a resident is told it in webrtc.v1.PrivacyDisclosure.
386
386
  * Each names part of a webrtc.v1.ServiceStatus, of a device's description, of how the
387
- * home is set up, or of who lives there; with the climate summary the disclosure names
388
- * separately, nothing else of the home reaches service.
387
+ * home is set up, of who lives there, or a problem the gateway reports of it; with the
388
+ * climate summary the disclosure names separately, nothing else of the home reaches service.
389
389
  *
390
390
  * @generated from enum kusinta.iot.access.v1.ServiceSignal
391
391
  */
@@ -475,6 +475,17 @@ export enum ServiceSignal {
475
475
  * @generated from enum value: SERVICE_SIGNAL_RESIDENTS = 9;
476
476
  */
477
477
  RESIDENTS = 9,
478
+
479
+ /**
480
+ * That a floor zone on one of the home's devices has been uncontrolled for about an hour —
481
+ * without a room, or without a control room — and so heats without control: the device and
482
+ * the quarter hour it was reported, until the zone is given a control room or removed. Never
483
+ * which rooms it had or lacks, nor who left it so
484
+ * (reporting.v1.PROBLEM_KIND_FLOOR_ZONE_UNCONTROLLED).
485
+ *
486
+ * @generated from enum value: SERVICE_SIGNAL_FLOOR_ZONE_UNCONTROLLED = 10;
487
+ */
488
+ FLOOR_ZONE_UNCONTROLLED = 10,
478
489
  }
479
490
 
480
491
  /**
@@ -11,7 +11,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
11
11
  * Describes the file kusinta/iot/access/v1/acl.proto.
12
12
  */
13
13
  export const file_kusinta_iot_access_v1_acl = /*@__PURE__*/
14
- fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQiwwQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWYSOwoIcmVsYXRpb24YCyABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uSgQIBRAGUhJhbGxvd2VkX2F0dHJpYnV0ZXMi5QEKFEVmZmVjdGl2ZVBlcm1pc3Npb25zEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoKZ2F0ZXdheV9pZBgCIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZBI1CgtkZXZpY2VfYWNscxgDIAMoCzIgLmt1c2ludGEuaW90LmFjY2Vzcy52MS5EZXZpY2VBY2wSLAoIdmFsaWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKrQCCg1TZXJ2aWNlU2lnbmFsEh4KGlNFUlZJQ0VfU0lHTkFMX1VOU1BFQ0lGSUVEEAASHwobU0VSVklDRV9TSUdOQUxfUkVBQ0hBQklMSVRZEAESGgoWU0VSVklDRV9TSUdOQUxfQkFUVEVSWRACEh0KGVNFUlZJQ0VfU0lHTkFMX1JBRElPX0xJTksQAxIbChdTRVJWSUNFX1NJR05BTF9GSVJNV0FSRRAEEhgKFFNFUlZJQ0VfU0lHTkFMX0ZBVUxUEAUSGQoVU0VSVklDRV9TSUdOQUxfRklMSU5HEAYSHQoZU0VSVklDRV9TSUdOQUxfUk9PTV9TRVRVUBAHEhgKFFNFUlZJQ0VfU0lHTkFMX0xJTktTEAgSHAoYU0VSVklDRV9TSUdOQUxfUkVTSURFTlRTEAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_identity_v1_identity]);
14
+ fileDesc("Ch9rdXNpbnRhL2lvdC9hY2Nlc3MvdjEvYWNsLnByb3RvEhVrdXNpbnRhLmlvdC5hY2Nlc3MudjEirgEKDEF0dHJpYnV0ZVJlZhIWCg5hdHRyaWJ1dGVfbmFtZRgBIAEoCRISCgpjbHVzdGVyX2lkGAIgASgNEhQKDGF0dHJpYnV0ZV9pZBgEIAEoDRIYCgtlbmRwb2ludF9pZBgDIAEoDUgAiAEBEh0KEHZlbmRvcl9leHRlbnNpb24YBSABKAlIAYgBAUIOCgxfZW5kcG9pbnRfaWRCEwoRX3ZlbmRvcl9leHRlbnNpb24iZQoKQ29tbWFuZFJlZhISCgpjbHVzdGVyX2lkGAEgASgNEhkKEW1hdHRlcl9jb21tYW5kX2lkGAIgASgNEhgKC2VuZHBvaW50X2lkGAMgASgNSACIAQFCDgoMX2VuZHBvaW50X2lkIloKCEV2ZW50UmVmEhIKCmNsdXN0ZXJfaWQYASABKA0SEAoIZXZlbnRfaWQYAiABKA0SGAoLZW5kcG9pbnRfaWQYAyABKA1IAIgBAUIOCgxfZW5kcG9pbnRfaWQi5wEKElByb3BlcnR5Q29uc3RyYWludBI2CglhdHRyaWJ1dGUYCCABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmEhEKB2ludF9tYXgYAiABKBFIABIRCgdpbnRfbWluGAMgASgRSAASEgoIdWludF9tYXgYBCABKA1IABISCgh1aW50X21pbhgFIAEoDUgAQgwKCmNvbnN0cmFpbnRKBAgBEAJKBAgGEAdKBAgHEAhSDmF0dHJpYnV0ZV9uYW1lUg5jbHVzdGVyX2lkX2hleFILZW5kcG9pbnRfaWQiwwQKCURldmljZUFjbBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEikKBHJvbGUYAyABKA4yGy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUm9sZRJACg9hbGxvd2VkX2FjdGlvbnMYBCADKA4yJy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuUGVybWlzc2lvbkFjdGlvbhJDChZhbGxvd2VkX2F0dHJpYnV0ZV9yZWZzGAcgAygLMiMua3VzaW50YS5pb3QuYWNjZXNzLnYxLkF0dHJpYnV0ZVJlZhJHChRwcm9wZXJ0eV9jb25zdHJhaW50cxgGIAMoCzIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Qcm9wZXJ0eUNvbnN0cmFpbnQSPwoUYWxsb3dlZF9jb21tYW5kX3JlZnMYCSADKAsyIS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQ29tbWFuZFJlZhI7ChJhbGxvd2VkX2V2ZW50X3JlZnMYCiADKAsyHy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuRXZlbnRSZWYSOwoIcmVsYXRpb24YCyABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uSgQIBRAGUhJhbGxvd2VkX2F0dHJpYnV0ZXMi5QEKFEVmZmVjdGl2ZVBlcm1pc3Npb25zEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoKZ2F0ZXdheV9pZBgCIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZBI1CgtkZXZpY2VfYWNscxgDIAMoCzIgLmt1c2ludGEuaW90LmFjY2Vzcy52MS5EZXZpY2VBY2wSLAoIdmFsaWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKuACCg1TZXJ2aWNlU2lnbmFsEh4KGlNFUlZJQ0VfU0lHTkFMX1VOU1BFQ0lGSUVEEAASHwobU0VSVklDRV9TSUdOQUxfUkVBQ0hBQklMSVRZEAESGgoWU0VSVklDRV9TSUdOQUxfQkFUVEVSWRACEh0KGVNFUlZJQ0VfU0lHTkFMX1JBRElPX0xJTksQAxIbChdTRVJWSUNFX1NJR05BTF9GSVJNV0FSRRAEEhgKFFNFUlZJQ0VfU0lHTkFMX0ZBVUxUEAUSGQoVU0VSVklDRV9TSUdOQUxfRklMSU5HEAYSHQoZU0VSVklDRV9TSUdOQUxfUk9PTV9TRVRVUBAHEhgKFFNFUlZJQ0VfU0lHTkFMX0xJTktTEAgSHAoYU0VSVklDRV9TSUdOQUxfUkVTSURFTlRTEAkSKgomU0VSVklDRV9TSUdOQUxfRkxPT1JfWk9ORV9VTkNPTlRST0xMRUQQCkICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_identity_v1_identity]);
15
15
 
16
16
  /**
17
17
  * Describes the message kusinta.iot.access.v1.AttributeRef.
@@ -64,8 +64,8 @@ export const ServiceSignalSchema = /*@__PURE__*/
64
64
  /**
65
65
  * What service sees of a home, as a resident is told it in webrtc.v1.PrivacyDisclosure.
66
66
  * Each names part of a webrtc.v1.ServiceStatus, of a device's description, of how the
67
- * home is set up, or of who lives there; with the climate summary the disclosure names
68
- * separately, nothing else of the home reaches service.
67
+ * home is set up, of who lives there, or a problem the gateway reports of it; with the
68
+ * climate summary the disclosure names separately, nothing else of the home reaches service.
69
69
  *
70
70
  * @generated from enum kusinta.iot.access.v1.ServiceSignal
71
71
  */
@@ -103,10 +103,11 @@ export declare type RoomClimate = Message<"kusinta.iot.climate.v1.RoomClimate">
103
103
 
104
104
  /**
105
105
  * Who or what set target_centidegrees. Unset while the target is, and when it is withheld
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
106
+ * from the recipient: from service in a home, and from anyone when it dates from before
108
107
  * their current residency in the home, or from a home they did not live in at the time
109
- * (see access.v1.MembershipRelation).
108
+ * (see access.v1.MembershipRelation). The property owner and the gateway administrators are
109
+ * given it for a target set in a home while it is empty, as they are given its rooms then
110
+ * (webrtc.v1 household.proto, EMPTY HOME); technicians stay withheld, empty or not.
110
111
  *
111
112
  * @generated from field: kusinta.iot.climate.v1.TargetChange target_change = 3;
112
113
  */
@@ -25,7 +25,8 @@ export declare const file_kusinta_iot_device_v1_device: GenFile;
25
25
  * per physical device, so a device is still one row, one claim, one placement.
26
26
  *
27
27
  * Field numbers: 1-2 identity, 3-49 standard Matter device types, 50-99 vendor
28
- * extensions — the vendor_properties cases, and radio_link (52) outside that oneof.
28
+ * extensions — the vendor_properties cases, and radio_link (52) and heat_source (53) outside
29
+ * that oneof.
29
30
  *
30
31
  * endpoint_id is Matter's own endpoint number, and it is scoped to ONE DEVICE — not
31
32
  * global, and nothing coordinates numbering between devices. Endpoint 1 on one valve and
@@ -193,6 +194,17 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
193
194
  */
194
195
  radioLink?: RadioLink | undefined;
195
196
 
197
+ /**
198
+ * A heat source's own readings, on the endpoint its connector reports them on. Outside
199
+ * vendor_properties for the reason radio_link is: they are not one vendor's extension but
200
+ * readings any heat source may have, whoever made it, and they must be able to sit beside a
201
+ * vendor case the same endpoint carries. Selected by the vendor branch by its
202
+ * (vendor_extension) key "kusinta.heat_source".
203
+ *
204
+ * @generated from field: kusinta.iot.device.v1.HeatSourceReadings heat_source = 53;
205
+ */
206
+ heatSource?: HeatSourceReadings | undefined;
207
+
196
208
  /**
197
209
  * Every cluster this endpoint hosts: what it supports, and any attribute value that has
198
210
  * no typed field above. This is what makes a device the schema does not model usable
@@ -214,10 +226,11 @@ export declare type Endpoint = Message<"kusinta.iot.device.v1.Endpoint"> & {
214
226
  * vendor parameter has no cluster and so no ClusterState to be listed in. A name list
215
227
  * rather than an id list because the vendor branch addresses by name. A bare list
216
228
  * rather than a per-extension map because an endpoint carries at most one
217
- * vendor_properties case and at most a radio_link beside it, and the schema keeps
218
- * radio_link's attribute names disjoint from every vendor_properties case's — a test
219
- * enforces it — so a name here never needs its extension to be read. radio_link's
220
- * parameters are listed here the same way as a vendor's.
229
+ * vendor_properties case and at most a radio_link and a heat_source beside it, and the
230
+ * schema keeps the attribute names of radio_link, heat_source and every vendor_properties
231
+ * case disjoint — a test enforces it — so a name here never needs its extension to be
232
+ * read. radio_link's and heat_source's parameters are listed here the same way as a
233
+ * vendor's.
221
234
  *
222
235
  * Same reading as the Matter side: named here with no value = implemented, not yet
223
236
  * reported. Absent from the list = this device does not have it. Empty = not stated,
@@ -346,6 +359,149 @@ export declare type Device = Message<"kusinta.iot.device.v1.Device"> & {
346
359
  */
347
360
  export declare const DeviceSchema: GenMessage<Device>;
348
361
 
362
+ /**
363
+ * A heat source's own readings: the temperatures its controller measures and works out, and
364
+ * its run state — what it is producing, its compressor, its degree minutes, its alarm — as its
365
+ * connector reads them from the heat source or the maker's service. What
366
+ * heating.v1.HeatingPlant.readings_device_id reads a plant's heat source by.
367
+ *
368
+ * Travels as vendor-branch PropertyUpdates with vendor_extension "kusinta.heat_source" and
369
+ * these attribute names, the value case following the field type as everywhere on the vendor
370
+ * branch. A temperature is in centidegrees (°C × 100) as int_value, as temperatures are
371
+ * throughout this schema: a connector converts what the heat source gives — degrees with a
372
+ * decimal, a maker's register scale — into centidegrees and rounds it no further. An
373
+ * enum-valued reading travels as its number in uint_value, as RadioLink.quality does, and
374
+ * keeps explicit presence: its UNSPECIFIED is never sent, since an unreported one is an
375
+ * absent field.
376
+ *
377
+ * Vendor-neutral on purpose: the same message for every heat source, a heat pump, a boiler
378
+ * or a district-heating substation, so that whoever reads a plant reads one shape. Which of
379
+ * the maker's points carries each reading, and how its codes map onto the values here, is
380
+ * the connector's mapping and not part of this contract; a reading the heat source has no
381
+ * sensor or state for is never sent, never sent as zero.
382
+ *
383
+ * Every field is `optional`, for the reason vendor readings always are: absent means never
384
+ * reported, present means a reading, 0 °C included. Read only: a heat source is steered
385
+ * through its plant's control inputs (heating.v1.HeatPumpControl), never by writing these.
386
+ *
387
+ * Who is sent them follows the device, as for any device's readings
388
+ * (access.v1.MembershipRelation), whoever owns the heat source (common.v1.AssetOwner decides
389
+ * nothing of who sees what). A heat source filed in a home is household data there: its
390
+ * readings go to the home's residents and never to service (access.v1.DeviceAcl.relation
391
+ * SERVICE), who are given of it only what a webrtc.v1.ServiceStatus carries, within the
392
+ * service signals (access.v1.ServiceSignal): an alarm as a fault (alarm_active), and never
393
+ * alarm_code or any other reading here.
394
+ *
395
+ * @generated from message kusinta.iot.device.v1.HeatSourceReadings
396
+ */
397
+ export declare type HeatSourceReadings = Message<"kusinta.iot.device.v1.HeatSourceReadings"> & {
398
+ /**
399
+ * The heat source's own outdoor sensor: the outdoor temperature its heating curve works
400
+ * from.
401
+ *
402
+ * @generated from field: optional sint32 outdoor_centidegrees = 1;
403
+ */
404
+ outdoorCentidegrees?: number | undefined;
405
+
406
+ /**
407
+ * The supply (flow) line from the heat source to its climate system, at its own sensor —
408
+ * its first climate system where it serves several. Where radiators and a floor circuit
409
+ * share it, this is the shared supply, before the floor circuit's own mixing
410
+ * (heating.v1.FloorCircuit.supply_probe reads after it).
411
+ *
412
+ * @generated from field: optional sint32 supply_centidegrees = 2;
413
+ */
414
+ supplyCentidegrees?: number | undefined;
415
+
416
+ /**
417
+ * The return line into the heat source, at its own sensor: the combined return of
418
+ * everything it heats.
419
+ *
420
+ * @generated from field: optional sint32 return_centidegrees = 3;
421
+ */
422
+ returnCentidegrees?: number | undefined;
423
+
424
+ /**
425
+ * The top of the hot-water tank: how hot the water available to draw is.
426
+ *
427
+ * @generated from field: optional sint32 hot_water_top_centidegrees = 4;
428
+ */
429
+ hotWaterTopCentidegrees?: number | undefined;
430
+
431
+ /**
432
+ * The hot-water tank's charging sensor: the one the heat source starts and stops making
433
+ * hot water by.
434
+ *
435
+ * @generated from field: optional sint32 hot_water_charging_centidegrees = 5;
436
+ */
437
+ hotWaterChargingCentidegrees?: number | undefined;
438
+
439
+ /**
440
+ * The supply temperature the heat source's own control is aiming for on the line
441
+ * supply_centidegrees reads, as it has worked it out from its heating curve and the
442
+ * outdoor temperature, with whatever offsets it applies. Its target, not a measurement.
443
+ *
444
+ * @generated from field: optional sint32 calculated_supply_centidegrees = 6;
445
+ */
446
+ calculatedSupplyCentidegrees?: number | undefined;
447
+
448
+ /**
449
+ * What the heat source is producing now (HeatSourceProduction), as its number. While it
450
+ * makes hot water its supply and return say nothing of the space heating, which is what a
451
+ * consumer reading them for the heating sets aside. A connector that cannot tell what its
452
+ * heat source is producing sends none, rather than a guess or OTHER: OTHER is a state the
453
+ * heat source reports, not a reading the connector lacks.
454
+ *
455
+ * @generated from field: optional uint32 producing = 7;
456
+ */
457
+ producing?: number | undefined;
458
+
459
+ /**
460
+ * Its compressor's state (CompressorState), as its number — its first compressor, where it
461
+ * has several. Absent for a heat source with none.
462
+ *
463
+ * @generated from field: optional uint32 compressor_state = 8;
464
+ */
465
+ compressorState?: number | undefined;
466
+
467
+ /**
468
+ * Its degree minutes, in whole degree-minutes (°C × minutes), rounded to the nearest: the
469
+ * running sum over time of how far the supply has been from calculated_supply_centidegrees,
470
+ * negative while it has run below it. What a heat source that keeps one starts its
471
+ * compressor and its add-on heat by, at thresholds of its own. Absent for a heat source
472
+ * that keeps none.
473
+ *
474
+ * @generated from field: optional sint32 degree_minutes = 9;
475
+ */
476
+ degreeMinutes?: number | undefined;
477
+
478
+ /**
479
+ * Whether the heat source reports an alarm now. An error it reports in its own operation:
480
+ * service is given it as webrtc.v1.SERVICE_FAULT_ERROR (access.v1.SERVICE_SIGNAL_FAULT), as
481
+ * any device's error, and nothing more of it.
482
+ *
483
+ * @generated from field: optional bool alarm_active = 10;
484
+ */
485
+ alarmActive?: boolean | undefined;
486
+
487
+ /**
488
+ * The maker's own number for its most severe current alarm, for whoever looks it up in the
489
+ * maker's documentation. Vendor-specific: it means nothing without the product, and no
490
+ * consumer decides anything by it. Present only while alarm_active is true; a connector
491
+ * sends a null value (PropertyUpdate.null_value) when the alarm ends. Never sent to service,
492
+ * in a home or out of one.
493
+ *
494
+ * @generated from field: optional uint32 alarm_code = 11;
495
+ */
496
+ alarmCode?: number | undefined;
497
+ };
498
+
499
+ /**
500
+ * Describes the message kusinta.iot.device.v1.HeatSourceReadings.
501
+ * Use `create(HeatSourceReadingsSchema)` to create a new message.
502
+ */
503
+ export declare const HeatSourceReadingsSchema: GenMessage<HeatSourceReadings>;
504
+
349
505
  /**
350
506
  * A device's radio link, as its connector reports it.
351
507
  *
@@ -393,6 +549,112 @@ export declare type RadioLink = Message<"kusinta.iot.device.v1.RadioLink"> & {
393
549
  */
394
550
  export declare const RadioLinkSchema: GenMessage<RadioLink>;
395
551
 
552
+ /**
553
+ * The value set of HeatSourceReadings.producing: what a heat source is producing now. Not a
554
+ * field type — producing is a uint32 like every enum-valued reading, so it keeps explicit
555
+ * presence — but the named constants for its numbers. A connector maps its maker's codes onto
556
+ * these; a code none of them names is OTHER.
557
+ *
558
+ * @generated from enum kusinta.iot.device.v1.HeatSourceProduction
559
+ */
560
+ export enum HeatSourceProduction {
561
+ /**
562
+ * Never sent; an unreported state is an absent field.
563
+ *
564
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_UNSPECIFIED = 0;
565
+ */
566
+ UNSPECIFIED = 0,
567
+
568
+ /**
569
+ * Producing nothing.
570
+ *
571
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_OFF = 1;
572
+ */
573
+ OFF = 1,
574
+
575
+ /**
576
+ * Heating the building: its climate systems.
577
+ *
578
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_SPACE_HEATING = 2;
579
+ */
580
+ SPACE_HEATING = 2,
581
+
582
+ /**
583
+ * Making hot water.
584
+ *
585
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_HOT_WATER = 3;
586
+ */
587
+ HOT_WATER = 3,
588
+
589
+ /**
590
+ * Heating a pool.
591
+ *
592
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_POOL = 4;
593
+ */
594
+ POOL = 4,
595
+
596
+ /**
597
+ * Cooling.
598
+ *
599
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_COOLING = 5;
600
+ */
601
+ COOLING = 5,
602
+
603
+ /**
604
+ * Something none of the above names, such as a transfer between stores.
605
+ *
606
+ * @generated from enum value: HEAT_SOURCE_PRODUCTION_OTHER = 6;
607
+ */
608
+ OTHER = 6,
609
+ }
610
+
611
+ /**
612
+ * Describes the enum kusinta.iot.device.v1.HeatSourceProduction.
613
+ */
614
+ export declare const HeatSourceProductionSchema: GenEnum<HeatSourceProduction>;
615
+
616
+ /**
617
+ * The value set of HeatSourceReadings.compressor_state, as the named constants for its
618
+ * numbers. Starting and stopping are kept apart from running and stopped: while a compressor
619
+ * starts, the heat it makes has not yet reached the supply, and readings then are not yet what
620
+ * it runs at.
621
+ *
622
+ * @generated from enum kusinta.iot.device.v1.CompressorState
623
+ */
624
+ export enum CompressorState {
625
+ /**
626
+ * Never sent; an unreported state is an absent field.
627
+ *
628
+ * @generated from enum value: COMPRESSOR_STATE_UNSPECIFIED = 0;
629
+ */
630
+ UNSPECIFIED = 0,
631
+
632
+ /**
633
+ * @generated from enum value: COMPRESSOR_STATE_STOPPED = 1;
634
+ */
635
+ STOPPED = 1,
636
+
637
+ /**
638
+ * @generated from enum value: COMPRESSOR_STATE_STARTING = 2;
639
+ */
640
+ STARTING = 2,
641
+
642
+ /**
643
+ * @generated from enum value: COMPRESSOR_STATE_RUNNING = 3;
644
+ */
645
+ RUNNING = 3,
646
+
647
+ /**
648
+ * @generated from enum value: COMPRESSOR_STATE_STOPPING = 4;
649
+ */
650
+ STOPPING = 4,
651
+ }
652
+
653
+ /**
654
+ * Describes the enum kusinta.iot.device.v1.CompressorState.
655
+ */
656
+ export declare const CompressorStateSchema: GenEnum<CompressorState>;
657
+
396
658
  /**
397
659
  * The value set of RadioLink.quality: how well a link is doing, as the device's
398
660
  * connector rates it. Not a field type — quality is a uint32 like every enum-valued
@@ -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("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]);
17
+ fileDesc("CiJrdXNpbnRhL2lvdC9kZXZpY2UvdjEvZGV2aWNlLnByb3RvEhVrdXNpbnRhLmlvdC5kZXZpY2UudjEi5QwKCEVuZHBvaW50EhMKC2VuZHBvaW50X2lkGAEgASgNEh0KFW1hdHRlcl9kZXZpY2VfdHlwZV9pZBgCIAEoDRJBCgp0aGVybW9zdGF0GAMgASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRoZXJtb3N0YXRQcm9wZXJ0aWVzSAASUAoSdGVtcGVyYXR1cmVfc2Vuc29yGAQgASgLMjIua3VzaW50YS5pb3QuZGV2aWNlLnYxLlRlbXBlcmF0dXJlU2Vuc29yUHJvcGVydGllc0gAEkoKD2h1bWlkaXR5X3NlbnNvchgFIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5IdW1pZGl0eVNlbnNvclByb3BlcnRpZXNIABJMChBvY2N1cGFuY3lfc2Vuc29yGAYgASgLMjAua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9jY3VwYW5jeVNlbnNvclByb3BlcnRpZXNIABJICg5jb250YWN0X3NlbnNvchgHIAEoCzIuLmt1c2ludGEuaW90LmRldmljZS52MS5Db250YWN0U2Vuc29yUHJvcGVydGllc0gAEkoKD3dpbmRvd19jb3ZlcmluZxgIIAEoCzIvLmt1c2ludGEuaW90LmRldmljZS52MS5XaW5kb3dDb3ZlcmluZ1Byb3BlcnRpZXNIABI+Cglkb29yX2xvY2sYCSABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRG9vckxvY2tQcm9wZXJ0aWVzSAASQwoMb25fb2ZmX2xpZ2h0GAogASgLMisua3VzaW50YS5pb3QuZGV2aWNlLnYxLk9uT2ZmTGlnaHRQcm9wZXJ0aWVzSAASSAoOZGltbWFibGVfbGlnaHQYCyABKAsyLi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGltbWFibGVMaWdodFByb3BlcnRpZXNIABJSChBjb2xvcl90ZW1wX2xpZ2h0GAwgASgLMjYua3VzaW50YS5pb3QuZGV2aWNlLnYxLkNvbG9yVGVtcGVyYXR1cmVMaWdodFByb3BlcnRpZXNIABJGCg1lbmVyZ3lfc2Vuc29yGA0gASgLMi0ua3VzaW50YS5pb3QuZGV2aWNlLnYxLkVuZXJneVNlbnNvclByb3BlcnRpZXNIABJKCg9wcmVzc3VyZV9zZW5zb3IYDiABKAsyLy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUHJlc3N1cmVTZW5zb3JQcm9wZXJ0aWVzSAASRAoMcG93ZXJfc291cmNlGA8gASgLMiwua3VzaW50YS5pb3QuZGV2aWNlLnYxLlBvd2VyU291cmNlUHJvcGVydGllc0gAEksKDWhtX3RoZXJtb3N0YXQYMiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtVGhlcm1vc3RhdFByb3BzSAESTQoOaG1fbWFpbnRlbmFuY2UYMyABKAsyMy5rdXNpbnRhLmlvdC52ZW5kb3IuaG9tZW1hdGljLnYxLkhtTWFpbnRlbmFuY2VQcm9wc0gBEjQKCnJhZGlvX2xpbmsYNCABKAsyIC5rdXNpbnRhLmlvdC5kZXZpY2UudjEuUmFkaW9MaW5rEj4KC2hlYXRfc291cmNlGDUgASgLMikua3VzaW50YS5pb3QuZGV2aWNlLnYxLkhlYXRTb3VyY2VSZWFkaW5ncxI1CghjbHVzdGVycxgQIAMoCzIjLmt1c2ludGEuaW90LmRldmljZS52MS5DbHVzdGVyU3RhdGUSHgoWdmVuZG9yX2F0dHJpYnV0ZV9uYW1lcxgRIAMoCRJjCht2ZW5kb3JfYXR0cmlidXRlX2JlaGF2aW91cnMYEiADKAsyPi5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRW5kcG9pbnQuVmVuZG9yQXR0cmlidXRlQmVoYXZpb3Vyc0VudHJ5GmsKHlZlbmRvckF0dHJpYnV0ZUJlaGF2aW91cnNFbnRyeRILCgNrZXkYASABKAkSOAoFdmFsdWUYAiABKAsyKS5rdXNpbnRhLmlvdC5kZXZpY2UudjEuQXR0cmlidXRlQmVoYXZpb3VyOgI4AUITChFtYXR0ZXJfcHJvcGVydGllc0ITChF2ZW5kb3JfcHJvcGVydGllcyK6BAoGRGV2aWNlEjsKCmRlc2NyaXB0b3IYASABKAsyJy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlRGVzY3JpcHRvchIyCgllbmRwb2ludHMYDiADKAsyHy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRW5kcG9pbnQSJwoabWluX3dyaXRlX2ludGVydmFsX3NlY29uZHMYDyABKA1IAIgBARIkChdtYXhfd3JpdGVfZGVsYXlfc2Vjb25kcxgQIAEoDUgBiAEBEi0KCWxhc3Rfc2VlbhgUIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMAoMbGFzdF91cGRhdGVkGBUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIdChtfbWluX3dyaXRlX2ludGVydmFsX3NlY29uZHNCGgoYX21heF93cml0ZV9kZWxheV9zZWNvbmRzSgQIAhAOSgQIMhAzUgp0aGVybW9zdGF0UhJ0ZW1wZXJhdHVyZV9zZW5zb3JSD2h1bWlkaXR5X3NlbnNvclIQb2NjdXBhbmN5X3NlbnNvclIOY29udGFjdF9zZW5zb3JSD3dpbmRvd19jb3ZlcmluZ1IJZG9vcl9sb2NrUgxvbl9vZmZfbGlnaHRSDmRpbW1hYmxlX2xpZ2h0UhBjb2xvcl90ZW1wX2xpZ2h0Ug1lbmVyZ3lfc2Vuc29yUg9wcmVzc3VyZV9zZW5zb3JSCWhvbWVtYXRpYyLhBwoSSGVhdFNvdXJjZVJlYWRpbmdzEj8KFG91dGRvb3JfY2VudGlkZWdyZWVzGAEgASgRQhyitRgUb3V0ZG9vcl9jZW50aWRlZ3JlZXPQtRgFSACIAQESPQoTc3VwcGx5X2NlbnRpZGVncmVlcxgCIAEoEUIborUYE3N1cHBseV9jZW50aWRlZ3JlZXPQtRgFSAGIAQESPQoTcmV0dXJuX2NlbnRpZGVncmVlcxgDIAEoEUIborUYE3JldHVybl9jZW50aWRlZ3JlZXPQtRgFSAKIAQESSwoaaG90X3dhdGVyX3RvcF9jZW50aWRlZ3JlZXMYBCABKBFCIqK1GBpob3Rfd2F0ZXJfdG9wX2NlbnRpZGVncmVlc9C1GAVIA4gBARJVCh9ob3Rfd2F0ZXJfY2hhcmdpbmdfY2VudGlkZWdyZWVzGAUgASgRQieitRgfaG90X3dhdGVyX2NoYXJnaW5nX2NlbnRpZGVncmVlc9C1GAVIBIgBARJTCh5jYWxjdWxhdGVkX3N1cHBseV9jZW50aWRlZ3JlZXMYBiABKBFCJqK1GB5jYWxjdWxhdGVkX3N1cHBseV9jZW50aWRlZ3JlZXPQtRgFSAWIAQESKQoJcHJvZHVjaW5nGAcgASgNQhGitRgJcHJvZHVjaW5n0LUYBUgGiAEBEjcKEGNvbXByZXNzb3Jfc3RhdGUYCCABKA1CGKK1GBBjb21wcmVzc29yX3N0YXRl0LUYBUgHiAEBEjMKDmRlZ3JlZV9taW51dGVzGAkgASgRQhaitRgOZGVncmVlX21pbnV0ZXPQtRgFSAiIAQESLwoMYWxhcm1fYWN0aXZlGAogASgIQhSitRgMYWxhcm1fYWN0aXZl0LUYBUgJiAEBEisKCmFsYXJtX2NvZGUYCyABKA1CEqK1GAphbGFybV9jb2Rl0LUYBUgKiAEBOheqtRgTa3VzaW50YS5oZWF0X3NvdXJjZUIXChVfb3V0ZG9vcl9jZW50aWRlZ3JlZXNCFgoUX3N1cHBseV9jZW50aWRlZ3JlZXNCFgoUX3JldHVybl9jZW50aWRlZ3JlZXNCHQobX2hvdF93YXRlcl90b3BfY2VudGlkZWdyZWVzQiIKIF9ob3Rfd2F0ZXJfY2hhcmdpbmdfY2VudGlkZWdyZWVzQiEKH19jYWxjdWxhdGVkX3N1cHBseV9jZW50aWRlZ3JlZXNCDAoKX3Byb2R1Y2luZ0ITChFfY29tcHJlc3Nvcl9zdGF0ZUIRCg9fZGVncmVlX21pbnV0ZXNCDwoNX2FsYXJtX2FjdGl2ZUINCgtfYWxhcm1fY29kZSK3AQoJUmFkaW9MaW5rEiUKB3F1YWxpdHkYASABKA1CD6K1GAdxdWFsaXR50LUYBUgAiAEBEicKCHJzc2lfZGJtGAIgASgRQhCitRgIcnNzaV9kYm3QtRgFSAGIAQESIwoGc25yX2RiGAMgASgCQg6itRgGc25yX2Ri0LUYBUgCiAEBOhGqtRgNa3VzaW50YS5yYWRpb0IKCghfcXVhbGl0eUILCglfcnNzaV9kYm1CCQoHX3Nucl9kYiqVAgoUSGVhdFNvdXJjZVByb2R1Y3Rpb24SJgoiSEVBVF9TT1VSQ0VfUFJPRFVDVElPTl9VTlNQRUNJRklFRBAAEh4KGkhFQVRfU09VUkNFX1BST0RVQ1RJT05fT0ZGEAESKAokSEVBVF9TT1VSQ0VfUFJPRFVDVElPTl9TUEFDRV9IRUFUSU5HEAISJAogSEVBVF9TT1VSQ0VfUFJPRFVDVElPTl9IT1RfV0FURVIQAxIfChtIRUFUX1NPVVJDRV9QUk9EVUNUSU9OX1BPT0wQBBIiCh5IRUFUX1NPVVJDRV9QUk9EVUNUSU9OX0NPT0xJTkcQBRIgChxIRUFUX1NPVVJDRV9QUk9EVUNUSU9OX09USEVSEAYqrQEKD0NvbXByZXNzb3JTdGF0ZRIgChxDT01QUkVTU09SX1NUQVRFX1VOU1BFQ0lGSUVEEAASHAoYQ09NUFJFU1NPUl9TVEFURV9TVE9QUEVEEAESHQoZQ09NUFJFU1NPUl9TVEFURV9TVEFSVElORxACEhwKGENPTVBSRVNTT1JfU1RBVEVfUlVOTklORxADEh0KGUNPTVBSRVNTT1JfU1RBVEVfU1RPUFBJTkcQBCp1CgxSYWRpb1F1YWxpdHkSHQoZUkFESU9fUVVBTElUWV9VTlNQRUNJRklFRBAAEhYKElJBRElPX1FVQUxJVFlfR09PRBABEhYKElJBRElPX1FVQUxJVFlfRkFJUhACEhYKElJBRElPX1FVQUxJVFlfUE9PUhADQgJIAWIGcHJvdG8z", [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.
@@ -30,18 +30,59 @@ export const EndpointSchema = /*@__PURE__*/
30
30
  export const DeviceSchema = /*@__PURE__*/
31
31
  messageDesc(file_kusinta_iot_device_v1_device, 1);
32
32
 
33
+ /**
34
+ * Describes the message kusinta.iot.device.v1.HeatSourceReadings.
35
+ * Use `create(HeatSourceReadingsSchema)` to create a new message.
36
+ */
37
+ export const HeatSourceReadingsSchema = /*@__PURE__*/
38
+ messageDesc(file_kusinta_iot_device_v1_device, 2);
39
+
33
40
  /**
34
41
  * Describes the message kusinta.iot.device.v1.RadioLink.
35
42
  * Use `create(RadioLinkSchema)` to create a new message.
36
43
  */
37
44
  export const RadioLinkSchema = /*@__PURE__*/
38
- messageDesc(file_kusinta_iot_device_v1_device, 2);
45
+ messageDesc(file_kusinta_iot_device_v1_device, 3);
46
+
47
+ /**
48
+ * Describes the enum kusinta.iot.device.v1.HeatSourceProduction.
49
+ */
50
+ export const HeatSourceProductionSchema = /*@__PURE__*/
51
+ enumDesc(file_kusinta_iot_device_v1_device, 0);
52
+
53
+ /**
54
+ * The value set of HeatSourceReadings.producing: what a heat source is producing now. Not a
55
+ * field type — producing is a uint32 like every enum-valued reading, so it keeps explicit
56
+ * presence — but the named constants for its numbers. A connector maps its maker's codes onto
57
+ * these; a code none of them names is OTHER.
58
+ *
59
+ * @generated from enum kusinta.iot.device.v1.HeatSourceProduction
60
+ */
61
+ export const HeatSourceProduction = /*@__PURE__*/
62
+ tsEnum(HeatSourceProductionSchema);
63
+
64
+ /**
65
+ * Describes the enum kusinta.iot.device.v1.CompressorState.
66
+ */
67
+ export const CompressorStateSchema = /*@__PURE__*/
68
+ enumDesc(file_kusinta_iot_device_v1_device, 1);
69
+
70
+ /**
71
+ * The value set of HeatSourceReadings.compressor_state, as the named constants for its
72
+ * numbers. Starting and stopping are kept apart from running and stopped: while a compressor
73
+ * starts, the heat it makes has not yet reached the supply, and readings then are not yet what
74
+ * it runs at.
75
+ *
76
+ * @generated from enum kusinta.iot.device.v1.CompressorState
77
+ */
78
+ export const CompressorState = /*@__PURE__*/
79
+ tsEnum(CompressorStateSchema);
39
80
 
40
81
  /**
41
82
  * Describes the enum kusinta.iot.device.v1.RadioQuality.
42
83
  */
43
84
  export const RadioQualitySchema = /*@__PURE__*/
44
- enumDesc(file_kusinta_iot_device_v1_device, 0);
85
+ enumDesc(file_kusinta_iot_device_v1_device, 2);
45
86
 
46
87
  /**
47
88
  * The value set of RadioLink.quality: how well a link is doing, as the device's
@@ -29,7 +29,8 @@ export declare const file_kusinta_iot_device_v1_property_update: GenFile;
29
29
  * (matter_device_type) == Endpoint.matter_device_type_id.
30
30
  * - present (vendor): the Endpoint field whose message type declares
31
31
  * (vendor_extension) == the update's vendor_extension — a vendor_properties case,
32
- * or radio_link ("kusinta.radio"), which sits outside that oneof.
32
+ * or radio_link ("kusinta.radio") or heat_source ("kusinta.heat_source"), which sit
33
+ * outside that oneof.
33
34
  * 3. Pick the field:
34
35
  * - Matter branch: the one field whose (matter_cluster_id) equals cluster_id AND
35
36
  * whose (matter_attribute_id) equals attribute_id.
@@ -4,9 +4,10 @@
4
4
 
5
5
  import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
- import type { DeviceId, SpaceId } from "../../identity/v1/identity_pb.js";
7
+ import type { DeviceId, SpaceId, UserId } from "../../identity/v1/identity_pb.js";
8
8
  import type { AttributeRef } from "../../access/v1/acl_pb.js";
9
9
  import type { AttributeValue } from "../../device/v1/cluster_state_pb.js";
10
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
10
11
 
11
12
  /**
12
13
  * Describes the file kusinta/iot/heating/v1/heating.proto.
@@ -107,8 +108,9 @@ export declare type HeatingPlant = Message<"kusinta.iot.heating.v1.HeatingPlant"
107
108
 
108
109
  /**
109
110
  * The device the heat source's own readings come from — its temperatures, compressor and
110
- * hot-water state — when it has one. Read only: the gateway drives a heat source through
111
- * the plant's control, never through this device.
111
+ * hot-water state — when it has one; its temperatures are the device's
112
+ * device.v1.HeatSourceReadings. Read only: the gateway drives a heat source through the
113
+ * plant's control, never through this device.
112
114
  *
113
115
  * @generated from field: kusinta.iot.identity.v1.DeviceId readings_device_id = 5;
114
116
  */
@@ -338,14 +340,17 @@ export declare type FloorZone = Message<"kusinta.iot.heating.v1.FloorZone"> & {
338
340
  /**
339
341
  * The rooms the zone heats, each a room within its plant's space, listed once, with a
340
342
  * share above 0 and shares summing to 1000. A zone may heat several rooms and a room may
341
- * be heated by several zones.
343
+ * be heated by several zones. A put names at least one; empty only for a zone whose rooms
344
+ * were all deleted, which is uncontrolled (see the file comment, UNCONTROLLED ZONES).
342
345
  *
343
346
  * @generated from field: repeated kusinta.iot.heating.v1.FloorZoneRoom rooms = 5;
344
347
  */
345
348
  rooms: FloorZoneRoom[];
346
349
 
347
350
  /**
348
- * One of rooms. Only its error, its sensor and its open window steer the zone.
351
+ * One of rooms. Only its error, its sensor and its open window steer the zone. A put names
352
+ * one; unset only once a deletion cleared it, and always while rooms is empty. A zone
353
+ * without one is uncontrolled (see the file comment, UNCONTROLLED ZONES).
349
354
  *
350
355
  * @generated from field: kusinta.iot.identity.v1.SpaceId control_room_id = 6;
351
356
  */
@@ -357,6 +362,35 @@ export declare type FloorZone = Message<"kusinta.iot.heating.v1.FloorZone"> & {
357
362
  * @generated from field: uint64 revision = 7;
358
363
  */
359
364
  revision: bigint;
365
+
366
+ /**
367
+ * While the zone is uncontrolled — no room, or no control room (see the file comment,
368
+ * UNCONTROLLED ZONES): since when it has been so, and the user whose change left it so — the
369
+ * deletion of its control room or its last room; uncontrolled_by is unset where no user's
370
+ * change did. Both unset while the zone is controlled. Read-only: set by the gateway, ignored
371
+ * in a put. A put that names a control room among its rooms ends it.
372
+ *
373
+ * uncontrolled_by is erased at the home's wipe with the record of who did what in the home
374
+ * (webrtc.v1 household.proto, WIPE); uncontrolled_since stays with the zone, which describes
375
+ * the house.
376
+ *
377
+ * For a home's zone — one left uncontrolled stays whose it was — sent only to the home's
378
+ * household admins (access.v1.MEMBERSHIP_RELATION_HOUSEHOLD_ADMIN) and an installer under a
379
+ * commissioning grant on the home, and unset for the home's other residents; never sent to
380
+ * service. Unset, too, when it dates from before the recipient's current residency in the
381
+ * home, or from a home they did not live in at the time (see access.v1.MembershipRelation).
382
+ * For a zone outside homes, sent to whoever is given the zone. That rooms is empty, or
383
+ * control_room_id unset, is what says the zone is uncontrolled; these say only since when
384
+ * and by whom, where the recipient is given them.
385
+ *
386
+ * @generated from field: google.protobuf.Timestamp uncontrolled_since = 8;
387
+ */
388
+ uncontrolledSince?: Timestamp | undefined;
389
+
390
+ /**
391
+ * @generated from field: kusinta.iot.identity.v1.UserId uncontrolled_by = 9;
392
+ */
393
+ uncontrolledBy?: UserId | undefined;
360
394
  };
361
395
 
362
396
  /**
@@ -3,6 +3,7 @@
3
3
  /* eslint-disable */
4
4
 
5
5
  import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
+ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
6
7
  import { file_kusinta_iot_access_v1_acl } from "../../access/v1/acl_pb.js";
7
8
  import { file_kusinta_iot_device_v1_cluster_state } from "../../device/v1/cluster_state_pb.js";
8
9
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
@@ -11,7 +12,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
11
12
  * Describes the file kusinta/iot/heating/v1/heating.proto.
12
13
  */
13
14
  export const file_kusinta_iot_heating_v1_heating = /*@__PURE__*/
14
- fileDesc("CiRrdXNpbnRhL2lvdC9oZWF0aW5nL3YxL2hlYXRpbmcucHJvdG8SFmt1c2ludGEuaW90LmhlYXRpbmcudjEifwoPRGV2aWNlQXR0cmlidXRlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjYKCWF0dHJpYnV0ZRgCIAEoCzIjLmt1c2ludGEuaW90LmFjY2Vzcy52MS5BdHRyaWJ1dGVSZWYihgEKDkNvbnRhY3RCaW5kaW5nEjcKBm91dHB1dBgBIAEoCzInLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRGV2aWNlQXR0cmlidXRlEjsKDGNsb3NlZF92YWx1ZRgCIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZSLsAgoMSGVhdGluZ1BsYW50EhAKCHBsYW50X2lkGAEgASgJEjIKCHNwYWNlX2lkGAIgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIMCgRuYW1lGAMgASgJEjYKBnNvdXJjZRgEIAEoDjImLmt1c2ludGEuaW90LmhlYXRpbmcudjEuSGVhdFNvdXJjZUtpbmQSPQoScmVhZGluZ3NfZGV2aWNlX2lkGAUgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSPAoJaGVhdF9wdW1wGAYgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0UHVtcENvbnRyb2xIABI2CgVtZXRlchgHIAEoCzInLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRGV2aWNlQXR0cmlidXRlEhAKCHJldmlzaW9uGAggASgEQgkKB2NvbnRyb2wi1gEKD0hlYXRQdW1wQ29udHJvbBI+Cg5zZ19yZWFkeV9ibG9jaxgBIAEoCzImLmt1c2ludGEuaW90LmhlYXRpbmcudjEuQ29udGFjdEJpbmRpbmcSPgoOc2dfcmVhZHlfYm9vc3QYAiABKAsyJi5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbnRhY3RCaW5kaW5nEkMKE2FkZF9vbl9oZWF0ZXJfYmxvY2sYAyABKAsyJi5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbnRhY3RCaW5kaW5nItoBCg5IZWF0aW5nQ2lyY3VpdBISCgpjaXJjdWl0X2lkGAEgASgJEhAKCHBsYW50X2lkGAIgASgJEgwKBG5hbWUYAyABKAkSOwoIcmFkaWF0b3IYBCABKAsyJy5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLlJhZGlhdG9yQ2lyY3VpdEgAEjUKBWZsb29yGAUgASgLMiQua3VzaW50YS5pb3QuaGVhdGluZy52MS5GbG9vckNpcmN1aXRIABIQCghyZXZpc2lvbhgGIAEoBEIOCgxkaXN0cmlidXRpb24iEQoPUmFkaWF0b3JDaXJjdWl0IuQBCgxGbG9vckNpcmN1aXQSFAoMbWl4aW5nX3ZhbHZlGAEgASgIEiQKF3N1cHBseV9jYXBfY2VudGlkZWdyZWVzGAIgASgRSACIAQESPQoMc3VwcGx5X3Byb2JlGAMgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5EZXZpY2VBdHRyaWJ1dGUSPQoMcmV0dXJuX3Byb2JlGAQgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5EZXZpY2VBdHRyaWJ1dGVCGgoYX3N1cHBseV9jYXBfY2VudGlkZWdyZWVzIvkBCglGbG9vclpvbmUSDwoHem9uZV9pZBgBIAEoCRISCgpjaXJjdWl0X2lkGAIgASgJEgwKBG5hbWUYAyABKAkSNgoGb3V0cHV0GAQgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db250YWN0QmluZGluZxI0CgVyb29tcxgFIAMoCzIlLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRmxvb3Jab25lUm9vbRI5Cg9jb250cm9sX3Jvb21faWQYBiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhAKCHJldmlzaW9uGAcgASgEIl8KDUZsb29yWm9uZVJvb20SMQoHcm9vbV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSGwoTYXJlYV9zaGFyZV9wZXJtaWxsZRgCIAEoDSKdAgoLQ29tZm9ydExvYWQSFwoPY29tZm9ydF9sb2FkX2lkGAEgASgJEjEKB3Jvb21faWQYAiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEgwKBG5hbWUYAyABKAkSNgoGb3V0cHV0GAQgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db250YWN0QmluZGluZxI2Cgd3aW5kb3dzGAUgAygLMiUua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db21mb3J0V2luZG93EhAKCHJldmlzaW9uGAYgASgEEhgKEHdpbmRvd3NfcmV2aXNpb24YByABKAQSGAoQd2luZG93c193aXRoaGVsZBgIIAEoCCJLCg1Db21mb3J0V2luZG93EhAKCHdlZWtkYXlzGAEgASgNEhQKDHN0YXJ0X21pbnV0ZRgCIAEoDRISCgplbmRfbWludXRlGAMgASgNIvMBCg1IZWF0aW5nTGF5b3V0EjQKBnBsYW50cxgBIAMoCzIkLmt1c2ludGEuaW90LmhlYXRpbmcudjEuSGVhdGluZ1BsYW50EjgKCGNpcmN1aXRzGAIgAygLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nQ2lyY3VpdBI2CgtmbG9vcl96b25lcxgDIAMoCzIhLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRmxvb3Jab25lEjoKDWNvbWZvcnRfbG9hZHMYBCADKAsyIy5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbWZvcnRMb2FkIoECCg1IZWF0aW5nUmVjb3JkEjUKBXBsYW50GAEgASgLMiQua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nUGxhbnRIABI5CgdjaXJjdWl0GAIgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nQ2lyY3VpdEgAEjcKCmZsb29yX3pvbmUYAyABKAsyIS5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkZsb29yWm9uZUgAEjsKDGNvbWZvcnRfbG9hZBgEIAEoCzIjLmt1c2ludGEuaW90LmhlYXRpbmcudjEuQ29tZm9ydExvYWRIAEIICgZyZWNvcmQqpQIKDkhlYXRTb3VyY2VLaW5kEiAKHEhFQVRfU09VUkNFX0tJTkRfVU5TUEVDSUZJRUQQABIqCiZIRUFUX1NPVVJDRV9LSU5EX0VYSEFVU1RfQUlSX0hFQVRfUFVNUBABEiwKKEhFQVRfU09VUkNFX0tJTkRfR1JPVU5EX1NPVVJDRV9IRUFUX1BVTVAQAhIoCiRIRUFUX1NPVVJDRV9LSU5EX0FJUl9XQVRFUl9IRUFUX1BVTVAQAxIlCiFIRUFUX1NPVVJDRV9LSU5EX0RJU1RSSUNUX0hFQVRJTkcQBBIkCiBIRUFUX1NPVVJDRV9LSU5EX0VMRUNUUklDX0JPSUxFUhAFEiAKHEhFQVRfU09VUkNFX0tJTkRfRlVFTF9CT0lMRVIQBkICSAFiBnByb3RvMw", [file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_identity_v1_identity]);
15
+ fileDesc("CiRrdXNpbnRhL2lvdC9oZWF0aW5nL3YxL2hlYXRpbmcucHJvdG8SFmt1c2ludGEuaW90LmhlYXRpbmcudjEifwoPRGV2aWNlQXR0cmlidXRlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjYKCWF0dHJpYnV0ZRgCIAEoCzIjLmt1c2ludGEuaW90LmFjY2Vzcy52MS5BdHRyaWJ1dGVSZWYihgEKDkNvbnRhY3RCaW5kaW5nEjcKBm91dHB1dBgBIAEoCzInLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRGV2aWNlQXR0cmlidXRlEjsKDGNsb3NlZF92YWx1ZRgCIAEoCzIlLmt1c2ludGEuaW90LmRldmljZS52MS5BdHRyaWJ1dGVWYWx1ZSLsAgoMSGVhdGluZ1BsYW50EhAKCHBsYW50X2lkGAEgASgJEjIKCHNwYWNlX2lkGAIgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIMCgRuYW1lGAMgASgJEjYKBnNvdXJjZRgEIAEoDjImLmt1c2ludGEuaW90LmhlYXRpbmcudjEuSGVhdFNvdXJjZUtpbmQSPQoScmVhZGluZ3NfZGV2aWNlX2lkGAUgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSPAoJaGVhdF9wdW1wGAYgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0UHVtcENvbnRyb2xIABI2CgVtZXRlchgHIAEoCzInLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRGV2aWNlQXR0cmlidXRlEhAKCHJldmlzaW9uGAggASgEQgkKB2NvbnRyb2wi1gEKD0hlYXRQdW1wQ29udHJvbBI+Cg5zZ19yZWFkeV9ibG9jaxgBIAEoCzImLmt1c2ludGEuaW90LmhlYXRpbmcudjEuQ29udGFjdEJpbmRpbmcSPgoOc2dfcmVhZHlfYm9vc3QYAiABKAsyJi5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbnRhY3RCaW5kaW5nEkMKE2FkZF9vbl9oZWF0ZXJfYmxvY2sYAyABKAsyJi5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbnRhY3RCaW5kaW5nItoBCg5IZWF0aW5nQ2lyY3VpdBISCgpjaXJjdWl0X2lkGAEgASgJEhAKCHBsYW50X2lkGAIgASgJEgwKBG5hbWUYAyABKAkSOwoIcmFkaWF0b3IYBCABKAsyJy5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLlJhZGlhdG9yQ2lyY3VpdEgAEjUKBWZsb29yGAUgASgLMiQua3VzaW50YS5pb3QuaGVhdGluZy52MS5GbG9vckNpcmN1aXRIABIQCghyZXZpc2lvbhgGIAEoBEIOCgxkaXN0cmlidXRpb24iEQoPUmFkaWF0b3JDaXJjdWl0IuQBCgxGbG9vckNpcmN1aXQSFAoMbWl4aW5nX3ZhbHZlGAEgASgIEiQKF3N1cHBseV9jYXBfY2VudGlkZWdyZWVzGAIgASgRSACIAQESPQoMc3VwcGx5X3Byb2JlGAMgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5EZXZpY2VBdHRyaWJ1dGUSPQoMcmV0dXJuX3Byb2JlGAQgASgLMicua3VzaW50YS5pb3QuaGVhdGluZy52MS5EZXZpY2VBdHRyaWJ1dGVCGgoYX3N1cHBseV9jYXBfY2VudGlkZWdyZWVzIusCCglGbG9vclpvbmUSDwoHem9uZV9pZBgBIAEoCRISCgpjaXJjdWl0X2lkGAIgASgJEgwKBG5hbWUYAyABKAkSNgoGb3V0cHV0GAQgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db250YWN0QmluZGluZxI0CgVyb29tcxgFIAMoCzIlLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRmxvb3Jab25lUm9vbRI5Cg9jb250cm9sX3Jvb21faWQYBiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhAKCHJldmlzaW9uGAcgASgEEjYKEnVuY29udHJvbGxlZF9zaW5jZRgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASOAoPdW5jb250cm9sbGVkX2J5GAkgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkIl8KDUZsb29yWm9uZVJvb20SMQoHcm9vbV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSGwoTYXJlYV9zaGFyZV9wZXJtaWxsZRgCIAEoDSKdAgoLQ29tZm9ydExvYWQSFwoPY29tZm9ydF9sb2FkX2lkGAEgASgJEjEKB3Jvb21faWQYAiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEgwKBG5hbWUYAyABKAkSNgoGb3V0cHV0GAQgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db250YWN0QmluZGluZxI2Cgd3aW5kb3dzGAUgAygLMiUua3VzaW50YS5pb3QuaGVhdGluZy52MS5Db21mb3J0V2luZG93EhAKCHJldmlzaW9uGAYgASgEEhgKEHdpbmRvd3NfcmV2aXNpb24YByABKAQSGAoQd2luZG93c193aXRoaGVsZBgIIAEoCCJLCg1Db21mb3J0V2luZG93EhAKCHdlZWtkYXlzGAEgASgNEhQKDHN0YXJ0X21pbnV0ZRgCIAEoDRISCgplbmRfbWludXRlGAMgASgNIvMBCg1IZWF0aW5nTGF5b3V0EjQKBnBsYW50cxgBIAMoCzIkLmt1c2ludGEuaW90LmhlYXRpbmcudjEuSGVhdGluZ1BsYW50EjgKCGNpcmN1aXRzGAIgAygLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nQ2lyY3VpdBI2CgtmbG9vcl96b25lcxgDIAMoCzIhLmt1c2ludGEuaW90LmhlYXRpbmcudjEuRmxvb3Jab25lEjoKDWNvbWZvcnRfbG9hZHMYBCADKAsyIy5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkNvbWZvcnRMb2FkIoECCg1IZWF0aW5nUmVjb3JkEjUKBXBsYW50GAEgASgLMiQua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nUGxhbnRIABI5CgdjaXJjdWl0GAIgASgLMiYua3VzaW50YS5pb3QuaGVhdGluZy52MS5IZWF0aW5nQ2lyY3VpdEgAEjcKCmZsb29yX3pvbmUYAyABKAsyIS5rdXNpbnRhLmlvdC5oZWF0aW5nLnYxLkZsb29yWm9uZUgAEjsKDGNvbWZvcnRfbG9hZBgEIAEoCzIjLmt1c2ludGEuaW90LmhlYXRpbmcudjEuQ29tZm9ydExvYWRIAEIICgZyZWNvcmQqpQIKDkhlYXRTb3VyY2VLaW5kEiAKHEhFQVRfU09VUkNFX0tJTkRfVU5TUEVDSUZJRUQQABIqCiZIRUFUX1NPVVJDRV9LSU5EX0VYSEFVU1RfQUlSX0hFQVRfUFVNUBABEiwKKEhFQVRfU09VUkNFX0tJTkRfR1JPVU5EX1NPVVJDRV9IRUFUX1BVTVAQAhIoCiRIRUFUX1NPVVJDRV9LSU5EX0FJUl9XQVRFUl9IRUFUX1BVTVAQAxIlCiFIRUFUX1NPVVJDRV9LSU5EX0RJU1RSSUNUX0hFQVRJTkcQBBIkCiBIRUFUX1NPVVJDRV9LSU5EX0VMRUNUUklDX0JPSUxFUhAFEiAKHEhFQVRfU09VUkNFX0tJTkRfRlVFTF9CT0lMRVIQBkICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_device_v1_cluster_state, file_kusinta_iot_identity_v1_identity]);
15
16
 
16
17
  /**
17
18
  * Describes the message kusinta.iot.heating.v1.DeviceAttribute.
@@ -76,7 +76,8 @@ export declare type ProblemSubject = Message<"kusinta.iot.reporting.v1.ProblemSu
76
76
  */
77
77
  subject: {
78
78
  /**
79
- * DEVICE_OFFLINE, BATTERY_*, DEVICE_ERROR, DEVICE_TAMPER.
79
+ * DEVICE_OFFLINE, BATTERY_*, DEVICE_ERROR, DEVICE_TAMPER; FLOOR_ZONE_UNCONTROLLED: the
80
+ * device whose output the zone binds.
80
81
  *
81
82
  * @generated from field: kusinta.iot.identity.v1.DeviceId device_id = 1;
82
83
  */
@@ -956,9 +957,9 @@ export declare type ReportInviteRoutesResponse = Message<"kusinta.iot.reporting.
956
957
  export declare const ReportInviteRoutesResponseSchema: GenMessage<ReportInviteRoutesResponse>;
957
958
 
958
959
  /**
959
- * What kind of problem is open. The device kinds mirror what service staff are given of a
960
- * device (webrtc.v1.ServiceStatus: reachability, the battery flags, the ServiceFault values);
961
- * a device signal added there is added here too.
960
+ * What kind of problem is open. The device kinds, FLOOR_ZONE_UNCONTROLLED aside, mirror what
961
+ * service staff are given of a device (webrtc.v1.ServiceStatus: reachability, the battery
962
+ * flags, the ServiceFault values); a device signal added there is added here too.
962
963
  *
963
964
  * @generated from enum kusinta.iot.reporting.v1.ProblemKind
964
965
  */
@@ -1053,6 +1054,27 @@ export enum ProblemKind {
1053
1054
  * @generated from enum value: PROBLEM_KIND_WINDOW_OPEN = 9;
1054
1055
  */
1055
1056
  WINDOW_OPEN = 9,
1057
+
1058
+ /**
1059
+ * A floor zone bound to one of the device's outputs (heating.v1.FloorZone.output) is
1060
+ * uncontrolled — it has no room, or no control room — and so heats without control: an
1061
+ * uncontrolled zone is not driven, and a floor zone rests closed (heating.v1, UNCONTROLLED
1062
+ * ZONES). Opened by the gateway only once the zone has been uncontrolled for about an hour,
1063
+ * so that a zone left so for a step of commissioning raises nothing. One problem per device,
1064
+ * however many zones on its outputs are uncontrolled. Closes CLEAR_REASON_RECOVERED once
1065
+ * each of them has a control room again or has been removed, and
1066
+ * CLEAR_REASON_DEVICE_REMOVED with the device.
1067
+ *
1068
+ * A service signal: it names the device and where the device is filed (Problem.space_id),
1069
+ * as any device problem does, and nothing else — not the zone's rooms, not which of the two
1070
+ * it lacks, not who left it so, and no time finer than Problem allows for a device in a
1071
+ * home. Not part of
1072
+ * webrtc.v1.ServiceStatus; residents are told of it as
1073
+ * access.v1.SERVICE_SIGNAL_FLOOR_ZONE_UNCONTROLLED.
1074
+ *
1075
+ * @generated from enum value: PROBLEM_KIND_FLOOR_ZONE_UNCONTROLLED = 10;
1076
+ */
1077
+ FLOOR_ZONE_UNCONTROLLED = 10,
1056
1078
  }
1057
1079
 
1058
1080
  /**
@@ -1111,7 +1133,8 @@ export enum ClearReason {
1111
1133
 
1112
1134
  /**
1113
1135
  * The condition ended: the device was heard, its battery recovered or was replaced, the
1114
- * connector came back, the window closed.
1136
+ * connector came back, the window closed, the floor zone was given a control room or
1137
+ * removed.
1115
1138
  *
1116
1139
  * @generated from enum value: CLEAR_REASON_RECOVERED = 1;
1117
1140
  */
@@ -12,7 +12,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
12
12
  * Describes the file kusinta/iot/reporting/v1/reporting.proto.
13
13
  */
14
14
  export const file_kusinta_iot_reporting_v1_reporting = /*@__PURE__*/
15
- fileDesc("CihrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nLnByb3RvEhhrdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEiPwoMU25hcHNob3RQYXJ0EhMKC3NuYXBzaG90X2lkGAEgASgJEgwKBHBhcnQYAiABKA0SDAoEbGFzdBgDIAEoCCLZAQoOUHJvYmxlbVN1YmplY3QSNgoJZGV2aWNlX2lkGAEgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWRIABI8Cgxjb25uZWN0b3JfaWQYAiABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZEgAEjMKB3Jvb21faWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEQoHZ2F0ZXdheRgEIAEoCEgAQgkKB3N1YmplY3Qi6gIKB1Byb2JsZW0SMwoEa2luZBgCIAEoDjIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5Qcm9ibGVtS2luZBI5CgdzdWJqZWN0GAMgASgLMigua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlByb2JsZW1TdWJqZWN0EjIKCHNwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKD2JhdHRlcnlfcGVyY2VudBgGIAEoDUgAiAEBEhQKDGRldmljZV9jb3VudBgHIAEoDRJECg9iYWNrZW5kX2ZhaWx1cmUYCCABKA4yKy5rdXNpbnRhLmlvdC5jb21tb24udjEuQmFja2VuZEZhaWx1cmVSZWFzb25CEgoQX2JhdHRlcnlfcGVyY2VudCJ3Cg5Qcm9ibGVtQ2xlYXJlZBIuCgpjbGVhcmVkX2F0GAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI1CgZyZWFzb24YAiABKA4yJS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuQ2xlYXJSZWFzb24irgEKEVByb2JsZW1UcmFuc2l0aW9uEhIKCnByb2JsZW1faWQYASABKAkSCwoDc2VxGAIgASgEEjEKBG9wZW4YAyABKAsyIS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUgAEjsKB2NsZWFyZWQYBCABKAsyKC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUNsZWFyZWRIAEIICgZjaGFuZ2Ui0AEKFVJlcG9ydFByb2JsZW1zUmVxdWVzdBIRCglzdHJlYW1faWQYAyABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgFIAMoCRILCgNzZXEYBCABKAQSQAoLdHJhbnNpdGlvbnMYASADKAsyKy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbVRyYW5zaXRpb24SOAoIc25hcHNob3QYAiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0ImUKDVRyYW5zaXRpb25BY2sSEgoKcHJvYmxlbV9pZBgBIAEoCRILCgNzZXEYAiABKAQSMwoGc3RhdHVzGAMgASgOMiMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkFja1N0YXR1cyJ9ChZSZXBvcnRQcm9ibGVtc1Jlc3BvbnNlEjUKBGFja3MYASADKAsyJy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuVHJhbnNpdGlvbkFjaxITCgthcHBsaWVkX3NlcRgDIAEoBBIXCg9yZXN5bmNfcmVxdWlyZWQYAiABKAgieAoMU2VydmljZVJlYWNoEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoGc3BhY2VzGAMgAygLMiYua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlYWNoZWRTcGFjZSJtCgxSZWFjaGVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEikKBXNpbmNlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKEAgoZUmVwb3J0U2VydmljZVJlYWNoUmVxdWVzdBIRCglzdHJlYW1faWQYBSABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgGIAMoCRILCgNzZXEYASABKAQSNQoFcmVhY2gYAiADKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU2VydmljZVJlYWNoEjkKEHJlbW92ZWRfdXNlcl9pZHMYAyADKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZpY2VSZWFjaFJlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLiAQoLU2VydmVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjQKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlEgwKBG5hbWUYAyABKAkSOQoPcGFyZW50X3NwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBINCgVmbG9vchgFIAEoBRIRCgl0aW1lX3pvbmUYBiABKAkihgIKGVJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QSEQoJc3RyZWFtX2lkGAUgASgJEhsKE3ByZXZpb3VzX3N0cmVhbV9pZHMYBiADKAkSCwoDc2VxGAEgASgEEjUKBnNwYWNlcxgCIAMoCzIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TZXJ2ZWRTcGFjZRI7ChFyZW1vdmVkX3NwYWNlX2lkcxgDIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZlZFNwYWNlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCKmAQoNR2F0ZXdheU1lbWJlchIwCgd1c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEioKBXJvbGVzGAIgAygOMhsua3VzaW50YS5pb3QuYWNjZXNzLnYxLlJvbGUSNwoTYWRtaW5pc3RyYXRvcl9zaW5jZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiggIKFFJlcG9ydE1lbWJlcnNSZXF1ZXN0EhEKCXN0cmVhbV9pZBgBIAEoCRIbChNwcmV2aW91c19zdHJlYW1faWRzGAIgAygJEgsKA3NlcRgDIAEoBBI4CgdtZW1iZXJzGAQgAygLMicua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkdhdGV3YXlNZW1iZXISOQoQcmVtb3ZlZF91c2VyX2lkcxgFIAMoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI4CghzbmFwc2hvdBgGIAEoCzImLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TbmFwc2hvdFBhcnQiRQoVUmVwb3J0TWVtYmVyc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLIAQoZUmVwb3J0SW52aXRlUm91dGVzUmVxdWVzdBIRCglzdHJlYW1faWQYASABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgCIAMoCRILCgNzZXEYAyABKAQSFQoNc2VjcmV0X2hhc2hlcxgEIAMoDBIdChVyZW1vdmVkX3NlY3JldF9oYXNoZXMYBSADKAwSOAoIc25hcHNob3QYBiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydEludml0ZVJvdXRlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCrcAgoLUHJvYmxlbUtpbmQSHAoYUFJPQkxFTV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobUFJPQkxFTV9LSU5EX0RFVklDRV9PRkZMSU5FEAESHAoYUFJPQkxFTV9LSU5EX0JBVFRFUllfTE9XEAISKwonUFJPQkxFTV9LSU5EX0JBVFRFUllfUkVQTEFDRU1FTlRfTkVFREVEEAMSHQoZUFJPQkxFTV9LSU5EX0RFVklDRV9FUlJPUhAEEh4KGlBST0JMRU1fS0lORF9ERVZJQ0VfVEFNUEVSEAUSIgoeUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9PRkZMSU5FEAYSIAocUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9FUlJPUhAHEiAKHFBST0JMRU1fS0lORF9VTkZJTEVEX0RFVklDRVMQCBIcChhQUk9CTEVNX0tJTkRfV0lORE9XX09QRU4QCSqfAgoLQ2xlYXJSZWFzb24SHAoYQ0xFQVJfUkVBU09OX1VOU1BFQ0lGSUVEEAASGgoWQ0xFQVJfUkVBU09OX1JFQ09WRVJFRBABEhYKEkNMRUFSX1JFQVNPTl9GSUxFRBACEh8KG0NMRUFSX1JFQVNPTl9ERVZJQ0VfUkVNT1ZFRBADEjAKLENMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9PRkZMSU5FEAQSIwofQ0xFQVJfUkVBU09OX05PX0xPTkdFUl9SRVBPUlRFRBAFEhYKEkNMRUFSX1JFQVNPTl9NT1ZFRBAGEi4KKkNMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9FUlJPUhAHKocBCglBY2tTdGF0dXMSGgoWQUNLX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKEkFDS19TVEFUVVNfQVBQTElFRBABEhgKFEFDS19TVEFUVVNfRFVQTElDQVRFEAISFwoTQUNLX1NUQVRVU19SRUpFQ1RFRBADEhMKD0FDS19TVEFUVVNfSEVMRBAEQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
15
+ fileDesc("CihrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nLnByb3RvEhhrdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEiPwoMU25hcHNob3RQYXJ0EhMKC3NuYXBzaG90X2lkGAEgASgJEgwKBHBhcnQYAiABKA0SDAoEbGFzdBgDIAEoCCLZAQoOUHJvYmxlbVN1YmplY3QSNgoJZGV2aWNlX2lkGAEgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWRIABI8Cgxjb25uZWN0b3JfaWQYAiABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZEgAEjMKB3Jvb21faWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEQoHZ2F0ZXdheRgEIAEoCEgAQgkKB3N1YmplY3Qi6gIKB1Byb2JsZW0SMwoEa2luZBgCIAEoDjIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5Qcm9ibGVtS2luZBI5CgdzdWJqZWN0GAMgASgLMigua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlByb2JsZW1TdWJqZWN0EjIKCHNwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKD2JhdHRlcnlfcGVyY2VudBgGIAEoDUgAiAEBEhQKDGRldmljZV9jb3VudBgHIAEoDRJECg9iYWNrZW5kX2ZhaWx1cmUYCCABKA4yKy5rdXNpbnRhLmlvdC5jb21tb24udjEuQmFja2VuZEZhaWx1cmVSZWFzb25CEgoQX2JhdHRlcnlfcGVyY2VudCJ3Cg5Qcm9ibGVtQ2xlYXJlZBIuCgpjbGVhcmVkX2F0GAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI1CgZyZWFzb24YAiABKA4yJS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuQ2xlYXJSZWFzb24irgEKEVByb2JsZW1UcmFuc2l0aW9uEhIKCnByb2JsZW1faWQYASABKAkSCwoDc2VxGAIgASgEEjEKBG9wZW4YAyABKAsyIS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUgAEjsKB2NsZWFyZWQYBCABKAsyKC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUNsZWFyZWRIAEIICgZjaGFuZ2Ui0AEKFVJlcG9ydFByb2JsZW1zUmVxdWVzdBIRCglzdHJlYW1faWQYAyABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgFIAMoCRILCgNzZXEYBCABKAQSQAoLdHJhbnNpdGlvbnMYASADKAsyKy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbVRyYW5zaXRpb24SOAoIc25hcHNob3QYAiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0ImUKDVRyYW5zaXRpb25BY2sSEgoKcHJvYmxlbV9pZBgBIAEoCRILCgNzZXEYAiABKAQSMwoGc3RhdHVzGAMgASgOMiMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkFja1N0YXR1cyJ9ChZSZXBvcnRQcm9ibGVtc1Jlc3BvbnNlEjUKBGFja3MYASADKAsyJy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuVHJhbnNpdGlvbkFjaxITCgthcHBsaWVkX3NlcRgDIAEoBBIXCg9yZXN5bmNfcmVxdWlyZWQYAiABKAgieAoMU2VydmljZVJlYWNoEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoGc3BhY2VzGAMgAygLMiYua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlYWNoZWRTcGFjZSJtCgxSZWFjaGVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEikKBXNpbmNlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKEAgoZUmVwb3J0U2VydmljZVJlYWNoUmVxdWVzdBIRCglzdHJlYW1faWQYBSABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgGIAMoCRILCgNzZXEYASABKAQSNQoFcmVhY2gYAiADKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU2VydmljZVJlYWNoEjkKEHJlbW92ZWRfdXNlcl9pZHMYAyADKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZpY2VSZWFjaFJlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLiAQoLU2VydmVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjQKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlEgwKBG5hbWUYAyABKAkSOQoPcGFyZW50X3NwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBINCgVmbG9vchgFIAEoBRIRCgl0aW1lX3pvbmUYBiABKAkihgIKGVJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QSEQoJc3RyZWFtX2lkGAUgASgJEhsKE3ByZXZpb3VzX3N0cmVhbV9pZHMYBiADKAkSCwoDc2VxGAEgASgEEjUKBnNwYWNlcxgCIAMoCzIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TZXJ2ZWRTcGFjZRI7ChFyZW1vdmVkX3NwYWNlX2lkcxgDIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZlZFNwYWNlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCKmAQoNR2F0ZXdheU1lbWJlchIwCgd1c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEioKBXJvbGVzGAIgAygOMhsua3VzaW50YS5pb3QuYWNjZXNzLnYxLlJvbGUSNwoTYWRtaW5pc3RyYXRvcl9zaW5jZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiggIKFFJlcG9ydE1lbWJlcnNSZXF1ZXN0EhEKCXN0cmVhbV9pZBgBIAEoCRIbChNwcmV2aW91c19zdHJlYW1faWRzGAIgAygJEgsKA3NlcRgDIAEoBBI4CgdtZW1iZXJzGAQgAygLMicua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkdhdGV3YXlNZW1iZXISOQoQcmVtb3ZlZF91c2VyX2lkcxgFIAMoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI4CghzbmFwc2hvdBgGIAEoCzImLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TbmFwc2hvdFBhcnQiRQoVUmVwb3J0TWVtYmVyc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLIAQoZUmVwb3J0SW52aXRlUm91dGVzUmVxdWVzdBIRCglzdHJlYW1faWQYASABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgCIAMoCRILCgNzZXEYAyABKAQSFQoNc2VjcmV0X2hhc2hlcxgEIAMoDBIdChVyZW1vdmVkX3NlY3JldF9oYXNoZXMYBSADKAwSOAoIc25hcHNob3QYBiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydEludml0ZVJvdXRlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCqGAwoLUHJvYmxlbUtpbmQSHAoYUFJPQkxFTV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobUFJPQkxFTV9LSU5EX0RFVklDRV9PRkZMSU5FEAESHAoYUFJPQkxFTV9LSU5EX0JBVFRFUllfTE9XEAISKwonUFJPQkxFTV9LSU5EX0JBVFRFUllfUkVQTEFDRU1FTlRfTkVFREVEEAMSHQoZUFJPQkxFTV9LSU5EX0RFVklDRV9FUlJPUhAEEh4KGlBST0JMRU1fS0lORF9ERVZJQ0VfVEFNUEVSEAUSIgoeUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9PRkZMSU5FEAYSIAocUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9FUlJPUhAHEiAKHFBST0JMRU1fS0lORF9VTkZJTEVEX0RFVklDRVMQCBIcChhQUk9CTEVNX0tJTkRfV0lORE9XX09QRU4QCRIoCiRQUk9CTEVNX0tJTkRfRkxPT1JfWk9ORV9VTkNPTlRST0xMRUQQCiqfAgoLQ2xlYXJSZWFzb24SHAoYQ0xFQVJfUkVBU09OX1VOU1BFQ0lGSUVEEAASGgoWQ0xFQVJfUkVBU09OX1JFQ09WRVJFRBABEhYKEkNMRUFSX1JFQVNPTl9GSUxFRBACEh8KG0NMRUFSX1JFQVNPTl9ERVZJQ0VfUkVNT1ZFRBADEjAKLENMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9PRkZMSU5FEAQSIwofQ0xFQVJfUkVBU09OX05PX0xPTkdFUl9SRVBPUlRFRBAFEhYKEkNMRUFSX1JFQVNPTl9NT1ZFRBAGEi4KKkNMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9FUlJPUhAHKocBCglBY2tTdGF0dXMSGgoWQUNLX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKEkFDS19TVEFUVVNfQVBQTElFRBABEhgKFEFDS19TVEFUVVNfRFVQTElDQVRFEAISFwoTQUNLX1NUQVRVU19SRUpFQ1RFRBADEhMKD0FDS19TVEFUVVNfSEVMRBAEQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
16
16
 
17
17
  /**
18
18
  * Describes the message kusinta.iot.reporting.v1.SnapshotPart.
@@ -161,9 +161,9 @@ export const ProblemKindSchema = /*@__PURE__*/
161
161
  enumDesc(file_kusinta_iot_reporting_v1_reporting, 0);
162
162
 
163
163
  /**
164
- * What kind of problem is open. The device kinds mirror what service staff are given of a
165
- * device (webrtc.v1.ServiceStatus: reachability, the battery flags, the ServiceFault values);
166
- * a device signal added there is added here too.
164
+ * What kind of problem is open. The device kinds, FLOOR_ZONE_UNCONTROLLED aside, mirror what
165
+ * service staff are given of a device (webrtc.v1.ServiceStatus: reachability, the battery
166
+ * flags, the ServiceFault values); a device signal added there is added here too.
167
167
  *
168
168
  * @generated from enum kusinta.iot.reporting.v1.ProblemKind
169
169
  */
@@ -50,11 +50,12 @@ export declare const vendor_attribute_capabilities: GenExtension<FieldOptions, n
50
50
  /**
51
51
  * The stable key identifying a vendor extension message, e.g. "homematic.thermostat".
52
52
  * Matches device.v1.PropertyUpdate.vendor_extension byte for byte, and is what selects
53
- * the Endpoint.vendor_properties case — or Endpoint.radio_link, for "kusinta.radio".
53
+ * the Endpoint.vendor_properties case — or Endpoint.radio_link, for "kusinta.radio", or
54
+ * Endpoint.heat_source, for "kusinta.heat_source".
54
55
  *
55
- * One key per message carried in Endpoint.vendor_properties or radio_link, so the vendor
56
- * branch of the resolution rule is the same shape as the Matter branch: pick a message
57
- * by a message option, then one field by a field option. Nothing nests.
56
+ * One key per message carried in Endpoint.vendor_properties, radio_link or heat_source, so
57
+ * the vendor branch of the resolution rule is the same shape as the Matter branch: pick a
58
+ * message by a message option, then one field by a field option. Nothing nests.
58
59
  *
59
60
  * Form: "<vendor>.<what the message models>", lower_snake_case on both sides —
60
61
  * "homematic.thermostat", and a humidity one would be "homematic.humidity_sensor". The
@@ -53,11 +53,12 @@ export const vendor_attribute_capabilities = /*@__PURE__*/
53
53
  /**
54
54
  * The stable key identifying a vendor extension message, e.g. "homematic.thermostat".
55
55
  * Matches device.v1.PropertyUpdate.vendor_extension byte for byte, and is what selects
56
- * the Endpoint.vendor_properties case — or Endpoint.radio_link, for "kusinta.radio".
56
+ * the Endpoint.vendor_properties case — or Endpoint.radio_link, for "kusinta.radio", or
57
+ * Endpoint.heat_source, for "kusinta.heat_source".
57
58
  *
58
- * One key per message carried in Endpoint.vendor_properties or radio_link, so the vendor
59
- * branch of the resolution rule is the same shape as the Matter branch: pick a message
60
- * by a message option, then one field by a field option. Nothing nests.
59
+ * One key per message carried in Endpoint.vendor_properties, radio_link or heat_source, so
60
+ * the vendor branch of the resolution rule is the same shape as the Matter branch: pick a
61
+ * message by a message option, then one field by a field option. Nothing nests.
61
62
  *
62
63
  * Form: "<vendor>.<what the message models>", lower_snake_case on both sides —
63
64
  * "homematic.thermostat", and a humidity one would be "homematic.humidity_sensor". The
@@ -95,7 +95,20 @@ export declare const CreateSpaceSchema: GenMessage<CreateSpace>;
95
95
  * filed on the apartment, where it was in it — and any link it would carry across a
96
96
  * boundary is removed. Changing the type of a space that has members needs
97
97
  * ROLE_PROPERTY_OWNER or ROLE_GATEWAY_ADMIN, who see them, and is refused if it would
98
- * leave a RESIDENT membership on a room.
98
+ * leave a RESIDENT membership on a room, as INVALID_REQUEST with metadata
99
+ * {"reason": "resident_on_room"}.
100
+ *
101
+ * An apartment keeps its type while its household data is there. A change of an apartment's
102
+ * type is refused as FAILED_PRECONDITION with metadata {"reason": "handover_pending"} while a
103
+ * handover of the home is under way: pending (household.proto, HANDOVER, VACANCY), confirmed
104
+ * but its wipe not yet done, or its last residency ended and no handover recorded yet. It is
105
+ * refused as FAILED_PRECONDITION with metadata {"reason": "home_occupied"} while any residency
106
+ * of the home names someone: a current resident, or a past household whose data has not been
107
+ * wiped. The home's household data goes by a handover first (household.proto, HANDOVER, WIPE),
108
+ * never by a retype away and back. Neither refuses a change that leaves the type as it is, a
109
+ * rename among them. Every other check is made first — who may make the change, and the
110
+ * refusals of its shape as INVALID_REQUEST, "resident_on_room" among them — and
111
+ * "handover_pending" before "home_occupied".
99
112
  *
100
113
  * The name of an apartment is the building's identifier for it (space.v1.Space.name), and is
101
114
  * changed only by the property owner or the gateway's administrators: from anyone else, a
@@ -182,6 +195,11 @@ export declare const UpdateSpaceSchema: GenMessage<UpdateSpace>;
182
195
  * anything in one, is guarded as UpdateSpace is, heating records included
183
196
  * (HEATING ACROSS A HOME).
184
197
  *
198
+ * Refused as FAILED_PRECONDITION with metadata {"reason": "handover_pending"}, cascade or not,
199
+ * while a handover is under way, as UpdateSpace has it, of the home deleted or of any home
200
+ * beneath the space: a household's records go by its wipe (household.proto, WIPE), never by a
201
+ * deletion.
202
+ *
185
203
  * @generated from message kusinta.iot.webrtc.v1.DeleteSpace
186
204
  */
187
205
  export declare type DeleteSpace = Message<"kusinta.iot.webrtc.v1.DeleteSpace"> & {
@@ -1787,6 +1805,16 @@ export declare const SetHomeTemplateSchema: GenMessage<SetHomeTemplate>;
1787
1805
  *
1788
1806
  * FAILED_PRECONDITION
1789
1807
  * "TEST_RUNNING" a test already drives one of its outputs.
1808
+ * "SG_READY_ORDER" OUTPUT_LEASE on one SG Ready input while a running test drives the
1809
+ * other input of the same plant, in either order: both held away from
1810
+ * rest is a state of the heat pump no test asks for. metadata "field"
1811
+ * names the input the running test drives.
1812
+ * "LAST_HEATING_ZONE" OUTPUT_LEASE or ZONE_EFFECT on a floor zone's output that would leave
1813
+ * its circuit no zone heating: the zone is the circuit's only one, or
1814
+ * every other zone of the circuit has its output driven by a running
1815
+ * test. A zone with no bound output counts as heating. Not refused once
1816
+ * the circuit's "floor.pump_tolerates_all_zones_off" is true
1817
+ * (commissioning.v1). metadata "record_id" names the zone.
1790
1818
  * "NEEDS_PASS" ZONE_EFFECT or PUMP_ALL_ZONES_OFF on outputs without a current
1791
1819
  * OUTPUT_LEASE pass; metadata "record_id" names one.
1792
1820
  * "OUTPUT_NOT_LEASED" an output its producer does not state as leased, with a lapse value